1 //===------- TreeTransform.h - Semantic Tree Transformation -----*- C++ -*-===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //===----------------------------------------------------------------------===//
8 //
9 //  This file implements a semantic tree transformation that takes a given
10 //  AST and rebuilds it, possibly transforming some nodes in the process.
11 //
12 //===----------------------------------------------------------------------===//
13 
14 #ifndef LLVM_CLANG_LIB_SEMA_TREETRANSFORM_H
15 #define LLVM_CLANG_LIB_SEMA_TREETRANSFORM_H
16 
17 #include "TypeLocBuilder.h"
18 #include "clang/AST/Decl.h"
19 #include "clang/AST/DeclObjC.h"
20 #include "clang/AST/DeclTemplate.h"
21 #include "clang/AST/Expr.h"
22 #include "clang/AST/ExprCXX.h"
23 #include "clang/AST/ExprObjC.h"
24 #include "clang/AST/ExprOpenMP.h"
25 #include "clang/AST/Stmt.h"
26 #include "clang/AST/StmtCXX.h"
27 #include "clang/AST/StmtObjC.h"
28 #include "clang/AST/StmtOpenMP.h"
29 #include "clang/Sema/Designator.h"
30 #include "clang/Sema/Lookup.h"
31 #include "clang/Sema/Ownership.h"
32 #include "clang/Sema/ParsedTemplate.h"
33 #include "clang/Sema/ScopeInfo.h"
34 #include "clang/Sema/SemaDiagnostic.h"
35 #include "clang/Sema/SemaInternal.h"
36 #include "llvm/ADT/ArrayRef.h"
37 #include "llvm/Support/ErrorHandling.h"
38 #include <algorithm>
39 
40 namespace clang {
41 using namespace sema;
42 
43 /// \brief A semantic tree transformation that allows one to transform one
44 /// abstract syntax tree into another.
45 ///
46 /// A new tree transformation is defined by creating a new subclass \c X of
47 /// \c TreeTransform<X> and then overriding certain operations to provide
48 /// behavior specific to that transformation. For example, template
49 /// instantiation is implemented as a tree transformation where the
50 /// transformation of TemplateTypeParmType nodes involves substituting the
51 /// template arguments for their corresponding template parameters; a similar
52 /// transformation is performed for non-type template parameters and
53 /// template template parameters.
54 ///
55 /// This tree-transformation template uses static polymorphism to allow
56 /// subclasses to customize any of its operations. Thus, a subclass can
57 /// override any of the transformation or rebuild operators by providing an
58 /// operation with the same signature as the default implementation. The
59 /// overridding function should not be virtual.
60 ///
61 /// Semantic tree transformations are split into two stages, either of which
62 /// can be replaced by a subclass. The "transform" step transforms an AST node
63 /// or the parts of an AST node using the various transformation functions,
64 /// then passes the pieces on to the "rebuild" step, which constructs a new AST
65 /// node of the appropriate kind from the pieces. The default transformation
66 /// routines recursively transform the operands to composite AST nodes (e.g.,
67 /// the pointee type of a PointerType node) and, if any of those operand nodes
68 /// were changed by the transformation, invokes the rebuild operation to create
69 /// a new AST node.
70 ///
71 /// Subclasses can customize the transformation at various levels. The
72 /// most coarse-grained transformations involve replacing TransformType(),
73 /// TransformExpr(), TransformDecl(), TransformNestedNameSpecifierLoc(),
74 /// TransformTemplateName(), or TransformTemplateArgument() with entirely
75 /// new implementations.
76 ///
77 /// For more fine-grained transformations, subclasses can replace any of the
78 /// \c TransformXXX functions (where XXX is the name of an AST node, e.g.,
79 /// PointerType, StmtExpr) to alter the transformation. As mentioned previously,
80 /// replacing TransformTemplateTypeParmType() allows template instantiation
81 /// to substitute template arguments for their corresponding template
82 /// parameters. Additionally, subclasses can override the \c RebuildXXX
83 /// functions to control how AST nodes are rebuilt when their operands change.
84 /// By default, \c TreeTransform will invoke semantic analysis to rebuild
85 /// AST nodes. However, certain other tree transformations (e.g, cloning) may
86 /// be able to use more efficient rebuild steps.
87 ///
88 /// There are a handful of other functions that can be overridden, allowing one
89 /// to avoid traversing nodes that don't need any transformation
90 /// (\c AlreadyTransformed()), force rebuilding AST nodes even when their
91 /// operands have not changed (\c AlwaysRebuild()), and customize the
92 /// default locations and entity names used for type-checking
93 /// (\c getBaseLocation(), \c getBaseEntity()).
94 template<typename Derived>
95 class TreeTransform {
96   /// \brief Private RAII object that helps us forget and then re-remember
97   /// the template argument corresponding to a partially-substituted parameter
98   /// pack.
99   class ForgetPartiallySubstitutedPackRAII {
100     Derived &Self;
101     TemplateArgument Old;
102 
103   public:
104     ForgetPartiallySubstitutedPackRAII(Derived &Self) : Self(Self) {
105       Old = Self.ForgetPartiallySubstitutedPack();
106     }
107 
108     ~ForgetPartiallySubstitutedPackRAII() {
109       Self.RememberPartiallySubstitutedPack(Old);
110     }
111   };
112 
113 protected:
114   Sema &SemaRef;
115 
116   /// \brief The set of local declarations that have been transformed, for
117   /// cases where we are forced to build new declarations within the transformer
118   /// rather than in the subclass (e.g., lambda closure types).
119   llvm::DenseMap<Decl *, Decl *> TransformedLocalDecls;
120 
121 public:
122   /// \brief Initializes a new tree transformer.
123   TreeTransform(Sema &SemaRef) : SemaRef(SemaRef) { }
124 
125   /// \brief Retrieves a reference to the derived class.
126   Derived &getDerived() { return static_cast<Derived&>(*this); }
127 
128   /// \brief Retrieves a reference to the derived class.
129   const Derived &getDerived() const {
130     return static_cast<const Derived&>(*this);
131   }
132 
133   static inline ExprResult Owned(Expr *E) { return E; }
134   static inline StmtResult Owned(Stmt *S) { return S; }
135 
136   /// \brief Retrieves a reference to the semantic analysis object used for
137   /// this tree transform.
138   Sema &getSema() const { return SemaRef; }
139 
140   /// \brief Whether the transformation should always rebuild AST nodes, even
141   /// if none of the children have changed.
142   ///
143   /// Subclasses may override this function to specify when the transformation
144   /// should rebuild all AST nodes.
145   ///
146   /// We must always rebuild all AST nodes when performing variadic template
147   /// pack expansion, in order to avoid violating the AST invariant that each
148   /// statement node appears at most once in its containing declaration.
149   bool AlwaysRebuild() { return SemaRef.ArgumentPackSubstitutionIndex != -1; }
150 
151   /// \brief Returns the location of the entity being transformed, if that
152   /// information was not available elsewhere in the AST.
153   ///
154   /// By default, returns no source-location information. Subclasses can
155   /// provide an alternative implementation that provides better location
156   /// information.
157   SourceLocation getBaseLocation() { return SourceLocation(); }
158 
159   /// \brief Returns the name of the entity being transformed, if that
160   /// information was not available elsewhere in the AST.
161   ///
162   /// By default, returns an empty name. Subclasses can provide an alternative
163   /// implementation with a more precise name.
164   DeclarationName getBaseEntity() { return DeclarationName(); }
165 
166   /// \brief Sets the "base" location and entity when that
167   /// information is known based on another transformation.
168   ///
169   /// By default, the source location and entity are ignored. Subclasses can
170   /// override this function to provide a customized implementation.
171   void setBase(SourceLocation Loc, DeclarationName Entity) { }
172 
173   /// \brief RAII object that temporarily sets the base location and entity
174   /// used for reporting diagnostics in types.
175   class TemporaryBase {
176     TreeTransform &Self;
177     SourceLocation OldLocation;
178     DeclarationName OldEntity;
179 
180   public:
181     TemporaryBase(TreeTransform &Self, SourceLocation Location,
182                   DeclarationName Entity) : Self(Self) {
183       OldLocation = Self.getDerived().getBaseLocation();
184       OldEntity = Self.getDerived().getBaseEntity();
185 
186       if (Location.isValid())
187         Self.getDerived().setBase(Location, Entity);
188     }
189 
190     ~TemporaryBase() {
191       Self.getDerived().setBase(OldLocation, OldEntity);
192     }
193   };
194 
195   /// \brief Determine whether the given type \p T has already been
196   /// transformed.
197   ///
198   /// Subclasses can provide an alternative implementation of this routine
199   /// to short-circuit evaluation when it is known that a given type will
200   /// not change. For example, template instantiation need not traverse
201   /// non-dependent types.
202   bool AlreadyTransformed(QualType T) {
203     return T.isNull();
204   }
205 
206   /// \brief Determine whether the given call argument should be dropped, e.g.,
207   /// because it is a default argument.
208   ///
209   /// Subclasses can provide an alternative implementation of this routine to
210   /// determine which kinds of call arguments get dropped. By default,
211   /// CXXDefaultArgument nodes are dropped (prior to transformation).
212   bool DropCallArgument(Expr *E) {
213     return E->isDefaultArgument();
214   }
215 
216   /// \brief Determine whether we should expand a pack expansion with the
217   /// given set of parameter packs into separate arguments by repeatedly
218   /// transforming the pattern.
219   ///
220   /// By default, the transformer never tries to expand pack expansions.
221   /// Subclasses can override this routine to provide different behavior.
222   ///
223   /// \param EllipsisLoc The location of the ellipsis that identifies the
224   /// pack expansion.
225   ///
226   /// \param PatternRange The source range that covers the entire pattern of
227   /// the pack expansion.
228   ///
229   /// \param Unexpanded The set of unexpanded parameter packs within the
230   /// pattern.
231   ///
232   /// \param ShouldExpand Will be set to \c true if the transformer should
233   /// expand the corresponding pack expansions into separate arguments. When
234   /// set, \c NumExpansions must also be set.
235   ///
236   /// \param RetainExpansion Whether the caller should add an unexpanded
237   /// pack expansion after all of the expanded arguments. This is used
238   /// when extending explicitly-specified template argument packs per
239   /// C++0x [temp.arg.explicit]p9.
240   ///
241   /// \param NumExpansions The number of separate arguments that will be in
242   /// the expanded form of the corresponding pack expansion. This is both an
243   /// input and an output parameter, which can be set by the caller if the
244   /// number of expansions is known a priori (e.g., due to a prior substitution)
245   /// and will be set by the callee when the number of expansions is known.
246   /// The callee must set this value when \c ShouldExpand is \c true; it may
247   /// set this value in other cases.
248   ///
249   /// \returns true if an error occurred (e.g., because the parameter packs
250   /// are to be instantiated with arguments of different lengths), false
251   /// otherwise. If false, \c ShouldExpand (and possibly \c NumExpansions)
252   /// must be set.
253   bool TryExpandParameterPacks(SourceLocation EllipsisLoc,
254                                SourceRange PatternRange,
255                                ArrayRef<UnexpandedParameterPack> Unexpanded,
256                                bool &ShouldExpand,
257                                bool &RetainExpansion,
258                                Optional<unsigned> &NumExpansions) {
259     ShouldExpand = false;
260     return false;
261   }
262 
263   /// \brief "Forget" about the partially-substituted pack template argument,
264   /// when performing an instantiation that must preserve the parameter pack
265   /// use.
266   ///
267   /// This routine is meant to be overridden by the template instantiator.
268   TemplateArgument ForgetPartiallySubstitutedPack() {
269     return TemplateArgument();
270   }
271 
272   /// \brief "Remember" the partially-substituted pack template argument
273   /// after performing an instantiation that must preserve the parameter pack
274   /// use.
275   ///
276   /// This routine is meant to be overridden by the template instantiator.
277   void RememberPartiallySubstitutedPack(TemplateArgument Arg) { }
278 
279   /// \brief Note to the derived class when a function parameter pack is
280   /// being expanded.
281   void ExpandingFunctionParameterPack(ParmVarDecl *Pack) { }
282 
283   /// \brief Transforms the given type into another type.
284   ///
285   /// By default, this routine transforms a type by creating a
286   /// TypeSourceInfo for it and delegating to the appropriate
287   /// function.  This is expensive, but we don't mind, because
288   /// this method is deprecated anyway;  all users should be
289   /// switched to storing TypeSourceInfos.
290   ///
291   /// \returns the transformed type.
292   QualType TransformType(QualType T);
293 
294   /// \brief Transforms the given type-with-location into a new
295   /// type-with-location.
296   ///
297   /// By default, this routine transforms a type by delegating to the
298   /// appropriate TransformXXXType to build a new type.  Subclasses
299   /// may override this function (to take over all type
300   /// transformations) or some set of the TransformXXXType functions
301   /// to alter the transformation.
302   TypeSourceInfo *TransformType(TypeSourceInfo *DI);
303 
304   /// \brief Transform the given type-with-location into a new
305   /// type, collecting location information in the given builder
306   /// as necessary.
307   ///
308   QualType TransformType(TypeLocBuilder &TLB, TypeLoc TL);
309 
310   /// \brief Transform the given statement.
311   ///
312   /// By default, this routine transforms a statement by delegating to the
313   /// appropriate TransformXXXStmt function to transform a specific kind of
314   /// statement or the TransformExpr() function to transform an expression.
315   /// Subclasses may override this function to transform statements using some
316   /// other mechanism.
317   ///
318   /// \returns the transformed statement.
319   StmtResult TransformStmt(Stmt *S);
320 
321   /// \brief Transform the given statement.
322   ///
323   /// By default, this routine transforms a statement by delegating to the
324   /// appropriate TransformOMPXXXClause function to transform a specific kind
325   /// of clause. Subclasses may override this function to transform statements
326   /// using some other mechanism.
327   ///
328   /// \returns the transformed OpenMP clause.
329   OMPClause *TransformOMPClause(OMPClause *S);
330 
331   /// \brief Transform the given attribute.
332   ///
333   /// By default, this routine transforms a statement by delegating to the
334   /// appropriate TransformXXXAttr function to transform a specific kind
335   /// of attribute. Subclasses may override this function to transform
336   /// attributed statements using some other mechanism.
337   ///
338   /// \returns the transformed attribute
339   const Attr *TransformAttr(const Attr *S);
340 
341 /// \brief Transform the specified attribute.
342 ///
343 /// Subclasses should override the transformation of attributes with a pragma
344 /// spelling to transform expressions stored within the attribute.
345 ///
346 /// \returns the transformed attribute.
347 #define ATTR(X)
348 #define PRAGMA_SPELLING_ATTR(X)                                                \
349   const X##Attr *Transform##X##Attr(const X##Attr *R) { return R; }
350 #include "clang/Basic/AttrList.inc"
351 
352   /// \brief Transform the given expression.
353   ///
354   /// By default, this routine transforms an expression by delegating to the
355   /// appropriate TransformXXXExpr function to build a new expression.
356   /// Subclasses may override this function to transform expressions using some
357   /// other mechanism.
358   ///
359   /// \returns the transformed expression.
360   ExprResult TransformExpr(Expr *E);
361 
362   /// \brief Transform the given initializer.
363   ///
364   /// By default, this routine transforms an initializer by stripping off the
365   /// semantic nodes added by initialization, then passing the result to
366   /// TransformExpr or TransformExprs.
367   ///
368   /// \returns the transformed initializer.
369   ExprResult TransformInitializer(Expr *Init, bool NotCopyInit);
370 
371   /// \brief Transform the given list of expressions.
372   ///
373   /// This routine transforms a list of expressions by invoking
374   /// \c TransformExpr() for each subexpression. However, it also provides
375   /// support for variadic templates by expanding any pack expansions (if the
376   /// derived class permits such expansion) along the way. When pack expansions
377   /// are present, the number of outputs may not equal the number of inputs.
378   ///
379   /// \param Inputs The set of expressions to be transformed.
380   ///
381   /// \param NumInputs The number of expressions in \c Inputs.
382   ///
383   /// \param IsCall If \c true, then this transform is being performed on
384   /// function-call arguments, and any arguments that should be dropped, will
385   /// be.
386   ///
387   /// \param Outputs The transformed input expressions will be added to this
388   /// vector.
389   ///
390   /// \param ArgChanged If non-NULL, will be set \c true if any argument changed
391   /// due to transformation.
392   ///
393   /// \returns true if an error occurred, false otherwise.
394   bool TransformExprs(Expr *const *Inputs, unsigned NumInputs, bool IsCall,
395                       SmallVectorImpl<Expr *> &Outputs,
396                       bool *ArgChanged = nullptr);
397 
398   /// \brief Transform the given declaration, which is referenced from a type
399   /// or expression.
400   ///
401   /// By default, acts as the identity function on declarations, unless the
402   /// transformer has had to transform the declaration itself. Subclasses
403   /// may override this function to provide alternate behavior.
404   Decl *TransformDecl(SourceLocation Loc, Decl *D) {
405     llvm::DenseMap<Decl *, Decl *>::iterator Known
406       = TransformedLocalDecls.find(D);
407     if (Known != TransformedLocalDecls.end())
408       return Known->second;
409 
410     return D;
411   }
412 
413   /// \brief Transform the specified condition.
414   ///
415   /// By default, this transforms the variable and expression and rebuilds
416   /// the condition.
417   Sema::ConditionResult TransformCondition(SourceLocation Loc, VarDecl *Var,
418                                            Expr *Expr,
419                                            Sema::ConditionKind Kind);
420 
421   /// \brief Transform the attributes associated with the given declaration and
422   /// place them on the new declaration.
423   ///
424   /// By default, this operation does nothing. Subclasses may override this
425   /// behavior to transform attributes.
426   void transformAttrs(Decl *Old, Decl *New) { }
427 
428   /// \brief Note that a local declaration has been transformed by this
429   /// transformer.
430   ///
431   /// Local declarations are typically transformed via a call to
432   /// TransformDefinition. However, in some cases (e.g., lambda expressions),
433   /// the transformer itself has to transform the declarations. This routine
434   /// can be overridden by a subclass that keeps track of such mappings.
435   void transformedLocalDecl(Decl *Old, Decl *New) {
436     TransformedLocalDecls[Old] = New;
437   }
438 
439   /// \brief Transform the definition of the given declaration.
440   ///
441   /// By default, invokes TransformDecl() to transform the declaration.
442   /// Subclasses may override this function to provide alternate behavior.
443   Decl *TransformDefinition(SourceLocation Loc, Decl *D) {
444     return getDerived().TransformDecl(Loc, D);
445   }
446 
447   /// \brief Transform the given declaration, which was the first part of a
448   /// nested-name-specifier in a member access expression.
449   ///
450   /// This specific declaration transformation only applies to the first
451   /// identifier in a nested-name-specifier of a member access expression, e.g.,
452   /// the \c T in \c x->T::member
453   ///
454   /// By default, invokes TransformDecl() to transform the declaration.
455   /// Subclasses may override this function to provide alternate behavior.
456   NamedDecl *TransformFirstQualifierInScope(NamedDecl *D, SourceLocation Loc) {
457     return cast_or_null<NamedDecl>(getDerived().TransformDecl(Loc, D));
458   }
459 
460   /// \brief Transform the given nested-name-specifier with source-location
461   /// information.
462   ///
463   /// By default, transforms all of the types and declarations within the
464   /// nested-name-specifier. Subclasses may override this function to provide
465   /// alternate behavior.
466   NestedNameSpecifierLoc
467   TransformNestedNameSpecifierLoc(NestedNameSpecifierLoc NNS,
468                                   QualType ObjectType = QualType(),
469                                   NamedDecl *FirstQualifierInScope = nullptr);
470 
471   /// \brief Transform the given declaration name.
472   ///
473   /// By default, transforms the types of conversion function, constructor,
474   /// and destructor names and then (if needed) rebuilds the declaration name.
475   /// Identifiers and selectors are returned unmodified. Sublcasses may
476   /// override this function to provide alternate behavior.
477   DeclarationNameInfo
478   TransformDeclarationNameInfo(const DeclarationNameInfo &NameInfo);
479 
480   /// \brief Transform the given template name.
481   ///
482   /// \param SS The nested-name-specifier that qualifies the template
483   /// name. This nested-name-specifier must already have been transformed.
484   ///
485   /// \param Name The template name to transform.
486   ///
487   /// \param NameLoc The source location of the template name.
488   ///
489   /// \param ObjectType If we're translating a template name within a member
490   /// access expression, this is the type of the object whose member template
491   /// is being referenced.
492   ///
493   /// \param FirstQualifierInScope If the first part of a nested-name-specifier
494   /// also refers to a name within the current (lexical) scope, this is the
495   /// declaration it refers to.
496   ///
497   /// By default, transforms the template name by transforming the declarations
498   /// and nested-name-specifiers that occur within the template name.
499   /// Subclasses may override this function to provide alternate behavior.
500   TemplateName
501   TransformTemplateName(CXXScopeSpec &SS, TemplateName Name,
502                         SourceLocation NameLoc,
503                         QualType ObjectType = QualType(),
504                         NamedDecl *FirstQualifierInScope = nullptr);
505 
506   /// \brief Transform the given template argument.
507   ///
508   /// By default, this operation transforms the type, expression, or
509   /// declaration stored within the template argument and constructs a
510   /// new template argument from the transformed result. Subclasses may
511   /// override this function to provide alternate behavior.
512   ///
513   /// Returns true if there was an error.
514   bool TransformTemplateArgument(const TemplateArgumentLoc &Input,
515                                  TemplateArgumentLoc &Output,
516                                  bool Uneval = false);
517 
518   /// \brief Transform the given set of template arguments.
519   ///
520   /// By default, this operation transforms all of the template arguments
521   /// in the input set using \c TransformTemplateArgument(), and appends
522   /// the transformed arguments to the output list.
523   ///
524   /// Note that this overload of \c TransformTemplateArguments() is merely
525   /// a convenience function. Subclasses that wish to override this behavior
526   /// should override the iterator-based member template version.
527   ///
528   /// \param Inputs The set of template arguments to be transformed.
529   ///
530   /// \param NumInputs The number of template arguments in \p Inputs.
531   ///
532   /// \param Outputs The set of transformed template arguments output by this
533   /// routine.
534   ///
535   /// Returns true if an error occurred.
536   bool TransformTemplateArguments(const TemplateArgumentLoc *Inputs,
537                                   unsigned NumInputs,
538                                   TemplateArgumentListInfo &Outputs,
539                                   bool Uneval = false) {
540     return TransformTemplateArguments(Inputs, Inputs + NumInputs, Outputs,
541                                       Uneval);
542   }
543 
544   /// \brief Transform the given set of template arguments.
545   ///
546   /// By default, this operation transforms all of the template arguments
547   /// in the input set using \c TransformTemplateArgument(), and appends
548   /// the transformed arguments to the output list.
549   ///
550   /// \param First An iterator to the first template argument.
551   ///
552   /// \param Last An iterator one step past the last template argument.
553   ///
554   /// \param Outputs The set of transformed template arguments output by this
555   /// routine.
556   ///
557   /// Returns true if an error occurred.
558   template<typename InputIterator>
559   bool TransformTemplateArguments(InputIterator First,
560                                   InputIterator Last,
561                                   TemplateArgumentListInfo &Outputs,
562                                   bool Uneval = false);
563 
564   /// \brief Fakes up a TemplateArgumentLoc for a given TemplateArgument.
565   void InventTemplateArgumentLoc(const TemplateArgument &Arg,
566                                  TemplateArgumentLoc &ArgLoc);
567 
568   /// \brief Fakes up a TypeSourceInfo for a type.
569   TypeSourceInfo *InventTypeSourceInfo(QualType T) {
570     return SemaRef.Context.getTrivialTypeSourceInfo(T,
571                        getDerived().getBaseLocation());
572   }
573 
574 #define ABSTRACT_TYPELOC(CLASS, PARENT)
575 #define TYPELOC(CLASS, PARENT)                                   \
576   QualType Transform##CLASS##Type(TypeLocBuilder &TLB, CLASS##TypeLoc T);
577 #include "clang/AST/TypeLocNodes.def"
578 
579   template<typename Fn>
580   QualType TransformFunctionProtoType(TypeLocBuilder &TLB,
581                                       FunctionProtoTypeLoc TL,
582                                       CXXRecordDecl *ThisContext,
583                                       unsigned ThisTypeQuals,
584                                       Fn TransformExceptionSpec);
585 
586   bool TransformExceptionSpec(SourceLocation Loc,
587                               FunctionProtoType::ExceptionSpecInfo &ESI,
588                               SmallVectorImpl<QualType> &Exceptions,
589                               bool &Changed);
590 
591   StmtResult TransformSEHHandler(Stmt *Handler);
592 
593   QualType
594   TransformTemplateSpecializationType(TypeLocBuilder &TLB,
595                                       TemplateSpecializationTypeLoc TL,
596                                       TemplateName Template);
597 
598   QualType
599   TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB,
600                                       DependentTemplateSpecializationTypeLoc TL,
601                                                TemplateName Template,
602                                                CXXScopeSpec &SS);
603 
604   QualType TransformDependentTemplateSpecializationType(
605       TypeLocBuilder &TLB, DependentTemplateSpecializationTypeLoc TL,
606       NestedNameSpecifierLoc QualifierLoc);
607 
608   /// \brief Transforms the parameters of a function type into the
609   /// given vectors.
610   ///
611   /// The result vectors should be kept in sync; null entries in the
612   /// variables vector are acceptable.
613   ///
614   /// Return true on error.
615   bool TransformFunctionTypeParams(
616       SourceLocation Loc, ArrayRef<ParmVarDecl *> Params,
617       const QualType *ParamTypes,
618       const FunctionProtoType::ExtParameterInfo *ParamInfos,
619       SmallVectorImpl<QualType> &PTypes, SmallVectorImpl<ParmVarDecl *> *PVars,
620       Sema::ExtParameterInfoBuilder &PInfos);
621 
622   /// \brief Transforms a single function-type parameter.  Return null
623   /// on error.
624   ///
625   /// \param indexAdjustment - A number to add to the parameter's
626   ///   scope index;  can be negative
627   ParmVarDecl *TransformFunctionTypeParam(ParmVarDecl *OldParm,
628                                           int indexAdjustment,
629                                           Optional<unsigned> NumExpansions,
630                                           bool ExpectParameterPack);
631 
632   QualType TransformReferenceType(TypeLocBuilder &TLB, ReferenceTypeLoc TL);
633 
634   StmtResult TransformCompoundStmt(CompoundStmt *S, bool IsStmtExpr);
635   ExprResult TransformCXXNamedCastExpr(CXXNamedCastExpr *E);
636 
637   TemplateParameterList *TransformTemplateParameterList(
638         TemplateParameterList *TPL) {
639     return TPL;
640   }
641 
642   ExprResult TransformAddressOfOperand(Expr *E);
643 
644   ExprResult TransformDependentScopeDeclRefExpr(DependentScopeDeclRefExpr *E,
645                                                 bool IsAddressOfOperand,
646                                                 TypeSourceInfo **RecoveryTSI);
647 
648   ExprResult TransformParenDependentScopeDeclRefExpr(
649       ParenExpr *PE, DependentScopeDeclRefExpr *DRE, bool IsAddressOfOperand,
650       TypeSourceInfo **RecoveryTSI);
651 
652   StmtResult TransformOMPExecutableDirective(OMPExecutableDirective *S);
653 
654 // FIXME: We use LLVM_ATTRIBUTE_NOINLINE because inlining causes a ridiculous
655 // amount of stack usage with clang.
656 #define STMT(Node, Parent)                        \
657   LLVM_ATTRIBUTE_NOINLINE \
658   StmtResult Transform##Node(Node *S);
659 #define EXPR(Node, Parent)                        \
660   LLVM_ATTRIBUTE_NOINLINE \
661   ExprResult Transform##Node(Node *E);
662 #define ABSTRACT_STMT(Stmt)
663 #include "clang/AST/StmtNodes.inc"
664 
665 #define OPENMP_CLAUSE(Name, Class)                        \
666   LLVM_ATTRIBUTE_NOINLINE \
667   OMPClause *Transform ## Class(Class *S);
668 #include "clang/Basic/OpenMPKinds.def"
669 
670   /// \brief Build a new pointer type given its pointee type.
671   ///
672   /// By default, performs semantic analysis when building the pointer type.
673   /// Subclasses may override this routine to provide different behavior.
674   QualType RebuildPointerType(QualType PointeeType, SourceLocation Sigil);
675 
676   /// \brief Build a new block pointer type given its pointee type.
677   ///
678   /// By default, performs semantic analysis when building the block pointer
679   /// type. Subclasses may override this routine to provide different behavior.
680   QualType RebuildBlockPointerType(QualType PointeeType, SourceLocation Sigil);
681 
682   /// \brief Build a new reference type given the type it references.
683   ///
684   /// By default, performs semantic analysis when building the
685   /// reference type. Subclasses may override this routine to provide
686   /// different behavior.
687   ///
688   /// \param LValue whether the type was written with an lvalue sigil
689   /// or an rvalue sigil.
690   QualType RebuildReferenceType(QualType ReferentType,
691                                 bool LValue,
692                                 SourceLocation Sigil);
693 
694   /// \brief Build a new member pointer type given the pointee type and the
695   /// class type it refers into.
696   ///
697   /// By default, performs semantic analysis when building the member pointer
698   /// type. Subclasses may override this routine to provide different behavior.
699   QualType RebuildMemberPointerType(QualType PointeeType, QualType ClassType,
700                                     SourceLocation Sigil);
701 
702   QualType RebuildObjCTypeParamType(const ObjCTypeParamDecl *Decl,
703                                     SourceLocation ProtocolLAngleLoc,
704                                     ArrayRef<ObjCProtocolDecl *> Protocols,
705                                     ArrayRef<SourceLocation> ProtocolLocs,
706                                     SourceLocation ProtocolRAngleLoc);
707 
708   /// \brief Build an Objective-C object type.
709   ///
710   /// By default, performs semantic analysis when building the object type.
711   /// Subclasses may override this routine to provide different behavior.
712   QualType RebuildObjCObjectType(QualType BaseType,
713                                  SourceLocation Loc,
714                                  SourceLocation TypeArgsLAngleLoc,
715                                  ArrayRef<TypeSourceInfo *> TypeArgs,
716                                  SourceLocation TypeArgsRAngleLoc,
717                                  SourceLocation ProtocolLAngleLoc,
718                                  ArrayRef<ObjCProtocolDecl *> Protocols,
719                                  ArrayRef<SourceLocation> ProtocolLocs,
720                                  SourceLocation ProtocolRAngleLoc);
721 
722   /// \brief Build a new Objective-C object pointer type given the pointee type.
723   ///
724   /// By default, directly builds the pointer type, with no additional semantic
725   /// analysis.
726   QualType RebuildObjCObjectPointerType(QualType PointeeType,
727                                         SourceLocation Star);
728 
729   /// \brief Build a new array type given the element type, size
730   /// modifier, size of the array (if known), size expression, and index type
731   /// qualifiers.
732   ///
733   /// By default, performs semantic analysis when building the array type.
734   /// Subclasses may override this routine to provide different behavior.
735   /// Also by default, all of the other Rebuild*Array
736   QualType RebuildArrayType(QualType ElementType,
737                             ArrayType::ArraySizeModifier SizeMod,
738                             const llvm::APInt *Size,
739                             Expr *SizeExpr,
740                             unsigned IndexTypeQuals,
741                             SourceRange BracketsRange);
742 
743   /// \brief Build a new constant array type given the element type, size
744   /// modifier, (known) size of the array, and index type qualifiers.
745   ///
746   /// By default, performs semantic analysis when building the array type.
747   /// Subclasses may override this routine to provide different behavior.
748   QualType RebuildConstantArrayType(QualType ElementType,
749                                     ArrayType::ArraySizeModifier SizeMod,
750                                     const llvm::APInt &Size,
751                                     unsigned IndexTypeQuals,
752                                     SourceRange BracketsRange);
753 
754   /// \brief Build a new incomplete array type given the element type, size
755   /// modifier, and index type qualifiers.
756   ///
757   /// By default, performs semantic analysis when building the array type.
758   /// Subclasses may override this routine to provide different behavior.
759   QualType RebuildIncompleteArrayType(QualType ElementType,
760                                       ArrayType::ArraySizeModifier SizeMod,
761                                       unsigned IndexTypeQuals,
762                                       SourceRange BracketsRange);
763 
764   /// \brief Build a new variable-length array type given the element type,
765   /// size modifier, size expression, and index type qualifiers.
766   ///
767   /// By default, performs semantic analysis when building the array type.
768   /// Subclasses may override this routine to provide different behavior.
769   QualType RebuildVariableArrayType(QualType ElementType,
770                                     ArrayType::ArraySizeModifier SizeMod,
771                                     Expr *SizeExpr,
772                                     unsigned IndexTypeQuals,
773                                     SourceRange BracketsRange);
774 
775   /// \brief Build a new dependent-sized array type given the element type,
776   /// size modifier, size expression, and index type qualifiers.
777   ///
778   /// By default, performs semantic analysis when building the array type.
779   /// Subclasses may override this routine to provide different behavior.
780   QualType RebuildDependentSizedArrayType(QualType ElementType,
781                                           ArrayType::ArraySizeModifier SizeMod,
782                                           Expr *SizeExpr,
783                                           unsigned IndexTypeQuals,
784                                           SourceRange BracketsRange);
785 
786   /// \brief Build a new vector type given the element type and
787   /// number of elements.
788   ///
789   /// By default, performs semantic analysis when building the vector type.
790   /// Subclasses may override this routine to provide different behavior.
791   QualType RebuildVectorType(QualType ElementType, unsigned NumElements,
792                              VectorType::VectorKind VecKind);
793 
794   /// \brief Build a new extended vector type given the element type and
795   /// number of elements.
796   ///
797   /// By default, performs semantic analysis when building the vector type.
798   /// Subclasses may override this routine to provide different behavior.
799   QualType RebuildExtVectorType(QualType ElementType, unsigned NumElements,
800                                 SourceLocation AttributeLoc);
801 
802   /// \brief Build a new potentially dependently-sized extended vector type
803   /// given the element type and number of elements.
804   ///
805   /// By default, performs semantic analysis when building the vector type.
806   /// Subclasses may override this routine to provide different behavior.
807   QualType RebuildDependentSizedExtVectorType(QualType ElementType,
808                                               Expr *SizeExpr,
809                                               SourceLocation AttributeLoc);
810 
811   /// \brief Build a new function type.
812   ///
813   /// By default, performs semantic analysis when building the function type.
814   /// Subclasses may override this routine to provide different behavior.
815   QualType RebuildFunctionProtoType(QualType T,
816                                     MutableArrayRef<QualType> ParamTypes,
817                                     const FunctionProtoType::ExtProtoInfo &EPI);
818 
819   /// \brief Build a new unprototyped function type.
820   QualType RebuildFunctionNoProtoType(QualType ResultType);
821 
822   /// \brief Rebuild an unresolved typename type, given the decl that
823   /// the UnresolvedUsingTypenameDecl was transformed to.
824   QualType RebuildUnresolvedUsingType(Decl *D);
825 
826   /// \brief Build a new typedef type.
827   QualType RebuildTypedefType(TypedefNameDecl *Typedef) {
828     return SemaRef.Context.getTypeDeclType(Typedef);
829   }
830 
831   /// \brief Build a new class/struct/union type.
832   QualType RebuildRecordType(RecordDecl *Record) {
833     return SemaRef.Context.getTypeDeclType(Record);
834   }
835 
836   /// \brief Build a new Enum type.
837   QualType RebuildEnumType(EnumDecl *Enum) {
838     return SemaRef.Context.getTypeDeclType(Enum);
839   }
840 
841   /// \brief Build a new typeof(expr) type.
842   ///
843   /// By default, performs semantic analysis when building the typeof type.
844   /// Subclasses may override this routine to provide different behavior.
845   QualType RebuildTypeOfExprType(Expr *Underlying, SourceLocation Loc);
846 
847   /// \brief Build a new typeof(type) type.
848   ///
849   /// By default, builds a new TypeOfType with the given underlying type.
850   QualType RebuildTypeOfType(QualType Underlying);
851 
852   /// \brief Build a new unary transform type.
853   QualType RebuildUnaryTransformType(QualType BaseType,
854                                      UnaryTransformType::UTTKind UKind,
855                                      SourceLocation Loc);
856 
857   /// \brief Build a new C++11 decltype type.
858   ///
859   /// By default, performs semantic analysis when building the decltype type.
860   /// Subclasses may override this routine to provide different behavior.
861   QualType RebuildDecltypeType(Expr *Underlying, SourceLocation Loc);
862 
863   /// \brief Build a new C++11 auto type.
864   ///
865   /// By default, builds a new AutoType with the given deduced type.
866   QualType RebuildAutoType(QualType Deduced, AutoTypeKeyword Keyword) {
867     // Note, IsDependent is always false here: we implicitly convert an 'auto'
868     // which has been deduced to a dependent type into an undeduced 'auto', so
869     // that we'll retry deduction after the transformation.
870     return SemaRef.Context.getAutoType(Deduced, Keyword,
871                                        /*IsDependent*/ false);
872   }
873 
874   /// \brief Build a new template specialization type.
875   ///
876   /// By default, performs semantic analysis when building the template
877   /// specialization type. Subclasses may override this routine to provide
878   /// different behavior.
879   QualType RebuildTemplateSpecializationType(TemplateName Template,
880                                              SourceLocation TemplateLoc,
881                                              TemplateArgumentListInfo &Args);
882 
883   /// \brief Build a new parenthesized type.
884   ///
885   /// By default, builds a new ParenType type from the inner type.
886   /// Subclasses may override this routine to provide different behavior.
887   QualType RebuildParenType(QualType InnerType) {
888     return SemaRef.Context.getParenType(InnerType);
889   }
890 
891   /// \brief Build a new qualified name type.
892   ///
893   /// By default, builds a new ElaboratedType type from the keyword,
894   /// the nested-name-specifier and the named type.
895   /// Subclasses may override this routine to provide different behavior.
896   QualType RebuildElaboratedType(SourceLocation KeywordLoc,
897                                  ElaboratedTypeKeyword Keyword,
898                                  NestedNameSpecifierLoc QualifierLoc,
899                                  QualType Named) {
900     return SemaRef.Context.getElaboratedType(Keyword,
901                                          QualifierLoc.getNestedNameSpecifier(),
902                                              Named);
903   }
904 
905   /// \brief Build a new typename type that refers to a template-id.
906   ///
907   /// By default, builds a new DependentNameType type from the
908   /// nested-name-specifier and the given type. Subclasses may override
909   /// this routine to provide different behavior.
910   QualType RebuildDependentTemplateSpecializationType(
911                                           ElaboratedTypeKeyword Keyword,
912                                           NestedNameSpecifierLoc QualifierLoc,
913                                           const IdentifierInfo *Name,
914                                           SourceLocation NameLoc,
915                                           TemplateArgumentListInfo &Args) {
916     // Rebuild the template name.
917     // TODO: avoid TemplateName abstraction
918     CXXScopeSpec SS;
919     SS.Adopt(QualifierLoc);
920     TemplateName InstName
921       = getDerived().RebuildTemplateName(SS, *Name, NameLoc, QualType(),
922                                          nullptr);
923 
924     if (InstName.isNull())
925       return QualType();
926 
927     // If it's still dependent, make a dependent specialization.
928     if (InstName.getAsDependentTemplateName())
929       return SemaRef.Context.getDependentTemplateSpecializationType(Keyword,
930                                           QualifierLoc.getNestedNameSpecifier(),
931                                                                     Name,
932                                                                     Args);
933 
934     // Otherwise, make an elaborated type wrapping a non-dependent
935     // specialization.
936     QualType T =
937     getDerived().RebuildTemplateSpecializationType(InstName, NameLoc, Args);
938     if (T.isNull()) return QualType();
939 
940     if (Keyword == ETK_None && QualifierLoc.getNestedNameSpecifier() == nullptr)
941       return T;
942 
943     return SemaRef.Context.getElaboratedType(Keyword,
944                                        QualifierLoc.getNestedNameSpecifier(),
945                                              T);
946   }
947 
948   /// \brief Build a new typename type that refers to an identifier.
949   ///
950   /// By default, performs semantic analysis when building the typename type
951   /// (or elaborated type). Subclasses may override this routine to provide
952   /// different behavior.
953   QualType RebuildDependentNameType(ElaboratedTypeKeyword Keyword,
954                                     SourceLocation KeywordLoc,
955                                     NestedNameSpecifierLoc QualifierLoc,
956                                     const IdentifierInfo *Id,
957                                     SourceLocation IdLoc) {
958     CXXScopeSpec SS;
959     SS.Adopt(QualifierLoc);
960 
961     if (QualifierLoc.getNestedNameSpecifier()->isDependent()) {
962       // If the name is still dependent, just build a new dependent name type.
963       if (!SemaRef.computeDeclContext(SS))
964         return SemaRef.Context.getDependentNameType(Keyword,
965                                           QualifierLoc.getNestedNameSpecifier(),
966                                                     Id);
967     }
968 
969     if (Keyword == ETK_None || Keyword == ETK_Typename)
970       return SemaRef.CheckTypenameType(Keyword, KeywordLoc, QualifierLoc,
971                                        *Id, IdLoc);
972 
973     TagTypeKind Kind = TypeWithKeyword::getTagTypeKindForKeyword(Keyword);
974 
975     // We had a dependent elaborated-type-specifier that has been transformed
976     // into a non-dependent elaborated-type-specifier. Find the tag we're
977     // referring to.
978     LookupResult Result(SemaRef, Id, IdLoc, Sema::LookupTagName);
979     DeclContext *DC = SemaRef.computeDeclContext(SS, false);
980     if (!DC)
981       return QualType();
982 
983     if (SemaRef.RequireCompleteDeclContext(SS, DC))
984       return QualType();
985 
986     TagDecl *Tag = nullptr;
987     SemaRef.LookupQualifiedName(Result, DC);
988     switch (Result.getResultKind()) {
989       case LookupResult::NotFound:
990       case LookupResult::NotFoundInCurrentInstantiation:
991         break;
992 
993       case LookupResult::Found:
994         Tag = Result.getAsSingle<TagDecl>();
995         break;
996 
997       case LookupResult::FoundOverloaded:
998       case LookupResult::FoundUnresolvedValue:
999         llvm_unreachable("Tag lookup cannot find non-tags");
1000 
1001       case LookupResult::Ambiguous:
1002         // Let the LookupResult structure handle ambiguities.
1003         return QualType();
1004     }
1005 
1006     if (!Tag) {
1007       // Check where the name exists but isn't a tag type and use that to emit
1008       // better diagnostics.
1009       LookupResult Result(SemaRef, Id, IdLoc, Sema::LookupTagName);
1010       SemaRef.LookupQualifiedName(Result, DC);
1011       switch (Result.getResultKind()) {
1012         case LookupResult::Found:
1013         case LookupResult::FoundOverloaded:
1014         case LookupResult::FoundUnresolvedValue: {
1015           NamedDecl *SomeDecl = Result.getRepresentativeDecl();
1016           Sema::NonTagKind NTK = SemaRef.getNonTagTypeDeclKind(SomeDecl, Kind);
1017           SemaRef.Diag(IdLoc, diag::err_tag_reference_non_tag) << SomeDecl
1018                                                                << NTK << Kind;
1019           SemaRef.Diag(SomeDecl->getLocation(), diag::note_declared_at);
1020           break;
1021         }
1022         default:
1023           SemaRef.Diag(IdLoc, diag::err_not_tag_in_scope)
1024               << Kind << Id << DC << QualifierLoc.getSourceRange();
1025           break;
1026       }
1027       return QualType();
1028     }
1029 
1030     if (!SemaRef.isAcceptableTagRedeclaration(Tag, Kind, /*isDefinition*/false,
1031                                               IdLoc, Id)) {
1032       SemaRef.Diag(KeywordLoc, diag::err_use_with_wrong_tag) << Id;
1033       SemaRef.Diag(Tag->getLocation(), diag::note_previous_use);
1034       return QualType();
1035     }
1036 
1037     // Build the elaborated-type-specifier type.
1038     QualType T = SemaRef.Context.getTypeDeclType(Tag);
1039     return SemaRef.Context.getElaboratedType(Keyword,
1040                                          QualifierLoc.getNestedNameSpecifier(),
1041                                              T);
1042   }
1043 
1044   /// \brief Build a new pack expansion type.
1045   ///
1046   /// By default, builds a new PackExpansionType type from the given pattern.
1047   /// Subclasses may override this routine to provide different behavior.
1048   QualType RebuildPackExpansionType(QualType Pattern,
1049                                     SourceRange PatternRange,
1050                                     SourceLocation EllipsisLoc,
1051                                     Optional<unsigned> NumExpansions) {
1052     return getSema().CheckPackExpansion(Pattern, PatternRange, EllipsisLoc,
1053                                         NumExpansions);
1054   }
1055 
1056   /// \brief Build a new atomic type given its value type.
1057   ///
1058   /// By default, performs semantic analysis when building the atomic type.
1059   /// Subclasses may override this routine to provide different behavior.
1060   QualType RebuildAtomicType(QualType ValueType, SourceLocation KWLoc);
1061 
1062   /// \brief Build a new pipe type given its value type.
1063   QualType RebuildPipeType(QualType ValueType, SourceLocation KWLoc,
1064                            bool isReadPipe);
1065 
1066   /// \brief Build a new template name given a nested name specifier, a flag
1067   /// indicating whether the "template" keyword was provided, and the template
1068   /// that the template name refers to.
1069   ///
1070   /// By default, builds the new template name directly. Subclasses may override
1071   /// this routine to provide different behavior.
1072   TemplateName RebuildTemplateName(CXXScopeSpec &SS,
1073                                    bool TemplateKW,
1074                                    TemplateDecl *Template);
1075 
1076   /// \brief Build a new template name given a nested name specifier and the
1077   /// name that is referred to as a template.
1078   ///
1079   /// By default, performs semantic analysis to determine whether the name can
1080   /// be resolved to a specific template, then builds the appropriate kind of
1081   /// template name. Subclasses may override this routine to provide different
1082   /// behavior.
1083   TemplateName RebuildTemplateName(CXXScopeSpec &SS,
1084                                    const IdentifierInfo &Name,
1085                                    SourceLocation NameLoc,
1086                                    QualType ObjectType,
1087                                    NamedDecl *FirstQualifierInScope);
1088 
1089   /// \brief Build a new template name given a nested name specifier and the
1090   /// overloaded operator name that is referred to as a template.
1091   ///
1092   /// By default, performs semantic analysis to determine whether the name can
1093   /// be resolved to a specific template, then builds the appropriate kind of
1094   /// template name. Subclasses may override this routine to provide different
1095   /// behavior.
1096   TemplateName RebuildTemplateName(CXXScopeSpec &SS,
1097                                    OverloadedOperatorKind Operator,
1098                                    SourceLocation NameLoc,
1099                                    QualType ObjectType);
1100 
1101   /// \brief Build a new template name given a template template parameter pack
1102   /// and the
1103   ///
1104   /// By default, performs semantic analysis to determine whether the name can
1105   /// be resolved to a specific template, then builds the appropriate kind of
1106   /// template name. Subclasses may override this routine to provide different
1107   /// behavior.
1108   TemplateName RebuildTemplateName(TemplateTemplateParmDecl *Param,
1109                                    const TemplateArgument &ArgPack) {
1110     return getSema().Context.getSubstTemplateTemplateParmPack(Param, ArgPack);
1111   }
1112 
1113   /// \brief Build a new compound statement.
1114   ///
1115   /// By default, performs semantic analysis to build the new statement.
1116   /// Subclasses may override this routine to provide different behavior.
1117   StmtResult RebuildCompoundStmt(SourceLocation LBraceLoc,
1118                                        MultiStmtArg Statements,
1119                                        SourceLocation RBraceLoc,
1120                                        bool IsStmtExpr) {
1121     return getSema().ActOnCompoundStmt(LBraceLoc, RBraceLoc, Statements,
1122                                        IsStmtExpr);
1123   }
1124 
1125   /// \brief Build a new case statement.
1126   ///
1127   /// By default, performs semantic analysis to build the new statement.
1128   /// Subclasses may override this routine to provide different behavior.
1129   StmtResult RebuildCaseStmt(SourceLocation CaseLoc,
1130                                    Expr *LHS,
1131                                    SourceLocation EllipsisLoc,
1132                                    Expr *RHS,
1133                                    SourceLocation ColonLoc) {
1134     return getSema().ActOnCaseStmt(CaseLoc, LHS, EllipsisLoc, RHS,
1135                                    ColonLoc);
1136   }
1137 
1138   /// \brief Attach the body to a new case statement.
1139   ///
1140   /// By default, performs semantic analysis to build the new statement.
1141   /// Subclasses may override this routine to provide different behavior.
1142   StmtResult RebuildCaseStmtBody(Stmt *S, Stmt *Body) {
1143     getSema().ActOnCaseStmtBody(S, Body);
1144     return S;
1145   }
1146 
1147   /// \brief Build a new default statement.
1148   ///
1149   /// By default, performs semantic analysis to build the new statement.
1150   /// Subclasses may override this routine to provide different behavior.
1151   StmtResult RebuildDefaultStmt(SourceLocation DefaultLoc,
1152                                       SourceLocation ColonLoc,
1153                                       Stmt *SubStmt) {
1154     return getSema().ActOnDefaultStmt(DefaultLoc, ColonLoc, SubStmt,
1155                                       /*CurScope=*/nullptr);
1156   }
1157 
1158   /// \brief Build a new label statement.
1159   ///
1160   /// By default, performs semantic analysis to build the new statement.
1161   /// Subclasses may override this routine to provide different behavior.
1162   StmtResult RebuildLabelStmt(SourceLocation IdentLoc, LabelDecl *L,
1163                               SourceLocation ColonLoc, Stmt *SubStmt) {
1164     return SemaRef.ActOnLabelStmt(IdentLoc, L, ColonLoc, SubStmt);
1165   }
1166 
1167   /// \brief Build a new label statement.
1168   ///
1169   /// By default, performs semantic analysis to build the new statement.
1170   /// Subclasses may override this routine to provide different behavior.
1171   StmtResult RebuildAttributedStmt(SourceLocation AttrLoc,
1172                                    ArrayRef<const Attr*> Attrs,
1173                                    Stmt *SubStmt) {
1174     return SemaRef.ActOnAttributedStmt(AttrLoc, Attrs, SubStmt);
1175   }
1176 
1177   /// \brief Build a new "if" statement.
1178   ///
1179   /// By default, performs semantic analysis to build the new statement.
1180   /// Subclasses may override this routine to provide different behavior.
1181   StmtResult RebuildIfStmt(SourceLocation IfLoc, bool IsConstexpr,
1182                            Sema::ConditionResult Cond, Stmt *Init, Stmt *Then,
1183                            SourceLocation ElseLoc, Stmt *Else) {
1184     return getSema().ActOnIfStmt(IfLoc, IsConstexpr, Init, Cond, Then,
1185                                  ElseLoc, Else);
1186   }
1187 
1188   /// \brief Start building a new switch statement.
1189   ///
1190   /// By default, performs semantic analysis to build the new statement.
1191   /// Subclasses may override this routine to provide different behavior.
1192   StmtResult RebuildSwitchStmtStart(SourceLocation SwitchLoc, Stmt *Init,
1193                                     Sema::ConditionResult Cond) {
1194     return getSema().ActOnStartOfSwitchStmt(SwitchLoc, Init, Cond);
1195   }
1196 
1197   /// \brief Attach the body to the switch statement.
1198   ///
1199   /// By default, performs semantic analysis to build the new statement.
1200   /// Subclasses may override this routine to provide different behavior.
1201   StmtResult RebuildSwitchStmtBody(SourceLocation SwitchLoc,
1202                                    Stmt *Switch, Stmt *Body) {
1203     return getSema().ActOnFinishSwitchStmt(SwitchLoc, Switch, Body);
1204   }
1205 
1206   /// \brief Build a new while statement.
1207   ///
1208   /// By default, performs semantic analysis to build the new statement.
1209   /// Subclasses may override this routine to provide different behavior.
1210   StmtResult RebuildWhileStmt(SourceLocation WhileLoc,
1211                               Sema::ConditionResult Cond, Stmt *Body) {
1212     return getSema().ActOnWhileStmt(WhileLoc, Cond, Body);
1213   }
1214 
1215   /// \brief Build a new do-while 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 RebuildDoStmt(SourceLocation DoLoc, Stmt *Body,
1220                            SourceLocation WhileLoc, SourceLocation LParenLoc,
1221                            Expr *Cond, SourceLocation RParenLoc) {
1222     return getSema().ActOnDoStmt(DoLoc, Body, WhileLoc, LParenLoc,
1223                                  Cond, RParenLoc);
1224   }
1225 
1226   /// \brief Build a new for statement.
1227   ///
1228   /// By default, performs semantic analysis to build the new statement.
1229   /// Subclasses may override this routine to provide different behavior.
1230   StmtResult RebuildForStmt(SourceLocation ForLoc, SourceLocation LParenLoc,
1231                             Stmt *Init, Sema::ConditionResult Cond,
1232                             Sema::FullExprArg Inc, SourceLocation RParenLoc,
1233                             Stmt *Body) {
1234     return getSema().ActOnForStmt(ForLoc, LParenLoc, Init, Cond,
1235                                   Inc, RParenLoc, Body);
1236   }
1237 
1238   /// \brief Build a new goto statement.
1239   ///
1240   /// By default, performs semantic analysis to build the new statement.
1241   /// Subclasses may override this routine to provide different behavior.
1242   StmtResult RebuildGotoStmt(SourceLocation GotoLoc, SourceLocation LabelLoc,
1243                              LabelDecl *Label) {
1244     return getSema().ActOnGotoStmt(GotoLoc, LabelLoc, Label);
1245   }
1246 
1247   /// \brief Build a new indirect goto statement.
1248   ///
1249   /// By default, performs semantic analysis to build the new statement.
1250   /// Subclasses may override this routine to provide different behavior.
1251   StmtResult RebuildIndirectGotoStmt(SourceLocation GotoLoc,
1252                                      SourceLocation StarLoc,
1253                                      Expr *Target) {
1254     return getSema().ActOnIndirectGotoStmt(GotoLoc, StarLoc, Target);
1255   }
1256 
1257   /// \brief Build a new return statement.
1258   ///
1259   /// By default, performs semantic analysis to build the new statement.
1260   /// Subclasses may override this routine to provide different behavior.
1261   StmtResult RebuildReturnStmt(SourceLocation ReturnLoc, Expr *Result) {
1262     return getSema().BuildReturnStmt(ReturnLoc, Result);
1263   }
1264 
1265   /// \brief Build a new declaration 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 RebuildDeclStmt(MutableArrayRef<Decl *> Decls,
1270                              SourceLocation StartLoc, SourceLocation EndLoc) {
1271     Sema::DeclGroupPtrTy DG = getSema().BuildDeclaratorGroup(Decls);
1272     return getSema().ActOnDeclStmt(DG, StartLoc, EndLoc);
1273   }
1274 
1275   /// \brief Build a new inline asm statement.
1276   ///
1277   /// By default, performs semantic analysis to build the new statement.
1278   /// Subclasses may override this routine to provide different behavior.
1279   StmtResult RebuildGCCAsmStmt(SourceLocation AsmLoc, bool IsSimple,
1280                                bool IsVolatile, unsigned NumOutputs,
1281                                unsigned NumInputs, IdentifierInfo **Names,
1282                                MultiExprArg Constraints, MultiExprArg Exprs,
1283                                Expr *AsmString, MultiExprArg Clobbers,
1284                                SourceLocation RParenLoc) {
1285     return getSema().ActOnGCCAsmStmt(AsmLoc, IsSimple, IsVolatile, NumOutputs,
1286                                      NumInputs, Names, Constraints, Exprs,
1287                                      AsmString, Clobbers, RParenLoc);
1288   }
1289 
1290   /// \brief Build a new MS style inline asm statement.
1291   ///
1292   /// By default, performs semantic analysis to build the new statement.
1293   /// Subclasses may override this routine to provide different behavior.
1294   StmtResult RebuildMSAsmStmt(SourceLocation AsmLoc, SourceLocation LBraceLoc,
1295                               ArrayRef<Token> AsmToks,
1296                               StringRef AsmString,
1297                               unsigned NumOutputs, unsigned NumInputs,
1298                               ArrayRef<StringRef> Constraints,
1299                               ArrayRef<StringRef> Clobbers,
1300                               ArrayRef<Expr*> Exprs,
1301                               SourceLocation EndLoc) {
1302     return getSema().ActOnMSAsmStmt(AsmLoc, LBraceLoc, AsmToks, AsmString,
1303                                     NumOutputs, NumInputs,
1304                                     Constraints, Clobbers, Exprs, EndLoc);
1305   }
1306 
1307   /// \brief Build a new co_return statement.
1308   ///
1309   /// By default, performs semantic analysis to build the new statement.
1310   /// Subclasses may override this routine to provide different behavior.
1311   StmtResult RebuildCoreturnStmt(SourceLocation CoreturnLoc, Expr *Result) {
1312     return getSema().BuildCoreturnStmt(CoreturnLoc, Result);
1313   }
1314 
1315   /// \brief Build a new co_await expression.
1316   ///
1317   /// By default, performs semantic analysis to build the new expression.
1318   /// Subclasses may override this routine to provide different behavior.
1319   ExprResult RebuildCoawaitExpr(SourceLocation CoawaitLoc, Expr *Result) {
1320     return getSema().BuildCoawaitExpr(CoawaitLoc, Result);
1321   }
1322 
1323   /// \brief Build a new co_yield expression.
1324   ///
1325   /// By default, performs semantic analysis to build the new expression.
1326   /// Subclasses may override this routine to provide different behavior.
1327   ExprResult RebuildCoyieldExpr(SourceLocation CoyieldLoc, Expr *Result) {
1328     return getSema().BuildCoyieldExpr(CoyieldLoc, Result);
1329   }
1330 
1331   /// \brief Build a new Objective-C \@try statement.
1332   ///
1333   /// By default, performs semantic analysis to build the new statement.
1334   /// Subclasses may override this routine to provide different behavior.
1335   StmtResult RebuildObjCAtTryStmt(SourceLocation AtLoc,
1336                                         Stmt *TryBody,
1337                                         MultiStmtArg CatchStmts,
1338                                         Stmt *Finally) {
1339     return getSema().ActOnObjCAtTryStmt(AtLoc, TryBody, CatchStmts,
1340                                         Finally);
1341   }
1342 
1343   /// \brief Rebuild an Objective-C exception declaration.
1344   ///
1345   /// By default, performs semantic analysis to build the new declaration.
1346   /// Subclasses may override this routine to provide different behavior.
1347   VarDecl *RebuildObjCExceptionDecl(VarDecl *ExceptionDecl,
1348                                     TypeSourceInfo *TInfo, QualType T) {
1349     return getSema().BuildObjCExceptionDecl(TInfo, T,
1350                                             ExceptionDecl->getInnerLocStart(),
1351                                             ExceptionDecl->getLocation(),
1352                                             ExceptionDecl->getIdentifier());
1353   }
1354 
1355   /// \brief Build a new Objective-C \@catch statement.
1356   ///
1357   /// By default, performs semantic analysis to build the new statement.
1358   /// Subclasses may override this routine to provide different behavior.
1359   StmtResult RebuildObjCAtCatchStmt(SourceLocation AtLoc,
1360                                           SourceLocation RParenLoc,
1361                                           VarDecl *Var,
1362                                           Stmt *Body) {
1363     return getSema().ActOnObjCAtCatchStmt(AtLoc, RParenLoc,
1364                                           Var, Body);
1365   }
1366 
1367   /// \brief Build a new Objective-C \@finally 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 RebuildObjCAtFinallyStmt(SourceLocation AtLoc,
1372                                             Stmt *Body) {
1373     return getSema().ActOnObjCAtFinallyStmt(AtLoc, Body);
1374   }
1375 
1376   /// \brief Build a new Objective-C \@throw statement.
1377   ///
1378   /// By default, performs semantic analysis to build the new statement.
1379   /// Subclasses may override this routine to provide different behavior.
1380   StmtResult RebuildObjCAtThrowStmt(SourceLocation AtLoc,
1381                                           Expr *Operand) {
1382     return getSema().BuildObjCAtThrowStmt(AtLoc, Operand);
1383   }
1384 
1385   /// \brief Build a new OpenMP executable directive.
1386   ///
1387   /// By default, performs semantic analysis to build the new statement.
1388   /// Subclasses may override this routine to provide different behavior.
1389   StmtResult RebuildOMPExecutableDirective(OpenMPDirectiveKind Kind,
1390                                            DeclarationNameInfo DirName,
1391                                            OpenMPDirectiveKind CancelRegion,
1392                                            ArrayRef<OMPClause *> Clauses,
1393                                            Stmt *AStmt, SourceLocation StartLoc,
1394                                            SourceLocation EndLoc) {
1395     return getSema().ActOnOpenMPExecutableDirective(
1396         Kind, DirName, CancelRegion, Clauses, AStmt, StartLoc, EndLoc);
1397   }
1398 
1399   /// \brief Build a new OpenMP 'if' clause.
1400   ///
1401   /// By default, performs semantic analysis to build the new OpenMP clause.
1402   /// Subclasses may override this routine to provide different behavior.
1403   OMPClause *RebuildOMPIfClause(OpenMPDirectiveKind NameModifier,
1404                                 Expr *Condition, SourceLocation StartLoc,
1405                                 SourceLocation LParenLoc,
1406                                 SourceLocation NameModifierLoc,
1407                                 SourceLocation ColonLoc,
1408                                 SourceLocation EndLoc) {
1409     return getSema().ActOnOpenMPIfClause(NameModifier, Condition, StartLoc,
1410                                          LParenLoc, NameModifierLoc, ColonLoc,
1411                                          EndLoc);
1412   }
1413 
1414   /// \brief Build a new OpenMP 'final' clause.
1415   ///
1416   /// By default, performs semantic analysis to build the new OpenMP clause.
1417   /// Subclasses may override this routine to provide different behavior.
1418   OMPClause *RebuildOMPFinalClause(Expr *Condition, SourceLocation StartLoc,
1419                                    SourceLocation LParenLoc,
1420                                    SourceLocation EndLoc) {
1421     return getSema().ActOnOpenMPFinalClause(Condition, StartLoc, LParenLoc,
1422                                             EndLoc);
1423   }
1424 
1425   /// \brief Build a new OpenMP 'num_threads' clause.
1426   ///
1427   /// By default, performs semantic analysis to build the new OpenMP clause.
1428   /// Subclasses may override this routine to provide different behavior.
1429   OMPClause *RebuildOMPNumThreadsClause(Expr *NumThreads,
1430                                         SourceLocation StartLoc,
1431                                         SourceLocation LParenLoc,
1432                                         SourceLocation EndLoc) {
1433     return getSema().ActOnOpenMPNumThreadsClause(NumThreads, StartLoc,
1434                                                  LParenLoc, EndLoc);
1435   }
1436 
1437   /// \brief Build a new OpenMP 'safelen' clause.
1438   ///
1439   /// By default, performs semantic analysis to build the new OpenMP clause.
1440   /// Subclasses may override this routine to provide different behavior.
1441   OMPClause *RebuildOMPSafelenClause(Expr *Len, SourceLocation StartLoc,
1442                                      SourceLocation LParenLoc,
1443                                      SourceLocation EndLoc) {
1444     return getSema().ActOnOpenMPSafelenClause(Len, StartLoc, LParenLoc, EndLoc);
1445   }
1446 
1447   /// \brief Build a new OpenMP 'simdlen' clause.
1448   ///
1449   /// By default, performs semantic analysis to build the new OpenMP clause.
1450   /// Subclasses may override this routine to provide different behavior.
1451   OMPClause *RebuildOMPSimdlenClause(Expr *Len, SourceLocation StartLoc,
1452                                      SourceLocation LParenLoc,
1453                                      SourceLocation EndLoc) {
1454     return getSema().ActOnOpenMPSimdlenClause(Len, StartLoc, LParenLoc, EndLoc);
1455   }
1456 
1457   /// \brief Build a new OpenMP 'collapse' clause.
1458   ///
1459   /// By default, performs semantic analysis to build the new OpenMP clause.
1460   /// Subclasses may override this routine to provide different behavior.
1461   OMPClause *RebuildOMPCollapseClause(Expr *Num, SourceLocation StartLoc,
1462                                       SourceLocation LParenLoc,
1463                                       SourceLocation EndLoc) {
1464     return getSema().ActOnOpenMPCollapseClause(Num, StartLoc, LParenLoc,
1465                                                EndLoc);
1466   }
1467 
1468   /// \brief Build a new OpenMP 'default' clause.
1469   ///
1470   /// By default, performs semantic analysis to build the new OpenMP clause.
1471   /// Subclasses may override this routine to provide different behavior.
1472   OMPClause *RebuildOMPDefaultClause(OpenMPDefaultClauseKind Kind,
1473                                      SourceLocation KindKwLoc,
1474                                      SourceLocation StartLoc,
1475                                      SourceLocation LParenLoc,
1476                                      SourceLocation EndLoc) {
1477     return getSema().ActOnOpenMPDefaultClause(Kind, KindKwLoc,
1478                                               StartLoc, LParenLoc, EndLoc);
1479   }
1480 
1481   /// \brief Build a new OpenMP 'proc_bind' clause.
1482   ///
1483   /// By default, performs semantic analysis to build the new OpenMP clause.
1484   /// Subclasses may override this routine to provide different behavior.
1485   OMPClause *RebuildOMPProcBindClause(OpenMPProcBindClauseKind Kind,
1486                                       SourceLocation KindKwLoc,
1487                                       SourceLocation StartLoc,
1488                                       SourceLocation LParenLoc,
1489                                       SourceLocation EndLoc) {
1490     return getSema().ActOnOpenMPProcBindClause(Kind, KindKwLoc,
1491                                                StartLoc, LParenLoc, EndLoc);
1492   }
1493 
1494   /// \brief Build a new OpenMP 'schedule' clause.
1495   ///
1496   /// By default, performs semantic analysis to build the new OpenMP clause.
1497   /// Subclasses may override this routine to provide different behavior.
1498   OMPClause *RebuildOMPScheduleClause(
1499       OpenMPScheduleClauseModifier M1, OpenMPScheduleClauseModifier M2,
1500       OpenMPScheduleClauseKind Kind, Expr *ChunkSize, SourceLocation StartLoc,
1501       SourceLocation LParenLoc, SourceLocation M1Loc, SourceLocation M2Loc,
1502       SourceLocation KindLoc, SourceLocation CommaLoc, SourceLocation EndLoc) {
1503     return getSema().ActOnOpenMPScheduleClause(
1504         M1, M2, Kind, ChunkSize, StartLoc, LParenLoc, M1Loc, M2Loc, KindLoc,
1505         CommaLoc, EndLoc);
1506   }
1507 
1508   /// \brief Build a new OpenMP 'ordered' clause.
1509   ///
1510   /// By default, performs semantic analysis to build the new OpenMP clause.
1511   /// Subclasses may override this routine to provide different behavior.
1512   OMPClause *RebuildOMPOrderedClause(SourceLocation StartLoc,
1513                                      SourceLocation EndLoc,
1514                                      SourceLocation LParenLoc, Expr *Num) {
1515     return getSema().ActOnOpenMPOrderedClause(StartLoc, EndLoc, LParenLoc, Num);
1516   }
1517 
1518   /// \brief Build a new OpenMP 'private' 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 *RebuildOMPPrivateClause(ArrayRef<Expr *> VarList,
1523                                      SourceLocation StartLoc,
1524                                      SourceLocation LParenLoc,
1525                                      SourceLocation EndLoc) {
1526     return getSema().ActOnOpenMPPrivateClause(VarList, StartLoc, LParenLoc,
1527                                               EndLoc);
1528   }
1529 
1530   /// \brief Build a new OpenMP 'firstprivate' 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 *RebuildOMPFirstprivateClause(ArrayRef<Expr *> VarList,
1535                                           SourceLocation StartLoc,
1536                                           SourceLocation LParenLoc,
1537                                           SourceLocation EndLoc) {
1538     return getSema().ActOnOpenMPFirstprivateClause(VarList, StartLoc, LParenLoc,
1539                                                    EndLoc);
1540   }
1541 
1542   /// \brief Build a new OpenMP 'lastprivate' clause.
1543   ///
1544   /// By default, performs semantic analysis to build the new OpenMP clause.
1545   /// Subclasses may override this routine to provide different behavior.
1546   OMPClause *RebuildOMPLastprivateClause(ArrayRef<Expr *> VarList,
1547                                          SourceLocation StartLoc,
1548                                          SourceLocation LParenLoc,
1549                                          SourceLocation EndLoc) {
1550     return getSema().ActOnOpenMPLastprivateClause(VarList, StartLoc, LParenLoc,
1551                                                   EndLoc);
1552   }
1553 
1554   /// \brief Build a new OpenMP 'shared' clause.
1555   ///
1556   /// By default, performs semantic analysis to build the new OpenMP clause.
1557   /// Subclasses may override this routine to provide different behavior.
1558   OMPClause *RebuildOMPSharedClause(ArrayRef<Expr *> VarList,
1559                                     SourceLocation StartLoc,
1560                                     SourceLocation LParenLoc,
1561                                     SourceLocation EndLoc) {
1562     return getSema().ActOnOpenMPSharedClause(VarList, StartLoc, LParenLoc,
1563                                              EndLoc);
1564   }
1565 
1566   /// \brief Build a new OpenMP 'reduction' clause.
1567   ///
1568   /// By default, performs semantic analysis to build the new statement.
1569   /// Subclasses may override this routine to provide different behavior.
1570   OMPClause *RebuildOMPReductionClause(ArrayRef<Expr *> VarList,
1571                                        SourceLocation StartLoc,
1572                                        SourceLocation LParenLoc,
1573                                        SourceLocation ColonLoc,
1574                                        SourceLocation EndLoc,
1575                                        CXXScopeSpec &ReductionIdScopeSpec,
1576                                        const DeclarationNameInfo &ReductionId,
1577                                        ArrayRef<Expr *> UnresolvedReductions) {
1578     return getSema().ActOnOpenMPReductionClause(
1579         VarList, StartLoc, LParenLoc, ColonLoc, EndLoc, ReductionIdScopeSpec,
1580         ReductionId, UnresolvedReductions);
1581   }
1582 
1583   /// \brief Build a new OpenMP 'linear' clause.
1584   ///
1585   /// By default, performs semantic analysis to build the new OpenMP clause.
1586   /// Subclasses may override this routine to provide different behavior.
1587   OMPClause *RebuildOMPLinearClause(ArrayRef<Expr *> VarList, Expr *Step,
1588                                     SourceLocation StartLoc,
1589                                     SourceLocation LParenLoc,
1590                                     OpenMPLinearClauseKind Modifier,
1591                                     SourceLocation ModifierLoc,
1592                                     SourceLocation ColonLoc,
1593                                     SourceLocation EndLoc) {
1594     return getSema().ActOnOpenMPLinearClause(VarList, Step, StartLoc, LParenLoc,
1595                                              Modifier, ModifierLoc, ColonLoc,
1596                                              EndLoc);
1597   }
1598 
1599   /// \brief Build a new OpenMP 'aligned' clause.
1600   ///
1601   /// By default, performs semantic analysis to build the new OpenMP clause.
1602   /// Subclasses may override this routine to provide different behavior.
1603   OMPClause *RebuildOMPAlignedClause(ArrayRef<Expr *> VarList, Expr *Alignment,
1604                                      SourceLocation StartLoc,
1605                                      SourceLocation LParenLoc,
1606                                      SourceLocation ColonLoc,
1607                                      SourceLocation EndLoc) {
1608     return getSema().ActOnOpenMPAlignedClause(VarList, Alignment, StartLoc,
1609                                               LParenLoc, ColonLoc, EndLoc);
1610   }
1611 
1612   /// \brief Build a new OpenMP 'copyin' clause.
1613   ///
1614   /// By default, performs semantic analysis to build the new OpenMP clause.
1615   /// Subclasses may override this routine to provide different behavior.
1616   OMPClause *RebuildOMPCopyinClause(ArrayRef<Expr *> VarList,
1617                                     SourceLocation StartLoc,
1618                                     SourceLocation LParenLoc,
1619                                     SourceLocation EndLoc) {
1620     return getSema().ActOnOpenMPCopyinClause(VarList, StartLoc, LParenLoc,
1621                                              EndLoc);
1622   }
1623 
1624   /// \brief Build a new OpenMP 'copyprivate' clause.
1625   ///
1626   /// By default, performs semantic analysis to build the new OpenMP clause.
1627   /// Subclasses may override this routine to provide different behavior.
1628   OMPClause *RebuildOMPCopyprivateClause(ArrayRef<Expr *> VarList,
1629                                          SourceLocation StartLoc,
1630                                          SourceLocation LParenLoc,
1631                                          SourceLocation EndLoc) {
1632     return getSema().ActOnOpenMPCopyprivateClause(VarList, StartLoc, LParenLoc,
1633                                                   EndLoc);
1634   }
1635 
1636   /// \brief Build a new OpenMP 'flush' pseudo clause.
1637   ///
1638   /// By default, performs semantic analysis to build the new OpenMP clause.
1639   /// Subclasses may override this routine to provide different behavior.
1640   OMPClause *RebuildOMPFlushClause(ArrayRef<Expr *> VarList,
1641                                    SourceLocation StartLoc,
1642                                    SourceLocation LParenLoc,
1643                                    SourceLocation EndLoc) {
1644     return getSema().ActOnOpenMPFlushClause(VarList, StartLoc, LParenLoc,
1645                                             EndLoc);
1646   }
1647 
1648   /// \brief Build a new OpenMP 'depend' pseudo clause.
1649   ///
1650   /// By default, performs semantic analysis to build the new OpenMP clause.
1651   /// Subclasses may override this routine to provide different behavior.
1652   OMPClause *
1653   RebuildOMPDependClause(OpenMPDependClauseKind DepKind, SourceLocation DepLoc,
1654                          SourceLocation ColonLoc, ArrayRef<Expr *> VarList,
1655                          SourceLocation StartLoc, SourceLocation LParenLoc,
1656                          SourceLocation EndLoc) {
1657     return getSema().ActOnOpenMPDependClause(DepKind, DepLoc, ColonLoc, VarList,
1658                                              StartLoc, LParenLoc, EndLoc);
1659   }
1660 
1661   /// \brief Build a new OpenMP 'device' clause.
1662   ///
1663   /// By default, performs semantic analysis to build the new statement.
1664   /// Subclasses may override this routine to provide different behavior.
1665   OMPClause *RebuildOMPDeviceClause(Expr *Device, SourceLocation StartLoc,
1666                                     SourceLocation LParenLoc,
1667                                     SourceLocation EndLoc) {
1668     return getSema().ActOnOpenMPDeviceClause(Device, StartLoc, LParenLoc,
1669                                              EndLoc);
1670   }
1671 
1672   /// \brief Build a new OpenMP 'map' clause.
1673   ///
1674   /// By default, performs semantic analysis to build the new OpenMP clause.
1675   /// Subclasses may override this routine to provide different behavior.
1676   OMPClause *
1677   RebuildOMPMapClause(OpenMPMapClauseKind MapTypeModifier,
1678                       OpenMPMapClauseKind MapType, bool IsMapTypeImplicit,
1679                       SourceLocation MapLoc, SourceLocation ColonLoc,
1680                       ArrayRef<Expr *> VarList, SourceLocation StartLoc,
1681                       SourceLocation LParenLoc, SourceLocation EndLoc) {
1682     return getSema().ActOnOpenMPMapClause(MapTypeModifier, MapType,
1683                                           IsMapTypeImplicit, MapLoc, ColonLoc,
1684                                           VarList, StartLoc, LParenLoc, EndLoc);
1685   }
1686 
1687   /// \brief Build a new OpenMP 'num_teams' clause.
1688   ///
1689   /// By default, performs semantic analysis to build the new statement.
1690   /// Subclasses may override this routine to provide different behavior.
1691   OMPClause *RebuildOMPNumTeamsClause(Expr *NumTeams, SourceLocation StartLoc,
1692                                       SourceLocation LParenLoc,
1693                                       SourceLocation EndLoc) {
1694     return getSema().ActOnOpenMPNumTeamsClause(NumTeams, StartLoc, LParenLoc,
1695                                                EndLoc);
1696   }
1697 
1698   /// \brief Build a new OpenMP 'thread_limit' clause.
1699   ///
1700   /// By default, performs semantic analysis to build the new statement.
1701   /// Subclasses may override this routine to provide different behavior.
1702   OMPClause *RebuildOMPThreadLimitClause(Expr *ThreadLimit,
1703                                          SourceLocation StartLoc,
1704                                          SourceLocation LParenLoc,
1705                                          SourceLocation EndLoc) {
1706     return getSema().ActOnOpenMPThreadLimitClause(ThreadLimit, StartLoc,
1707                                                   LParenLoc, EndLoc);
1708   }
1709 
1710   /// \brief Build a new OpenMP 'priority' clause.
1711   ///
1712   /// By default, performs semantic analysis to build the new statement.
1713   /// Subclasses may override this routine to provide different behavior.
1714   OMPClause *RebuildOMPPriorityClause(Expr *Priority, SourceLocation StartLoc,
1715                                       SourceLocation LParenLoc,
1716                                       SourceLocation EndLoc) {
1717     return getSema().ActOnOpenMPPriorityClause(Priority, StartLoc, LParenLoc,
1718                                                EndLoc);
1719   }
1720 
1721   /// \brief Build a new OpenMP 'grainsize' clause.
1722   ///
1723   /// By default, performs semantic analysis to build the new statement.
1724   /// Subclasses may override this routine to provide different behavior.
1725   OMPClause *RebuildOMPGrainsizeClause(Expr *Grainsize, SourceLocation StartLoc,
1726                                        SourceLocation LParenLoc,
1727                                        SourceLocation EndLoc) {
1728     return getSema().ActOnOpenMPGrainsizeClause(Grainsize, StartLoc, LParenLoc,
1729                                                 EndLoc);
1730   }
1731 
1732   /// \brief Build a new OpenMP 'num_tasks' clause.
1733   ///
1734   /// By default, performs semantic analysis to build the new statement.
1735   /// Subclasses may override this routine to provide different behavior.
1736   OMPClause *RebuildOMPNumTasksClause(Expr *NumTasks, SourceLocation StartLoc,
1737                                       SourceLocation LParenLoc,
1738                                       SourceLocation EndLoc) {
1739     return getSema().ActOnOpenMPNumTasksClause(NumTasks, StartLoc, LParenLoc,
1740                                                EndLoc);
1741   }
1742 
1743   /// \brief Build a new OpenMP 'hint' clause.
1744   ///
1745   /// By default, performs semantic analysis to build the new statement.
1746   /// Subclasses may override this routine to provide different behavior.
1747   OMPClause *RebuildOMPHintClause(Expr *Hint, SourceLocation StartLoc,
1748                                   SourceLocation LParenLoc,
1749                                   SourceLocation EndLoc) {
1750     return getSema().ActOnOpenMPHintClause(Hint, StartLoc, LParenLoc, EndLoc);
1751   }
1752 
1753   /// \brief Build a new OpenMP 'dist_schedule' clause.
1754   ///
1755   /// By default, performs semantic analysis to build the new OpenMP clause.
1756   /// Subclasses may override this routine to provide different behavior.
1757   OMPClause *
1758   RebuildOMPDistScheduleClause(OpenMPDistScheduleClauseKind Kind,
1759                                Expr *ChunkSize, SourceLocation StartLoc,
1760                                SourceLocation LParenLoc, SourceLocation KindLoc,
1761                                SourceLocation CommaLoc, SourceLocation EndLoc) {
1762     return getSema().ActOnOpenMPDistScheduleClause(
1763         Kind, ChunkSize, StartLoc, LParenLoc, KindLoc, CommaLoc, EndLoc);
1764   }
1765 
1766   /// \brief Build a new OpenMP 'to' clause.
1767   ///
1768   /// By default, performs semantic analysis to build the new statement.
1769   /// Subclasses may override this routine to provide different behavior.
1770   OMPClause *RebuildOMPToClause(ArrayRef<Expr *> VarList,
1771                                 SourceLocation StartLoc,
1772                                 SourceLocation LParenLoc,
1773                                 SourceLocation EndLoc) {
1774     return getSema().ActOnOpenMPToClause(VarList, StartLoc, LParenLoc, EndLoc);
1775   }
1776 
1777   /// \brief Build a new OpenMP 'from' clause.
1778   ///
1779   /// By default, performs semantic analysis to build the new statement.
1780   /// Subclasses may override this routine to provide different behavior.
1781   OMPClause *RebuildOMPFromClause(ArrayRef<Expr *> VarList,
1782                                   SourceLocation StartLoc,
1783                                   SourceLocation LParenLoc,
1784                                   SourceLocation EndLoc) {
1785     return getSema().ActOnOpenMPFromClause(VarList, StartLoc, LParenLoc,
1786                                            EndLoc);
1787   }
1788 
1789   /// Build a new OpenMP 'use_device_ptr' clause.
1790   ///
1791   /// By default, performs semantic analysis to build the new OpenMP clause.
1792   /// Subclasses may override this routine to provide different behavior.
1793   OMPClause *RebuildOMPUseDevicePtrClause(ArrayRef<Expr *> VarList,
1794                                           SourceLocation StartLoc,
1795                                           SourceLocation LParenLoc,
1796                                           SourceLocation EndLoc) {
1797     return getSema().ActOnOpenMPUseDevicePtrClause(VarList, StartLoc, LParenLoc,
1798                                                    EndLoc);
1799   }
1800 
1801   /// Build a new OpenMP 'is_device_ptr' clause.
1802   ///
1803   /// By default, performs semantic analysis to build the new OpenMP clause.
1804   /// Subclasses may override this routine to provide different behavior.
1805   OMPClause *RebuildOMPIsDevicePtrClause(ArrayRef<Expr *> VarList,
1806                                          SourceLocation StartLoc,
1807                                          SourceLocation LParenLoc,
1808                                          SourceLocation EndLoc) {
1809     return getSema().ActOnOpenMPIsDevicePtrClause(VarList, StartLoc, LParenLoc,
1810                                                   EndLoc);
1811   }
1812 
1813   /// \brief Rebuild the operand to an Objective-C \@synchronized statement.
1814   ///
1815   /// By default, performs semantic analysis to build the new statement.
1816   /// Subclasses may override this routine to provide different behavior.
1817   ExprResult RebuildObjCAtSynchronizedOperand(SourceLocation atLoc,
1818                                               Expr *object) {
1819     return getSema().ActOnObjCAtSynchronizedOperand(atLoc, object);
1820   }
1821 
1822   /// \brief Build a new Objective-C \@synchronized statement.
1823   ///
1824   /// By default, performs semantic analysis to build the new statement.
1825   /// Subclasses may override this routine to provide different behavior.
1826   StmtResult RebuildObjCAtSynchronizedStmt(SourceLocation AtLoc,
1827                                            Expr *Object, Stmt *Body) {
1828     return getSema().ActOnObjCAtSynchronizedStmt(AtLoc, Object, Body);
1829   }
1830 
1831   /// \brief Build a new Objective-C \@autoreleasepool statement.
1832   ///
1833   /// By default, performs semantic analysis to build the new statement.
1834   /// Subclasses may override this routine to provide different behavior.
1835   StmtResult RebuildObjCAutoreleasePoolStmt(SourceLocation AtLoc,
1836                                             Stmt *Body) {
1837     return getSema().ActOnObjCAutoreleasePoolStmt(AtLoc, Body);
1838   }
1839 
1840   /// \brief Build a new Objective-C fast enumeration statement.
1841   ///
1842   /// By default, performs semantic analysis to build the new statement.
1843   /// Subclasses may override this routine to provide different behavior.
1844   StmtResult RebuildObjCForCollectionStmt(SourceLocation ForLoc,
1845                                           Stmt *Element,
1846                                           Expr *Collection,
1847                                           SourceLocation RParenLoc,
1848                                           Stmt *Body) {
1849     StmtResult ForEachStmt = getSema().ActOnObjCForCollectionStmt(ForLoc,
1850                                                 Element,
1851                                                 Collection,
1852                                                 RParenLoc);
1853     if (ForEachStmt.isInvalid())
1854       return StmtError();
1855 
1856     return getSema().FinishObjCForCollectionStmt(ForEachStmt.get(), Body);
1857   }
1858 
1859   /// \brief Build a new C++ exception declaration.
1860   ///
1861   /// By default, performs semantic analysis to build the new decaration.
1862   /// Subclasses may override this routine to provide different behavior.
1863   VarDecl *RebuildExceptionDecl(VarDecl *ExceptionDecl,
1864                                 TypeSourceInfo *Declarator,
1865                                 SourceLocation StartLoc,
1866                                 SourceLocation IdLoc,
1867                                 IdentifierInfo *Id) {
1868     VarDecl *Var = getSema().BuildExceptionDeclaration(nullptr, Declarator,
1869                                                        StartLoc, IdLoc, Id);
1870     if (Var)
1871       getSema().CurContext->addDecl(Var);
1872     return Var;
1873   }
1874 
1875   /// \brief Build a new C++ catch statement.
1876   ///
1877   /// By default, performs semantic analysis to build the new statement.
1878   /// Subclasses may override this routine to provide different behavior.
1879   StmtResult RebuildCXXCatchStmt(SourceLocation CatchLoc,
1880                                  VarDecl *ExceptionDecl,
1881                                  Stmt *Handler) {
1882     return Owned(new (getSema().Context) CXXCatchStmt(CatchLoc, ExceptionDecl,
1883                                                       Handler));
1884   }
1885 
1886   /// \brief Build a new C++ try statement.
1887   ///
1888   /// By default, performs semantic analysis to build the new statement.
1889   /// Subclasses may override this routine to provide different behavior.
1890   StmtResult RebuildCXXTryStmt(SourceLocation TryLoc, Stmt *TryBlock,
1891                                ArrayRef<Stmt *> Handlers) {
1892     return getSema().ActOnCXXTryBlock(TryLoc, TryBlock, Handlers);
1893   }
1894 
1895   /// \brief Build a new C++0x range-based for statement.
1896   ///
1897   /// By default, performs semantic analysis to build the new statement.
1898   /// Subclasses may override this routine to provide different behavior.
1899   StmtResult RebuildCXXForRangeStmt(SourceLocation ForLoc,
1900                                     SourceLocation CoawaitLoc,
1901                                     SourceLocation ColonLoc,
1902                                     Stmt *Range, Stmt *Begin, Stmt *End,
1903                                     Expr *Cond, Expr *Inc,
1904                                     Stmt *LoopVar,
1905                                     SourceLocation RParenLoc) {
1906     // If we've just learned that the range is actually an Objective-C
1907     // collection, treat this as an Objective-C fast enumeration loop.
1908     if (DeclStmt *RangeStmt = dyn_cast<DeclStmt>(Range)) {
1909       if (RangeStmt->isSingleDecl()) {
1910         if (VarDecl *RangeVar = dyn_cast<VarDecl>(RangeStmt->getSingleDecl())) {
1911           if (RangeVar->isInvalidDecl())
1912             return StmtError();
1913 
1914           Expr *RangeExpr = RangeVar->getInit();
1915           if (!RangeExpr->isTypeDependent() &&
1916               RangeExpr->getType()->isObjCObjectPointerType())
1917             return getSema().ActOnObjCForCollectionStmt(ForLoc, LoopVar, RangeExpr,
1918                                                         RParenLoc);
1919         }
1920       }
1921     }
1922 
1923     return getSema().BuildCXXForRangeStmt(ForLoc, CoawaitLoc, ColonLoc,
1924                                           Range, Begin, End,
1925                                           Cond, Inc, LoopVar, RParenLoc,
1926                                           Sema::BFRK_Rebuild);
1927   }
1928 
1929   /// \brief Build a new C++0x range-based for statement.
1930   ///
1931   /// By default, performs semantic analysis to build the new statement.
1932   /// Subclasses may override this routine to provide different behavior.
1933   StmtResult RebuildMSDependentExistsStmt(SourceLocation KeywordLoc,
1934                                           bool IsIfExists,
1935                                           NestedNameSpecifierLoc QualifierLoc,
1936                                           DeclarationNameInfo NameInfo,
1937                                           Stmt *Nested) {
1938     return getSema().BuildMSDependentExistsStmt(KeywordLoc, IsIfExists,
1939                                                 QualifierLoc, NameInfo, Nested);
1940   }
1941 
1942   /// \brief Attach body to a C++0x range-based for statement.
1943   ///
1944   /// By default, performs semantic analysis to finish the new statement.
1945   /// Subclasses may override this routine to provide different behavior.
1946   StmtResult FinishCXXForRangeStmt(Stmt *ForRange, Stmt *Body) {
1947     return getSema().FinishCXXForRangeStmt(ForRange, Body);
1948   }
1949 
1950   StmtResult RebuildSEHTryStmt(bool IsCXXTry, SourceLocation TryLoc,
1951                                Stmt *TryBlock, Stmt *Handler) {
1952     return getSema().ActOnSEHTryBlock(IsCXXTry, TryLoc, TryBlock, Handler);
1953   }
1954 
1955   StmtResult RebuildSEHExceptStmt(SourceLocation Loc, Expr *FilterExpr,
1956                                   Stmt *Block) {
1957     return getSema().ActOnSEHExceptBlock(Loc, FilterExpr, Block);
1958   }
1959 
1960   StmtResult RebuildSEHFinallyStmt(SourceLocation Loc, Stmt *Block) {
1961     return SEHFinallyStmt::Create(getSema().getASTContext(), Loc, Block);
1962   }
1963 
1964   /// \brief Build a new predefined expression.
1965   ///
1966   /// By default, performs semantic analysis to build the new expression.
1967   /// Subclasses may override this routine to provide different behavior.
1968   ExprResult RebuildPredefinedExpr(SourceLocation Loc,
1969                                    PredefinedExpr::IdentType IT) {
1970     return getSema().BuildPredefinedExpr(Loc, IT);
1971   }
1972 
1973   /// \brief Build a new expression that references a declaration.
1974   ///
1975   /// By default, performs semantic analysis to build the new expression.
1976   /// Subclasses may override this routine to provide different behavior.
1977   ExprResult RebuildDeclarationNameExpr(const CXXScopeSpec &SS,
1978                                         LookupResult &R,
1979                                         bool RequiresADL) {
1980     return getSema().BuildDeclarationNameExpr(SS, R, RequiresADL);
1981   }
1982 
1983 
1984   /// \brief Build a new expression that references a declaration.
1985   ///
1986   /// By default, performs semantic analysis to build the new expression.
1987   /// Subclasses may override this routine to provide different behavior.
1988   ExprResult RebuildDeclRefExpr(NestedNameSpecifierLoc QualifierLoc,
1989                                 ValueDecl *VD,
1990                                 const DeclarationNameInfo &NameInfo,
1991                                 TemplateArgumentListInfo *TemplateArgs) {
1992     CXXScopeSpec SS;
1993     SS.Adopt(QualifierLoc);
1994 
1995     // FIXME: loses template args.
1996 
1997     return getSema().BuildDeclarationNameExpr(SS, NameInfo, VD);
1998   }
1999 
2000   /// \brief Build a new expression in parentheses.
2001   ///
2002   /// By default, performs semantic analysis to build the new expression.
2003   /// Subclasses may override this routine to provide different behavior.
2004   ExprResult RebuildParenExpr(Expr *SubExpr, SourceLocation LParen,
2005                                     SourceLocation RParen) {
2006     return getSema().ActOnParenExpr(LParen, RParen, SubExpr);
2007   }
2008 
2009   /// \brief Build a new pseudo-destructor expression.
2010   ///
2011   /// By default, performs semantic analysis to build the new expression.
2012   /// Subclasses may override this routine to provide different behavior.
2013   ExprResult RebuildCXXPseudoDestructorExpr(Expr *Base,
2014                                             SourceLocation OperatorLoc,
2015                                             bool isArrow,
2016                                             CXXScopeSpec &SS,
2017                                             TypeSourceInfo *ScopeType,
2018                                             SourceLocation CCLoc,
2019                                             SourceLocation TildeLoc,
2020                                         PseudoDestructorTypeStorage Destroyed);
2021 
2022   /// \brief Build a new unary operator expression.
2023   ///
2024   /// By default, performs semantic analysis to build the new expression.
2025   /// Subclasses may override this routine to provide different behavior.
2026   ExprResult RebuildUnaryOperator(SourceLocation OpLoc,
2027                                         UnaryOperatorKind Opc,
2028                                         Expr *SubExpr) {
2029     return getSema().BuildUnaryOp(/*Scope=*/nullptr, OpLoc, Opc, SubExpr);
2030   }
2031 
2032   /// \brief Build a new builtin offsetof expression.
2033   ///
2034   /// By default, performs semantic analysis to build the new expression.
2035   /// Subclasses may override this routine to provide different behavior.
2036   ExprResult RebuildOffsetOfExpr(SourceLocation OperatorLoc,
2037                                  TypeSourceInfo *Type,
2038                                  ArrayRef<Sema::OffsetOfComponent> Components,
2039                                  SourceLocation RParenLoc) {
2040     return getSema().BuildBuiltinOffsetOf(OperatorLoc, Type, Components,
2041                                           RParenLoc);
2042   }
2043 
2044   /// \brief Build a new sizeof, alignof or vec_step expression with a
2045   /// type argument.
2046   ///
2047   /// By default, performs semantic analysis to build the new expression.
2048   /// Subclasses may override this routine to provide different behavior.
2049   ExprResult RebuildUnaryExprOrTypeTrait(TypeSourceInfo *TInfo,
2050                                          SourceLocation OpLoc,
2051                                          UnaryExprOrTypeTrait ExprKind,
2052                                          SourceRange R) {
2053     return getSema().CreateUnaryExprOrTypeTraitExpr(TInfo, OpLoc, ExprKind, R);
2054   }
2055 
2056   /// \brief Build a new sizeof, alignof or vec step expression with an
2057   /// expression argument.
2058   ///
2059   /// By default, performs semantic analysis to build the new expression.
2060   /// Subclasses may override this routine to provide different behavior.
2061   ExprResult RebuildUnaryExprOrTypeTrait(Expr *SubExpr, SourceLocation OpLoc,
2062                                          UnaryExprOrTypeTrait ExprKind,
2063                                          SourceRange R) {
2064     ExprResult Result
2065       = getSema().CreateUnaryExprOrTypeTraitExpr(SubExpr, OpLoc, ExprKind);
2066     if (Result.isInvalid())
2067       return ExprError();
2068 
2069     return Result;
2070   }
2071 
2072   /// \brief Build a new array subscript expression.
2073   ///
2074   /// By default, performs semantic analysis to build the new expression.
2075   /// Subclasses may override this routine to provide different behavior.
2076   ExprResult RebuildArraySubscriptExpr(Expr *LHS,
2077                                              SourceLocation LBracketLoc,
2078                                              Expr *RHS,
2079                                              SourceLocation RBracketLoc) {
2080     return getSema().ActOnArraySubscriptExpr(/*Scope=*/nullptr, LHS,
2081                                              LBracketLoc, RHS,
2082                                              RBracketLoc);
2083   }
2084 
2085   /// \brief Build a new array section expression.
2086   ///
2087   /// By default, performs semantic analysis to build the new expression.
2088   /// Subclasses may override this routine to provide different behavior.
2089   ExprResult RebuildOMPArraySectionExpr(Expr *Base, SourceLocation LBracketLoc,
2090                                         Expr *LowerBound,
2091                                         SourceLocation ColonLoc, Expr *Length,
2092                                         SourceLocation RBracketLoc) {
2093     return getSema().ActOnOMPArraySectionExpr(Base, LBracketLoc, LowerBound,
2094                                               ColonLoc, Length, RBracketLoc);
2095   }
2096 
2097   /// \brief Build a new call expression.
2098   ///
2099   /// By default, performs semantic analysis to build the new expression.
2100   /// Subclasses may override this routine to provide different behavior.
2101   ExprResult RebuildCallExpr(Expr *Callee, SourceLocation LParenLoc,
2102                                    MultiExprArg Args,
2103                                    SourceLocation RParenLoc,
2104                                    Expr *ExecConfig = nullptr) {
2105     return getSema().ActOnCallExpr(/*Scope=*/nullptr, Callee, LParenLoc,
2106                                    Args, RParenLoc, ExecConfig);
2107   }
2108 
2109   /// \brief Build a new member access expression.
2110   ///
2111   /// By default, performs semantic analysis to build the new expression.
2112   /// Subclasses may override this routine to provide different behavior.
2113   ExprResult RebuildMemberExpr(Expr *Base, SourceLocation OpLoc,
2114                                bool isArrow,
2115                                NestedNameSpecifierLoc QualifierLoc,
2116                                SourceLocation TemplateKWLoc,
2117                                const DeclarationNameInfo &MemberNameInfo,
2118                                ValueDecl *Member,
2119                                NamedDecl *FoundDecl,
2120                         const TemplateArgumentListInfo *ExplicitTemplateArgs,
2121                                NamedDecl *FirstQualifierInScope) {
2122     ExprResult BaseResult = getSema().PerformMemberExprBaseConversion(Base,
2123                                                                       isArrow);
2124     if (!Member->getDeclName()) {
2125       // We have a reference to an unnamed field.  This is always the
2126       // base of an anonymous struct/union member access, i.e. the
2127       // field is always of record type.
2128       assert(!QualifierLoc && "Can't have an unnamed field with a qualifier!");
2129       assert(Member->getType()->isRecordType() &&
2130              "unnamed member not of record type?");
2131 
2132       BaseResult =
2133         getSema().PerformObjectMemberConversion(BaseResult.get(),
2134                                                 QualifierLoc.getNestedNameSpecifier(),
2135                                                 FoundDecl, Member);
2136       if (BaseResult.isInvalid())
2137         return ExprError();
2138       Base = BaseResult.get();
2139       ExprValueKind VK = isArrow ? VK_LValue : Base->getValueKind();
2140       MemberExpr *ME = new (getSema().Context)
2141           MemberExpr(Base, isArrow, OpLoc, Member, MemberNameInfo,
2142                      cast<FieldDecl>(Member)->getType(), VK, OK_Ordinary);
2143       return ME;
2144     }
2145 
2146     CXXScopeSpec SS;
2147     SS.Adopt(QualifierLoc);
2148 
2149     Base = BaseResult.get();
2150     QualType BaseType = Base->getType();
2151 
2152     // FIXME: this involves duplicating earlier analysis in a lot of
2153     // cases; we should avoid this when possible.
2154     LookupResult R(getSema(), MemberNameInfo, Sema::LookupMemberName);
2155     R.addDecl(FoundDecl);
2156     R.resolveKind();
2157 
2158     return getSema().BuildMemberReferenceExpr(Base, BaseType, OpLoc, isArrow,
2159                                               SS, TemplateKWLoc,
2160                                               FirstQualifierInScope,
2161                                               R, ExplicitTemplateArgs,
2162                                               /*S*/nullptr);
2163   }
2164 
2165   /// \brief Build a new binary operator expression.
2166   ///
2167   /// By default, performs semantic analysis to build the new expression.
2168   /// Subclasses may override this routine to provide different behavior.
2169   ExprResult RebuildBinaryOperator(SourceLocation OpLoc,
2170                                          BinaryOperatorKind Opc,
2171                                          Expr *LHS, Expr *RHS) {
2172     return getSema().BuildBinOp(/*Scope=*/nullptr, OpLoc, Opc, LHS, RHS);
2173   }
2174 
2175   /// \brief Build a new conditional operator expression.
2176   ///
2177   /// By default, performs semantic analysis to build the new expression.
2178   /// Subclasses may override this routine to provide different behavior.
2179   ExprResult RebuildConditionalOperator(Expr *Cond,
2180                                         SourceLocation QuestionLoc,
2181                                         Expr *LHS,
2182                                         SourceLocation ColonLoc,
2183                                         Expr *RHS) {
2184     return getSema().ActOnConditionalOp(QuestionLoc, ColonLoc, Cond,
2185                                         LHS, RHS);
2186   }
2187 
2188   /// \brief Build a new C-style cast expression.
2189   ///
2190   /// By default, performs semantic analysis to build the new expression.
2191   /// Subclasses may override this routine to provide different behavior.
2192   ExprResult RebuildCStyleCastExpr(SourceLocation LParenLoc,
2193                                          TypeSourceInfo *TInfo,
2194                                          SourceLocation RParenLoc,
2195                                          Expr *SubExpr) {
2196     return getSema().BuildCStyleCastExpr(LParenLoc, TInfo, RParenLoc,
2197                                          SubExpr);
2198   }
2199 
2200   /// \brief Build a new compound literal expression.
2201   ///
2202   /// By default, performs semantic analysis to build the new expression.
2203   /// Subclasses may override this routine to provide different behavior.
2204   ExprResult RebuildCompoundLiteralExpr(SourceLocation LParenLoc,
2205                                               TypeSourceInfo *TInfo,
2206                                               SourceLocation RParenLoc,
2207                                               Expr *Init) {
2208     return getSema().BuildCompoundLiteralExpr(LParenLoc, TInfo, RParenLoc,
2209                                               Init);
2210   }
2211 
2212   /// \brief Build a new extended vector element access expression.
2213   ///
2214   /// By default, performs semantic analysis to build the new expression.
2215   /// Subclasses may override this routine to provide different behavior.
2216   ExprResult RebuildExtVectorElementExpr(Expr *Base,
2217                                                SourceLocation OpLoc,
2218                                                SourceLocation AccessorLoc,
2219                                                IdentifierInfo &Accessor) {
2220 
2221     CXXScopeSpec SS;
2222     DeclarationNameInfo NameInfo(&Accessor, AccessorLoc);
2223     return getSema().BuildMemberReferenceExpr(Base, Base->getType(),
2224                                               OpLoc, /*IsArrow*/ false,
2225                                               SS, SourceLocation(),
2226                                               /*FirstQualifierInScope*/ nullptr,
2227                                               NameInfo,
2228                                               /* TemplateArgs */ nullptr,
2229                                               /*S*/ nullptr);
2230   }
2231 
2232   /// \brief Build a new initializer list expression.
2233   ///
2234   /// By default, performs semantic analysis to build the new expression.
2235   /// Subclasses may override this routine to provide different behavior.
2236   ExprResult RebuildInitList(SourceLocation LBraceLoc,
2237                              MultiExprArg Inits,
2238                              SourceLocation RBraceLoc,
2239                              QualType ResultTy) {
2240     ExprResult Result
2241       = SemaRef.ActOnInitList(LBraceLoc, Inits, RBraceLoc);
2242     if (Result.isInvalid() || ResultTy->isDependentType())
2243       return Result;
2244 
2245     // Patch in the result type we were given, which may have been computed
2246     // when the initial InitListExpr was built.
2247     InitListExpr *ILE = cast<InitListExpr>((Expr *)Result.get());
2248     ILE->setType(ResultTy);
2249     return Result;
2250   }
2251 
2252   /// \brief Build a new designated initializer expression.
2253   ///
2254   /// By default, performs semantic analysis to build the new expression.
2255   /// Subclasses may override this routine to provide different behavior.
2256   ExprResult RebuildDesignatedInitExpr(Designation &Desig,
2257                                              MultiExprArg ArrayExprs,
2258                                              SourceLocation EqualOrColonLoc,
2259                                              bool GNUSyntax,
2260                                              Expr *Init) {
2261     ExprResult Result
2262       = SemaRef.ActOnDesignatedInitializer(Desig, EqualOrColonLoc, GNUSyntax,
2263                                            Init);
2264     if (Result.isInvalid())
2265       return ExprError();
2266 
2267     return Result;
2268   }
2269 
2270   /// \brief Build a new value-initialized expression.
2271   ///
2272   /// By default, builds the implicit value initialization without performing
2273   /// any semantic analysis. Subclasses may override this routine to provide
2274   /// different behavior.
2275   ExprResult RebuildImplicitValueInitExpr(QualType T) {
2276     return new (SemaRef.Context) ImplicitValueInitExpr(T);
2277   }
2278 
2279   /// \brief Build a new \c va_arg expression.
2280   ///
2281   /// By default, performs semantic analysis to build the new expression.
2282   /// Subclasses may override this routine to provide different behavior.
2283   ExprResult RebuildVAArgExpr(SourceLocation BuiltinLoc,
2284                                     Expr *SubExpr, TypeSourceInfo *TInfo,
2285                                     SourceLocation RParenLoc) {
2286     return getSema().BuildVAArgExpr(BuiltinLoc,
2287                                     SubExpr, TInfo,
2288                                     RParenLoc);
2289   }
2290 
2291   /// \brief Build a new expression list in parentheses.
2292   ///
2293   /// By default, performs semantic analysis to build the new expression.
2294   /// Subclasses may override this routine to provide different behavior.
2295   ExprResult RebuildParenListExpr(SourceLocation LParenLoc,
2296                                   MultiExprArg SubExprs,
2297                                   SourceLocation RParenLoc) {
2298     return getSema().ActOnParenListExpr(LParenLoc, RParenLoc, SubExprs);
2299   }
2300 
2301   /// \brief Build a new address-of-label expression.
2302   ///
2303   /// By default, performs semantic analysis, using the name of the label
2304   /// rather than attempting to map the label statement itself.
2305   /// Subclasses may override this routine to provide different behavior.
2306   ExprResult RebuildAddrLabelExpr(SourceLocation AmpAmpLoc,
2307                                   SourceLocation LabelLoc, LabelDecl *Label) {
2308     return getSema().ActOnAddrLabel(AmpAmpLoc, LabelLoc, Label);
2309   }
2310 
2311   /// \brief Build a new GNU statement expression.
2312   ///
2313   /// By default, performs semantic analysis to build the new expression.
2314   /// Subclasses may override this routine to provide different behavior.
2315   ExprResult RebuildStmtExpr(SourceLocation LParenLoc,
2316                                    Stmt *SubStmt,
2317                                    SourceLocation RParenLoc) {
2318     return getSema().ActOnStmtExpr(LParenLoc, SubStmt, RParenLoc);
2319   }
2320 
2321   /// \brief Build a new __builtin_choose_expr expression.
2322   ///
2323   /// By default, performs semantic analysis to build the new expression.
2324   /// Subclasses may override this routine to provide different behavior.
2325   ExprResult RebuildChooseExpr(SourceLocation BuiltinLoc,
2326                                      Expr *Cond, Expr *LHS, Expr *RHS,
2327                                      SourceLocation RParenLoc) {
2328     return SemaRef.ActOnChooseExpr(BuiltinLoc,
2329                                    Cond, LHS, RHS,
2330                                    RParenLoc);
2331   }
2332 
2333   /// \brief Build a new generic selection expression.
2334   ///
2335   /// By default, performs semantic analysis to build the new expression.
2336   /// Subclasses may override this routine to provide different behavior.
2337   ExprResult RebuildGenericSelectionExpr(SourceLocation KeyLoc,
2338                                          SourceLocation DefaultLoc,
2339                                          SourceLocation RParenLoc,
2340                                          Expr *ControllingExpr,
2341                                          ArrayRef<TypeSourceInfo *> Types,
2342                                          ArrayRef<Expr *> Exprs) {
2343     return getSema().CreateGenericSelectionExpr(KeyLoc, DefaultLoc, RParenLoc,
2344                                                 ControllingExpr, Types, Exprs);
2345   }
2346 
2347   /// \brief Build a new overloaded operator call expression.
2348   ///
2349   /// By default, performs semantic analysis to build the new expression.
2350   /// The semantic analysis provides the behavior of template instantiation,
2351   /// copying with transformations that turn what looks like an overloaded
2352   /// operator call into a use of a builtin operator, performing
2353   /// argument-dependent lookup, etc. Subclasses may override this routine to
2354   /// provide different behavior.
2355   ExprResult RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op,
2356                                               SourceLocation OpLoc,
2357                                               Expr *Callee,
2358                                               Expr *First,
2359                                               Expr *Second);
2360 
2361   /// \brief Build a new C++ "named" cast expression, such as static_cast or
2362   /// reinterpret_cast.
2363   ///
2364   /// By default, this routine dispatches to one of the more-specific routines
2365   /// for a particular named case, e.g., RebuildCXXStaticCastExpr().
2366   /// Subclasses may override this routine to provide different behavior.
2367   ExprResult RebuildCXXNamedCastExpr(SourceLocation OpLoc,
2368                                            Stmt::StmtClass Class,
2369                                            SourceLocation LAngleLoc,
2370                                            TypeSourceInfo *TInfo,
2371                                            SourceLocation RAngleLoc,
2372                                            SourceLocation LParenLoc,
2373                                            Expr *SubExpr,
2374                                            SourceLocation RParenLoc) {
2375     switch (Class) {
2376     case Stmt::CXXStaticCastExprClass:
2377       return getDerived().RebuildCXXStaticCastExpr(OpLoc, LAngleLoc, TInfo,
2378                                                    RAngleLoc, LParenLoc,
2379                                                    SubExpr, RParenLoc);
2380 
2381     case Stmt::CXXDynamicCastExprClass:
2382       return getDerived().RebuildCXXDynamicCastExpr(OpLoc, LAngleLoc, TInfo,
2383                                                     RAngleLoc, LParenLoc,
2384                                                     SubExpr, RParenLoc);
2385 
2386     case Stmt::CXXReinterpretCastExprClass:
2387       return getDerived().RebuildCXXReinterpretCastExpr(OpLoc, LAngleLoc, TInfo,
2388                                                         RAngleLoc, LParenLoc,
2389                                                         SubExpr,
2390                                                         RParenLoc);
2391 
2392     case Stmt::CXXConstCastExprClass:
2393       return getDerived().RebuildCXXConstCastExpr(OpLoc, LAngleLoc, TInfo,
2394                                                    RAngleLoc, LParenLoc,
2395                                                    SubExpr, RParenLoc);
2396 
2397     default:
2398       llvm_unreachable("Invalid C++ named cast");
2399     }
2400   }
2401 
2402   /// \brief Build a new C++ static_cast expression.
2403   ///
2404   /// By default, performs semantic analysis to build the new expression.
2405   /// Subclasses may override this routine to provide different behavior.
2406   ExprResult RebuildCXXStaticCastExpr(SourceLocation OpLoc,
2407                                             SourceLocation LAngleLoc,
2408                                             TypeSourceInfo *TInfo,
2409                                             SourceLocation RAngleLoc,
2410                                             SourceLocation LParenLoc,
2411                                             Expr *SubExpr,
2412                                             SourceLocation RParenLoc) {
2413     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_static_cast,
2414                                        TInfo, SubExpr,
2415                                        SourceRange(LAngleLoc, RAngleLoc),
2416                                        SourceRange(LParenLoc, RParenLoc));
2417   }
2418 
2419   /// \brief Build a new C++ dynamic_cast expression.
2420   ///
2421   /// By default, performs semantic analysis to build the new expression.
2422   /// Subclasses may override this routine to provide different behavior.
2423   ExprResult RebuildCXXDynamicCastExpr(SourceLocation OpLoc,
2424                                              SourceLocation LAngleLoc,
2425                                              TypeSourceInfo *TInfo,
2426                                              SourceLocation RAngleLoc,
2427                                              SourceLocation LParenLoc,
2428                                              Expr *SubExpr,
2429                                              SourceLocation RParenLoc) {
2430     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_dynamic_cast,
2431                                        TInfo, SubExpr,
2432                                        SourceRange(LAngleLoc, RAngleLoc),
2433                                        SourceRange(LParenLoc, RParenLoc));
2434   }
2435 
2436   /// \brief Build a new C++ reinterpret_cast expression.
2437   ///
2438   /// By default, performs semantic analysis to build the new expression.
2439   /// Subclasses may override this routine to provide different behavior.
2440   ExprResult RebuildCXXReinterpretCastExpr(SourceLocation OpLoc,
2441                                                  SourceLocation LAngleLoc,
2442                                                  TypeSourceInfo *TInfo,
2443                                                  SourceLocation RAngleLoc,
2444                                                  SourceLocation LParenLoc,
2445                                                  Expr *SubExpr,
2446                                                  SourceLocation RParenLoc) {
2447     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_reinterpret_cast,
2448                                        TInfo, SubExpr,
2449                                        SourceRange(LAngleLoc, RAngleLoc),
2450                                        SourceRange(LParenLoc, RParenLoc));
2451   }
2452 
2453   /// \brief Build a new C++ const_cast expression.
2454   ///
2455   /// By default, performs semantic analysis to build the new expression.
2456   /// Subclasses may override this routine to provide different behavior.
2457   ExprResult RebuildCXXConstCastExpr(SourceLocation OpLoc,
2458                                            SourceLocation LAngleLoc,
2459                                            TypeSourceInfo *TInfo,
2460                                            SourceLocation RAngleLoc,
2461                                            SourceLocation LParenLoc,
2462                                            Expr *SubExpr,
2463                                            SourceLocation RParenLoc) {
2464     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_const_cast,
2465                                        TInfo, SubExpr,
2466                                        SourceRange(LAngleLoc, RAngleLoc),
2467                                        SourceRange(LParenLoc, RParenLoc));
2468   }
2469 
2470   /// \brief Build a new C++ functional-style cast expression.
2471   ///
2472   /// By default, performs semantic analysis to build the new expression.
2473   /// Subclasses may override this routine to provide different behavior.
2474   ExprResult RebuildCXXFunctionalCastExpr(TypeSourceInfo *TInfo,
2475                                           SourceLocation LParenLoc,
2476                                           Expr *Sub,
2477                                           SourceLocation RParenLoc) {
2478     return getSema().BuildCXXTypeConstructExpr(TInfo, LParenLoc,
2479                                                MultiExprArg(&Sub, 1),
2480                                                RParenLoc);
2481   }
2482 
2483   /// \brief Build a new C++ typeid(type) expression.
2484   ///
2485   /// By default, performs semantic analysis to build the new expression.
2486   /// Subclasses may override this routine to provide different behavior.
2487   ExprResult RebuildCXXTypeidExpr(QualType TypeInfoType,
2488                                         SourceLocation TypeidLoc,
2489                                         TypeSourceInfo *Operand,
2490                                         SourceLocation RParenLoc) {
2491     return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand,
2492                                     RParenLoc);
2493   }
2494 
2495 
2496   /// \brief Build a new C++ typeid(expr) expression.
2497   ///
2498   /// By default, performs semantic analysis to build the new expression.
2499   /// Subclasses may override this routine to provide different behavior.
2500   ExprResult RebuildCXXTypeidExpr(QualType TypeInfoType,
2501                                         SourceLocation TypeidLoc,
2502                                         Expr *Operand,
2503                                         SourceLocation RParenLoc) {
2504     return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand,
2505                                     RParenLoc);
2506   }
2507 
2508   /// \brief Build a new C++ __uuidof(type) expression.
2509   ///
2510   /// By default, performs semantic analysis to build the new expression.
2511   /// Subclasses may override this routine to provide different behavior.
2512   ExprResult RebuildCXXUuidofExpr(QualType TypeInfoType,
2513                                         SourceLocation TypeidLoc,
2514                                         TypeSourceInfo *Operand,
2515                                         SourceLocation RParenLoc) {
2516     return getSema().BuildCXXUuidof(TypeInfoType, TypeidLoc, Operand,
2517                                     RParenLoc);
2518   }
2519 
2520   /// \brief Build a new C++ __uuidof(expr) expression.
2521   ///
2522   /// By default, performs semantic analysis to build the new expression.
2523   /// Subclasses may override this routine to provide different behavior.
2524   ExprResult RebuildCXXUuidofExpr(QualType TypeInfoType,
2525                                         SourceLocation TypeidLoc,
2526                                         Expr *Operand,
2527                                         SourceLocation RParenLoc) {
2528     return getSema().BuildCXXUuidof(TypeInfoType, TypeidLoc, Operand,
2529                                     RParenLoc);
2530   }
2531 
2532   /// \brief Build a new C++ "this" expression.
2533   ///
2534   /// By default, builds a new "this" expression without performing any
2535   /// semantic analysis. Subclasses may override this routine to provide
2536   /// different behavior.
2537   ExprResult RebuildCXXThisExpr(SourceLocation ThisLoc,
2538                                 QualType ThisType,
2539                                 bool isImplicit) {
2540     getSema().CheckCXXThisCapture(ThisLoc);
2541     return new (getSema().Context) CXXThisExpr(ThisLoc, ThisType, isImplicit);
2542   }
2543 
2544   /// \brief Build a new C++ throw expression.
2545   ///
2546   /// By default, performs semantic analysis to build the new expression.
2547   /// Subclasses may override this routine to provide different behavior.
2548   ExprResult RebuildCXXThrowExpr(SourceLocation ThrowLoc, Expr *Sub,
2549                                  bool IsThrownVariableInScope) {
2550     return getSema().BuildCXXThrow(ThrowLoc, Sub, IsThrownVariableInScope);
2551   }
2552 
2553   /// \brief Build a new C++ default-argument expression.
2554   ///
2555   /// By default, builds a new default-argument expression, which does not
2556   /// require any semantic analysis. Subclasses may override this routine to
2557   /// provide different behavior.
2558   ExprResult RebuildCXXDefaultArgExpr(SourceLocation Loc,
2559                                             ParmVarDecl *Param) {
2560     return CXXDefaultArgExpr::Create(getSema().Context, Loc, Param);
2561   }
2562 
2563   /// \brief Build a new C++11 default-initialization expression.
2564   ///
2565   /// By default, builds a new default field initialization expression, which
2566   /// does not require any semantic analysis. Subclasses may override this
2567   /// routine to provide different behavior.
2568   ExprResult RebuildCXXDefaultInitExpr(SourceLocation Loc,
2569                                        FieldDecl *Field) {
2570     return CXXDefaultInitExpr::Create(getSema().Context, Loc, Field);
2571   }
2572 
2573   /// \brief Build a new C++ zero-initialization expression.
2574   ///
2575   /// By default, performs semantic analysis to build the new expression.
2576   /// Subclasses may override this routine to provide different behavior.
2577   ExprResult RebuildCXXScalarValueInitExpr(TypeSourceInfo *TSInfo,
2578                                            SourceLocation LParenLoc,
2579                                            SourceLocation RParenLoc) {
2580     return getSema().BuildCXXTypeConstructExpr(TSInfo, LParenLoc,
2581                                                None, RParenLoc);
2582   }
2583 
2584   /// \brief Build a new C++ "new" expression.
2585   ///
2586   /// By default, performs semantic analysis to build the new expression.
2587   /// Subclasses may override this routine to provide different behavior.
2588   ExprResult RebuildCXXNewExpr(SourceLocation StartLoc,
2589                                bool UseGlobal,
2590                                SourceLocation PlacementLParen,
2591                                MultiExprArg PlacementArgs,
2592                                SourceLocation PlacementRParen,
2593                                SourceRange TypeIdParens,
2594                                QualType AllocatedType,
2595                                TypeSourceInfo *AllocatedTypeInfo,
2596                                Expr *ArraySize,
2597                                SourceRange DirectInitRange,
2598                                Expr *Initializer) {
2599     return getSema().BuildCXXNew(StartLoc, UseGlobal,
2600                                  PlacementLParen,
2601                                  PlacementArgs,
2602                                  PlacementRParen,
2603                                  TypeIdParens,
2604                                  AllocatedType,
2605                                  AllocatedTypeInfo,
2606                                  ArraySize,
2607                                  DirectInitRange,
2608                                  Initializer);
2609   }
2610 
2611   /// \brief Build a new C++ "delete" expression.
2612   ///
2613   /// By default, performs semantic analysis to build the new expression.
2614   /// Subclasses may override this routine to provide different behavior.
2615   ExprResult RebuildCXXDeleteExpr(SourceLocation StartLoc,
2616                                         bool IsGlobalDelete,
2617                                         bool IsArrayForm,
2618                                         Expr *Operand) {
2619     return getSema().ActOnCXXDelete(StartLoc, IsGlobalDelete, IsArrayForm,
2620                                     Operand);
2621   }
2622 
2623   /// \brief Build a new type trait expression.
2624   ///
2625   /// By default, performs semantic analysis to build the new expression.
2626   /// Subclasses may override this routine to provide different behavior.
2627   ExprResult RebuildTypeTrait(TypeTrait Trait,
2628                               SourceLocation StartLoc,
2629                               ArrayRef<TypeSourceInfo *> Args,
2630                               SourceLocation RParenLoc) {
2631     return getSema().BuildTypeTrait(Trait, StartLoc, Args, RParenLoc);
2632   }
2633 
2634   /// \brief Build a new array type trait expression.
2635   ///
2636   /// By default, performs semantic analysis to build the new expression.
2637   /// Subclasses may override this routine to provide different behavior.
2638   ExprResult RebuildArrayTypeTrait(ArrayTypeTrait Trait,
2639                                    SourceLocation StartLoc,
2640                                    TypeSourceInfo *TSInfo,
2641                                    Expr *DimExpr,
2642                                    SourceLocation RParenLoc) {
2643     return getSema().BuildArrayTypeTrait(Trait, StartLoc, TSInfo, DimExpr, RParenLoc);
2644   }
2645 
2646   /// \brief Build a new expression trait expression.
2647   ///
2648   /// By default, performs semantic analysis to build the new expression.
2649   /// Subclasses may override this routine to provide different behavior.
2650   ExprResult RebuildExpressionTrait(ExpressionTrait Trait,
2651                                    SourceLocation StartLoc,
2652                                    Expr *Queried,
2653                                    SourceLocation RParenLoc) {
2654     return getSema().BuildExpressionTrait(Trait, StartLoc, Queried, RParenLoc);
2655   }
2656 
2657   /// \brief Build a new (previously unresolved) declaration reference
2658   /// expression.
2659   ///
2660   /// By default, performs semantic analysis to build the new expression.
2661   /// Subclasses may override this routine to provide different behavior.
2662   ExprResult RebuildDependentScopeDeclRefExpr(
2663                                           NestedNameSpecifierLoc QualifierLoc,
2664                                           SourceLocation TemplateKWLoc,
2665                                        const DeclarationNameInfo &NameInfo,
2666                               const TemplateArgumentListInfo *TemplateArgs,
2667                                           bool IsAddressOfOperand,
2668                                           TypeSourceInfo **RecoveryTSI) {
2669     CXXScopeSpec SS;
2670     SS.Adopt(QualifierLoc);
2671 
2672     if (TemplateArgs || TemplateKWLoc.isValid())
2673       return getSema().BuildQualifiedTemplateIdExpr(SS, TemplateKWLoc, NameInfo,
2674                                                     TemplateArgs);
2675 
2676     return getSema().BuildQualifiedDeclarationNameExpr(
2677         SS, NameInfo, IsAddressOfOperand, /*S*/nullptr, RecoveryTSI);
2678   }
2679 
2680   /// \brief Build a new template-id expression.
2681   ///
2682   /// By default, performs semantic analysis to build the new expression.
2683   /// Subclasses may override this routine to provide different behavior.
2684   ExprResult RebuildTemplateIdExpr(const CXXScopeSpec &SS,
2685                                    SourceLocation TemplateKWLoc,
2686                                    LookupResult &R,
2687                                    bool RequiresADL,
2688                               const TemplateArgumentListInfo *TemplateArgs) {
2689     return getSema().BuildTemplateIdExpr(SS, TemplateKWLoc, R, RequiresADL,
2690                                          TemplateArgs);
2691   }
2692 
2693   /// \brief Build a new object-construction expression.
2694   ///
2695   /// By default, performs semantic analysis to build the new expression.
2696   /// Subclasses may override this routine to provide different behavior.
2697   ExprResult RebuildCXXConstructExpr(QualType T,
2698                                      SourceLocation Loc,
2699                                      CXXConstructorDecl *Constructor,
2700                                      bool IsElidable,
2701                                      MultiExprArg Args,
2702                                      bool HadMultipleCandidates,
2703                                      bool ListInitialization,
2704                                      bool StdInitListInitialization,
2705                                      bool RequiresZeroInit,
2706                              CXXConstructExpr::ConstructionKind ConstructKind,
2707                                      SourceRange ParenRange) {
2708     SmallVector<Expr*, 8> ConvertedArgs;
2709     if (getSema().CompleteConstructorCall(Constructor, Args, Loc,
2710                                           ConvertedArgs))
2711       return ExprError();
2712 
2713     return getSema().BuildCXXConstructExpr(Loc, T, Constructor,
2714                                            IsElidable,
2715                                            ConvertedArgs,
2716                                            HadMultipleCandidates,
2717                                            ListInitialization,
2718                                            StdInitListInitialization,
2719                                            RequiresZeroInit, ConstructKind,
2720                                            ParenRange);
2721   }
2722 
2723   /// \brief Build a new implicit construction via inherited constructor
2724   /// expression.
2725   ExprResult RebuildCXXInheritedCtorInitExpr(QualType T, SourceLocation Loc,
2726                                              CXXConstructorDecl *Constructor,
2727                                              bool ConstructsVBase,
2728                                              bool InheritedFromVBase) {
2729     return new (getSema().Context) CXXInheritedCtorInitExpr(
2730         Loc, T, Constructor, ConstructsVBase, InheritedFromVBase);
2731   }
2732 
2733   /// \brief Build a new object-construction expression.
2734   ///
2735   /// By default, performs semantic analysis to build the new expression.
2736   /// Subclasses may override this routine to provide different behavior.
2737   ExprResult RebuildCXXTemporaryObjectExpr(TypeSourceInfo *TSInfo,
2738                                            SourceLocation LParenLoc,
2739                                            MultiExprArg Args,
2740                                            SourceLocation RParenLoc) {
2741     return getSema().BuildCXXTypeConstructExpr(TSInfo,
2742                                                LParenLoc,
2743                                                Args,
2744                                                RParenLoc);
2745   }
2746 
2747   /// \brief Build a new object-construction expression.
2748   ///
2749   /// By default, performs semantic analysis to build the new expression.
2750   /// Subclasses may override this routine to provide different behavior.
2751   ExprResult RebuildCXXUnresolvedConstructExpr(TypeSourceInfo *TSInfo,
2752                                                SourceLocation LParenLoc,
2753                                                MultiExprArg Args,
2754                                                SourceLocation RParenLoc) {
2755     return getSema().BuildCXXTypeConstructExpr(TSInfo,
2756                                                LParenLoc,
2757                                                Args,
2758                                                RParenLoc);
2759   }
2760 
2761   /// \brief Build a new member reference expression.
2762   ///
2763   /// By default, performs semantic analysis to build the new expression.
2764   /// Subclasses may override this routine to provide different behavior.
2765   ExprResult RebuildCXXDependentScopeMemberExpr(Expr *BaseE,
2766                                                 QualType BaseType,
2767                                                 bool IsArrow,
2768                                                 SourceLocation OperatorLoc,
2769                                           NestedNameSpecifierLoc QualifierLoc,
2770                                                 SourceLocation TemplateKWLoc,
2771                                             NamedDecl *FirstQualifierInScope,
2772                                    const DeclarationNameInfo &MemberNameInfo,
2773                               const TemplateArgumentListInfo *TemplateArgs) {
2774     CXXScopeSpec SS;
2775     SS.Adopt(QualifierLoc);
2776 
2777     return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType,
2778                                             OperatorLoc, IsArrow,
2779                                             SS, TemplateKWLoc,
2780                                             FirstQualifierInScope,
2781                                             MemberNameInfo,
2782                                             TemplateArgs, /*S*/nullptr);
2783   }
2784 
2785   /// \brief Build a new member reference expression.
2786   ///
2787   /// By default, performs semantic analysis to build the new expression.
2788   /// Subclasses may override this routine to provide different behavior.
2789   ExprResult RebuildUnresolvedMemberExpr(Expr *BaseE, QualType BaseType,
2790                                          SourceLocation OperatorLoc,
2791                                          bool IsArrow,
2792                                          NestedNameSpecifierLoc QualifierLoc,
2793                                          SourceLocation TemplateKWLoc,
2794                                          NamedDecl *FirstQualifierInScope,
2795                                          LookupResult &R,
2796                                 const TemplateArgumentListInfo *TemplateArgs) {
2797     CXXScopeSpec SS;
2798     SS.Adopt(QualifierLoc);
2799 
2800     return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType,
2801                                             OperatorLoc, IsArrow,
2802                                             SS, TemplateKWLoc,
2803                                             FirstQualifierInScope,
2804                                             R, TemplateArgs, /*S*/nullptr);
2805   }
2806 
2807   /// \brief Build a new noexcept expression.
2808   ///
2809   /// By default, performs semantic analysis to build the new expression.
2810   /// Subclasses may override this routine to provide different behavior.
2811   ExprResult RebuildCXXNoexceptExpr(SourceRange Range, Expr *Arg) {
2812     return SemaRef.BuildCXXNoexceptExpr(Range.getBegin(), Arg, Range.getEnd());
2813   }
2814 
2815   /// \brief Build a new expression to compute the length of a parameter pack.
2816   ExprResult RebuildSizeOfPackExpr(SourceLocation OperatorLoc,
2817                                    NamedDecl *Pack,
2818                                    SourceLocation PackLoc,
2819                                    SourceLocation RParenLoc,
2820                                    Optional<unsigned> Length,
2821                                    ArrayRef<TemplateArgument> PartialArgs) {
2822     return SizeOfPackExpr::Create(SemaRef.Context, OperatorLoc, Pack, PackLoc,
2823                                   RParenLoc, Length, PartialArgs);
2824   }
2825 
2826   /// \brief Build a new Objective-C boxed expression.
2827   ///
2828   /// By default, performs semantic analysis to build the new expression.
2829   /// Subclasses may override this routine to provide different behavior.
2830   ExprResult RebuildObjCBoxedExpr(SourceRange SR, Expr *ValueExpr) {
2831     return getSema().BuildObjCBoxedExpr(SR, ValueExpr);
2832   }
2833 
2834   /// \brief Build a new Objective-C array literal.
2835   ///
2836   /// By default, performs semantic analysis to build the new expression.
2837   /// Subclasses may override this routine to provide different behavior.
2838   ExprResult RebuildObjCArrayLiteral(SourceRange Range,
2839                                      Expr **Elements, unsigned NumElements) {
2840     return getSema().BuildObjCArrayLiteral(Range,
2841                                            MultiExprArg(Elements, NumElements));
2842   }
2843 
2844   ExprResult RebuildObjCSubscriptRefExpr(SourceLocation RB,
2845                                          Expr *Base, Expr *Key,
2846                                          ObjCMethodDecl *getterMethod,
2847                                          ObjCMethodDecl *setterMethod) {
2848     return  getSema().BuildObjCSubscriptExpression(RB, Base, Key,
2849                                                    getterMethod, setterMethod);
2850   }
2851 
2852   /// \brief Build a new Objective-C dictionary literal.
2853   ///
2854   /// By default, performs semantic analysis to build the new expression.
2855   /// Subclasses may override this routine to provide different behavior.
2856   ExprResult RebuildObjCDictionaryLiteral(SourceRange Range,
2857                               MutableArrayRef<ObjCDictionaryElement> Elements) {
2858     return getSema().BuildObjCDictionaryLiteral(Range, Elements);
2859   }
2860 
2861   /// \brief Build a new Objective-C \@encode expression.
2862   ///
2863   /// By default, performs semantic analysis to build the new expression.
2864   /// Subclasses may override this routine to provide different behavior.
2865   ExprResult RebuildObjCEncodeExpr(SourceLocation AtLoc,
2866                                          TypeSourceInfo *EncodeTypeInfo,
2867                                          SourceLocation RParenLoc) {
2868     return SemaRef.BuildObjCEncodeExpression(AtLoc, EncodeTypeInfo, RParenLoc);
2869   }
2870 
2871   /// \brief Build a new Objective-C class message.
2872   ExprResult RebuildObjCMessageExpr(TypeSourceInfo *ReceiverTypeInfo,
2873                                           Selector Sel,
2874                                           ArrayRef<SourceLocation> SelectorLocs,
2875                                           ObjCMethodDecl *Method,
2876                                           SourceLocation LBracLoc,
2877                                           MultiExprArg Args,
2878                                           SourceLocation RBracLoc) {
2879     return SemaRef.BuildClassMessage(ReceiverTypeInfo,
2880                                      ReceiverTypeInfo->getType(),
2881                                      /*SuperLoc=*/SourceLocation(),
2882                                      Sel, Method, LBracLoc, SelectorLocs,
2883                                      RBracLoc, Args);
2884   }
2885 
2886   /// \brief Build a new Objective-C instance message.
2887   ExprResult RebuildObjCMessageExpr(Expr *Receiver,
2888                                           Selector Sel,
2889                                           ArrayRef<SourceLocation> SelectorLocs,
2890                                           ObjCMethodDecl *Method,
2891                                           SourceLocation LBracLoc,
2892                                           MultiExprArg Args,
2893                                           SourceLocation RBracLoc) {
2894     return SemaRef.BuildInstanceMessage(Receiver,
2895                                         Receiver->getType(),
2896                                         /*SuperLoc=*/SourceLocation(),
2897                                         Sel, Method, LBracLoc, SelectorLocs,
2898                                         RBracLoc, Args);
2899   }
2900 
2901   /// \brief Build a new Objective-C instance/class message to 'super'.
2902   ExprResult RebuildObjCMessageExpr(SourceLocation SuperLoc,
2903                                     Selector Sel,
2904                                     ArrayRef<SourceLocation> SelectorLocs,
2905                                     QualType SuperType,
2906                                     ObjCMethodDecl *Method,
2907                                     SourceLocation LBracLoc,
2908                                     MultiExprArg Args,
2909                                     SourceLocation RBracLoc) {
2910     return Method->isInstanceMethod() ? SemaRef.BuildInstanceMessage(nullptr,
2911                                           SuperType,
2912                                           SuperLoc,
2913                                           Sel, Method, LBracLoc, SelectorLocs,
2914                                           RBracLoc, Args)
2915                                       : SemaRef.BuildClassMessage(nullptr,
2916                                           SuperType,
2917                                           SuperLoc,
2918                                           Sel, Method, LBracLoc, SelectorLocs,
2919                                           RBracLoc, Args);
2920 
2921 
2922   }
2923 
2924   /// \brief Build a new Objective-C ivar reference expression.
2925   ///
2926   /// By default, performs semantic analysis to build the new expression.
2927   /// Subclasses may override this routine to provide different behavior.
2928   ExprResult RebuildObjCIvarRefExpr(Expr *BaseArg, ObjCIvarDecl *Ivar,
2929                                           SourceLocation IvarLoc,
2930                                           bool IsArrow, bool IsFreeIvar) {
2931     // FIXME: We lose track of the IsFreeIvar bit.
2932     CXXScopeSpec SS;
2933     DeclarationNameInfo NameInfo(Ivar->getDeclName(), IvarLoc);
2934     return getSema().BuildMemberReferenceExpr(BaseArg, BaseArg->getType(),
2935                                               /*FIXME:*/IvarLoc, IsArrow,
2936                                               SS, SourceLocation(),
2937                                               /*FirstQualifierInScope=*/nullptr,
2938                                               NameInfo,
2939                                               /*TemplateArgs=*/nullptr,
2940                                               /*S=*/nullptr);
2941   }
2942 
2943   /// \brief Build a new Objective-C property reference expression.
2944   ///
2945   /// By default, performs semantic analysis to build the new expression.
2946   /// Subclasses may override this routine to provide different behavior.
2947   ExprResult RebuildObjCPropertyRefExpr(Expr *BaseArg,
2948                                         ObjCPropertyDecl *Property,
2949                                         SourceLocation PropertyLoc) {
2950     CXXScopeSpec SS;
2951     DeclarationNameInfo NameInfo(Property->getDeclName(), PropertyLoc);
2952     return getSema().BuildMemberReferenceExpr(BaseArg, BaseArg->getType(),
2953                                               /*FIXME:*/PropertyLoc,
2954                                               /*IsArrow=*/false,
2955                                               SS, SourceLocation(),
2956                                               /*FirstQualifierInScope=*/nullptr,
2957                                               NameInfo,
2958                                               /*TemplateArgs=*/nullptr,
2959                                               /*S=*/nullptr);
2960   }
2961 
2962   /// \brief Build a new Objective-C property reference expression.
2963   ///
2964   /// By default, performs semantic analysis to build the new expression.
2965   /// Subclasses may override this routine to provide different behavior.
2966   ExprResult RebuildObjCPropertyRefExpr(Expr *Base, QualType T,
2967                                         ObjCMethodDecl *Getter,
2968                                         ObjCMethodDecl *Setter,
2969                                         SourceLocation PropertyLoc) {
2970     // Since these expressions can only be value-dependent, we do not
2971     // need to perform semantic analysis again.
2972     return Owned(
2973       new (getSema().Context) ObjCPropertyRefExpr(Getter, Setter, T,
2974                                                   VK_LValue, OK_ObjCProperty,
2975                                                   PropertyLoc, Base));
2976   }
2977 
2978   /// \brief Build a new Objective-C "isa" expression.
2979   ///
2980   /// By default, performs semantic analysis to build the new expression.
2981   /// Subclasses may override this routine to provide different behavior.
2982   ExprResult RebuildObjCIsaExpr(Expr *BaseArg, SourceLocation IsaLoc,
2983                                 SourceLocation OpLoc, bool IsArrow) {
2984     CXXScopeSpec SS;
2985     DeclarationNameInfo NameInfo(&getSema().Context.Idents.get("isa"), IsaLoc);
2986     return getSema().BuildMemberReferenceExpr(BaseArg, BaseArg->getType(),
2987                                               OpLoc, IsArrow,
2988                                               SS, SourceLocation(),
2989                                               /*FirstQualifierInScope=*/nullptr,
2990                                               NameInfo,
2991                                               /*TemplateArgs=*/nullptr,
2992                                               /*S=*/nullptr);
2993   }
2994 
2995   /// \brief Build a new shuffle vector expression.
2996   ///
2997   /// By default, performs semantic analysis to build the new expression.
2998   /// Subclasses may override this routine to provide different behavior.
2999   ExprResult RebuildShuffleVectorExpr(SourceLocation BuiltinLoc,
3000                                       MultiExprArg SubExprs,
3001                                       SourceLocation RParenLoc) {
3002     // Find the declaration for __builtin_shufflevector
3003     const IdentifierInfo &Name
3004       = SemaRef.Context.Idents.get("__builtin_shufflevector");
3005     TranslationUnitDecl *TUDecl = SemaRef.Context.getTranslationUnitDecl();
3006     DeclContext::lookup_result Lookup = TUDecl->lookup(DeclarationName(&Name));
3007     assert(!Lookup.empty() && "No __builtin_shufflevector?");
3008 
3009     // Build a reference to the __builtin_shufflevector builtin
3010     FunctionDecl *Builtin = cast<FunctionDecl>(Lookup.front());
3011     Expr *Callee = new (SemaRef.Context) DeclRefExpr(Builtin, false,
3012                                                   SemaRef.Context.BuiltinFnTy,
3013                                                   VK_RValue, BuiltinLoc);
3014     QualType CalleePtrTy = SemaRef.Context.getPointerType(Builtin->getType());
3015     Callee = SemaRef.ImpCastExprToType(Callee, CalleePtrTy,
3016                                        CK_BuiltinFnToFnPtr).get();
3017 
3018     // Build the CallExpr
3019     ExprResult TheCall = new (SemaRef.Context) CallExpr(
3020         SemaRef.Context, Callee, SubExprs, Builtin->getCallResultType(),
3021         Expr::getValueKindForType(Builtin->getReturnType()), RParenLoc);
3022 
3023     // Type-check the __builtin_shufflevector expression.
3024     return SemaRef.SemaBuiltinShuffleVector(cast<CallExpr>(TheCall.get()));
3025   }
3026 
3027   /// \brief Build a new convert vector expression.
3028   ExprResult RebuildConvertVectorExpr(SourceLocation BuiltinLoc,
3029                                       Expr *SrcExpr, TypeSourceInfo *DstTInfo,
3030                                       SourceLocation RParenLoc) {
3031     return SemaRef.SemaConvertVectorExpr(SrcExpr, DstTInfo,
3032                                          BuiltinLoc, RParenLoc);
3033   }
3034 
3035   /// \brief Build a new template argument pack expansion.
3036   ///
3037   /// By default, performs semantic analysis to build a new pack expansion
3038   /// for a template argument. Subclasses may override this routine to provide
3039   /// different behavior.
3040   TemplateArgumentLoc RebuildPackExpansion(TemplateArgumentLoc Pattern,
3041                                            SourceLocation EllipsisLoc,
3042                                            Optional<unsigned> NumExpansions) {
3043     switch (Pattern.getArgument().getKind()) {
3044     case TemplateArgument::Expression: {
3045       ExprResult Result
3046         = getSema().CheckPackExpansion(Pattern.getSourceExpression(),
3047                                        EllipsisLoc, NumExpansions);
3048       if (Result.isInvalid())
3049         return TemplateArgumentLoc();
3050 
3051       return TemplateArgumentLoc(Result.get(), Result.get());
3052     }
3053 
3054     case TemplateArgument::Template:
3055       return TemplateArgumentLoc(TemplateArgument(
3056                                           Pattern.getArgument().getAsTemplate(),
3057                                                   NumExpansions),
3058                                  Pattern.getTemplateQualifierLoc(),
3059                                  Pattern.getTemplateNameLoc(),
3060                                  EllipsisLoc);
3061 
3062     case TemplateArgument::Null:
3063     case TemplateArgument::Integral:
3064     case TemplateArgument::Declaration:
3065     case TemplateArgument::Pack:
3066     case TemplateArgument::TemplateExpansion:
3067     case TemplateArgument::NullPtr:
3068       llvm_unreachable("Pack expansion pattern has no parameter packs");
3069 
3070     case TemplateArgument::Type:
3071       if (TypeSourceInfo *Expansion
3072             = getSema().CheckPackExpansion(Pattern.getTypeSourceInfo(),
3073                                            EllipsisLoc,
3074                                            NumExpansions))
3075         return TemplateArgumentLoc(TemplateArgument(Expansion->getType()),
3076                                    Expansion);
3077       break;
3078     }
3079 
3080     return TemplateArgumentLoc();
3081   }
3082 
3083   /// \brief Build a new expression pack expansion.
3084   ///
3085   /// By default, performs semantic analysis to build a new pack expansion
3086   /// for an expression. Subclasses may override this routine to provide
3087   /// different behavior.
3088   ExprResult RebuildPackExpansion(Expr *Pattern, SourceLocation EllipsisLoc,
3089                                   Optional<unsigned> NumExpansions) {
3090     return getSema().CheckPackExpansion(Pattern, EllipsisLoc, NumExpansions);
3091   }
3092 
3093   /// \brief Build a new C++1z fold-expression.
3094   ///
3095   /// By default, performs semantic analysis in order to build a new fold
3096   /// expression.
3097   ExprResult RebuildCXXFoldExpr(SourceLocation LParenLoc, Expr *LHS,
3098                                 BinaryOperatorKind Operator,
3099                                 SourceLocation EllipsisLoc, Expr *RHS,
3100                                 SourceLocation RParenLoc) {
3101     return getSema().BuildCXXFoldExpr(LParenLoc, LHS, Operator, EllipsisLoc,
3102                                       RHS, RParenLoc);
3103   }
3104 
3105   /// \brief Build an empty C++1z fold-expression with the given operator.
3106   ///
3107   /// By default, produces the fallback value for the fold-expression, or
3108   /// produce an error if there is no fallback value.
3109   ExprResult RebuildEmptyCXXFoldExpr(SourceLocation EllipsisLoc,
3110                                      BinaryOperatorKind Operator) {
3111     return getSema().BuildEmptyCXXFoldExpr(EllipsisLoc, Operator);
3112   }
3113 
3114   /// \brief Build a new atomic operation expression.
3115   ///
3116   /// By default, performs semantic analysis to build the new expression.
3117   /// Subclasses may override this routine to provide different behavior.
3118   ExprResult RebuildAtomicExpr(SourceLocation BuiltinLoc,
3119                                MultiExprArg SubExprs,
3120                                QualType RetTy,
3121                                AtomicExpr::AtomicOp Op,
3122                                SourceLocation RParenLoc) {
3123     // Just create the expression; there is not any interesting semantic
3124     // analysis here because we can't actually build an AtomicExpr until
3125     // we are sure it is semantically sound.
3126     return new (SemaRef.Context) AtomicExpr(BuiltinLoc, SubExprs, RetTy, Op,
3127                                             RParenLoc);
3128   }
3129 
3130 private:
3131   TypeLoc TransformTypeInObjectScope(TypeLoc TL,
3132                                      QualType ObjectType,
3133                                      NamedDecl *FirstQualifierInScope,
3134                                      CXXScopeSpec &SS);
3135 
3136   TypeSourceInfo *TransformTypeInObjectScope(TypeSourceInfo *TSInfo,
3137                                              QualType ObjectType,
3138                                              NamedDecl *FirstQualifierInScope,
3139                                              CXXScopeSpec &SS);
3140 
3141   TypeSourceInfo *TransformTSIInObjectScope(TypeLoc TL, QualType ObjectType,
3142                                             NamedDecl *FirstQualifierInScope,
3143                                             CXXScopeSpec &SS);
3144 };
3145 
3146 template<typename Derived>
3147 StmtResult TreeTransform<Derived>::TransformStmt(Stmt *S) {
3148   if (!S)
3149     return S;
3150 
3151   switch (S->getStmtClass()) {
3152   case Stmt::NoStmtClass: break;
3153 
3154   // Transform individual statement nodes
3155 #define STMT(Node, Parent)                                              \
3156   case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(S));
3157 #define ABSTRACT_STMT(Node)
3158 #define EXPR(Node, Parent)
3159 #include "clang/AST/StmtNodes.inc"
3160 
3161   // Transform expressions by calling TransformExpr.
3162 #define STMT(Node, Parent)
3163 #define ABSTRACT_STMT(Stmt)
3164 #define EXPR(Node, Parent) case Stmt::Node##Class:
3165 #include "clang/AST/StmtNodes.inc"
3166     {
3167       ExprResult E = getDerived().TransformExpr(cast<Expr>(S));
3168       if (E.isInvalid())
3169         return StmtError();
3170 
3171       return getSema().ActOnExprStmt(E);
3172     }
3173   }
3174 
3175   return S;
3176 }
3177 
3178 template<typename Derived>
3179 OMPClause *TreeTransform<Derived>::TransformOMPClause(OMPClause *S) {
3180   if (!S)
3181     return S;
3182 
3183   switch (S->getClauseKind()) {
3184   default: break;
3185   // Transform individual clause nodes
3186 #define OPENMP_CLAUSE(Name, Class)                                             \
3187   case OMPC_ ## Name :                                                         \
3188     return getDerived().Transform ## Class(cast<Class>(S));
3189 #include "clang/Basic/OpenMPKinds.def"
3190   }
3191 
3192   return S;
3193 }
3194 
3195 
3196 template<typename Derived>
3197 ExprResult TreeTransform<Derived>::TransformExpr(Expr *E) {
3198   if (!E)
3199     return E;
3200 
3201   switch (E->getStmtClass()) {
3202     case Stmt::NoStmtClass: break;
3203 #define STMT(Node, Parent) case Stmt::Node##Class: break;
3204 #define ABSTRACT_STMT(Stmt)
3205 #define EXPR(Node, Parent)                                              \
3206     case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(E));
3207 #include "clang/AST/StmtNodes.inc"
3208   }
3209 
3210   return E;
3211 }
3212 
3213 template<typename Derived>
3214 ExprResult TreeTransform<Derived>::TransformInitializer(Expr *Init,
3215                                                         bool NotCopyInit) {
3216   // Initializers are instantiated like expressions, except that various outer
3217   // layers are stripped.
3218   if (!Init)
3219     return Init;
3220 
3221   if (ExprWithCleanups *ExprTemp = dyn_cast<ExprWithCleanups>(Init))
3222     Init = ExprTemp->getSubExpr();
3223 
3224   if (auto *AIL = dyn_cast<ArrayInitLoopExpr>(Init))
3225     Init = AIL->getCommonExpr();
3226 
3227   if (MaterializeTemporaryExpr *MTE = dyn_cast<MaterializeTemporaryExpr>(Init))
3228     Init = MTE->GetTemporaryExpr();
3229 
3230   while (CXXBindTemporaryExpr *Binder = dyn_cast<CXXBindTemporaryExpr>(Init))
3231     Init = Binder->getSubExpr();
3232 
3233   if (ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(Init))
3234     Init = ICE->getSubExprAsWritten();
3235 
3236   if (CXXStdInitializerListExpr *ILE =
3237           dyn_cast<CXXStdInitializerListExpr>(Init))
3238     return TransformInitializer(ILE->getSubExpr(), NotCopyInit);
3239 
3240   // If this is copy-initialization, we only need to reconstruct
3241   // InitListExprs. Other forms of copy-initialization will be a no-op if
3242   // the initializer is already the right type.
3243   CXXConstructExpr *Construct = dyn_cast<CXXConstructExpr>(Init);
3244   if (!NotCopyInit && !(Construct && Construct->isListInitialization()))
3245     return getDerived().TransformExpr(Init);
3246 
3247   // Revert value-initialization back to empty parens.
3248   if (CXXScalarValueInitExpr *VIE = dyn_cast<CXXScalarValueInitExpr>(Init)) {
3249     SourceRange Parens = VIE->getSourceRange();
3250     return getDerived().RebuildParenListExpr(Parens.getBegin(), None,
3251                                              Parens.getEnd());
3252   }
3253 
3254   // FIXME: We shouldn't build ImplicitValueInitExprs for direct-initialization.
3255   if (isa<ImplicitValueInitExpr>(Init))
3256     return getDerived().RebuildParenListExpr(SourceLocation(), None,
3257                                              SourceLocation());
3258 
3259   // Revert initialization by constructor back to a parenthesized or braced list
3260   // of expressions. Any other form of initializer can just be reused directly.
3261   if (!Construct || isa<CXXTemporaryObjectExpr>(Construct))
3262     return getDerived().TransformExpr(Init);
3263 
3264   // If the initialization implicitly converted an initializer list to a
3265   // std::initializer_list object, unwrap the std::initializer_list too.
3266   if (Construct && Construct->isStdInitListInitialization())
3267     return TransformInitializer(Construct->getArg(0), NotCopyInit);
3268 
3269   SmallVector<Expr*, 8> NewArgs;
3270   bool ArgChanged = false;
3271   if (getDerived().TransformExprs(Construct->getArgs(), Construct->getNumArgs(),
3272                                   /*IsCall*/true, NewArgs, &ArgChanged))
3273     return ExprError();
3274 
3275   // If this was list initialization, revert to list form.
3276   if (Construct->isListInitialization())
3277     return getDerived().RebuildInitList(Construct->getLocStart(), NewArgs,
3278                                         Construct->getLocEnd(),
3279                                         Construct->getType());
3280 
3281   // Build a ParenListExpr to represent anything else.
3282   SourceRange Parens = Construct->getParenOrBraceRange();
3283   if (Parens.isInvalid()) {
3284     // This was a variable declaration's initialization for which no initializer
3285     // was specified.
3286     assert(NewArgs.empty() &&
3287            "no parens or braces but have direct init with arguments?");
3288     return ExprEmpty();
3289   }
3290   return getDerived().RebuildParenListExpr(Parens.getBegin(), NewArgs,
3291                                            Parens.getEnd());
3292 }
3293 
3294 template<typename Derived>
3295 bool TreeTransform<Derived>::TransformExprs(Expr *const *Inputs,
3296                                             unsigned NumInputs,
3297                                             bool IsCall,
3298                                       SmallVectorImpl<Expr *> &Outputs,
3299                                             bool *ArgChanged) {
3300   for (unsigned I = 0; I != NumInputs; ++I) {
3301     // If requested, drop call arguments that need to be dropped.
3302     if (IsCall && getDerived().DropCallArgument(Inputs[I])) {
3303       if (ArgChanged)
3304         *ArgChanged = true;
3305 
3306       break;
3307     }
3308 
3309     if (PackExpansionExpr *Expansion = dyn_cast<PackExpansionExpr>(Inputs[I])) {
3310       Expr *Pattern = Expansion->getPattern();
3311 
3312       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
3313       getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
3314       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
3315 
3316       // Determine whether the set of unexpanded parameter packs can and should
3317       // be expanded.
3318       bool Expand = true;
3319       bool RetainExpansion = false;
3320       Optional<unsigned> OrigNumExpansions = Expansion->getNumExpansions();
3321       Optional<unsigned> NumExpansions = OrigNumExpansions;
3322       if (getDerived().TryExpandParameterPacks(Expansion->getEllipsisLoc(),
3323                                                Pattern->getSourceRange(),
3324                                                Unexpanded,
3325                                                Expand, RetainExpansion,
3326                                                NumExpansions))
3327         return true;
3328 
3329       if (!Expand) {
3330         // The transform has determined that we should perform a simple
3331         // transformation on the pack expansion, producing another pack
3332         // expansion.
3333         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
3334         ExprResult OutPattern = getDerived().TransformExpr(Pattern);
3335         if (OutPattern.isInvalid())
3336           return true;
3337 
3338         ExprResult Out = getDerived().RebuildPackExpansion(OutPattern.get(),
3339                                                 Expansion->getEllipsisLoc(),
3340                                                            NumExpansions);
3341         if (Out.isInvalid())
3342           return true;
3343 
3344         if (ArgChanged)
3345           *ArgChanged = true;
3346         Outputs.push_back(Out.get());
3347         continue;
3348       }
3349 
3350       // Record right away that the argument was changed.  This needs
3351       // to happen even if the array expands to nothing.
3352       if (ArgChanged) *ArgChanged = true;
3353 
3354       // The transform has determined that we should perform an elementwise
3355       // expansion of the pattern. Do so.
3356       for (unsigned I = 0; I != *NumExpansions; ++I) {
3357         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
3358         ExprResult Out = getDerived().TransformExpr(Pattern);
3359         if (Out.isInvalid())
3360           return true;
3361 
3362         if (Out.get()->containsUnexpandedParameterPack()) {
3363           Out = getDerived().RebuildPackExpansion(
3364               Out.get(), Expansion->getEllipsisLoc(), OrigNumExpansions);
3365           if (Out.isInvalid())
3366             return true;
3367         }
3368 
3369         Outputs.push_back(Out.get());
3370       }
3371 
3372       // If we're supposed to retain a pack expansion, do so by temporarily
3373       // forgetting the partially-substituted parameter pack.
3374       if (RetainExpansion) {
3375         ForgetPartiallySubstitutedPackRAII Forget(getDerived());
3376 
3377         ExprResult Out = getDerived().TransformExpr(Pattern);
3378         if (Out.isInvalid())
3379           return true;
3380 
3381         Out = getDerived().RebuildPackExpansion(
3382             Out.get(), Expansion->getEllipsisLoc(), OrigNumExpansions);
3383         if (Out.isInvalid())
3384           return true;
3385 
3386         Outputs.push_back(Out.get());
3387       }
3388 
3389       continue;
3390     }
3391 
3392     ExprResult Result =
3393       IsCall ? getDerived().TransformInitializer(Inputs[I], /*DirectInit*/false)
3394              : getDerived().TransformExpr(Inputs[I]);
3395     if (Result.isInvalid())
3396       return true;
3397 
3398     if (Result.get() != Inputs[I] && ArgChanged)
3399       *ArgChanged = true;
3400 
3401     Outputs.push_back(Result.get());
3402   }
3403 
3404   return false;
3405 }
3406 
3407 template <typename Derived>
3408 Sema::ConditionResult TreeTransform<Derived>::TransformCondition(
3409     SourceLocation Loc, VarDecl *Var, Expr *Expr, Sema::ConditionKind Kind) {
3410   if (Var) {
3411     VarDecl *ConditionVar = cast_or_null<VarDecl>(
3412         getDerived().TransformDefinition(Var->getLocation(), Var));
3413 
3414     if (!ConditionVar)
3415       return Sema::ConditionError();
3416 
3417     return getSema().ActOnConditionVariable(ConditionVar, Loc, Kind);
3418   }
3419 
3420   if (Expr) {
3421     ExprResult CondExpr = getDerived().TransformExpr(Expr);
3422 
3423     if (CondExpr.isInvalid())
3424       return Sema::ConditionError();
3425 
3426     return getSema().ActOnCondition(nullptr, Loc, CondExpr.get(), Kind);
3427   }
3428 
3429   return Sema::ConditionResult();
3430 }
3431 
3432 template<typename Derived>
3433 NestedNameSpecifierLoc
3434 TreeTransform<Derived>::TransformNestedNameSpecifierLoc(
3435                                                     NestedNameSpecifierLoc NNS,
3436                                                      QualType ObjectType,
3437                                              NamedDecl *FirstQualifierInScope) {
3438   SmallVector<NestedNameSpecifierLoc, 4> Qualifiers;
3439   for (NestedNameSpecifierLoc Qualifier = NNS; Qualifier;
3440        Qualifier = Qualifier.getPrefix())
3441     Qualifiers.push_back(Qualifier);
3442 
3443   CXXScopeSpec SS;
3444   while (!Qualifiers.empty()) {
3445     NestedNameSpecifierLoc Q = Qualifiers.pop_back_val();
3446     NestedNameSpecifier *QNNS = Q.getNestedNameSpecifier();
3447 
3448     switch (QNNS->getKind()) {
3449     case NestedNameSpecifier::Identifier: {
3450       Sema::NestedNameSpecInfo IdInfo(QNNS->getAsIdentifier(),
3451                           Q.getLocalBeginLoc(), Q.getLocalEndLoc(), ObjectType);
3452       if (SemaRef.BuildCXXNestedNameSpecifier(/*Scope=*/nullptr, IdInfo, false,
3453                                               SS, FirstQualifierInScope, false))
3454         return NestedNameSpecifierLoc();
3455     }
3456       break;
3457 
3458     case NestedNameSpecifier::Namespace: {
3459       NamespaceDecl *NS
3460         = cast_or_null<NamespaceDecl>(
3461                                     getDerived().TransformDecl(
3462                                                           Q.getLocalBeginLoc(),
3463                                                        QNNS->getAsNamespace()));
3464       SS.Extend(SemaRef.Context, NS, Q.getLocalBeginLoc(), Q.getLocalEndLoc());
3465       break;
3466     }
3467 
3468     case NestedNameSpecifier::NamespaceAlias: {
3469       NamespaceAliasDecl *Alias
3470         = cast_or_null<NamespaceAliasDecl>(
3471                       getDerived().TransformDecl(Q.getLocalBeginLoc(),
3472                                                  QNNS->getAsNamespaceAlias()));
3473       SS.Extend(SemaRef.Context, Alias, Q.getLocalBeginLoc(),
3474                 Q.getLocalEndLoc());
3475       break;
3476     }
3477 
3478     case NestedNameSpecifier::Global:
3479       // There is no meaningful transformation that one could perform on the
3480       // global scope.
3481       SS.MakeGlobal(SemaRef.Context, Q.getBeginLoc());
3482       break;
3483 
3484     case NestedNameSpecifier::Super: {
3485       CXXRecordDecl *RD =
3486           cast_or_null<CXXRecordDecl>(getDerived().TransformDecl(
3487               SourceLocation(), QNNS->getAsRecordDecl()));
3488       SS.MakeSuper(SemaRef.Context, RD, Q.getBeginLoc(), Q.getEndLoc());
3489       break;
3490     }
3491 
3492     case NestedNameSpecifier::TypeSpecWithTemplate:
3493     case NestedNameSpecifier::TypeSpec: {
3494       TypeLoc TL = TransformTypeInObjectScope(Q.getTypeLoc(), ObjectType,
3495                                               FirstQualifierInScope, SS);
3496 
3497       if (!TL)
3498         return NestedNameSpecifierLoc();
3499 
3500       if (TL.getType()->isDependentType() || TL.getType()->isRecordType() ||
3501           (SemaRef.getLangOpts().CPlusPlus11 &&
3502            TL.getType()->isEnumeralType())) {
3503         assert(!TL.getType().hasLocalQualifiers() &&
3504                "Can't get cv-qualifiers here");
3505         if (TL.getType()->isEnumeralType())
3506           SemaRef.Diag(TL.getBeginLoc(),
3507                        diag::warn_cxx98_compat_enum_nested_name_spec);
3508         SS.Extend(SemaRef.Context, /*FIXME:*/SourceLocation(), TL,
3509                   Q.getLocalEndLoc());
3510         break;
3511       }
3512       // If the nested-name-specifier is an invalid type def, don't emit an
3513       // error because a previous error should have already been emitted.
3514       TypedefTypeLoc TTL = TL.getAs<TypedefTypeLoc>();
3515       if (!TTL || !TTL.getTypedefNameDecl()->isInvalidDecl()) {
3516         SemaRef.Diag(TL.getBeginLoc(), diag::err_nested_name_spec_non_tag)
3517           << TL.getType() << SS.getRange();
3518       }
3519       return NestedNameSpecifierLoc();
3520     }
3521     }
3522 
3523     // The qualifier-in-scope and object type only apply to the leftmost entity.
3524     FirstQualifierInScope = nullptr;
3525     ObjectType = QualType();
3526   }
3527 
3528   // Don't rebuild the nested-name-specifier if we don't have to.
3529   if (SS.getScopeRep() == NNS.getNestedNameSpecifier() &&
3530       !getDerived().AlwaysRebuild())
3531     return NNS;
3532 
3533   // If we can re-use the source-location data from the original
3534   // nested-name-specifier, do so.
3535   if (SS.location_size() == NNS.getDataLength() &&
3536       memcmp(SS.location_data(), NNS.getOpaqueData(), SS.location_size()) == 0)
3537     return NestedNameSpecifierLoc(SS.getScopeRep(), NNS.getOpaqueData());
3538 
3539   // Allocate new nested-name-specifier location information.
3540   return SS.getWithLocInContext(SemaRef.Context);
3541 }
3542 
3543 template<typename Derived>
3544 DeclarationNameInfo
3545 TreeTransform<Derived>
3546 ::TransformDeclarationNameInfo(const DeclarationNameInfo &NameInfo) {
3547   DeclarationName Name = NameInfo.getName();
3548   if (!Name)
3549     return DeclarationNameInfo();
3550 
3551   switch (Name.getNameKind()) {
3552   case DeclarationName::Identifier:
3553   case DeclarationName::ObjCZeroArgSelector:
3554   case DeclarationName::ObjCOneArgSelector:
3555   case DeclarationName::ObjCMultiArgSelector:
3556   case DeclarationName::CXXOperatorName:
3557   case DeclarationName::CXXLiteralOperatorName:
3558   case DeclarationName::CXXUsingDirective:
3559     return NameInfo;
3560 
3561   case DeclarationName::CXXConstructorName:
3562   case DeclarationName::CXXDestructorName:
3563   case DeclarationName::CXXConversionFunctionName: {
3564     TypeSourceInfo *NewTInfo;
3565     CanQualType NewCanTy;
3566     if (TypeSourceInfo *OldTInfo = NameInfo.getNamedTypeInfo()) {
3567       NewTInfo = getDerived().TransformType(OldTInfo);
3568       if (!NewTInfo)
3569         return DeclarationNameInfo();
3570       NewCanTy = SemaRef.Context.getCanonicalType(NewTInfo->getType());
3571     }
3572     else {
3573       NewTInfo = nullptr;
3574       TemporaryBase Rebase(*this, NameInfo.getLoc(), Name);
3575       QualType NewT = getDerived().TransformType(Name.getCXXNameType());
3576       if (NewT.isNull())
3577         return DeclarationNameInfo();
3578       NewCanTy = SemaRef.Context.getCanonicalType(NewT);
3579     }
3580 
3581     DeclarationName NewName
3582       = SemaRef.Context.DeclarationNames.getCXXSpecialName(Name.getNameKind(),
3583                                                            NewCanTy);
3584     DeclarationNameInfo NewNameInfo(NameInfo);
3585     NewNameInfo.setName(NewName);
3586     NewNameInfo.setNamedTypeInfo(NewTInfo);
3587     return NewNameInfo;
3588   }
3589   }
3590 
3591   llvm_unreachable("Unknown name kind.");
3592 }
3593 
3594 template<typename Derived>
3595 TemplateName
3596 TreeTransform<Derived>::TransformTemplateName(CXXScopeSpec &SS,
3597                                               TemplateName Name,
3598                                               SourceLocation NameLoc,
3599                                               QualType ObjectType,
3600                                               NamedDecl *FirstQualifierInScope) {
3601   if (QualifiedTemplateName *QTN = Name.getAsQualifiedTemplateName()) {
3602     TemplateDecl *Template = QTN->getTemplateDecl();
3603     assert(Template && "qualified template name must refer to a template");
3604 
3605     TemplateDecl *TransTemplate
3606       = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc,
3607                                                               Template));
3608     if (!TransTemplate)
3609       return TemplateName();
3610 
3611     if (!getDerived().AlwaysRebuild() &&
3612         SS.getScopeRep() == QTN->getQualifier() &&
3613         TransTemplate == Template)
3614       return Name;
3615 
3616     return getDerived().RebuildTemplateName(SS, QTN->hasTemplateKeyword(),
3617                                             TransTemplate);
3618   }
3619 
3620   if (DependentTemplateName *DTN = Name.getAsDependentTemplateName()) {
3621     if (SS.getScopeRep()) {
3622       // These apply to the scope specifier, not the template.
3623       ObjectType = QualType();
3624       FirstQualifierInScope = nullptr;
3625     }
3626 
3627     if (!getDerived().AlwaysRebuild() &&
3628         SS.getScopeRep() == DTN->getQualifier() &&
3629         ObjectType.isNull())
3630       return Name;
3631 
3632     if (DTN->isIdentifier()) {
3633       return getDerived().RebuildTemplateName(SS,
3634                                               *DTN->getIdentifier(),
3635                                               NameLoc,
3636                                               ObjectType,
3637                                               FirstQualifierInScope);
3638     }
3639 
3640     return getDerived().RebuildTemplateName(SS, DTN->getOperator(), NameLoc,
3641                                             ObjectType);
3642   }
3643 
3644   if (TemplateDecl *Template = Name.getAsTemplateDecl()) {
3645     TemplateDecl *TransTemplate
3646       = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc,
3647                                                               Template));
3648     if (!TransTemplate)
3649       return TemplateName();
3650 
3651     if (!getDerived().AlwaysRebuild() &&
3652         TransTemplate == Template)
3653       return Name;
3654 
3655     return TemplateName(TransTemplate);
3656   }
3657 
3658   if (SubstTemplateTemplateParmPackStorage *SubstPack
3659       = Name.getAsSubstTemplateTemplateParmPack()) {
3660     TemplateTemplateParmDecl *TransParam
3661     = cast_or_null<TemplateTemplateParmDecl>(
3662             getDerived().TransformDecl(NameLoc, SubstPack->getParameterPack()));
3663     if (!TransParam)
3664       return TemplateName();
3665 
3666     if (!getDerived().AlwaysRebuild() &&
3667         TransParam == SubstPack->getParameterPack())
3668       return Name;
3669 
3670     return getDerived().RebuildTemplateName(TransParam,
3671                                             SubstPack->getArgumentPack());
3672   }
3673 
3674   // These should be getting filtered out before they reach the AST.
3675   llvm_unreachable("overloaded function decl survived to here");
3676 }
3677 
3678 template<typename Derived>
3679 void TreeTransform<Derived>::InventTemplateArgumentLoc(
3680                                          const TemplateArgument &Arg,
3681                                          TemplateArgumentLoc &Output) {
3682   SourceLocation Loc = getDerived().getBaseLocation();
3683   switch (Arg.getKind()) {
3684   case TemplateArgument::Null:
3685     llvm_unreachable("null template argument in TreeTransform");
3686     break;
3687 
3688   case TemplateArgument::Type:
3689     Output = TemplateArgumentLoc(Arg,
3690                SemaRef.Context.getTrivialTypeSourceInfo(Arg.getAsType(), Loc));
3691 
3692     break;
3693 
3694   case TemplateArgument::Template:
3695   case TemplateArgument::TemplateExpansion: {
3696     NestedNameSpecifierLocBuilder Builder;
3697     TemplateName Template = Arg.getAsTemplateOrTemplatePattern();
3698     if (DependentTemplateName *DTN = Template.getAsDependentTemplateName())
3699       Builder.MakeTrivial(SemaRef.Context, DTN->getQualifier(), Loc);
3700     else if (QualifiedTemplateName *QTN = Template.getAsQualifiedTemplateName())
3701       Builder.MakeTrivial(SemaRef.Context, QTN->getQualifier(), Loc);
3702 
3703     if (Arg.getKind() == TemplateArgument::Template)
3704       Output = TemplateArgumentLoc(Arg,
3705                                    Builder.getWithLocInContext(SemaRef.Context),
3706                                    Loc);
3707     else
3708       Output = TemplateArgumentLoc(Arg,
3709                                    Builder.getWithLocInContext(SemaRef.Context),
3710                                    Loc, Loc);
3711 
3712     break;
3713   }
3714 
3715   case TemplateArgument::Expression:
3716     Output = TemplateArgumentLoc(Arg, Arg.getAsExpr());
3717     break;
3718 
3719   case TemplateArgument::Declaration:
3720   case TemplateArgument::Integral:
3721   case TemplateArgument::Pack:
3722   case TemplateArgument::NullPtr:
3723     Output = TemplateArgumentLoc(Arg, TemplateArgumentLocInfo());
3724     break;
3725   }
3726 }
3727 
3728 template<typename Derived>
3729 bool TreeTransform<Derived>::TransformTemplateArgument(
3730                                          const TemplateArgumentLoc &Input,
3731                                          TemplateArgumentLoc &Output, bool Uneval) {
3732   const TemplateArgument &Arg = Input.getArgument();
3733   switch (Arg.getKind()) {
3734   case TemplateArgument::Null:
3735   case TemplateArgument::Integral:
3736   case TemplateArgument::Pack:
3737   case TemplateArgument::Declaration:
3738   case TemplateArgument::NullPtr:
3739     llvm_unreachable("Unexpected TemplateArgument");
3740 
3741   case TemplateArgument::Type: {
3742     TypeSourceInfo *DI = Input.getTypeSourceInfo();
3743     if (!DI)
3744       DI = InventTypeSourceInfo(Input.getArgument().getAsType());
3745 
3746     DI = getDerived().TransformType(DI);
3747     if (!DI) return true;
3748 
3749     Output = TemplateArgumentLoc(TemplateArgument(DI->getType()), DI);
3750     return false;
3751   }
3752 
3753   case TemplateArgument::Template: {
3754     NestedNameSpecifierLoc QualifierLoc = Input.getTemplateQualifierLoc();
3755     if (QualifierLoc) {
3756       QualifierLoc = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc);
3757       if (!QualifierLoc)
3758         return true;
3759     }
3760 
3761     CXXScopeSpec SS;
3762     SS.Adopt(QualifierLoc);
3763     TemplateName Template
3764       = getDerived().TransformTemplateName(SS, Arg.getAsTemplate(),
3765                                            Input.getTemplateNameLoc());
3766     if (Template.isNull())
3767       return true;
3768 
3769     Output = TemplateArgumentLoc(TemplateArgument(Template), QualifierLoc,
3770                                  Input.getTemplateNameLoc());
3771     return false;
3772   }
3773 
3774   case TemplateArgument::TemplateExpansion:
3775     llvm_unreachable("Caller should expand pack expansions");
3776 
3777   case TemplateArgument::Expression: {
3778     // Template argument expressions are constant expressions.
3779     EnterExpressionEvaluationContext Unevaluated(
3780         getSema(), Uneval ? Sema::Unevaluated : Sema::ConstantEvaluated);
3781 
3782     Expr *InputExpr = Input.getSourceExpression();
3783     if (!InputExpr) InputExpr = Input.getArgument().getAsExpr();
3784 
3785     ExprResult E = getDerived().TransformExpr(InputExpr);
3786     E = SemaRef.ActOnConstantExpression(E);
3787     if (E.isInvalid()) return true;
3788     Output = TemplateArgumentLoc(TemplateArgument(E.get()), E.get());
3789     return false;
3790   }
3791   }
3792 
3793   // Work around bogus GCC warning
3794   return true;
3795 }
3796 
3797 /// \brief Iterator adaptor that invents template argument location information
3798 /// for each of the template arguments in its underlying iterator.
3799 template<typename Derived, typename InputIterator>
3800 class TemplateArgumentLocInventIterator {
3801   TreeTransform<Derived> &Self;
3802   InputIterator Iter;
3803 
3804 public:
3805   typedef TemplateArgumentLoc value_type;
3806   typedef TemplateArgumentLoc reference;
3807   typedef typename std::iterator_traits<InputIterator>::difference_type
3808     difference_type;
3809   typedef std::input_iterator_tag iterator_category;
3810 
3811   class pointer {
3812     TemplateArgumentLoc Arg;
3813 
3814   public:
3815     explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { }
3816 
3817     const TemplateArgumentLoc *operator->() const { return &Arg; }
3818   };
3819 
3820   TemplateArgumentLocInventIterator() { }
3821 
3822   explicit TemplateArgumentLocInventIterator(TreeTransform<Derived> &Self,
3823                                              InputIterator Iter)
3824     : Self(Self), Iter(Iter) { }
3825 
3826   TemplateArgumentLocInventIterator &operator++() {
3827     ++Iter;
3828     return *this;
3829   }
3830 
3831   TemplateArgumentLocInventIterator operator++(int) {
3832     TemplateArgumentLocInventIterator Old(*this);
3833     ++(*this);
3834     return Old;
3835   }
3836 
3837   reference operator*() const {
3838     TemplateArgumentLoc Result;
3839     Self.InventTemplateArgumentLoc(*Iter, Result);
3840     return Result;
3841   }
3842 
3843   pointer operator->() const { return pointer(**this); }
3844 
3845   friend bool operator==(const TemplateArgumentLocInventIterator &X,
3846                          const TemplateArgumentLocInventIterator &Y) {
3847     return X.Iter == Y.Iter;
3848   }
3849 
3850   friend bool operator!=(const TemplateArgumentLocInventIterator &X,
3851                          const TemplateArgumentLocInventIterator &Y) {
3852     return X.Iter != Y.Iter;
3853   }
3854 };
3855 
3856 template<typename Derived>
3857 template<typename InputIterator>
3858 bool TreeTransform<Derived>::TransformTemplateArguments(
3859     InputIterator First, InputIterator Last, TemplateArgumentListInfo &Outputs,
3860     bool Uneval) {
3861   for (; First != Last; ++First) {
3862     TemplateArgumentLoc Out;
3863     TemplateArgumentLoc In = *First;
3864 
3865     if (In.getArgument().getKind() == TemplateArgument::Pack) {
3866       // Unpack argument packs, which we translate them into separate
3867       // arguments.
3868       // FIXME: We could do much better if we could guarantee that the
3869       // TemplateArgumentLocInfo for the pack expansion would be usable for
3870       // all of the template arguments in the argument pack.
3871       typedef TemplateArgumentLocInventIterator<Derived,
3872                                                 TemplateArgument::pack_iterator>
3873         PackLocIterator;
3874       if (TransformTemplateArguments(PackLocIterator(*this,
3875                                                  In.getArgument().pack_begin()),
3876                                      PackLocIterator(*this,
3877                                                    In.getArgument().pack_end()),
3878                                      Outputs, Uneval))
3879         return true;
3880 
3881       continue;
3882     }
3883 
3884     if (In.getArgument().isPackExpansion()) {
3885       // We have a pack expansion, for which we will be substituting into
3886       // the pattern.
3887       SourceLocation Ellipsis;
3888       Optional<unsigned> OrigNumExpansions;
3889       TemplateArgumentLoc Pattern
3890         = getSema().getTemplateArgumentPackExpansionPattern(
3891               In, Ellipsis, OrigNumExpansions);
3892 
3893       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
3894       getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
3895       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
3896 
3897       // Determine whether the set of unexpanded parameter packs can and should
3898       // be expanded.
3899       bool Expand = true;
3900       bool RetainExpansion = false;
3901       Optional<unsigned> NumExpansions = OrigNumExpansions;
3902       if (getDerived().TryExpandParameterPacks(Ellipsis,
3903                                                Pattern.getSourceRange(),
3904                                                Unexpanded,
3905                                                Expand,
3906                                                RetainExpansion,
3907                                                NumExpansions))
3908         return true;
3909 
3910       if (!Expand) {
3911         // The transform has determined that we should perform a simple
3912         // transformation on the pack expansion, producing another pack
3913         // expansion.
3914         TemplateArgumentLoc OutPattern;
3915         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
3916         if (getDerived().TransformTemplateArgument(Pattern, OutPattern, Uneval))
3917           return true;
3918 
3919         Out = getDerived().RebuildPackExpansion(OutPattern, Ellipsis,
3920                                                 NumExpansions);
3921         if (Out.getArgument().isNull())
3922           return true;
3923 
3924         Outputs.addArgument(Out);
3925         continue;
3926       }
3927 
3928       // The transform has determined that we should perform an elementwise
3929       // expansion of the pattern. Do so.
3930       for (unsigned I = 0; I != *NumExpansions; ++I) {
3931         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
3932 
3933         if (getDerived().TransformTemplateArgument(Pattern, Out, Uneval))
3934           return true;
3935 
3936         if (Out.getArgument().containsUnexpandedParameterPack()) {
3937           Out = getDerived().RebuildPackExpansion(Out, Ellipsis,
3938                                                   OrigNumExpansions);
3939           if (Out.getArgument().isNull())
3940             return true;
3941         }
3942 
3943         Outputs.addArgument(Out);
3944       }
3945 
3946       // If we're supposed to retain a pack expansion, do so by temporarily
3947       // forgetting the partially-substituted parameter pack.
3948       if (RetainExpansion) {
3949         ForgetPartiallySubstitutedPackRAII Forget(getDerived());
3950 
3951         if (getDerived().TransformTemplateArgument(Pattern, Out, Uneval))
3952           return true;
3953 
3954         Out = getDerived().RebuildPackExpansion(Out, Ellipsis,
3955                                                 OrigNumExpansions);
3956         if (Out.getArgument().isNull())
3957           return true;
3958 
3959         Outputs.addArgument(Out);
3960       }
3961 
3962       continue;
3963     }
3964 
3965     // The simple case:
3966     if (getDerived().TransformTemplateArgument(In, Out, Uneval))
3967       return true;
3968 
3969     Outputs.addArgument(Out);
3970   }
3971 
3972   return false;
3973 
3974 }
3975 
3976 //===----------------------------------------------------------------------===//
3977 // Type transformation
3978 //===----------------------------------------------------------------------===//
3979 
3980 template<typename Derived>
3981 QualType TreeTransform<Derived>::TransformType(QualType T) {
3982   if (getDerived().AlreadyTransformed(T))
3983     return T;
3984 
3985   // Temporary workaround.  All of these transformations should
3986   // eventually turn into transformations on TypeLocs.
3987   TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(T,
3988                                                 getDerived().getBaseLocation());
3989 
3990   TypeSourceInfo *NewDI = getDerived().TransformType(DI);
3991 
3992   if (!NewDI)
3993     return QualType();
3994 
3995   return NewDI->getType();
3996 }
3997 
3998 template<typename Derived>
3999 TypeSourceInfo *TreeTransform<Derived>::TransformType(TypeSourceInfo *DI) {
4000   // Refine the base location to the type's location.
4001   TemporaryBase Rebase(*this, DI->getTypeLoc().getBeginLoc(),
4002                        getDerived().getBaseEntity());
4003   if (getDerived().AlreadyTransformed(DI->getType()))
4004     return DI;
4005 
4006   TypeLocBuilder TLB;
4007 
4008   TypeLoc TL = DI->getTypeLoc();
4009   TLB.reserve(TL.getFullDataSize());
4010 
4011   QualType Result = getDerived().TransformType(TLB, TL);
4012   if (Result.isNull())
4013     return nullptr;
4014 
4015   return TLB.getTypeSourceInfo(SemaRef.Context, Result);
4016 }
4017 
4018 template<typename Derived>
4019 QualType
4020 TreeTransform<Derived>::TransformType(TypeLocBuilder &TLB, TypeLoc T) {
4021   switch (T.getTypeLocClass()) {
4022 #define ABSTRACT_TYPELOC(CLASS, PARENT)
4023 #define TYPELOC(CLASS, PARENT)                                                 \
4024   case TypeLoc::CLASS:                                                         \
4025     return getDerived().Transform##CLASS##Type(TLB,                            \
4026                                                T.castAs<CLASS##TypeLoc>());
4027 #include "clang/AST/TypeLocNodes.def"
4028   }
4029 
4030   llvm_unreachable("unhandled type loc!");
4031 }
4032 
4033 /// FIXME: By default, this routine adds type qualifiers only to types
4034 /// that can have qualifiers, and silently suppresses those qualifiers
4035 /// that are not permitted (e.g., qualifiers on reference or function
4036 /// types). This is the right thing for template instantiation, but
4037 /// probably not for other clients.
4038 template<typename Derived>
4039 QualType
4040 TreeTransform<Derived>::TransformQualifiedType(TypeLocBuilder &TLB,
4041                                                QualifiedTypeLoc T) {
4042   Qualifiers Quals = T.getType().getLocalQualifiers();
4043 
4044   QualType Result = getDerived().TransformType(TLB, T.getUnqualifiedLoc());
4045   if (Result.isNull())
4046     return QualType();
4047 
4048   // Silently suppress qualifiers if the result type can't be qualified.
4049   // FIXME: this is the right thing for template instantiation, but
4050   // probably not for other clients.
4051   if (Result->isFunctionType() || Result->isReferenceType())
4052     return Result;
4053 
4054   // Suppress Objective-C lifetime qualifiers if they don't make sense for the
4055   // resulting type.
4056   if (Quals.hasObjCLifetime()) {
4057     if (!Result->isObjCLifetimeType() && !Result->isDependentType())
4058       Quals.removeObjCLifetime();
4059     else if (Result.getObjCLifetime()) {
4060       // Objective-C ARC:
4061       //   A lifetime qualifier applied to a substituted template parameter
4062       //   overrides the lifetime qualifier from the template argument.
4063       const AutoType *AutoTy;
4064       if (const SubstTemplateTypeParmType *SubstTypeParam
4065                                 = dyn_cast<SubstTemplateTypeParmType>(Result)) {
4066         QualType Replacement = SubstTypeParam->getReplacementType();
4067         Qualifiers Qs = Replacement.getQualifiers();
4068         Qs.removeObjCLifetime();
4069         Replacement
4070           = SemaRef.Context.getQualifiedType(Replacement.getUnqualifiedType(),
4071                                              Qs);
4072         Result = SemaRef.Context.getSubstTemplateTypeParmType(
4073                                         SubstTypeParam->getReplacedParameter(),
4074                                                               Replacement);
4075         TLB.TypeWasModifiedSafely(Result);
4076       } else if ((AutoTy = dyn_cast<AutoType>(Result)) && AutoTy->isDeduced()) {
4077         // 'auto' types behave the same way as template parameters.
4078         QualType Deduced = AutoTy->getDeducedType();
4079         Qualifiers Qs = Deduced.getQualifiers();
4080         Qs.removeObjCLifetime();
4081         Deduced = SemaRef.Context.getQualifiedType(Deduced.getUnqualifiedType(),
4082                                                    Qs);
4083         Result = SemaRef.Context.getAutoType(Deduced, AutoTy->getKeyword(),
4084                                 AutoTy->isDependentType());
4085         TLB.TypeWasModifiedSafely(Result);
4086       } else {
4087         // Otherwise, complain about the addition of a qualifier to an
4088         // already-qualified type.
4089         SourceRange R = T.getUnqualifiedLoc().getSourceRange();
4090         SemaRef.Diag(R.getBegin(), diag::err_attr_objc_ownership_redundant)
4091           << Result << R;
4092 
4093         Quals.removeObjCLifetime();
4094       }
4095     }
4096   }
4097   if (!Quals.empty()) {
4098     Result = SemaRef.BuildQualifiedType(Result, T.getBeginLoc(), Quals);
4099     // BuildQualifiedType might not add qualifiers if they are invalid.
4100     if (Result.hasLocalQualifiers())
4101       TLB.push<QualifiedTypeLoc>(Result);
4102     // No location information to preserve.
4103   }
4104 
4105   return Result;
4106 }
4107 
4108 template<typename Derived>
4109 TypeLoc
4110 TreeTransform<Derived>::TransformTypeInObjectScope(TypeLoc TL,
4111                                                    QualType ObjectType,
4112                                                    NamedDecl *UnqualLookup,
4113                                                    CXXScopeSpec &SS) {
4114   if (getDerived().AlreadyTransformed(TL.getType()))
4115     return TL;
4116 
4117   TypeSourceInfo *TSI =
4118       TransformTSIInObjectScope(TL, ObjectType, UnqualLookup, SS);
4119   if (TSI)
4120     return TSI->getTypeLoc();
4121   return TypeLoc();
4122 }
4123 
4124 template<typename Derived>
4125 TypeSourceInfo *
4126 TreeTransform<Derived>::TransformTypeInObjectScope(TypeSourceInfo *TSInfo,
4127                                                    QualType ObjectType,
4128                                                    NamedDecl *UnqualLookup,
4129                                                    CXXScopeSpec &SS) {
4130   if (getDerived().AlreadyTransformed(TSInfo->getType()))
4131     return TSInfo;
4132 
4133   return TransformTSIInObjectScope(TSInfo->getTypeLoc(), ObjectType,
4134                                    UnqualLookup, SS);
4135 }
4136 
4137 template <typename Derived>
4138 TypeSourceInfo *TreeTransform<Derived>::TransformTSIInObjectScope(
4139     TypeLoc TL, QualType ObjectType, NamedDecl *UnqualLookup,
4140     CXXScopeSpec &SS) {
4141   QualType T = TL.getType();
4142   assert(!getDerived().AlreadyTransformed(T));
4143 
4144   TypeLocBuilder TLB;
4145   QualType Result;
4146 
4147   if (isa<TemplateSpecializationType>(T)) {
4148     TemplateSpecializationTypeLoc SpecTL =
4149         TL.castAs<TemplateSpecializationTypeLoc>();
4150 
4151     TemplateName Template
4152     = getDerived().TransformTemplateName(SS,
4153                                          SpecTL.getTypePtr()->getTemplateName(),
4154                                          SpecTL.getTemplateNameLoc(),
4155                                          ObjectType, UnqualLookup);
4156     if (Template.isNull())
4157       return nullptr;
4158 
4159     Result = getDerived().TransformTemplateSpecializationType(TLB, SpecTL,
4160                                                               Template);
4161   } else if (isa<DependentTemplateSpecializationType>(T)) {
4162     DependentTemplateSpecializationTypeLoc SpecTL =
4163         TL.castAs<DependentTemplateSpecializationTypeLoc>();
4164 
4165     TemplateName Template
4166       = getDerived().RebuildTemplateName(SS,
4167                                          *SpecTL.getTypePtr()->getIdentifier(),
4168                                          SpecTL.getTemplateNameLoc(),
4169                                          ObjectType, UnqualLookup);
4170     if (Template.isNull())
4171       return nullptr;
4172 
4173     Result = getDerived().TransformDependentTemplateSpecializationType(TLB,
4174                                                                        SpecTL,
4175                                                                        Template,
4176                                                                        SS);
4177   } else {
4178     // Nothing special needs to be done for these.
4179     Result = getDerived().TransformType(TLB, TL);
4180   }
4181 
4182   if (Result.isNull())
4183     return nullptr;
4184 
4185   return TLB.getTypeSourceInfo(SemaRef.Context, Result);
4186 }
4187 
4188 template <class TyLoc> static inline
4189 QualType TransformTypeSpecType(TypeLocBuilder &TLB, TyLoc T) {
4190   TyLoc NewT = TLB.push<TyLoc>(T.getType());
4191   NewT.setNameLoc(T.getNameLoc());
4192   return T.getType();
4193 }
4194 
4195 template<typename Derived>
4196 QualType TreeTransform<Derived>::TransformBuiltinType(TypeLocBuilder &TLB,
4197                                                       BuiltinTypeLoc T) {
4198   BuiltinTypeLoc NewT = TLB.push<BuiltinTypeLoc>(T.getType());
4199   NewT.setBuiltinLoc(T.getBuiltinLoc());
4200   if (T.needsExtraLocalData())
4201     NewT.getWrittenBuiltinSpecs() = T.getWrittenBuiltinSpecs();
4202   return T.getType();
4203 }
4204 
4205 template<typename Derived>
4206 QualType TreeTransform<Derived>::TransformComplexType(TypeLocBuilder &TLB,
4207                                                       ComplexTypeLoc T) {
4208   // FIXME: recurse?
4209   return TransformTypeSpecType(TLB, T);
4210 }
4211 
4212 template <typename Derived>
4213 QualType TreeTransform<Derived>::TransformAdjustedType(TypeLocBuilder &TLB,
4214                                                        AdjustedTypeLoc TL) {
4215   // Adjustments applied during transformation are handled elsewhere.
4216   return getDerived().TransformType(TLB, TL.getOriginalLoc());
4217 }
4218 
4219 template<typename Derived>
4220 QualType TreeTransform<Derived>::TransformDecayedType(TypeLocBuilder &TLB,
4221                                                       DecayedTypeLoc TL) {
4222   QualType OriginalType = getDerived().TransformType(TLB, TL.getOriginalLoc());
4223   if (OriginalType.isNull())
4224     return QualType();
4225 
4226   QualType Result = TL.getType();
4227   if (getDerived().AlwaysRebuild() ||
4228       OriginalType != TL.getOriginalLoc().getType())
4229     Result = SemaRef.Context.getDecayedType(OriginalType);
4230   TLB.push<DecayedTypeLoc>(Result);
4231   // Nothing to set for DecayedTypeLoc.
4232   return Result;
4233 }
4234 
4235 template<typename Derived>
4236 QualType TreeTransform<Derived>::TransformPointerType(TypeLocBuilder &TLB,
4237                                                       PointerTypeLoc TL) {
4238   QualType PointeeType
4239     = getDerived().TransformType(TLB, TL.getPointeeLoc());
4240   if (PointeeType.isNull())
4241     return QualType();
4242 
4243   QualType Result = TL.getType();
4244   if (PointeeType->getAs<ObjCObjectType>()) {
4245     // A dependent pointer type 'T *' has is being transformed such
4246     // that an Objective-C class type is being replaced for 'T'. The
4247     // resulting pointer type is an ObjCObjectPointerType, not a
4248     // PointerType.
4249     Result = SemaRef.Context.getObjCObjectPointerType(PointeeType);
4250 
4251     ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result);
4252     NewT.setStarLoc(TL.getStarLoc());
4253     return Result;
4254   }
4255 
4256   if (getDerived().AlwaysRebuild() ||
4257       PointeeType != TL.getPointeeLoc().getType()) {
4258     Result = getDerived().RebuildPointerType(PointeeType, TL.getSigilLoc());
4259     if (Result.isNull())
4260       return QualType();
4261   }
4262 
4263   // Objective-C ARC can add lifetime qualifiers to the type that we're
4264   // pointing to.
4265   TLB.TypeWasModifiedSafely(Result->getPointeeType());
4266 
4267   PointerTypeLoc NewT = TLB.push<PointerTypeLoc>(Result);
4268   NewT.setSigilLoc(TL.getSigilLoc());
4269   return Result;
4270 }
4271 
4272 template<typename Derived>
4273 QualType
4274 TreeTransform<Derived>::TransformBlockPointerType(TypeLocBuilder &TLB,
4275                                                   BlockPointerTypeLoc TL) {
4276   QualType PointeeType
4277     = getDerived().TransformType(TLB, TL.getPointeeLoc());
4278   if (PointeeType.isNull())
4279     return QualType();
4280 
4281   QualType Result = TL.getType();
4282   if (getDerived().AlwaysRebuild() ||
4283       PointeeType != TL.getPointeeLoc().getType()) {
4284     Result = getDerived().RebuildBlockPointerType(PointeeType,
4285                                                   TL.getSigilLoc());
4286     if (Result.isNull())
4287       return QualType();
4288   }
4289 
4290   BlockPointerTypeLoc NewT = TLB.push<BlockPointerTypeLoc>(Result);
4291   NewT.setSigilLoc(TL.getSigilLoc());
4292   return Result;
4293 }
4294 
4295 /// Transforms a reference type.  Note that somewhat paradoxically we
4296 /// don't care whether the type itself is an l-value type or an r-value
4297 /// type;  we only care if the type was *written* as an l-value type
4298 /// or an r-value type.
4299 template<typename Derived>
4300 QualType
4301 TreeTransform<Derived>::TransformReferenceType(TypeLocBuilder &TLB,
4302                                                ReferenceTypeLoc TL) {
4303   const ReferenceType *T = TL.getTypePtr();
4304 
4305   // Note that this works with the pointee-as-written.
4306   QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
4307   if (PointeeType.isNull())
4308     return QualType();
4309 
4310   QualType Result = TL.getType();
4311   if (getDerived().AlwaysRebuild() ||
4312       PointeeType != T->getPointeeTypeAsWritten()) {
4313     Result = getDerived().RebuildReferenceType(PointeeType,
4314                                                T->isSpelledAsLValue(),
4315                                                TL.getSigilLoc());
4316     if (Result.isNull())
4317       return QualType();
4318   }
4319 
4320   // Objective-C ARC can add lifetime qualifiers to the type that we're
4321   // referring to.
4322   TLB.TypeWasModifiedSafely(
4323                      Result->getAs<ReferenceType>()->getPointeeTypeAsWritten());
4324 
4325   // r-value references can be rebuilt as l-value references.
4326   ReferenceTypeLoc NewTL;
4327   if (isa<LValueReferenceType>(Result))
4328     NewTL = TLB.push<LValueReferenceTypeLoc>(Result);
4329   else
4330     NewTL = TLB.push<RValueReferenceTypeLoc>(Result);
4331   NewTL.setSigilLoc(TL.getSigilLoc());
4332 
4333   return Result;
4334 }
4335 
4336 template<typename Derived>
4337 QualType
4338 TreeTransform<Derived>::TransformLValueReferenceType(TypeLocBuilder &TLB,
4339                                                  LValueReferenceTypeLoc TL) {
4340   return TransformReferenceType(TLB, TL);
4341 }
4342 
4343 template<typename Derived>
4344 QualType
4345 TreeTransform<Derived>::TransformRValueReferenceType(TypeLocBuilder &TLB,
4346                                                  RValueReferenceTypeLoc TL) {
4347   return TransformReferenceType(TLB, TL);
4348 }
4349 
4350 template<typename Derived>
4351 QualType
4352 TreeTransform<Derived>::TransformMemberPointerType(TypeLocBuilder &TLB,
4353                                                    MemberPointerTypeLoc TL) {
4354   QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
4355   if (PointeeType.isNull())
4356     return QualType();
4357 
4358   TypeSourceInfo* OldClsTInfo = TL.getClassTInfo();
4359   TypeSourceInfo *NewClsTInfo = nullptr;
4360   if (OldClsTInfo) {
4361     NewClsTInfo = getDerived().TransformType(OldClsTInfo);
4362     if (!NewClsTInfo)
4363       return QualType();
4364   }
4365 
4366   const MemberPointerType *T = TL.getTypePtr();
4367   QualType OldClsType = QualType(T->getClass(), 0);
4368   QualType NewClsType;
4369   if (NewClsTInfo)
4370     NewClsType = NewClsTInfo->getType();
4371   else {
4372     NewClsType = getDerived().TransformType(OldClsType);
4373     if (NewClsType.isNull())
4374       return QualType();
4375   }
4376 
4377   QualType Result = TL.getType();
4378   if (getDerived().AlwaysRebuild() ||
4379       PointeeType != T->getPointeeType() ||
4380       NewClsType != OldClsType) {
4381     Result = getDerived().RebuildMemberPointerType(PointeeType, NewClsType,
4382                                                    TL.getStarLoc());
4383     if (Result.isNull())
4384       return QualType();
4385   }
4386 
4387   // If we had to adjust the pointee type when building a member pointer, make
4388   // sure to push TypeLoc info for it.
4389   const MemberPointerType *MPT = Result->getAs<MemberPointerType>();
4390   if (MPT && PointeeType != MPT->getPointeeType()) {
4391     assert(isa<AdjustedType>(MPT->getPointeeType()));
4392     TLB.push<AdjustedTypeLoc>(MPT->getPointeeType());
4393   }
4394 
4395   MemberPointerTypeLoc NewTL = TLB.push<MemberPointerTypeLoc>(Result);
4396   NewTL.setSigilLoc(TL.getSigilLoc());
4397   NewTL.setClassTInfo(NewClsTInfo);
4398 
4399   return Result;
4400 }
4401 
4402 template<typename Derived>
4403 QualType
4404 TreeTransform<Derived>::TransformConstantArrayType(TypeLocBuilder &TLB,
4405                                                    ConstantArrayTypeLoc TL) {
4406   const ConstantArrayType *T = TL.getTypePtr();
4407   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
4408   if (ElementType.isNull())
4409     return QualType();
4410 
4411   QualType Result = TL.getType();
4412   if (getDerived().AlwaysRebuild() ||
4413       ElementType != T->getElementType()) {
4414     Result = getDerived().RebuildConstantArrayType(ElementType,
4415                                                    T->getSizeModifier(),
4416                                                    T->getSize(),
4417                                              T->getIndexTypeCVRQualifiers(),
4418                                                    TL.getBracketsRange());
4419     if (Result.isNull())
4420       return QualType();
4421   }
4422 
4423   // We might have either a ConstantArrayType or a VariableArrayType now:
4424   // a ConstantArrayType is allowed to have an element type which is a
4425   // VariableArrayType if the type is dependent.  Fortunately, all array
4426   // types have the same location layout.
4427   ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result);
4428   NewTL.setLBracketLoc(TL.getLBracketLoc());
4429   NewTL.setRBracketLoc(TL.getRBracketLoc());
4430 
4431   Expr *Size = TL.getSizeExpr();
4432   if (Size) {
4433     EnterExpressionEvaluationContext Unevaluated(SemaRef,
4434                                                  Sema::ConstantEvaluated);
4435     Size = getDerived().TransformExpr(Size).template getAs<Expr>();
4436     Size = SemaRef.ActOnConstantExpression(Size).get();
4437   }
4438   NewTL.setSizeExpr(Size);
4439 
4440   return Result;
4441 }
4442 
4443 template<typename Derived>
4444 QualType TreeTransform<Derived>::TransformIncompleteArrayType(
4445                                               TypeLocBuilder &TLB,
4446                                               IncompleteArrayTypeLoc TL) {
4447   const IncompleteArrayType *T = TL.getTypePtr();
4448   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
4449   if (ElementType.isNull())
4450     return QualType();
4451 
4452   QualType Result = TL.getType();
4453   if (getDerived().AlwaysRebuild() ||
4454       ElementType != T->getElementType()) {
4455     Result = getDerived().RebuildIncompleteArrayType(ElementType,
4456                                                      T->getSizeModifier(),
4457                                            T->getIndexTypeCVRQualifiers(),
4458                                                      TL.getBracketsRange());
4459     if (Result.isNull())
4460       return QualType();
4461   }
4462 
4463   IncompleteArrayTypeLoc NewTL = TLB.push<IncompleteArrayTypeLoc>(Result);
4464   NewTL.setLBracketLoc(TL.getLBracketLoc());
4465   NewTL.setRBracketLoc(TL.getRBracketLoc());
4466   NewTL.setSizeExpr(nullptr);
4467 
4468   return Result;
4469 }
4470 
4471 template<typename Derived>
4472 QualType
4473 TreeTransform<Derived>::TransformVariableArrayType(TypeLocBuilder &TLB,
4474                                                    VariableArrayTypeLoc TL) {
4475   const VariableArrayType *T = TL.getTypePtr();
4476   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
4477   if (ElementType.isNull())
4478     return QualType();
4479 
4480   ExprResult SizeResult
4481     = getDerived().TransformExpr(T->getSizeExpr());
4482   if (SizeResult.isInvalid())
4483     return QualType();
4484 
4485   Expr *Size = SizeResult.get();
4486 
4487   QualType Result = TL.getType();
4488   if (getDerived().AlwaysRebuild() ||
4489       ElementType != T->getElementType() ||
4490       Size != T->getSizeExpr()) {
4491     Result = getDerived().RebuildVariableArrayType(ElementType,
4492                                                    T->getSizeModifier(),
4493                                                    Size,
4494                                              T->getIndexTypeCVRQualifiers(),
4495                                                    TL.getBracketsRange());
4496     if (Result.isNull())
4497       return QualType();
4498   }
4499 
4500   // We might have constant size array now, but fortunately it has the same
4501   // location layout.
4502   ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result);
4503   NewTL.setLBracketLoc(TL.getLBracketLoc());
4504   NewTL.setRBracketLoc(TL.getRBracketLoc());
4505   NewTL.setSizeExpr(Size);
4506 
4507   return Result;
4508 }
4509 
4510 template<typename Derived>
4511 QualType
4512 TreeTransform<Derived>::TransformDependentSizedArrayType(TypeLocBuilder &TLB,
4513                                              DependentSizedArrayTypeLoc TL) {
4514   const DependentSizedArrayType *T = TL.getTypePtr();
4515   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
4516   if (ElementType.isNull())
4517     return QualType();
4518 
4519   // Array bounds are constant expressions.
4520   EnterExpressionEvaluationContext Unevaluated(SemaRef,
4521                                                Sema::ConstantEvaluated);
4522 
4523   // Prefer the expression from the TypeLoc;  the other may have been uniqued.
4524   Expr *origSize = TL.getSizeExpr();
4525   if (!origSize) origSize = T->getSizeExpr();
4526 
4527   ExprResult sizeResult
4528     = getDerived().TransformExpr(origSize);
4529   sizeResult = SemaRef.ActOnConstantExpression(sizeResult);
4530   if (sizeResult.isInvalid())
4531     return QualType();
4532 
4533   Expr *size = sizeResult.get();
4534 
4535   QualType Result = TL.getType();
4536   if (getDerived().AlwaysRebuild() ||
4537       ElementType != T->getElementType() ||
4538       size != origSize) {
4539     Result = getDerived().RebuildDependentSizedArrayType(ElementType,
4540                                                          T->getSizeModifier(),
4541                                                          size,
4542                                                 T->getIndexTypeCVRQualifiers(),
4543                                                         TL.getBracketsRange());
4544     if (Result.isNull())
4545       return QualType();
4546   }
4547 
4548   // We might have any sort of array type now, but fortunately they
4549   // all have the same location layout.
4550   ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result);
4551   NewTL.setLBracketLoc(TL.getLBracketLoc());
4552   NewTL.setRBracketLoc(TL.getRBracketLoc());
4553   NewTL.setSizeExpr(size);
4554 
4555   return Result;
4556 }
4557 
4558 template<typename Derived>
4559 QualType TreeTransform<Derived>::TransformDependentSizedExtVectorType(
4560                                       TypeLocBuilder &TLB,
4561                                       DependentSizedExtVectorTypeLoc TL) {
4562   const DependentSizedExtVectorType *T = TL.getTypePtr();
4563 
4564   // FIXME: ext vector locs should be nested
4565   QualType ElementType = getDerived().TransformType(T->getElementType());
4566   if (ElementType.isNull())
4567     return QualType();
4568 
4569   // Vector sizes are constant expressions.
4570   EnterExpressionEvaluationContext Unevaluated(SemaRef,
4571                                                Sema::ConstantEvaluated);
4572 
4573   ExprResult Size = getDerived().TransformExpr(T->getSizeExpr());
4574   Size = SemaRef.ActOnConstantExpression(Size);
4575   if (Size.isInvalid())
4576     return QualType();
4577 
4578   QualType Result = TL.getType();
4579   if (getDerived().AlwaysRebuild() ||
4580       ElementType != T->getElementType() ||
4581       Size.get() != T->getSizeExpr()) {
4582     Result = getDerived().RebuildDependentSizedExtVectorType(ElementType,
4583                                                              Size.get(),
4584                                                          T->getAttributeLoc());
4585     if (Result.isNull())
4586       return QualType();
4587   }
4588 
4589   // Result might be dependent or not.
4590   if (isa<DependentSizedExtVectorType>(Result)) {
4591     DependentSizedExtVectorTypeLoc NewTL
4592       = TLB.push<DependentSizedExtVectorTypeLoc>(Result);
4593     NewTL.setNameLoc(TL.getNameLoc());
4594   } else {
4595     ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result);
4596     NewTL.setNameLoc(TL.getNameLoc());
4597   }
4598 
4599   return Result;
4600 }
4601 
4602 template<typename Derived>
4603 QualType TreeTransform<Derived>::TransformVectorType(TypeLocBuilder &TLB,
4604                                                      VectorTypeLoc TL) {
4605   const VectorType *T = TL.getTypePtr();
4606   QualType ElementType = getDerived().TransformType(T->getElementType());
4607   if (ElementType.isNull())
4608     return QualType();
4609 
4610   QualType Result = TL.getType();
4611   if (getDerived().AlwaysRebuild() ||
4612       ElementType != T->getElementType()) {
4613     Result = getDerived().RebuildVectorType(ElementType, T->getNumElements(),
4614                                             T->getVectorKind());
4615     if (Result.isNull())
4616       return QualType();
4617   }
4618 
4619   VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result);
4620   NewTL.setNameLoc(TL.getNameLoc());
4621 
4622   return Result;
4623 }
4624 
4625 template<typename Derived>
4626 QualType TreeTransform<Derived>::TransformExtVectorType(TypeLocBuilder &TLB,
4627                                                         ExtVectorTypeLoc TL) {
4628   const VectorType *T = TL.getTypePtr();
4629   QualType ElementType = getDerived().TransformType(T->getElementType());
4630   if (ElementType.isNull())
4631     return QualType();
4632 
4633   QualType Result = TL.getType();
4634   if (getDerived().AlwaysRebuild() ||
4635       ElementType != T->getElementType()) {
4636     Result = getDerived().RebuildExtVectorType(ElementType,
4637                                                T->getNumElements(),
4638                                                /*FIXME*/ SourceLocation());
4639     if (Result.isNull())
4640       return QualType();
4641   }
4642 
4643   ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result);
4644   NewTL.setNameLoc(TL.getNameLoc());
4645 
4646   return Result;
4647 }
4648 
4649 template <typename Derived>
4650 ParmVarDecl *TreeTransform<Derived>::TransformFunctionTypeParam(
4651     ParmVarDecl *OldParm, int indexAdjustment, Optional<unsigned> NumExpansions,
4652     bool ExpectParameterPack) {
4653   TypeSourceInfo *OldDI = OldParm->getTypeSourceInfo();
4654   TypeSourceInfo *NewDI = nullptr;
4655 
4656   if (NumExpansions && isa<PackExpansionType>(OldDI->getType())) {
4657     // If we're substituting into a pack expansion type and we know the
4658     // length we want to expand to, just substitute for the pattern.
4659     TypeLoc OldTL = OldDI->getTypeLoc();
4660     PackExpansionTypeLoc OldExpansionTL = OldTL.castAs<PackExpansionTypeLoc>();
4661 
4662     TypeLocBuilder TLB;
4663     TypeLoc NewTL = OldDI->getTypeLoc();
4664     TLB.reserve(NewTL.getFullDataSize());
4665 
4666     QualType Result = getDerived().TransformType(TLB,
4667                                                OldExpansionTL.getPatternLoc());
4668     if (Result.isNull())
4669       return nullptr;
4670 
4671     Result = RebuildPackExpansionType(Result,
4672                                 OldExpansionTL.getPatternLoc().getSourceRange(),
4673                                       OldExpansionTL.getEllipsisLoc(),
4674                                       NumExpansions);
4675     if (Result.isNull())
4676       return nullptr;
4677 
4678     PackExpansionTypeLoc NewExpansionTL
4679       = TLB.push<PackExpansionTypeLoc>(Result);
4680     NewExpansionTL.setEllipsisLoc(OldExpansionTL.getEllipsisLoc());
4681     NewDI = TLB.getTypeSourceInfo(SemaRef.Context, Result);
4682   } else
4683     NewDI = getDerived().TransformType(OldDI);
4684   if (!NewDI)
4685     return nullptr;
4686 
4687   if (NewDI == OldDI && indexAdjustment == 0)
4688     return OldParm;
4689 
4690   ParmVarDecl *newParm = ParmVarDecl::Create(SemaRef.Context,
4691                                              OldParm->getDeclContext(),
4692                                              OldParm->getInnerLocStart(),
4693                                              OldParm->getLocation(),
4694                                              OldParm->getIdentifier(),
4695                                              NewDI->getType(),
4696                                              NewDI,
4697                                              OldParm->getStorageClass(),
4698                                              /* DefArg */ nullptr);
4699   newParm->setScopeInfo(OldParm->getFunctionScopeDepth(),
4700                         OldParm->getFunctionScopeIndex() + indexAdjustment);
4701   return newParm;
4702 }
4703 
4704 template <typename Derived>
4705 bool TreeTransform<Derived>::TransformFunctionTypeParams(
4706     SourceLocation Loc, ArrayRef<ParmVarDecl *> Params,
4707     const QualType *ParamTypes,
4708     const FunctionProtoType::ExtParameterInfo *ParamInfos,
4709     SmallVectorImpl<QualType> &OutParamTypes,
4710     SmallVectorImpl<ParmVarDecl *> *PVars,
4711     Sema::ExtParameterInfoBuilder &PInfos) {
4712   int indexAdjustment = 0;
4713 
4714   unsigned NumParams = Params.size();
4715   for (unsigned i = 0; i != NumParams; ++i) {
4716     if (ParmVarDecl *OldParm = Params[i]) {
4717       assert(OldParm->getFunctionScopeIndex() == i);
4718 
4719       Optional<unsigned> NumExpansions;
4720       ParmVarDecl *NewParm = nullptr;
4721       if (OldParm->isParameterPack()) {
4722         // We have a function parameter pack that may need to be expanded.
4723         SmallVector<UnexpandedParameterPack, 2> Unexpanded;
4724 
4725         // Find the parameter packs that could be expanded.
4726         TypeLoc TL = OldParm->getTypeSourceInfo()->getTypeLoc();
4727         PackExpansionTypeLoc ExpansionTL = TL.castAs<PackExpansionTypeLoc>();
4728         TypeLoc Pattern = ExpansionTL.getPatternLoc();
4729         SemaRef.collectUnexpandedParameterPacks(Pattern, Unexpanded);
4730         assert(Unexpanded.size() > 0 && "Could not find parameter packs!");
4731 
4732         // Determine whether we should expand the parameter packs.
4733         bool ShouldExpand = false;
4734         bool RetainExpansion = false;
4735         Optional<unsigned> OrigNumExpansions =
4736             ExpansionTL.getTypePtr()->getNumExpansions();
4737         NumExpansions = OrigNumExpansions;
4738         if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(),
4739                                                  Pattern.getSourceRange(),
4740                                                  Unexpanded,
4741                                                  ShouldExpand,
4742                                                  RetainExpansion,
4743                                                  NumExpansions)) {
4744           return true;
4745         }
4746 
4747         if (ShouldExpand) {
4748           // Expand the function parameter pack into multiple, separate
4749           // parameters.
4750           getDerived().ExpandingFunctionParameterPack(OldParm);
4751           for (unsigned I = 0; I != *NumExpansions; ++I) {
4752             Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
4753             ParmVarDecl *NewParm
4754               = getDerived().TransformFunctionTypeParam(OldParm,
4755                                                         indexAdjustment++,
4756                                                         OrigNumExpansions,
4757                                                 /*ExpectParameterPack=*/false);
4758             if (!NewParm)
4759               return true;
4760 
4761             if (ParamInfos)
4762               PInfos.set(OutParamTypes.size(), ParamInfos[i]);
4763             OutParamTypes.push_back(NewParm->getType());
4764             if (PVars)
4765               PVars->push_back(NewParm);
4766           }
4767 
4768           // If we're supposed to retain a pack expansion, do so by temporarily
4769           // forgetting the partially-substituted parameter pack.
4770           if (RetainExpansion) {
4771             ForgetPartiallySubstitutedPackRAII Forget(getDerived());
4772             ParmVarDecl *NewParm
4773               = getDerived().TransformFunctionTypeParam(OldParm,
4774                                                         indexAdjustment++,
4775                                                         OrigNumExpansions,
4776                                                 /*ExpectParameterPack=*/false);
4777             if (!NewParm)
4778               return true;
4779 
4780             if (ParamInfos)
4781               PInfos.set(OutParamTypes.size(), ParamInfos[i]);
4782             OutParamTypes.push_back(NewParm->getType());
4783             if (PVars)
4784               PVars->push_back(NewParm);
4785           }
4786 
4787           // The next parameter should have the same adjustment as the
4788           // last thing we pushed, but we post-incremented indexAdjustment
4789           // on every push.  Also, if we push nothing, the adjustment should
4790           // go down by one.
4791           indexAdjustment--;
4792 
4793           // We're done with the pack expansion.
4794           continue;
4795         }
4796 
4797         // We'll substitute the parameter now without expanding the pack
4798         // expansion.
4799         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
4800         NewParm = getDerived().TransformFunctionTypeParam(OldParm,
4801                                                           indexAdjustment,
4802                                                           NumExpansions,
4803                                                   /*ExpectParameterPack=*/true);
4804       } else {
4805         NewParm = getDerived().TransformFunctionTypeParam(
4806             OldParm, indexAdjustment, None, /*ExpectParameterPack=*/ false);
4807       }
4808 
4809       if (!NewParm)
4810         return true;
4811 
4812       if (ParamInfos)
4813         PInfos.set(OutParamTypes.size(), ParamInfos[i]);
4814       OutParamTypes.push_back(NewParm->getType());
4815       if (PVars)
4816         PVars->push_back(NewParm);
4817       continue;
4818     }
4819 
4820     // Deal with the possibility that we don't have a parameter
4821     // declaration for this parameter.
4822     QualType OldType = ParamTypes[i];
4823     bool IsPackExpansion = false;
4824     Optional<unsigned> NumExpansions;
4825     QualType NewType;
4826     if (const PackExpansionType *Expansion
4827                                        = dyn_cast<PackExpansionType>(OldType)) {
4828       // We have a function parameter pack that may need to be expanded.
4829       QualType Pattern = Expansion->getPattern();
4830       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
4831       getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
4832 
4833       // Determine whether we should expand the parameter packs.
4834       bool ShouldExpand = false;
4835       bool RetainExpansion = false;
4836       if (getDerived().TryExpandParameterPacks(Loc, SourceRange(),
4837                                                Unexpanded,
4838                                                ShouldExpand,
4839                                                RetainExpansion,
4840                                                NumExpansions)) {
4841         return true;
4842       }
4843 
4844       if (ShouldExpand) {
4845         // Expand the function parameter pack into multiple, separate
4846         // parameters.
4847         for (unsigned I = 0; I != *NumExpansions; ++I) {
4848           Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
4849           QualType NewType = getDerived().TransformType(Pattern);
4850           if (NewType.isNull())
4851             return true;
4852 
4853           if (NewType->containsUnexpandedParameterPack()) {
4854             NewType =
4855                 getSema().getASTContext().getPackExpansionType(NewType, None);
4856 
4857             if (NewType.isNull())
4858               return true;
4859           }
4860 
4861           if (ParamInfos)
4862             PInfos.set(OutParamTypes.size(), ParamInfos[i]);
4863           OutParamTypes.push_back(NewType);
4864           if (PVars)
4865             PVars->push_back(nullptr);
4866         }
4867 
4868         // We're done with the pack expansion.
4869         continue;
4870       }
4871 
4872       // If we're supposed to retain a pack expansion, do so by temporarily
4873       // forgetting the partially-substituted parameter pack.
4874       if (RetainExpansion) {
4875         ForgetPartiallySubstitutedPackRAII Forget(getDerived());
4876         QualType NewType = getDerived().TransformType(Pattern);
4877         if (NewType.isNull())
4878           return true;
4879 
4880         if (ParamInfos)
4881           PInfos.set(OutParamTypes.size(), ParamInfos[i]);
4882         OutParamTypes.push_back(NewType);
4883         if (PVars)
4884           PVars->push_back(nullptr);
4885       }
4886 
4887       // We'll substitute the parameter now without expanding the pack
4888       // expansion.
4889       OldType = Expansion->getPattern();
4890       IsPackExpansion = true;
4891       Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
4892       NewType = getDerived().TransformType(OldType);
4893     } else {
4894       NewType = getDerived().TransformType(OldType);
4895     }
4896 
4897     if (NewType.isNull())
4898       return true;
4899 
4900     if (IsPackExpansion)
4901       NewType = getSema().Context.getPackExpansionType(NewType,
4902                                                        NumExpansions);
4903 
4904     if (ParamInfos)
4905       PInfos.set(OutParamTypes.size(), ParamInfos[i]);
4906     OutParamTypes.push_back(NewType);
4907     if (PVars)
4908       PVars->push_back(nullptr);
4909   }
4910 
4911 #ifndef NDEBUG
4912   if (PVars) {
4913     for (unsigned i = 0, e = PVars->size(); i != e; ++i)
4914       if (ParmVarDecl *parm = (*PVars)[i])
4915         assert(parm->getFunctionScopeIndex() == i);
4916   }
4917 #endif
4918 
4919   return false;
4920 }
4921 
4922 template<typename Derived>
4923 QualType
4924 TreeTransform<Derived>::TransformFunctionProtoType(TypeLocBuilder &TLB,
4925                                                    FunctionProtoTypeLoc TL) {
4926   SmallVector<QualType, 4> ExceptionStorage;
4927   TreeTransform *This = this; // Work around gcc.gnu.org/PR56135.
4928   return getDerived().TransformFunctionProtoType(
4929       TLB, TL, nullptr, 0,
4930       [&](FunctionProtoType::ExceptionSpecInfo &ESI, bool &Changed) {
4931         return This->TransformExceptionSpec(TL.getBeginLoc(), ESI,
4932                                             ExceptionStorage, Changed);
4933       });
4934 }
4935 
4936 template<typename Derived> template<typename Fn>
4937 QualType TreeTransform<Derived>::TransformFunctionProtoType(
4938     TypeLocBuilder &TLB, FunctionProtoTypeLoc TL, CXXRecordDecl *ThisContext,
4939     unsigned ThisTypeQuals, Fn TransformExceptionSpec) {
4940 
4941   // Transform the parameters and return type.
4942   //
4943   // We are required to instantiate the params and return type in source order.
4944   // When the function has a trailing return type, we instantiate the
4945   // parameters before the return type,  since the return type can then refer
4946   // to the parameters themselves (via decltype, sizeof, etc.).
4947   //
4948   SmallVector<QualType, 4> ParamTypes;
4949   SmallVector<ParmVarDecl*, 4> ParamDecls;
4950   Sema::ExtParameterInfoBuilder ExtParamInfos;
4951   const FunctionProtoType *T = TL.getTypePtr();
4952 
4953   QualType ResultType;
4954 
4955   if (T->hasTrailingReturn()) {
4956     if (getDerived().TransformFunctionTypeParams(
4957             TL.getBeginLoc(), TL.getParams(),
4958             TL.getTypePtr()->param_type_begin(),
4959             T->getExtParameterInfosOrNull(),
4960             ParamTypes, &ParamDecls, ExtParamInfos))
4961       return QualType();
4962 
4963     {
4964       // C++11 [expr.prim.general]p3:
4965       //   If a declaration declares a member function or member function
4966       //   template of a class X, the expression this is a prvalue of type
4967       //   "pointer to cv-qualifier-seq X" between the optional cv-qualifer-seq
4968       //   and the end of the function-definition, member-declarator, or
4969       //   declarator.
4970       Sema::CXXThisScopeRAII ThisScope(SemaRef, ThisContext, ThisTypeQuals);
4971 
4972       ResultType = getDerived().TransformType(TLB, TL.getReturnLoc());
4973       if (ResultType.isNull())
4974         return QualType();
4975     }
4976   }
4977   else {
4978     ResultType = getDerived().TransformType(TLB, TL.getReturnLoc());
4979     if (ResultType.isNull())
4980       return QualType();
4981 
4982     if (getDerived().TransformFunctionTypeParams(
4983             TL.getBeginLoc(), TL.getParams(),
4984             TL.getTypePtr()->param_type_begin(),
4985             T->getExtParameterInfosOrNull(),
4986             ParamTypes, &ParamDecls, ExtParamInfos))
4987       return QualType();
4988   }
4989 
4990   FunctionProtoType::ExtProtoInfo EPI = T->getExtProtoInfo();
4991 
4992   bool EPIChanged = false;
4993   if (TransformExceptionSpec(EPI.ExceptionSpec, EPIChanged))
4994     return QualType();
4995 
4996   // Handle extended parameter information.
4997   if (auto NewExtParamInfos =
4998         ExtParamInfos.getPointerOrNull(ParamTypes.size())) {
4999     if (!EPI.ExtParameterInfos ||
5000         llvm::makeArrayRef(EPI.ExtParameterInfos, TL.getNumParams())
5001           != llvm::makeArrayRef(NewExtParamInfos, ParamTypes.size())) {
5002       EPIChanged = true;
5003     }
5004     EPI.ExtParameterInfos = NewExtParamInfos;
5005   } else if (EPI.ExtParameterInfos) {
5006     EPIChanged = true;
5007     EPI.ExtParameterInfos = nullptr;
5008   }
5009 
5010   QualType Result = TL.getType();
5011   if (getDerived().AlwaysRebuild() || ResultType != T->getReturnType() ||
5012       T->getParamTypes() != llvm::makeArrayRef(ParamTypes) || EPIChanged) {
5013     Result = getDerived().RebuildFunctionProtoType(ResultType, ParamTypes, EPI);
5014     if (Result.isNull())
5015       return QualType();
5016   }
5017 
5018   FunctionProtoTypeLoc NewTL = TLB.push<FunctionProtoTypeLoc>(Result);
5019   NewTL.setLocalRangeBegin(TL.getLocalRangeBegin());
5020   NewTL.setLParenLoc(TL.getLParenLoc());
5021   NewTL.setRParenLoc(TL.getRParenLoc());
5022   NewTL.setLocalRangeEnd(TL.getLocalRangeEnd());
5023   for (unsigned i = 0, e = NewTL.getNumParams(); i != e; ++i)
5024     NewTL.setParam(i, ParamDecls[i]);
5025 
5026   return Result;
5027 }
5028 
5029 template<typename Derived>
5030 bool TreeTransform<Derived>::TransformExceptionSpec(
5031     SourceLocation Loc, FunctionProtoType::ExceptionSpecInfo &ESI,
5032     SmallVectorImpl<QualType> &Exceptions, bool &Changed) {
5033   assert(ESI.Type != EST_Uninstantiated && ESI.Type != EST_Unevaluated);
5034 
5035   // Instantiate a dynamic noexcept expression, if any.
5036   if (ESI.Type == EST_ComputedNoexcept) {
5037     EnterExpressionEvaluationContext Unevaluated(getSema(),
5038                                                  Sema::ConstantEvaluated);
5039     ExprResult NoexceptExpr = getDerived().TransformExpr(ESI.NoexceptExpr);
5040     if (NoexceptExpr.isInvalid())
5041       return true;
5042 
5043     // FIXME: This is bogus, a noexcept expression is not a condition.
5044     NoexceptExpr = getSema().CheckBooleanCondition(Loc, NoexceptExpr.get());
5045     if (NoexceptExpr.isInvalid())
5046       return true;
5047 
5048     if (!NoexceptExpr.get()->isValueDependent()) {
5049       NoexceptExpr = getSema().VerifyIntegerConstantExpression(
5050           NoexceptExpr.get(), nullptr,
5051           diag::err_noexcept_needs_constant_expression,
5052           /*AllowFold*/false);
5053       if (NoexceptExpr.isInvalid())
5054         return true;
5055     }
5056 
5057     if (ESI.NoexceptExpr != NoexceptExpr.get())
5058       Changed = true;
5059     ESI.NoexceptExpr = NoexceptExpr.get();
5060   }
5061 
5062   if (ESI.Type != EST_Dynamic)
5063     return false;
5064 
5065   // Instantiate a dynamic exception specification's type.
5066   for (QualType T : ESI.Exceptions) {
5067     if (const PackExpansionType *PackExpansion =
5068             T->getAs<PackExpansionType>()) {
5069       Changed = true;
5070 
5071       // We have a pack expansion. Instantiate it.
5072       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
5073       SemaRef.collectUnexpandedParameterPacks(PackExpansion->getPattern(),
5074                                               Unexpanded);
5075       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
5076 
5077       // Determine whether the set of unexpanded parameter packs can and
5078       // should
5079       // be expanded.
5080       bool Expand = false;
5081       bool RetainExpansion = false;
5082       Optional<unsigned> NumExpansions = PackExpansion->getNumExpansions();
5083       // FIXME: Track the location of the ellipsis (and track source location
5084       // information for the types in the exception specification in general).
5085       if (getDerived().TryExpandParameterPacks(
5086               Loc, SourceRange(), Unexpanded, Expand,
5087               RetainExpansion, NumExpansions))
5088         return true;
5089 
5090       if (!Expand) {
5091         // We can't expand this pack expansion into separate arguments yet;
5092         // just substitute into the pattern and create a new pack expansion
5093         // type.
5094         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
5095         QualType U = getDerived().TransformType(PackExpansion->getPattern());
5096         if (U.isNull())
5097           return true;
5098 
5099         U = SemaRef.Context.getPackExpansionType(U, NumExpansions);
5100         Exceptions.push_back(U);
5101         continue;
5102       }
5103 
5104       // Substitute into the pack expansion pattern for each slice of the
5105       // pack.
5106       for (unsigned ArgIdx = 0; ArgIdx != *NumExpansions; ++ArgIdx) {
5107         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), ArgIdx);
5108 
5109         QualType U = getDerived().TransformType(PackExpansion->getPattern());
5110         if (U.isNull() || SemaRef.CheckSpecifiedExceptionType(U, Loc))
5111           return true;
5112 
5113         Exceptions.push_back(U);
5114       }
5115     } else {
5116       QualType U = getDerived().TransformType(T);
5117       if (U.isNull() || SemaRef.CheckSpecifiedExceptionType(U, Loc))
5118         return true;
5119       if (T != U)
5120         Changed = true;
5121 
5122       Exceptions.push_back(U);
5123     }
5124   }
5125 
5126   ESI.Exceptions = Exceptions;
5127   if (ESI.Exceptions.empty())
5128     ESI.Type = EST_DynamicNone;
5129   return false;
5130 }
5131 
5132 template<typename Derived>
5133 QualType TreeTransform<Derived>::TransformFunctionNoProtoType(
5134                                                  TypeLocBuilder &TLB,
5135                                                  FunctionNoProtoTypeLoc TL) {
5136   const FunctionNoProtoType *T = TL.getTypePtr();
5137   QualType ResultType = getDerived().TransformType(TLB, TL.getReturnLoc());
5138   if (ResultType.isNull())
5139     return QualType();
5140 
5141   QualType Result = TL.getType();
5142   if (getDerived().AlwaysRebuild() || ResultType != T->getReturnType())
5143     Result = getDerived().RebuildFunctionNoProtoType(ResultType);
5144 
5145   FunctionNoProtoTypeLoc NewTL = TLB.push<FunctionNoProtoTypeLoc>(Result);
5146   NewTL.setLocalRangeBegin(TL.getLocalRangeBegin());
5147   NewTL.setLParenLoc(TL.getLParenLoc());
5148   NewTL.setRParenLoc(TL.getRParenLoc());
5149   NewTL.setLocalRangeEnd(TL.getLocalRangeEnd());
5150 
5151   return Result;
5152 }
5153 
5154 template<typename Derived> QualType
5155 TreeTransform<Derived>::TransformUnresolvedUsingType(TypeLocBuilder &TLB,
5156                                                  UnresolvedUsingTypeLoc TL) {
5157   const UnresolvedUsingType *T = TL.getTypePtr();
5158   Decl *D = getDerived().TransformDecl(TL.getNameLoc(), T->getDecl());
5159   if (!D)
5160     return QualType();
5161 
5162   QualType Result = TL.getType();
5163   if (getDerived().AlwaysRebuild() || D != T->getDecl()) {
5164     Result = getDerived().RebuildUnresolvedUsingType(D);
5165     if (Result.isNull())
5166       return QualType();
5167   }
5168 
5169   // We might get an arbitrary type spec type back.  We should at
5170   // least always get a type spec type, though.
5171   TypeSpecTypeLoc NewTL = TLB.pushTypeSpec(Result);
5172   NewTL.setNameLoc(TL.getNameLoc());
5173 
5174   return Result;
5175 }
5176 
5177 template<typename Derived>
5178 QualType TreeTransform<Derived>::TransformTypedefType(TypeLocBuilder &TLB,
5179                                                       TypedefTypeLoc TL) {
5180   const TypedefType *T = TL.getTypePtr();
5181   TypedefNameDecl *Typedef
5182     = cast_or_null<TypedefNameDecl>(getDerived().TransformDecl(TL.getNameLoc(),
5183                                                                T->getDecl()));
5184   if (!Typedef)
5185     return QualType();
5186 
5187   QualType Result = TL.getType();
5188   if (getDerived().AlwaysRebuild() ||
5189       Typedef != T->getDecl()) {
5190     Result = getDerived().RebuildTypedefType(Typedef);
5191     if (Result.isNull())
5192       return QualType();
5193   }
5194 
5195   TypedefTypeLoc NewTL = TLB.push<TypedefTypeLoc>(Result);
5196   NewTL.setNameLoc(TL.getNameLoc());
5197 
5198   return Result;
5199 }
5200 
5201 template<typename Derived>
5202 QualType TreeTransform<Derived>::TransformTypeOfExprType(TypeLocBuilder &TLB,
5203                                                       TypeOfExprTypeLoc TL) {
5204   // typeof expressions are not potentially evaluated contexts
5205   EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated,
5206                                                Sema::ReuseLambdaContextDecl);
5207 
5208   ExprResult E = getDerived().TransformExpr(TL.getUnderlyingExpr());
5209   if (E.isInvalid())
5210     return QualType();
5211 
5212   E = SemaRef.HandleExprEvaluationContextForTypeof(E.get());
5213   if (E.isInvalid())
5214     return QualType();
5215 
5216   QualType Result = TL.getType();
5217   if (getDerived().AlwaysRebuild() ||
5218       E.get() != TL.getUnderlyingExpr()) {
5219     Result = getDerived().RebuildTypeOfExprType(E.get(), TL.getTypeofLoc());
5220     if (Result.isNull())
5221       return QualType();
5222   }
5223   else E.get();
5224 
5225   TypeOfExprTypeLoc NewTL = TLB.push<TypeOfExprTypeLoc>(Result);
5226   NewTL.setTypeofLoc(TL.getTypeofLoc());
5227   NewTL.setLParenLoc(TL.getLParenLoc());
5228   NewTL.setRParenLoc(TL.getRParenLoc());
5229 
5230   return Result;
5231 }
5232 
5233 template<typename Derived>
5234 QualType TreeTransform<Derived>::TransformTypeOfType(TypeLocBuilder &TLB,
5235                                                      TypeOfTypeLoc TL) {
5236   TypeSourceInfo* Old_Under_TI = TL.getUnderlyingTInfo();
5237   TypeSourceInfo* New_Under_TI = getDerived().TransformType(Old_Under_TI);
5238   if (!New_Under_TI)
5239     return QualType();
5240 
5241   QualType Result = TL.getType();
5242   if (getDerived().AlwaysRebuild() || New_Under_TI != Old_Under_TI) {
5243     Result = getDerived().RebuildTypeOfType(New_Under_TI->getType());
5244     if (Result.isNull())
5245       return QualType();
5246   }
5247 
5248   TypeOfTypeLoc NewTL = TLB.push<TypeOfTypeLoc>(Result);
5249   NewTL.setTypeofLoc(TL.getTypeofLoc());
5250   NewTL.setLParenLoc(TL.getLParenLoc());
5251   NewTL.setRParenLoc(TL.getRParenLoc());
5252   NewTL.setUnderlyingTInfo(New_Under_TI);
5253 
5254   return Result;
5255 }
5256 
5257 template<typename Derived>
5258 QualType TreeTransform<Derived>::TransformDecltypeType(TypeLocBuilder &TLB,
5259                                                        DecltypeTypeLoc TL) {
5260   const DecltypeType *T = TL.getTypePtr();
5261 
5262   // decltype expressions are not potentially evaluated contexts
5263   EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated,
5264                                                nullptr, /*IsDecltype=*/ true);
5265 
5266   ExprResult E = getDerived().TransformExpr(T->getUnderlyingExpr());
5267   if (E.isInvalid())
5268     return QualType();
5269 
5270   E = getSema().ActOnDecltypeExpression(E.get());
5271   if (E.isInvalid())
5272     return QualType();
5273 
5274   QualType Result = TL.getType();
5275   if (getDerived().AlwaysRebuild() ||
5276       E.get() != T->getUnderlyingExpr()) {
5277     Result = getDerived().RebuildDecltypeType(E.get(), TL.getNameLoc());
5278     if (Result.isNull())
5279       return QualType();
5280   }
5281   else E.get();
5282 
5283   DecltypeTypeLoc NewTL = TLB.push<DecltypeTypeLoc>(Result);
5284   NewTL.setNameLoc(TL.getNameLoc());
5285 
5286   return Result;
5287 }
5288 
5289 template<typename Derived>
5290 QualType TreeTransform<Derived>::TransformUnaryTransformType(
5291                                                             TypeLocBuilder &TLB,
5292                                                      UnaryTransformTypeLoc TL) {
5293   QualType Result = TL.getType();
5294   if (Result->isDependentType()) {
5295     const UnaryTransformType *T = TL.getTypePtr();
5296     QualType NewBase =
5297       getDerived().TransformType(TL.getUnderlyingTInfo())->getType();
5298     Result = getDerived().RebuildUnaryTransformType(NewBase,
5299                                                     T->getUTTKind(),
5300                                                     TL.getKWLoc());
5301     if (Result.isNull())
5302       return QualType();
5303   }
5304 
5305   UnaryTransformTypeLoc NewTL = TLB.push<UnaryTransformTypeLoc>(Result);
5306   NewTL.setKWLoc(TL.getKWLoc());
5307   NewTL.setParensRange(TL.getParensRange());
5308   NewTL.setUnderlyingTInfo(TL.getUnderlyingTInfo());
5309   return Result;
5310 }
5311 
5312 template<typename Derived>
5313 QualType TreeTransform<Derived>::TransformAutoType(TypeLocBuilder &TLB,
5314                                                    AutoTypeLoc TL) {
5315   const AutoType *T = TL.getTypePtr();
5316   QualType OldDeduced = T->getDeducedType();
5317   QualType NewDeduced;
5318   if (!OldDeduced.isNull()) {
5319     NewDeduced = getDerived().TransformType(OldDeduced);
5320     if (NewDeduced.isNull())
5321       return QualType();
5322   }
5323 
5324   QualType Result = TL.getType();
5325   if (getDerived().AlwaysRebuild() || NewDeduced != OldDeduced ||
5326       T->isDependentType()) {
5327     Result = getDerived().RebuildAutoType(NewDeduced, T->getKeyword());
5328     if (Result.isNull())
5329       return QualType();
5330   }
5331 
5332   AutoTypeLoc NewTL = TLB.push<AutoTypeLoc>(Result);
5333   NewTL.setNameLoc(TL.getNameLoc());
5334 
5335   return Result;
5336 }
5337 
5338 template<typename Derived>
5339 QualType TreeTransform<Derived>::TransformRecordType(TypeLocBuilder &TLB,
5340                                                      RecordTypeLoc TL) {
5341   const RecordType *T = TL.getTypePtr();
5342   RecordDecl *Record
5343     = cast_or_null<RecordDecl>(getDerived().TransformDecl(TL.getNameLoc(),
5344                                                           T->getDecl()));
5345   if (!Record)
5346     return QualType();
5347 
5348   QualType Result = TL.getType();
5349   if (getDerived().AlwaysRebuild() ||
5350       Record != T->getDecl()) {
5351     Result = getDerived().RebuildRecordType(Record);
5352     if (Result.isNull())
5353       return QualType();
5354   }
5355 
5356   RecordTypeLoc NewTL = TLB.push<RecordTypeLoc>(Result);
5357   NewTL.setNameLoc(TL.getNameLoc());
5358 
5359   return Result;
5360 }
5361 
5362 template<typename Derived>
5363 QualType TreeTransform<Derived>::TransformEnumType(TypeLocBuilder &TLB,
5364                                                    EnumTypeLoc TL) {
5365   const EnumType *T = TL.getTypePtr();
5366   EnumDecl *Enum
5367     = cast_or_null<EnumDecl>(getDerived().TransformDecl(TL.getNameLoc(),
5368                                                         T->getDecl()));
5369   if (!Enum)
5370     return QualType();
5371 
5372   QualType Result = TL.getType();
5373   if (getDerived().AlwaysRebuild() ||
5374       Enum != T->getDecl()) {
5375     Result = getDerived().RebuildEnumType(Enum);
5376     if (Result.isNull())
5377       return QualType();
5378   }
5379 
5380   EnumTypeLoc NewTL = TLB.push<EnumTypeLoc>(Result);
5381   NewTL.setNameLoc(TL.getNameLoc());
5382 
5383   return Result;
5384 }
5385 
5386 template<typename Derived>
5387 QualType TreeTransform<Derived>::TransformInjectedClassNameType(
5388                                          TypeLocBuilder &TLB,
5389                                          InjectedClassNameTypeLoc TL) {
5390   Decl *D = getDerived().TransformDecl(TL.getNameLoc(),
5391                                        TL.getTypePtr()->getDecl());
5392   if (!D) return QualType();
5393 
5394   QualType T = SemaRef.Context.getTypeDeclType(cast<TypeDecl>(D));
5395   TLB.pushTypeSpec(T).setNameLoc(TL.getNameLoc());
5396   return T;
5397 }
5398 
5399 template<typename Derived>
5400 QualType TreeTransform<Derived>::TransformTemplateTypeParmType(
5401                                                 TypeLocBuilder &TLB,
5402                                                 TemplateTypeParmTypeLoc TL) {
5403   return TransformTypeSpecType(TLB, TL);
5404 }
5405 
5406 template<typename Derived>
5407 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmType(
5408                                          TypeLocBuilder &TLB,
5409                                          SubstTemplateTypeParmTypeLoc TL) {
5410   const SubstTemplateTypeParmType *T = TL.getTypePtr();
5411 
5412   // Substitute into the replacement type, which itself might involve something
5413   // that needs to be transformed. This only tends to occur with default
5414   // template arguments of template template parameters.
5415   TemporaryBase Rebase(*this, TL.getNameLoc(), DeclarationName());
5416   QualType Replacement = getDerived().TransformType(T->getReplacementType());
5417   if (Replacement.isNull())
5418     return QualType();
5419 
5420   // Always canonicalize the replacement type.
5421   Replacement = SemaRef.Context.getCanonicalType(Replacement);
5422   QualType Result
5423     = SemaRef.Context.getSubstTemplateTypeParmType(T->getReplacedParameter(),
5424                                                    Replacement);
5425 
5426   // Propagate type-source information.
5427   SubstTemplateTypeParmTypeLoc NewTL
5428     = TLB.push<SubstTemplateTypeParmTypeLoc>(Result);
5429   NewTL.setNameLoc(TL.getNameLoc());
5430   return Result;
5431 
5432 }
5433 
5434 template<typename Derived>
5435 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmPackType(
5436                                           TypeLocBuilder &TLB,
5437                                           SubstTemplateTypeParmPackTypeLoc TL) {
5438   return TransformTypeSpecType(TLB, TL);
5439 }
5440 
5441 template<typename Derived>
5442 QualType TreeTransform<Derived>::TransformTemplateSpecializationType(
5443                                                         TypeLocBuilder &TLB,
5444                                            TemplateSpecializationTypeLoc TL) {
5445   const TemplateSpecializationType *T = TL.getTypePtr();
5446 
5447   // The nested-name-specifier never matters in a TemplateSpecializationType,
5448   // because we can't have a dependent nested-name-specifier anyway.
5449   CXXScopeSpec SS;
5450   TemplateName Template
5451     = getDerived().TransformTemplateName(SS, T->getTemplateName(),
5452                                          TL.getTemplateNameLoc());
5453   if (Template.isNull())
5454     return QualType();
5455 
5456   return getDerived().TransformTemplateSpecializationType(TLB, TL, Template);
5457 }
5458 
5459 template<typename Derived>
5460 QualType TreeTransform<Derived>::TransformAtomicType(TypeLocBuilder &TLB,
5461                                                      AtomicTypeLoc TL) {
5462   QualType ValueType = getDerived().TransformType(TLB, TL.getValueLoc());
5463   if (ValueType.isNull())
5464     return QualType();
5465 
5466   QualType Result = TL.getType();
5467   if (getDerived().AlwaysRebuild() ||
5468       ValueType != TL.getValueLoc().getType()) {
5469     Result = getDerived().RebuildAtomicType(ValueType, TL.getKWLoc());
5470     if (Result.isNull())
5471       return QualType();
5472   }
5473 
5474   AtomicTypeLoc NewTL = TLB.push<AtomicTypeLoc>(Result);
5475   NewTL.setKWLoc(TL.getKWLoc());
5476   NewTL.setLParenLoc(TL.getLParenLoc());
5477   NewTL.setRParenLoc(TL.getRParenLoc());
5478 
5479   return Result;
5480 }
5481 
5482 template <typename Derived>
5483 QualType TreeTransform<Derived>::TransformPipeType(TypeLocBuilder &TLB,
5484                                                    PipeTypeLoc TL) {
5485   QualType ValueType = getDerived().TransformType(TLB, TL.getValueLoc());
5486   if (ValueType.isNull())
5487     return QualType();
5488 
5489   QualType Result = TL.getType();
5490   if (getDerived().AlwaysRebuild() || ValueType != TL.getValueLoc().getType()) {
5491     const PipeType *PT = Result->getAs<PipeType>();
5492     bool isReadPipe = PT->isReadOnly();
5493     Result = getDerived().RebuildPipeType(ValueType, TL.getKWLoc(), isReadPipe);
5494     if (Result.isNull())
5495       return QualType();
5496   }
5497 
5498   PipeTypeLoc NewTL = TLB.push<PipeTypeLoc>(Result);
5499   NewTL.setKWLoc(TL.getKWLoc());
5500 
5501   return Result;
5502 }
5503 
5504   /// \brief Simple iterator that traverses the template arguments in a
5505   /// container that provides a \c getArgLoc() member function.
5506   ///
5507   /// This iterator is intended to be used with the iterator form of
5508   /// \c TreeTransform<Derived>::TransformTemplateArguments().
5509   template<typename ArgLocContainer>
5510   class TemplateArgumentLocContainerIterator {
5511     ArgLocContainer *Container;
5512     unsigned Index;
5513 
5514   public:
5515     typedef TemplateArgumentLoc value_type;
5516     typedef TemplateArgumentLoc reference;
5517     typedef int difference_type;
5518     typedef std::input_iterator_tag iterator_category;
5519 
5520     class pointer {
5521       TemplateArgumentLoc Arg;
5522 
5523     public:
5524       explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { }
5525 
5526       const TemplateArgumentLoc *operator->() const {
5527         return &Arg;
5528       }
5529     };
5530 
5531 
5532     TemplateArgumentLocContainerIterator() {}
5533 
5534     TemplateArgumentLocContainerIterator(ArgLocContainer &Container,
5535                                  unsigned Index)
5536       : Container(&Container), Index(Index) { }
5537 
5538     TemplateArgumentLocContainerIterator &operator++() {
5539       ++Index;
5540       return *this;
5541     }
5542 
5543     TemplateArgumentLocContainerIterator operator++(int) {
5544       TemplateArgumentLocContainerIterator Old(*this);
5545       ++(*this);
5546       return Old;
5547     }
5548 
5549     TemplateArgumentLoc operator*() const {
5550       return Container->getArgLoc(Index);
5551     }
5552 
5553     pointer operator->() const {
5554       return pointer(Container->getArgLoc(Index));
5555     }
5556 
5557     friend bool operator==(const TemplateArgumentLocContainerIterator &X,
5558                            const TemplateArgumentLocContainerIterator &Y) {
5559       return X.Container == Y.Container && X.Index == Y.Index;
5560     }
5561 
5562     friend bool operator!=(const TemplateArgumentLocContainerIterator &X,
5563                            const TemplateArgumentLocContainerIterator &Y) {
5564       return !(X == Y);
5565     }
5566   };
5567 
5568 
5569 template <typename Derived>
5570 QualType TreeTransform<Derived>::TransformTemplateSpecializationType(
5571                                                         TypeLocBuilder &TLB,
5572                                            TemplateSpecializationTypeLoc TL,
5573                                                       TemplateName Template) {
5574   TemplateArgumentListInfo NewTemplateArgs;
5575   NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
5576   NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
5577   typedef TemplateArgumentLocContainerIterator<TemplateSpecializationTypeLoc>
5578     ArgIterator;
5579   if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
5580                                               ArgIterator(TL, TL.getNumArgs()),
5581                                               NewTemplateArgs))
5582     return QualType();
5583 
5584   // FIXME: maybe don't rebuild if all the template arguments are the same.
5585 
5586   QualType Result =
5587     getDerived().RebuildTemplateSpecializationType(Template,
5588                                                    TL.getTemplateNameLoc(),
5589                                                    NewTemplateArgs);
5590 
5591   if (!Result.isNull()) {
5592     // Specializations of template template parameters are represented as
5593     // TemplateSpecializationTypes, and substitution of type alias templates
5594     // within a dependent context can transform them into
5595     // DependentTemplateSpecializationTypes.
5596     if (isa<DependentTemplateSpecializationType>(Result)) {
5597       DependentTemplateSpecializationTypeLoc NewTL
5598         = TLB.push<DependentTemplateSpecializationTypeLoc>(Result);
5599       NewTL.setElaboratedKeywordLoc(SourceLocation());
5600       NewTL.setQualifierLoc(NestedNameSpecifierLoc());
5601       NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
5602       NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
5603       NewTL.setLAngleLoc(TL.getLAngleLoc());
5604       NewTL.setRAngleLoc(TL.getRAngleLoc());
5605       for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
5606         NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
5607       return Result;
5608     }
5609 
5610     TemplateSpecializationTypeLoc NewTL
5611       = TLB.push<TemplateSpecializationTypeLoc>(Result);
5612     NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
5613     NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
5614     NewTL.setLAngleLoc(TL.getLAngleLoc());
5615     NewTL.setRAngleLoc(TL.getRAngleLoc());
5616     for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
5617       NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
5618   }
5619 
5620   return Result;
5621 }
5622 
5623 template <typename Derived>
5624 QualType TreeTransform<Derived>::TransformDependentTemplateSpecializationType(
5625                                      TypeLocBuilder &TLB,
5626                                      DependentTemplateSpecializationTypeLoc TL,
5627                                      TemplateName Template,
5628                                      CXXScopeSpec &SS) {
5629   TemplateArgumentListInfo NewTemplateArgs;
5630   NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
5631   NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
5632   typedef TemplateArgumentLocContainerIterator<
5633             DependentTemplateSpecializationTypeLoc> ArgIterator;
5634   if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
5635                                               ArgIterator(TL, TL.getNumArgs()),
5636                                               NewTemplateArgs))
5637     return QualType();
5638 
5639   // FIXME: maybe don't rebuild if all the template arguments are the same.
5640 
5641   if (DependentTemplateName *DTN = Template.getAsDependentTemplateName()) {
5642     QualType Result
5643       = getSema().Context.getDependentTemplateSpecializationType(
5644                                                 TL.getTypePtr()->getKeyword(),
5645                                                          DTN->getQualifier(),
5646                                                          DTN->getIdentifier(),
5647                                                                NewTemplateArgs);
5648 
5649     DependentTemplateSpecializationTypeLoc NewTL
5650       = TLB.push<DependentTemplateSpecializationTypeLoc>(Result);
5651     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
5652     NewTL.setQualifierLoc(SS.getWithLocInContext(SemaRef.Context));
5653     NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
5654     NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
5655     NewTL.setLAngleLoc(TL.getLAngleLoc());
5656     NewTL.setRAngleLoc(TL.getRAngleLoc());
5657     for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
5658       NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
5659     return Result;
5660   }
5661 
5662   QualType Result
5663     = getDerived().RebuildTemplateSpecializationType(Template,
5664                                                      TL.getTemplateNameLoc(),
5665                                                      NewTemplateArgs);
5666 
5667   if (!Result.isNull()) {
5668     /// FIXME: Wrap this in an elaborated-type-specifier?
5669     TemplateSpecializationTypeLoc NewTL
5670       = TLB.push<TemplateSpecializationTypeLoc>(Result);
5671     NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
5672     NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
5673     NewTL.setLAngleLoc(TL.getLAngleLoc());
5674     NewTL.setRAngleLoc(TL.getRAngleLoc());
5675     for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
5676       NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
5677   }
5678 
5679   return Result;
5680 }
5681 
5682 template<typename Derived>
5683 QualType
5684 TreeTransform<Derived>::TransformElaboratedType(TypeLocBuilder &TLB,
5685                                                 ElaboratedTypeLoc TL) {
5686   const ElaboratedType *T = TL.getTypePtr();
5687 
5688   NestedNameSpecifierLoc QualifierLoc;
5689   // NOTE: the qualifier in an ElaboratedType is optional.
5690   if (TL.getQualifierLoc()) {
5691     QualifierLoc
5692       = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc());
5693     if (!QualifierLoc)
5694       return QualType();
5695   }
5696 
5697   QualType NamedT = getDerived().TransformType(TLB, TL.getNamedTypeLoc());
5698   if (NamedT.isNull())
5699     return QualType();
5700 
5701   // C++0x [dcl.type.elab]p2:
5702   //   If the identifier resolves to a typedef-name or the simple-template-id
5703   //   resolves to an alias template specialization, the
5704   //   elaborated-type-specifier is ill-formed.
5705   if (T->getKeyword() != ETK_None && T->getKeyword() != ETK_Typename) {
5706     if (const TemplateSpecializationType *TST =
5707           NamedT->getAs<TemplateSpecializationType>()) {
5708       TemplateName Template = TST->getTemplateName();
5709       if (TypeAliasTemplateDecl *TAT = dyn_cast_or_null<TypeAliasTemplateDecl>(
5710               Template.getAsTemplateDecl())) {
5711         SemaRef.Diag(TL.getNamedTypeLoc().getBeginLoc(),
5712                      diag::err_tag_reference_non_tag)
5713             << TAT << Sema::NTK_TypeAliasTemplate
5714             << ElaboratedType::getTagTypeKindForKeyword(T->getKeyword());
5715         SemaRef.Diag(TAT->getLocation(), diag::note_declared_at);
5716       }
5717     }
5718   }
5719 
5720   QualType Result = TL.getType();
5721   if (getDerived().AlwaysRebuild() ||
5722       QualifierLoc != TL.getQualifierLoc() ||
5723       NamedT != T->getNamedType()) {
5724     Result = getDerived().RebuildElaboratedType(TL.getElaboratedKeywordLoc(),
5725                                                 T->getKeyword(),
5726                                                 QualifierLoc, NamedT);
5727     if (Result.isNull())
5728       return QualType();
5729   }
5730 
5731   ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
5732   NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
5733   NewTL.setQualifierLoc(QualifierLoc);
5734   return Result;
5735 }
5736 
5737 template<typename Derived>
5738 QualType TreeTransform<Derived>::TransformAttributedType(
5739                                                 TypeLocBuilder &TLB,
5740                                                 AttributedTypeLoc TL) {
5741   const AttributedType *oldType = TL.getTypePtr();
5742   QualType modifiedType = getDerived().TransformType(TLB, TL.getModifiedLoc());
5743   if (modifiedType.isNull())
5744     return QualType();
5745 
5746   QualType result = TL.getType();
5747 
5748   // FIXME: dependent operand expressions?
5749   if (getDerived().AlwaysRebuild() ||
5750       modifiedType != oldType->getModifiedType()) {
5751     // TODO: this is really lame; we should really be rebuilding the
5752     // equivalent type from first principles.
5753     QualType equivalentType
5754       = getDerived().TransformType(oldType->getEquivalentType());
5755     if (equivalentType.isNull())
5756       return QualType();
5757 
5758     // Check whether we can add nullability; it is only represented as
5759     // type sugar, and therefore cannot be diagnosed in any other way.
5760     if (auto nullability = oldType->getImmediateNullability()) {
5761       if (!modifiedType->canHaveNullability()) {
5762         SemaRef.Diag(TL.getAttrNameLoc(), diag::err_nullability_nonpointer)
5763           << DiagNullabilityKind(*nullability, false) << modifiedType;
5764         return QualType();
5765       }
5766     }
5767 
5768     result = SemaRef.Context.getAttributedType(oldType->getAttrKind(),
5769                                                modifiedType,
5770                                                equivalentType);
5771   }
5772 
5773   AttributedTypeLoc newTL = TLB.push<AttributedTypeLoc>(result);
5774   newTL.setAttrNameLoc(TL.getAttrNameLoc());
5775   if (TL.hasAttrOperand())
5776     newTL.setAttrOperandParensRange(TL.getAttrOperandParensRange());
5777   if (TL.hasAttrExprOperand())
5778     newTL.setAttrExprOperand(TL.getAttrExprOperand());
5779   else if (TL.hasAttrEnumOperand())
5780     newTL.setAttrEnumOperandLoc(TL.getAttrEnumOperandLoc());
5781 
5782   return result;
5783 }
5784 
5785 template<typename Derived>
5786 QualType
5787 TreeTransform<Derived>::TransformParenType(TypeLocBuilder &TLB,
5788                                            ParenTypeLoc TL) {
5789   QualType Inner = getDerived().TransformType(TLB, TL.getInnerLoc());
5790   if (Inner.isNull())
5791     return QualType();
5792 
5793   QualType Result = TL.getType();
5794   if (getDerived().AlwaysRebuild() ||
5795       Inner != TL.getInnerLoc().getType()) {
5796     Result = getDerived().RebuildParenType(Inner);
5797     if (Result.isNull())
5798       return QualType();
5799   }
5800 
5801   ParenTypeLoc NewTL = TLB.push<ParenTypeLoc>(Result);
5802   NewTL.setLParenLoc(TL.getLParenLoc());
5803   NewTL.setRParenLoc(TL.getRParenLoc());
5804   return Result;
5805 }
5806 
5807 template<typename Derived>
5808 QualType TreeTransform<Derived>::TransformDependentNameType(TypeLocBuilder &TLB,
5809                                                       DependentNameTypeLoc TL) {
5810   const DependentNameType *T = TL.getTypePtr();
5811 
5812   NestedNameSpecifierLoc QualifierLoc
5813     = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc());
5814   if (!QualifierLoc)
5815     return QualType();
5816 
5817   QualType Result
5818     = getDerived().RebuildDependentNameType(T->getKeyword(),
5819                                             TL.getElaboratedKeywordLoc(),
5820                                             QualifierLoc,
5821                                             T->getIdentifier(),
5822                                             TL.getNameLoc());
5823   if (Result.isNull())
5824     return QualType();
5825 
5826   if (const ElaboratedType* ElabT = Result->getAs<ElaboratedType>()) {
5827     QualType NamedT = ElabT->getNamedType();
5828     TLB.pushTypeSpec(NamedT).setNameLoc(TL.getNameLoc());
5829 
5830     ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
5831     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
5832     NewTL.setQualifierLoc(QualifierLoc);
5833   } else {
5834     DependentNameTypeLoc NewTL = TLB.push<DependentNameTypeLoc>(Result);
5835     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
5836     NewTL.setQualifierLoc(QualifierLoc);
5837     NewTL.setNameLoc(TL.getNameLoc());
5838   }
5839   return Result;
5840 }
5841 
5842 template<typename Derived>
5843 QualType TreeTransform<Derived>::
5844           TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB,
5845                                  DependentTemplateSpecializationTypeLoc TL) {
5846   NestedNameSpecifierLoc QualifierLoc;
5847   if (TL.getQualifierLoc()) {
5848     QualifierLoc
5849       = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc());
5850     if (!QualifierLoc)
5851       return QualType();
5852   }
5853 
5854   return getDerived()
5855            .TransformDependentTemplateSpecializationType(TLB, TL, QualifierLoc);
5856 }
5857 
5858 template<typename Derived>
5859 QualType TreeTransform<Derived>::
5860 TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB,
5861                                    DependentTemplateSpecializationTypeLoc TL,
5862                                        NestedNameSpecifierLoc QualifierLoc) {
5863   const DependentTemplateSpecializationType *T = TL.getTypePtr();
5864 
5865   TemplateArgumentListInfo NewTemplateArgs;
5866   NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
5867   NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
5868 
5869   typedef TemplateArgumentLocContainerIterator<
5870   DependentTemplateSpecializationTypeLoc> ArgIterator;
5871   if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
5872                                               ArgIterator(TL, TL.getNumArgs()),
5873                                               NewTemplateArgs))
5874     return QualType();
5875 
5876   QualType Result
5877     = getDerived().RebuildDependentTemplateSpecializationType(T->getKeyword(),
5878                                                               QualifierLoc,
5879                                                             T->getIdentifier(),
5880                                                        TL.getTemplateNameLoc(),
5881                                                             NewTemplateArgs);
5882   if (Result.isNull())
5883     return QualType();
5884 
5885   if (const ElaboratedType *ElabT = dyn_cast<ElaboratedType>(Result)) {
5886     QualType NamedT = ElabT->getNamedType();
5887 
5888     // Copy information relevant to the template specialization.
5889     TemplateSpecializationTypeLoc NamedTL
5890       = TLB.push<TemplateSpecializationTypeLoc>(NamedT);
5891     NamedTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
5892     NamedTL.setTemplateNameLoc(TL.getTemplateNameLoc());
5893     NamedTL.setLAngleLoc(TL.getLAngleLoc());
5894     NamedTL.setRAngleLoc(TL.getRAngleLoc());
5895     for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I)
5896       NamedTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo());
5897 
5898     // Copy information relevant to the elaborated type.
5899     ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
5900     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
5901     NewTL.setQualifierLoc(QualifierLoc);
5902   } else if (isa<DependentTemplateSpecializationType>(Result)) {
5903     DependentTemplateSpecializationTypeLoc SpecTL
5904       = TLB.push<DependentTemplateSpecializationTypeLoc>(Result);
5905     SpecTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
5906     SpecTL.setQualifierLoc(QualifierLoc);
5907     SpecTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
5908     SpecTL.setTemplateNameLoc(TL.getTemplateNameLoc());
5909     SpecTL.setLAngleLoc(TL.getLAngleLoc());
5910     SpecTL.setRAngleLoc(TL.getRAngleLoc());
5911     for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I)
5912       SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo());
5913   } else {
5914     TemplateSpecializationTypeLoc SpecTL
5915       = TLB.push<TemplateSpecializationTypeLoc>(Result);
5916     SpecTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
5917     SpecTL.setTemplateNameLoc(TL.getTemplateNameLoc());
5918     SpecTL.setLAngleLoc(TL.getLAngleLoc());
5919     SpecTL.setRAngleLoc(TL.getRAngleLoc());
5920     for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I)
5921       SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo());
5922   }
5923   return Result;
5924 }
5925 
5926 template<typename Derived>
5927 QualType TreeTransform<Derived>::TransformPackExpansionType(TypeLocBuilder &TLB,
5928                                                       PackExpansionTypeLoc TL) {
5929   QualType Pattern
5930     = getDerived().TransformType(TLB, TL.getPatternLoc());
5931   if (Pattern.isNull())
5932     return QualType();
5933 
5934   QualType Result = TL.getType();
5935   if (getDerived().AlwaysRebuild() ||
5936       Pattern != TL.getPatternLoc().getType()) {
5937     Result = getDerived().RebuildPackExpansionType(Pattern,
5938                                            TL.getPatternLoc().getSourceRange(),
5939                                                    TL.getEllipsisLoc(),
5940                                            TL.getTypePtr()->getNumExpansions());
5941     if (Result.isNull())
5942       return QualType();
5943   }
5944 
5945   PackExpansionTypeLoc NewT = TLB.push<PackExpansionTypeLoc>(Result);
5946   NewT.setEllipsisLoc(TL.getEllipsisLoc());
5947   return Result;
5948 }
5949 
5950 template<typename Derived>
5951 QualType
5952 TreeTransform<Derived>::TransformObjCInterfaceType(TypeLocBuilder &TLB,
5953                                                    ObjCInterfaceTypeLoc TL) {
5954   // ObjCInterfaceType is never dependent.
5955   TLB.pushFullCopy(TL);
5956   return TL.getType();
5957 }
5958 
5959 template<typename Derived>
5960 QualType
5961 TreeTransform<Derived>::TransformObjCTypeParamType(TypeLocBuilder &TLB,
5962                                                    ObjCTypeParamTypeLoc TL) {
5963   const ObjCTypeParamType *T = TL.getTypePtr();
5964   ObjCTypeParamDecl *OTP = cast_or_null<ObjCTypeParamDecl>(
5965       getDerived().TransformDecl(T->getDecl()->getLocation(), T->getDecl()));
5966   if (!OTP)
5967     return QualType();
5968 
5969   QualType Result = TL.getType();
5970   if (getDerived().AlwaysRebuild() ||
5971       OTP != T->getDecl()) {
5972     Result = getDerived().RebuildObjCTypeParamType(OTP,
5973                  TL.getProtocolLAngleLoc(),
5974                  llvm::makeArrayRef(TL.getTypePtr()->qual_begin(),
5975                                     TL.getNumProtocols()),
5976                  TL.getProtocolLocs(),
5977                  TL.getProtocolRAngleLoc());
5978     if (Result.isNull())
5979       return QualType();
5980   }
5981 
5982   ObjCTypeParamTypeLoc NewTL = TLB.push<ObjCTypeParamTypeLoc>(Result);
5983   if (TL.getNumProtocols()) {
5984     NewTL.setProtocolLAngleLoc(TL.getProtocolLAngleLoc());
5985     for (unsigned i = 0, n = TL.getNumProtocols(); i != n; ++i)
5986       NewTL.setProtocolLoc(i, TL.getProtocolLoc(i));
5987     NewTL.setProtocolRAngleLoc(TL.getProtocolRAngleLoc());
5988   }
5989   return Result;
5990 }
5991 
5992 template<typename Derived>
5993 QualType
5994 TreeTransform<Derived>::TransformObjCObjectType(TypeLocBuilder &TLB,
5995                                                 ObjCObjectTypeLoc TL) {
5996   // Transform base type.
5997   QualType BaseType = getDerived().TransformType(TLB, TL.getBaseLoc());
5998   if (BaseType.isNull())
5999     return QualType();
6000 
6001   bool AnyChanged = BaseType != TL.getBaseLoc().getType();
6002 
6003   // Transform type arguments.
6004   SmallVector<TypeSourceInfo *, 4> NewTypeArgInfos;
6005   for (unsigned i = 0, n = TL.getNumTypeArgs(); i != n; ++i) {
6006     TypeSourceInfo *TypeArgInfo = TL.getTypeArgTInfo(i);
6007     TypeLoc TypeArgLoc = TypeArgInfo->getTypeLoc();
6008     QualType TypeArg = TypeArgInfo->getType();
6009     if (auto PackExpansionLoc = TypeArgLoc.getAs<PackExpansionTypeLoc>()) {
6010       AnyChanged = true;
6011 
6012       // We have a pack expansion. Instantiate it.
6013       const auto *PackExpansion = PackExpansionLoc.getType()
6014                                     ->castAs<PackExpansionType>();
6015       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
6016       SemaRef.collectUnexpandedParameterPacks(PackExpansion->getPattern(),
6017                                               Unexpanded);
6018       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
6019 
6020       // Determine whether the set of unexpanded parameter packs can
6021       // and should be expanded.
6022       TypeLoc PatternLoc = PackExpansionLoc.getPatternLoc();
6023       bool Expand = false;
6024       bool RetainExpansion = false;
6025       Optional<unsigned> NumExpansions = PackExpansion->getNumExpansions();
6026       if (getDerived().TryExpandParameterPacks(
6027             PackExpansionLoc.getEllipsisLoc(), PatternLoc.getSourceRange(),
6028             Unexpanded, Expand, RetainExpansion, NumExpansions))
6029         return QualType();
6030 
6031       if (!Expand) {
6032         // We can't expand this pack expansion into separate arguments yet;
6033         // just substitute into the pattern and create a new pack expansion
6034         // type.
6035         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
6036 
6037         TypeLocBuilder TypeArgBuilder;
6038         TypeArgBuilder.reserve(PatternLoc.getFullDataSize());
6039         QualType NewPatternType = getDerived().TransformType(TypeArgBuilder,
6040                                                              PatternLoc);
6041         if (NewPatternType.isNull())
6042           return QualType();
6043 
6044         QualType NewExpansionType = SemaRef.Context.getPackExpansionType(
6045                                       NewPatternType, NumExpansions);
6046         auto NewExpansionLoc = TLB.push<PackExpansionTypeLoc>(NewExpansionType);
6047         NewExpansionLoc.setEllipsisLoc(PackExpansionLoc.getEllipsisLoc());
6048         NewTypeArgInfos.push_back(
6049           TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewExpansionType));
6050         continue;
6051       }
6052 
6053       // Substitute into the pack expansion pattern for each slice of the
6054       // pack.
6055       for (unsigned ArgIdx = 0; ArgIdx != *NumExpansions; ++ArgIdx) {
6056         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), ArgIdx);
6057 
6058         TypeLocBuilder TypeArgBuilder;
6059         TypeArgBuilder.reserve(PatternLoc.getFullDataSize());
6060 
6061         QualType NewTypeArg = getDerived().TransformType(TypeArgBuilder,
6062                                                          PatternLoc);
6063         if (NewTypeArg.isNull())
6064           return QualType();
6065 
6066         NewTypeArgInfos.push_back(
6067           TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewTypeArg));
6068       }
6069 
6070       continue;
6071     }
6072 
6073     TypeLocBuilder TypeArgBuilder;
6074     TypeArgBuilder.reserve(TypeArgLoc.getFullDataSize());
6075     QualType NewTypeArg = getDerived().TransformType(TypeArgBuilder, TypeArgLoc);
6076     if (NewTypeArg.isNull())
6077       return QualType();
6078 
6079     // If nothing changed, just keep the old TypeSourceInfo.
6080     if (NewTypeArg == TypeArg) {
6081       NewTypeArgInfos.push_back(TypeArgInfo);
6082       continue;
6083     }
6084 
6085     NewTypeArgInfos.push_back(
6086       TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewTypeArg));
6087     AnyChanged = true;
6088   }
6089 
6090   QualType Result = TL.getType();
6091   if (getDerived().AlwaysRebuild() || AnyChanged) {
6092     // Rebuild the type.
6093     Result = getDerived().RebuildObjCObjectType(
6094                BaseType,
6095                TL.getLocStart(),
6096                TL.getTypeArgsLAngleLoc(),
6097                NewTypeArgInfos,
6098                TL.getTypeArgsRAngleLoc(),
6099                TL.getProtocolLAngleLoc(),
6100                llvm::makeArrayRef(TL.getTypePtr()->qual_begin(),
6101                                   TL.getNumProtocols()),
6102                TL.getProtocolLocs(),
6103                TL.getProtocolRAngleLoc());
6104 
6105     if (Result.isNull())
6106       return QualType();
6107   }
6108 
6109   ObjCObjectTypeLoc NewT = TLB.push<ObjCObjectTypeLoc>(Result);
6110   NewT.setHasBaseTypeAsWritten(true);
6111   NewT.setTypeArgsLAngleLoc(TL.getTypeArgsLAngleLoc());
6112   for (unsigned i = 0, n = TL.getNumTypeArgs(); i != n; ++i)
6113     NewT.setTypeArgTInfo(i, NewTypeArgInfos[i]);
6114   NewT.setTypeArgsRAngleLoc(TL.getTypeArgsRAngleLoc());
6115   NewT.setProtocolLAngleLoc(TL.getProtocolLAngleLoc());
6116   for (unsigned i = 0, n = TL.getNumProtocols(); i != n; ++i)
6117     NewT.setProtocolLoc(i, TL.getProtocolLoc(i));
6118   NewT.setProtocolRAngleLoc(TL.getProtocolRAngleLoc());
6119   return Result;
6120 }
6121 
6122 template<typename Derived>
6123 QualType
6124 TreeTransform<Derived>::TransformObjCObjectPointerType(TypeLocBuilder &TLB,
6125                                                ObjCObjectPointerTypeLoc TL) {
6126   QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
6127   if (PointeeType.isNull())
6128     return QualType();
6129 
6130   QualType Result = TL.getType();
6131   if (getDerived().AlwaysRebuild() ||
6132       PointeeType != TL.getPointeeLoc().getType()) {
6133     Result = getDerived().RebuildObjCObjectPointerType(PointeeType,
6134                                                        TL.getStarLoc());
6135     if (Result.isNull())
6136       return QualType();
6137   }
6138 
6139   ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result);
6140   NewT.setStarLoc(TL.getStarLoc());
6141   return Result;
6142 }
6143 
6144 //===----------------------------------------------------------------------===//
6145 // Statement transformation
6146 //===----------------------------------------------------------------------===//
6147 template<typename Derived>
6148 StmtResult
6149 TreeTransform<Derived>::TransformNullStmt(NullStmt *S) {
6150   return S;
6151 }
6152 
6153 template<typename Derived>
6154 StmtResult
6155 TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S) {
6156   return getDerived().TransformCompoundStmt(S, false);
6157 }
6158 
6159 template<typename Derived>
6160 StmtResult
6161 TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S,
6162                                               bool IsStmtExpr) {
6163   Sema::CompoundScopeRAII CompoundScope(getSema());
6164 
6165   bool SubStmtInvalid = false;
6166   bool SubStmtChanged = false;
6167   SmallVector<Stmt*, 8> Statements;
6168   for (auto *B : S->body()) {
6169     StmtResult Result = getDerived().TransformStmt(B);
6170     if (Result.isInvalid()) {
6171       // Immediately fail if this was a DeclStmt, since it's very
6172       // likely that this will cause problems for future statements.
6173       if (isa<DeclStmt>(B))
6174         return StmtError();
6175 
6176       // Otherwise, just keep processing substatements and fail later.
6177       SubStmtInvalid = true;
6178       continue;
6179     }
6180 
6181     SubStmtChanged = SubStmtChanged || Result.get() != B;
6182     Statements.push_back(Result.getAs<Stmt>());
6183   }
6184 
6185   if (SubStmtInvalid)
6186     return StmtError();
6187 
6188   if (!getDerived().AlwaysRebuild() &&
6189       !SubStmtChanged)
6190     return S;
6191 
6192   return getDerived().RebuildCompoundStmt(S->getLBracLoc(),
6193                                           Statements,
6194                                           S->getRBracLoc(),
6195                                           IsStmtExpr);
6196 }
6197 
6198 template<typename Derived>
6199 StmtResult
6200 TreeTransform<Derived>::TransformCaseStmt(CaseStmt *S) {
6201   ExprResult LHS, RHS;
6202   {
6203     EnterExpressionEvaluationContext Unevaluated(SemaRef,
6204                                                  Sema::ConstantEvaluated);
6205 
6206     // Transform the left-hand case value.
6207     LHS = getDerived().TransformExpr(S->getLHS());
6208     LHS = SemaRef.ActOnConstantExpression(LHS);
6209     if (LHS.isInvalid())
6210       return StmtError();
6211 
6212     // Transform the right-hand case value (for the GNU case-range extension).
6213     RHS = getDerived().TransformExpr(S->getRHS());
6214     RHS = SemaRef.ActOnConstantExpression(RHS);
6215     if (RHS.isInvalid())
6216       return StmtError();
6217   }
6218 
6219   // Build the case statement.
6220   // Case statements are always rebuilt so that they will attached to their
6221   // transformed switch statement.
6222   StmtResult Case = getDerived().RebuildCaseStmt(S->getCaseLoc(),
6223                                                        LHS.get(),
6224                                                        S->getEllipsisLoc(),
6225                                                        RHS.get(),
6226                                                        S->getColonLoc());
6227   if (Case.isInvalid())
6228     return StmtError();
6229 
6230   // Transform the statement following the case
6231   StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt());
6232   if (SubStmt.isInvalid())
6233     return StmtError();
6234 
6235   // Attach the body to the case statement
6236   return getDerived().RebuildCaseStmtBody(Case.get(), SubStmt.get());
6237 }
6238 
6239 template<typename Derived>
6240 StmtResult
6241 TreeTransform<Derived>::TransformDefaultStmt(DefaultStmt *S) {
6242   // Transform the statement following the default case
6243   StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt());
6244   if (SubStmt.isInvalid())
6245     return StmtError();
6246 
6247   // Default statements are always rebuilt
6248   return getDerived().RebuildDefaultStmt(S->getDefaultLoc(), S->getColonLoc(),
6249                                          SubStmt.get());
6250 }
6251 
6252 template<typename Derived>
6253 StmtResult
6254 TreeTransform<Derived>::TransformLabelStmt(LabelStmt *S) {
6255   StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt());
6256   if (SubStmt.isInvalid())
6257     return StmtError();
6258 
6259   Decl *LD = getDerived().TransformDecl(S->getDecl()->getLocation(),
6260                                         S->getDecl());
6261   if (!LD)
6262     return StmtError();
6263 
6264 
6265   // FIXME: Pass the real colon location in.
6266   return getDerived().RebuildLabelStmt(S->getIdentLoc(),
6267                                        cast<LabelDecl>(LD), SourceLocation(),
6268                                        SubStmt.get());
6269 }
6270 
6271 template <typename Derived>
6272 const Attr *TreeTransform<Derived>::TransformAttr(const Attr *R) {
6273   if (!R)
6274     return R;
6275 
6276   switch (R->getKind()) {
6277 // Transform attributes with a pragma spelling by calling TransformXXXAttr.
6278 #define ATTR(X)
6279 #define PRAGMA_SPELLING_ATTR(X)                                                \
6280   case attr::X:                                                                \
6281     return getDerived().Transform##X##Attr(cast<X##Attr>(R));
6282 #include "clang/Basic/AttrList.inc"
6283   default:
6284     return R;
6285   }
6286 }
6287 
6288 template <typename Derived>
6289 StmtResult TreeTransform<Derived>::TransformAttributedStmt(AttributedStmt *S) {
6290   bool AttrsChanged = false;
6291   SmallVector<const Attr *, 1> Attrs;
6292 
6293   // Visit attributes and keep track if any are transformed.
6294   for (const auto *I : S->getAttrs()) {
6295     const Attr *R = getDerived().TransformAttr(I);
6296     AttrsChanged |= (I != R);
6297     Attrs.push_back(R);
6298   }
6299 
6300   StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt());
6301   if (SubStmt.isInvalid())
6302     return StmtError();
6303 
6304   if (SubStmt.get() == S->getSubStmt() && !AttrsChanged)
6305     return S;
6306 
6307   return getDerived().RebuildAttributedStmt(S->getAttrLoc(), Attrs,
6308                                             SubStmt.get());
6309 }
6310 
6311 template<typename Derived>
6312 StmtResult
6313 TreeTransform<Derived>::TransformIfStmt(IfStmt *S) {
6314   // Transform the initialization statement
6315   StmtResult Init = getDerived().TransformStmt(S->getInit());
6316   if (Init.isInvalid())
6317     return StmtError();
6318 
6319   // Transform the condition
6320   Sema::ConditionResult Cond = getDerived().TransformCondition(
6321       S->getIfLoc(), S->getConditionVariable(), S->getCond(),
6322       S->isConstexpr() ? Sema::ConditionKind::ConstexprIf
6323                        : Sema::ConditionKind::Boolean);
6324   if (Cond.isInvalid())
6325     return StmtError();
6326 
6327   // If this is a constexpr if, determine which arm we should instantiate.
6328   llvm::Optional<bool> ConstexprConditionValue;
6329   if (S->isConstexpr())
6330     ConstexprConditionValue = Cond.getKnownValue();
6331 
6332   // Transform the "then" branch.
6333   StmtResult Then;
6334   if (!ConstexprConditionValue || *ConstexprConditionValue) {
6335     Then = getDerived().TransformStmt(S->getThen());
6336     if (Then.isInvalid())
6337       return StmtError();
6338   } else {
6339     Then = new (getSema().Context) NullStmt(S->getThen()->getLocStart());
6340   }
6341 
6342   // Transform the "else" branch.
6343   StmtResult Else;
6344   if (!ConstexprConditionValue || !*ConstexprConditionValue) {
6345     Else = getDerived().TransformStmt(S->getElse());
6346     if (Else.isInvalid())
6347       return StmtError();
6348   }
6349 
6350   if (!getDerived().AlwaysRebuild() &&
6351       Init.get() == S->getInit() &&
6352       Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) &&
6353       Then.get() == S->getThen() &&
6354       Else.get() == S->getElse())
6355     return S;
6356 
6357   return getDerived().RebuildIfStmt(S->getIfLoc(), S->isConstexpr(), Cond,
6358                                     Init.get(), Then.get(), S->getElseLoc(),
6359                                     Else.get());
6360 }
6361 
6362 template<typename Derived>
6363 StmtResult
6364 TreeTransform<Derived>::TransformSwitchStmt(SwitchStmt *S) {
6365   // Transform the initialization statement
6366   StmtResult Init = getDerived().TransformStmt(S->getInit());
6367   if (Init.isInvalid())
6368     return StmtError();
6369 
6370   // Transform the condition.
6371   Sema::ConditionResult Cond = getDerived().TransformCondition(
6372       S->getSwitchLoc(), S->getConditionVariable(), S->getCond(),
6373       Sema::ConditionKind::Switch);
6374   if (Cond.isInvalid())
6375     return StmtError();
6376 
6377   // Rebuild the switch statement.
6378   StmtResult Switch
6379     = getDerived().RebuildSwitchStmtStart(S->getSwitchLoc(),
6380                                           S->getInit(), Cond);
6381   if (Switch.isInvalid())
6382     return StmtError();
6383 
6384   // Transform the body of the switch statement.
6385   StmtResult Body = getDerived().TransformStmt(S->getBody());
6386   if (Body.isInvalid())
6387     return StmtError();
6388 
6389   // Complete the switch statement.
6390   return getDerived().RebuildSwitchStmtBody(S->getSwitchLoc(), Switch.get(),
6391                                             Body.get());
6392 }
6393 
6394 template<typename Derived>
6395 StmtResult
6396 TreeTransform<Derived>::TransformWhileStmt(WhileStmt *S) {
6397   // Transform the condition
6398   Sema::ConditionResult Cond = getDerived().TransformCondition(
6399       S->getWhileLoc(), S->getConditionVariable(), S->getCond(),
6400       Sema::ConditionKind::Boolean);
6401   if (Cond.isInvalid())
6402     return StmtError();
6403 
6404   // Transform the body
6405   StmtResult Body = getDerived().TransformStmt(S->getBody());
6406   if (Body.isInvalid())
6407     return StmtError();
6408 
6409   if (!getDerived().AlwaysRebuild() &&
6410       Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) &&
6411       Body.get() == S->getBody())
6412     return Owned(S);
6413 
6414   return getDerived().RebuildWhileStmt(S->getWhileLoc(), Cond, Body.get());
6415 }
6416 
6417 template<typename Derived>
6418 StmtResult
6419 TreeTransform<Derived>::TransformDoStmt(DoStmt *S) {
6420   // Transform the body
6421   StmtResult Body = getDerived().TransformStmt(S->getBody());
6422   if (Body.isInvalid())
6423     return StmtError();
6424 
6425   // Transform the condition
6426   ExprResult Cond = getDerived().TransformExpr(S->getCond());
6427   if (Cond.isInvalid())
6428     return StmtError();
6429 
6430   if (!getDerived().AlwaysRebuild() &&
6431       Cond.get() == S->getCond() &&
6432       Body.get() == S->getBody())
6433     return S;
6434 
6435   return getDerived().RebuildDoStmt(S->getDoLoc(), Body.get(), S->getWhileLoc(),
6436                                     /*FIXME:*/S->getWhileLoc(), Cond.get(),
6437                                     S->getRParenLoc());
6438 }
6439 
6440 template<typename Derived>
6441 StmtResult
6442 TreeTransform<Derived>::TransformForStmt(ForStmt *S) {
6443   // Transform the initialization statement
6444   StmtResult Init = getDerived().TransformStmt(S->getInit());
6445   if (Init.isInvalid())
6446     return StmtError();
6447 
6448   // In OpenMP loop region loop control variable must be captured and be
6449   // private. Perform analysis of first part (if any).
6450   if (getSema().getLangOpts().OpenMP && Init.isUsable())
6451     getSema().ActOnOpenMPLoopInitialization(S->getForLoc(), Init.get());
6452 
6453   // Transform the condition
6454   Sema::ConditionResult Cond = getDerived().TransformCondition(
6455       S->getForLoc(), S->getConditionVariable(), S->getCond(),
6456       Sema::ConditionKind::Boolean);
6457   if (Cond.isInvalid())
6458     return StmtError();
6459 
6460   // Transform the increment
6461   ExprResult Inc = getDerived().TransformExpr(S->getInc());
6462   if (Inc.isInvalid())
6463     return StmtError();
6464 
6465   Sema::FullExprArg FullInc(getSema().MakeFullDiscardedValueExpr(Inc.get()));
6466   if (S->getInc() && !FullInc.get())
6467     return StmtError();
6468 
6469   // Transform the body
6470   StmtResult Body = getDerived().TransformStmt(S->getBody());
6471   if (Body.isInvalid())
6472     return StmtError();
6473 
6474   if (!getDerived().AlwaysRebuild() &&
6475       Init.get() == S->getInit() &&
6476       Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) &&
6477       Inc.get() == S->getInc() &&
6478       Body.get() == S->getBody())
6479     return S;
6480 
6481   return getDerived().RebuildForStmt(S->getForLoc(), S->getLParenLoc(),
6482                                      Init.get(), Cond, FullInc,
6483                                      S->getRParenLoc(), Body.get());
6484 }
6485 
6486 template<typename Derived>
6487 StmtResult
6488 TreeTransform<Derived>::TransformGotoStmt(GotoStmt *S) {
6489   Decl *LD = getDerived().TransformDecl(S->getLabel()->getLocation(),
6490                                         S->getLabel());
6491   if (!LD)
6492     return StmtError();
6493 
6494   // Goto statements must always be rebuilt, to resolve the label.
6495   return getDerived().RebuildGotoStmt(S->getGotoLoc(), S->getLabelLoc(),
6496                                       cast<LabelDecl>(LD));
6497 }
6498 
6499 template<typename Derived>
6500 StmtResult
6501 TreeTransform<Derived>::TransformIndirectGotoStmt(IndirectGotoStmt *S) {
6502   ExprResult Target = getDerived().TransformExpr(S->getTarget());
6503   if (Target.isInvalid())
6504     return StmtError();
6505   Target = SemaRef.MaybeCreateExprWithCleanups(Target.get());
6506 
6507   if (!getDerived().AlwaysRebuild() &&
6508       Target.get() == S->getTarget())
6509     return S;
6510 
6511   return getDerived().RebuildIndirectGotoStmt(S->getGotoLoc(), S->getStarLoc(),
6512                                               Target.get());
6513 }
6514 
6515 template<typename Derived>
6516 StmtResult
6517 TreeTransform<Derived>::TransformContinueStmt(ContinueStmt *S) {
6518   return S;
6519 }
6520 
6521 template<typename Derived>
6522 StmtResult
6523 TreeTransform<Derived>::TransformBreakStmt(BreakStmt *S) {
6524   return S;
6525 }
6526 
6527 template<typename Derived>
6528 StmtResult
6529 TreeTransform<Derived>::TransformReturnStmt(ReturnStmt *S) {
6530   ExprResult Result = getDerived().TransformInitializer(S->getRetValue(),
6531                                                         /*NotCopyInit*/false);
6532   if (Result.isInvalid())
6533     return StmtError();
6534 
6535   // FIXME: We always rebuild the return statement because there is no way
6536   // to tell whether the return type of the function has changed.
6537   return getDerived().RebuildReturnStmt(S->getReturnLoc(), Result.get());
6538 }
6539 
6540 template<typename Derived>
6541 StmtResult
6542 TreeTransform<Derived>::TransformDeclStmt(DeclStmt *S) {
6543   bool DeclChanged = false;
6544   SmallVector<Decl *, 4> Decls;
6545   for (auto *D : S->decls()) {
6546     Decl *Transformed = getDerived().TransformDefinition(D->getLocation(), D);
6547     if (!Transformed)
6548       return StmtError();
6549 
6550     if (Transformed != D)
6551       DeclChanged = true;
6552 
6553     Decls.push_back(Transformed);
6554   }
6555 
6556   if (!getDerived().AlwaysRebuild() && !DeclChanged)
6557     return S;
6558 
6559   return getDerived().RebuildDeclStmt(Decls, S->getStartLoc(), S->getEndLoc());
6560 }
6561 
6562 template<typename Derived>
6563 StmtResult
6564 TreeTransform<Derived>::TransformGCCAsmStmt(GCCAsmStmt *S) {
6565 
6566   SmallVector<Expr*, 8> Constraints;
6567   SmallVector<Expr*, 8> Exprs;
6568   SmallVector<IdentifierInfo *, 4> Names;
6569 
6570   ExprResult AsmString;
6571   SmallVector<Expr*, 8> Clobbers;
6572 
6573   bool ExprsChanged = false;
6574 
6575   // Go through the outputs.
6576   for (unsigned I = 0, E = S->getNumOutputs(); I != E; ++I) {
6577     Names.push_back(S->getOutputIdentifier(I));
6578 
6579     // No need to transform the constraint literal.
6580     Constraints.push_back(S->getOutputConstraintLiteral(I));
6581 
6582     // Transform the output expr.
6583     Expr *OutputExpr = S->getOutputExpr(I);
6584     ExprResult Result = getDerived().TransformExpr(OutputExpr);
6585     if (Result.isInvalid())
6586       return StmtError();
6587 
6588     ExprsChanged |= Result.get() != OutputExpr;
6589 
6590     Exprs.push_back(Result.get());
6591   }
6592 
6593   // Go through the inputs.
6594   for (unsigned I = 0, E = S->getNumInputs(); I != E; ++I) {
6595     Names.push_back(S->getInputIdentifier(I));
6596 
6597     // No need to transform the constraint literal.
6598     Constraints.push_back(S->getInputConstraintLiteral(I));
6599 
6600     // Transform the input expr.
6601     Expr *InputExpr = S->getInputExpr(I);
6602     ExprResult Result = getDerived().TransformExpr(InputExpr);
6603     if (Result.isInvalid())
6604       return StmtError();
6605 
6606     ExprsChanged |= Result.get() != InputExpr;
6607 
6608     Exprs.push_back(Result.get());
6609   }
6610 
6611   if (!getDerived().AlwaysRebuild() && !ExprsChanged)
6612     return S;
6613 
6614   // Go through the clobbers.
6615   for (unsigned I = 0, E = S->getNumClobbers(); I != E; ++I)
6616     Clobbers.push_back(S->getClobberStringLiteral(I));
6617 
6618   // No need to transform the asm string literal.
6619   AsmString = S->getAsmString();
6620   return getDerived().RebuildGCCAsmStmt(S->getAsmLoc(), S->isSimple(),
6621                                         S->isVolatile(), S->getNumOutputs(),
6622                                         S->getNumInputs(), Names.data(),
6623                                         Constraints, Exprs, AsmString.get(),
6624                                         Clobbers, S->getRParenLoc());
6625 }
6626 
6627 template<typename Derived>
6628 StmtResult
6629 TreeTransform<Derived>::TransformMSAsmStmt(MSAsmStmt *S) {
6630   ArrayRef<Token> AsmToks =
6631     llvm::makeArrayRef(S->getAsmToks(), S->getNumAsmToks());
6632 
6633   bool HadError = false, HadChange = false;
6634 
6635   ArrayRef<Expr*> SrcExprs = S->getAllExprs();
6636   SmallVector<Expr*, 8> TransformedExprs;
6637   TransformedExprs.reserve(SrcExprs.size());
6638   for (unsigned i = 0, e = SrcExprs.size(); i != e; ++i) {
6639     ExprResult Result = getDerived().TransformExpr(SrcExprs[i]);
6640     if (!Result.isUsable()) {
6641       HadError = true;
6642     } else {
6643       HadChange |= (Result.get() != SrcExprs[i]);
6644       TransformedExprs.push_back(Result.get());
6645     }
6646   }
6647 
6648   if (HadError) return StmtError();
6649   if (!HadChange && !getDerived().AlwaysRebuild())
6650     return Owned(S);
6651 
6652   return getDerived().RebuildMSAsmStmt(S->getAsmLoc(), S->getLBraceLoc(),
6653                                        AsmToks, S->getAsmString(),
6654                                        S->getNumOutputs(), S->getNumInputs(),
6655                                        S->getAllConstraints(), S->getClobbers(),
6656                                        TransformedExprs, S->getEndLoc());
6657 }
6658 
6659 // C++ Coroutines TS
6660 
6661 template<typename Derived>
6662 StmtResult
6663 TreeTransform<Derived>::TransformCoroutineBodyStmt(CoroutineBodyStmt *S) {
6664   // The coroutine body should be re-formed by the caller if necessary.
6665   // FIXME: The coroutine body is always rebuilt by ActOnFinishFunctionBody
6666   return getDerived().TransformStmt(S->getBody());
6667 }
6668 
6669 template<typename Derived>
6670 StmtResult
6671 TreeTransform<Derived>::TransformCoreturnStmt(CoreturnStmt *S) {
6672   ExprResult Result = getDerived().TransformInitializer(S->getOperand(),
6673                                                         /*NotCopyInit*/false);
6674   if (Result.isInvalid())
6675     return StmtError();
6676 
6677   // Always rebuild; we don't know if this needs to be injected into a new
6678   // context or if the promise type has changed.
6679   return getDerived().RebuildCoreturnStmt(S->getKeywordLoc(), Result.get());
6680 }
6681 
6682 template<typename Derived>
6683 ExprResult
6684 TreeTransform<Derived>::TransformCoawaitExpr(CoawaitExpr *E) {
6685   ExprResult Result = getDerived().TransformInitializer(E->getOperand(),
6686                                                         /*NotCopyInit*/false);
6687   if (Result.isInvalid())
6688     return ExprError();
6689 
6690   // Always rebuild; we don't know if this needs to be injected into a new
6691   // context or if the promise type has changed.
6692   return getDerived().RebuildCoawaitExpr(E->getKeywordLoc(), Result.get());
6693 }
6694 
6695 template<typename Derived>
6696 ExprResult
6697 TreeTransform<Derived>::TransformCoyieldExpr(CoyieldExpr *E) {
6698   ExprResult Result = getDerived().TransformInitializer(E->getOperand(),
6699                                                         /*NotCopyInit*/false);
6700   if (Result.isInvalid())
6701     return ExprError();
6702 
6703   // Always rebuild; we don't know if this needs to be injected into a new
6704   // context or if the promise type has changed.
6705   return getDerived().RebuildCoyieldExpr(E->getKeywordLoc(), Result.get());
6706 }
6707 
6708 // Objective-C Statements.
6709 
6710 template<typename Derived>
6711 StmtResult
6712 TreeTransform<Derived>::TransformObjCAtTryStmt(ObjCAtTryStmt *S) {
6713   // Transform the body of the @try.
6714   StmtResult TryBody = getDerived().TransformStmt(S->getTryBody());
6715   if (TryBody.isInvalid())
6716     return StmtError();
6717 
6718   // Transform the @catch statements (if present).
6719   bool AnyCatchChanged = false;
6720   SmallVector<Stmt*, 8> CatchStmts;
6721   for (unsigned I = 0, N = S->getNumCatchStmts(); I != N; ++I) {
6722     StmtResult Catch = getDerived().TransformStmt(S->getCatchStmt(I));
6723     if (Catch.isInvalid())
6724       return StmtError();
6725     if (Catch.get() != S->getCatchStmt(I))
6726       AnyCatchChanged = true;
6727     CatchStmts.push_back(Catch.get());
6728   }
6729 
6730   // Transform the @finally statement (if present).
6731   StmtResult Finally;
6732   if (S->getFinallyStmt()) {
6733     Finally = getDerived().TransformStmt(S->getFinallyStmt());
6734     if (Finally.isInvalid())
6735       return StmtError();
6736   }
6737 
6738   // If nothing changed, just retain this statement.
6739   if (!getDerived().AlwaysRebuild() &&
6740       TryBody.get() == S->getTryBody() &&
6741       !AnyCatchChanged &&
6742       Finally.get() == S->getFinallyStmt())
6743     return S;
6744 
6745   // Build a new statement.
6746   return getDerived().RebuildObjCAtTryStmt(S->getAtTryLoc(), TryBody.get(),
6747                                            CatchStmts, Finally.get());
6748 }
6749 
6750 template<typename Derived>
6751 StmtResult
6752 TreeTransform<Derived>::TransformObjCAtCatchStmt(ObjCAtCatchStmt *S) {
6753   // Transform the @catch parameter, if there is one.
6754   VarDecl *Var = nullptr;
6755   if (VarDecl *FromVar = S->getCatchParamDecl()) {
6756     TypeSourceInfo *TSInfo = nullptr;
6757     if (FromVar->getTypeSourceInfo()) {
6758       TSInfo = getDerived().TransformType(FromVar->getTypeSourceInfo());
6759       if (!TSInfo)
6760         return StmtError();
6761     }
6762 
6763     QualType T;
6764     if (TSInfo)
6765       T = TSInfo->getType();
6766     else {
6767       T = getDerived().TransformType(FromVar->getType());
6768       if (T.isNull())
6769         return StmtError();
6770     }
6771 
6772     Var = getDerived().RebuildObjCExceptionDecl(FromVar, TSInfo, T);
6773     if (!Var)
6774       return StmtError();
6775   }
6776 
6777   StmtResult Body = getDerived().TransformStmt(S->getCatchBody());
6778   if (Body.isInvalid())
6779     return StmtError();
6780 
6781   return getDerived().RebuildObjCAtCatchStmt(S->getAtCatchLoc(),
6782                                              S->getRParenLoc(),
6783                                              Var, Body.get());
6784 }
6785 
6786 template<typename Derived>
6787 StmtResult
6788 TreeTransform<Derived>::TransformObjCAtFinallyStmt(ObjCAtFinallyStmt *S) {
6789   // Transform the body.
6790   StmtResult Body = getDerived().TransformStmt(S->getFinallyBody());
6791   if (Body.isInvalid())
6792     return StmtError();
6793 
6794   // If nothing changed, just retain this statement.
6795   if (!getDerived().AlwaysRebuild() &&
6796       Body.get() == S->getFinallyBody())
6797     return S;
6798 
6799   // Build a new statement.
6800   return getDerived().RebuildObjCAtFinallyStmt(S->getAtFinallyLoc(),
6801                                                Body.get());
6802 }
6803 
6804 template<typename Derived>
6805 StmtResult
6806 TreeTransform<Derived>::TransformObjCAtThrowStmt(ObjCAtThrowStmt *S) {
6807   ExprResult Operand;
6808   if (S->getThrowExpr()) {
6809     Operand = getDerived().TransformExpr(S->getThrowExpr());
6810     if (Operand.isInvalid())
6811       return StmtError();
6812   }
6813 
6814   if (!getDerived().AlwaysRebuild() &&
6815       Operand.get() == S->getThrowExpr())
6816     return S;
6817 
6818   return getDerived().RebuildObjCAtThrowStmt(S->getThrowLoc(), Operand.get());
6819 }
6820 
6821 template<typename Derived>
6822 StmtResult
6823 TreeTransform<Derived>::TransformObjCAtSynchronizedStmt(
6824                                                   ObjCAtSynchronizedStmt *S) {
6825   // Transform the object we are locking.
6826   ExprResult Object = getDerived().TransformExpr(S->getSynchExpr());
6827   if (Object.isInvalid())
6828     return StmtError();
6829   Object =
6830     getDerived().RebuildObjCAtSynchronizedOperand(S->getAtSynchronizedLoc(),
6831                                                   Object.get());
6832   if (Object.isInvalid())
6833     return StmtError();
6834 
6835   // Transform the body.
6836   StmtResult Body = getDerived().TransformStmt(S->getSynchBody());
6837   if (Body.isInvalid())
6838     return StmtError();
6839 
6840   // If nothing change, just retain the current statement.
6841   if (!getDerived().AlwaysRebuild() &&
6842       Object.get() == S->getSynchExpr() &&
6843       Body.get() == S->getSynchBody())
6844     return S;
6845 
6846   // Build a new statement.
6847   return getDerived().RebuildObjCAtSynchronizedStmt(S->getAtSynchronizedLoc(),
6848                                                     Object.get(), Body.get());
6849 }
6850 
6851 template<typename Derived>
6852 StmtResult
6853 TreeTransform<Derived>::TransformObjCAutoreleasePoolStmt(
6854                                               ObjCAutoreleasePoolStmt *S) {
6855   // Transform the body.
6856   StmtResult Body = getDerived().TransformStmt(S->getSubStmt());
6857   if (Body.isInvalid())
6858     return StmtError();
6859 
6860   // If nothing changed, just retain this statement.
6861   if (!getDerived().AlwaysRebuild() &&
6862       Body.get() == S->getSubStmt())
6863     return S;
6864 
6865   // Build a new statement.
6866   return getDerived().RebuildObjCAutoreleasePoolStmt(
6867                         S->getAtLoc(), Body.get());
6868 }
6869 
6870 template<typename Derived>
6871 StmtResult
6872 TreeTransform<Derived>::TransformObjCForCollectionStmt(
6873                                                   ObjCForCollectionStmt *S) {
6874   // Transform the element statement.
6875   StmtResult Element = getDerived().TransformStmt(S->getElement());
6876   if (Element.isInvalid())
6877     return StmtError();
6878 
6879   // Transform the collection expression.
6880   ExprResult Collection = getDerived().TransformExpr(S->getCollection());
6881   if (Collection.isInvalid())
6882     return StmtError();
6883 
6884   // Transform the body.
6885   StmtResult Body = getDerived().TransformStmt(S->getBody());
6886   if (Body.isInvalid())
6887     return StmtError();
6888 
6889   // If nothing changed, just retain this statement.
6890   if (!getDerived().AlwaysRebuild() &&
6891       Element.get() == S->getElement() &&
6892       Collection.get() == S->getCollection() &&
6893       Body.get() == S->getBody())
6894     return S;
6895 
6896   // Build a new statement.
6897   return getDerived().RebuildObjCForCollectionStmt(S->getForLoc(),
6898                                                    Element.get(),
6899                                                    Collection.get(),
6900                                                    S->getRParenLoc(),
6901                                                    Body.get());
6902 }
6903 
6904 template <typename Derived>
6905 StmtResult TreeTransform<Derived>::TransformCXXCatchStmt(CXXCatchStmt *S) {
6906   // Transform the exception declaration, if any.
6907   VarDecl *Var = nullptr;
6908   if (VarDecl *ExceptionDecl = S->getExceptionDecl()) {
6909     TypeSourceInfo *T =
6910         getDerived().TransformType(ExceptionDecl->getTypeSourceInfo());
6911     if (!T)
6912       return StmtError();
6913 
6914     Var = getDerived().RebuildExceptionDecl(
6915         ExceptionDecl, T, ExceptionDecl->getInnerLocStart(),
6916         ExceptionDecl->getLocation(), ExceptionDecl->getIdentifier());
6917     if (!Var || Var->isInvalidDecl())
6918       return StmtError();
6919   }
6920 
6921   // Transform the actual exception handler.
6922   StmtResult Handler = getDerived().TransformStmt(S->getHandlerBlock());
6923   if (Handler.isInvalid())
6924     return StmtError();
6925 
6926   if (!getDerived().AlwaysRebuild() && !Var &&
6927       Handler.get() == S->getHandlerBlock())
6928     return S;
6929 
6930   return getDerived().RebuildCXXCatchStmt(S->getCatchLoc(), Var, Handler.get());
6931 }
6932 
6933 template <typename Derived>
6934 StmtResult TreeTransform<Derived>::TransformCXXTryStmt(CXXTryStmt *S) {
6935   // Transform the try block itself.
6936   StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock());
6937   if (TryBlock.isInvalid())
6938     return StmtError();
6939 
6940   // Transform the handlers.
6941   bool HandlerChanged = false;
6942   SmallVector<Stmt *, 8> Handlers;
6943   for (unsigned I = 0, N = S->getNumHandlers(); I != N; ++I) {
6944     StmtResult Handler = getDerived().TransformCXXCatchStmt(S->getHandler(I));
6945     if (Handler.isInvalid())
6946       return StmtError();
6947 
6948     HandlerChanged = HandlerChanged || Handler.get() != S->getHandler(I);
6949     Handlers.push_back(Handler.getAs<Stmt>());
6950   }
6951 
6952   if (!getDerived().AlwaysRebuild() && TryBlock.get() == S->getTryBlock() &&
6953       !HandlerChanged)
6954     return S;
6955 
6956   return getDerived().RebuildCXXTryStmt(S->getTryLoc(), TryBlock.get(),
6957                                         Handlers);
6958 }
6959 
6960 template<typename Derived>
6961 StmtResult
6962 TreeTransform<Derived>::TransformCXXForRangeStmt(CXXForRangeStmt *S) {
6963   StmtResult Range = getDerived().TransformStmt(S->getRangeStmt());
6964   if (Range.isInvalid())
6965     return StmtError();
6966 
6967   StmtResult Begin = getDerived().TransformStmt(S->getBeginStmt());
6968   if (Begin.isInvalid())
6969     return StmtError();
6970   StmtResult End = getDerived().TransformStmt(S->getEndStmt());
6971   if (End.isInvalid())
6972     return StmtError();
6973 
6974   ExprResult Cond = getDerived().TransformExpr(S->getCond());
6975   if (Cond.isInvalid())
6976     return StmtError();
6977   if (Cond.get())
6978     Cond = SemaRef.CheckBooleanCondition(S->getColonLoc(), Cond.get());
6979   if (Cond.isInvalid())
6980     return StmtError();
6981   if (Cond.get())
6982     Cond = SemaRef.MaybeCreateExprWithCleanups(Cond.get());
6983 
6984   ExprResult Inc = getDerived().TransformExpr(S->getInc());
6985   if (Inc.isInvalid())
6986     return StmtError();
6987   if (Inc.get())
6988     Inc = SemaRef.MaybeCreateExprWithCleanups(Inc.get());
6989 
6990   StmtResult LoopVar = getDerived().TransformStmt(S->getLoopVarStmt());
6991   if (LoopVar.isInvalid())
6992     return StmtError();
6993 
6994   StmtResult NewStmt = S;
6995   if (getDerived().AlwaysRebuild() ||
6996       Range.get() != S->getRangeStmt() ||
6997       Begin.get() != S->getBeginStmt() ||
6998       End.get() != S->getEndStmt() ||
6999       Cond.get() != S->getCond() ||
7000       Inc.get() != S->getInc() ||
7001       LoopVar.get() != S->getLoopVarStmt()) {
7002     NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(),
7003                                                   S->getCoawaitLoc(),
7004                                                   S->getColonLoc(), Range.get(),
7005                                                   Begin.get(), End.get(),
7006                                                   Cond.get(),
7007                                                   Inc.get(), LoopVar.get(),
7008                                                   S->getRParenLoc());
7009     if (NewStmt.isInvalid())
7010       return StmtError();
7011   }
7012 
7013   StmtResult Body = getDerived().TransformStmt(S->getBody());
7014   if (Body.isInvalid())
7015     return StmtError();
7016 
7017   // Body has changed but we didn't rebuild the for-range statement. Rebuild
7018   // it now so we have a new statement to attach the body to.
7019   if (Body.get() != S->getBody() && NewStmt.get() == S) {
7020     NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(),
7021                                                   S->getCoawaitLoc(),
7022                                                   S->getColonLoc(), Range.get(),
7023                                                   Begin.get(), End.get(),
7024                                                   Cond.get(),
7025                                                   Inc.get(), LoopVar.get(),
7026                                                   S->getRParenLoc());
7027     if (NewStmt.isInvalid())
7028       return StmtError();
7029   }
7030 
7031   if (NewStmt.get() == S)
7032     return S;
7033 
7034   return FinishCXXForRangeStmt(NewStmt.get(), Body.get());
7035 }
7036 
7037 template<typename Derived>
7038 StmtResult
7039 TreeTransform<Derived>::TransformMSDependentExistsStmt(
7040                                                     MSDependentExistsStmt *S) {
7041   // Transform the nested-name-specifier, if any.
7042   NestedNameSpecifierLoc QualifierLoc;
7043   if (S->getQualifierLoc()) {
7044     QualifierLoc
7045       = getDerived().TransformNestedNameSpecifierLoc(S->getQualifierLoc());
7046     if (!QualifierLoc)
7047       return StmtError();
7048   }
7049 
7050   // Transform the declaration name.
7051   DeclarationNameInfo NameInfo = S->getNameInfo();
7052   if (NameInfo.getName()) {
7053     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
7054     if (!NameInfo.getName())
7055       return StmtError();
7056   }
7057 
7058   // Check whether anything changed.
7059   if (!getDerived().AlwaysRebuild() &&
7060       QualifierLoc == S->getQualifierLoc() &&
7061       NameInfo.getName() == S->getNameInfo().getName())
7062     return S;
7063 
7064   // Determine whether this name exists, if we can.
7065   CXXScopeSpec SS;
7066   SS.Adopt(QualifierLoc);
7067   bool Dependent = false;
7068   switch (getSema().CheckMicrosoftIfExistsSymbol(/*S=*/nullptr, SS, NameInfo)) {
7069   case Sema::IER_Exists:
7070     if (S->isIfExists())
7071       break;
7072 
7073     return new (getSema().Context) NullStmt(S->getKeywordLoc());
7074 
7075   case Sema::IER_DoesNotExist:
7076     if (S->isIfNotExists())
7077       break;
7078 
7079     return new (getSema().Context) NullStmt(S->getKeywordLoc());
7080 
7081   case Sema::IER_Dependent:
7082     Dependent = true;
7083     break;
7084 
7085   case Sema::IER_Error:
7086     return StmtError();
7087   }
7088 
7089   // We need to continue with the instantiation, so do so now.
7090   StmtResult SubStmt = getDerived().TransformCompoundStmt(S->getSubStmt());
7091   if (SubStmt.isInvalid())
7092     return StmtError();
7093 
7094   // If we have resolved the name, just transform to the substatement.
7095   if (!Dependent)
7096     return SubStmt;
7097 
7098   // The name is still dependent, so build a dependent expression again.
7099   return getDerived().RebuildMSDependentExistsStmt(S->getKeywordLoc(),
7100                                                    S->isIfExists(),
7101                                                    QualifierLoc,
7102                                                    NameInfo,
7103                                                    SubStmt.get());
7104 }
7105 
7106 template<typename Derived>
7107 ExprResult
7108 TreeTransform<Derived>::TransformMSPropertyRefExpr(MSPropertyRefExpr *E) {
7109   NestedNameSpecifierLoc QualifierLoc;
7110   if (E->getQualifierLoc()) {
7111     QualifierLoc
7112     = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
7113     if (!QualifierLoc)
7114       return ExprError();
7115   }
7116 
7117   MSPropertyDecl *PD = cast_or_null<MSPropertyDecl>(
7118     getDerived().TransformDecl(E->getMemberLoc(), E->getPropertyDecl()));
7119   if (!PD)
7120     return ExprError();
7121 
7122   ExprResult Base = getDerived().TransformExpr(E->getBaseExpr());
7123   if (Base.isInvalid())
7124     return ExprError();
7125 
7126   return new (SemaRef.getASTContext())
7127       MSPropertyRefExpr(Base.get(), PD, E->isArrow(),
7128                         SemaRef.getASTContext().PseudoObjectTy, VK_LValue,
7129                         QualifierLoc, E->getMemberLoc());
7130 }
7131 
7132 template <typename Derived>
7133 ExprResult TreeTransform<Derived>::TransformMSPropertySubscriptExpr(
7134     MSPropertySubscriptExpr *E) {
7135   auto BaseRes = getDerived().TransformExpr(E->getBase());
7136   if (BaseRes.isInvalid())
7137     return ExprError();
7138   auto IdxRes = getDerived().TransformExpr(E->getIdx());
7139   if (IdxRes.isInvalid())
7140     return ExprError();
7141 
7142   if (!getDerived().AlwaysRebuild() &&
7143       BaseRes.get() == E->getBase() &&
7144       IdxRes.get() == E->getIdx())
7145     return E;
7146 
7147   return getDerived().RebuildArraySubscriptExpr(
7148       BaseRes.get(), SourceLocation(), IdxRes.get(), E->getRBracketLoc());
7149 }
7150 
7151 template <typename Derived>
7152 StmtResult TreeTransform<Derived>::TransformSEHTryStmt(SEHTryStmt *S) {
7153   StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock());
7154   if (TryBlock.isInvalid())
7155     return StmtError();
7156 
7157   StmtResult Handler = getDerived().TransformSEHHandler(S->getHandler());
7158   if (Handler.isInvalid())
7159     return StmtError();
7160 
7161   if (!getDerived().AlwaysRebuild() && TryBlock.get() == S->getTryBlock() &&
7162       Handler.get() == S->getHandler())
7163     return S;
7164 
7165   return getDerived().RebuildSEHTryStmt(S->getIsCXXTry(), S->getTryLoc(),
7166                                         TryBlock.get(), Handler.get());
7167 }
7168 
7169 template <typename Derived>
7170 StmtResult TreeTransform<Derived>::TransformSEHFinallyStmt(SEHFinallyStmt *S) {
7171   StmtResult Block = getDerived().TransformCompoundStmt(S->getBlock());
7172   if (Block.isInvalid())
7173     return StmtError();
7174 
7175   return getDerived().RebuildSEHFinallyStmt(S->getFinallyLoc(), Block.get());
7176 }
7177 
7178 template <typename Derived>
7179 StmtResult TreeTransform<Derived>::TransformSEHExceptStmt(SEHExceptStmt *S) {
7180   ExprResult FilterExpr = getDerived().TransformExpr(S->getFilterExpr());
7181   if (FilterExpr.isInvalid())
7182     return StmtError();
7183 
7184   StmtResult Block = getDerived().TransformCompoundStmt(S->getBlock());
7185   if (Block.isInvalid())
7186     return StmtError();
7187 
7188   return getDerived().RebuildSEHExceptStmt(S->getExceptLoc(), FilterExpr.get(),
7189                                            Block.get());
7190 }
7191 
7192 template <typename Derived>
7193 StmtResult TreeTransform<Derived>::TransformSEHHandler(Stmt *Handler) {
7194   if (isa<SEHFinallyStmt>(Handler))
7195     return getDerived().TransformSEHFinallyStmt(cast<SEHFinallyStmt>(Handler));
7196   else
7197     return getDerived().TransformSEHExceptStmt(cast<SEHExceptStmt>(Handler));
7198 }
7199 
7200 template<typename Derived>
7201 StmtResult
7202 TreeTransform<Derived>::TransformSEHLeaveStmt(SEHLeaveStmt *S) {
7203   return S;
7204 }
7205 
7206 //===----------------------------------------------------------------------===//
7207 // OpenMP directive transformation
7208 //===----------------------------------------------------------------------===//
7209 template <typename Derived>
7210 StmtResult TreeTransform<Derived>::TransformOMPExecutableDirective(
7211     OMPExecutableDirective *D) {
7212 
7213   // Transform the clauses
7214   llvm::SmallVector<OMPClause *, 16> TClauses;
7215   ArrayRef<OMPClause *> Clauses = D->clauses();
7216   TClauses.reserve(Clauses.size());
7217   for (ArrayRef<OMPClause *>::iterator I = Clauses.begin(), E = Clauses.end();
7218        I != E; ++I) {
7219     if (*I) {
7220       getDerived().getSema().StartOpenMPClause((*I)->getClauseKind());
7221       OMPClause *Clause = getDerived().TransformOMPClause(*I);
7222       getDerived().getSema().EndOpenMPClause();
7223       if (Clause)
7224         TClauses.push_back(Clause);
7225     } else {
7226       TClauses.push_back(nullptr);
7227     }
7228   }
7229   StmtResult AssociatedStmt;
7230   if (D->hasAssociatedStmt() && D->getAssociatedStmt()) {
7231     getDerived().getSema().ActOnOpenMPRegionStart(D->getDirectiveKind(),
7232                                                   /*CurScope=*/nullptr);
7233     StmtResult Body;
7234     {
7235       Sema::CompoundScopeRAII CompoundScope(getSema());
7236       Body = getDerived().TransformStmt(
7237           cast<CapturedStmt>(D->getAssociatedStmt())->getCapturedStmt());
7238     }
7239     AssociatedStmt =
7240         getDerived().getSema().ActOnOpenMPRegionEnd(Body, TClauses);
7241     if (AssociatedStmt.isInvalid()) {
7242       return StmtError();
7243     }
7244   }
7245   if (TClauses.size() != Clauses.size()) {
7246     return StmtError();
7247   }
7248 
7249   // Transform directive name for 'omp critical' directive.
7250   DeclarationNameInfo DirName;
7251   if (D->getDirectiveKind() == OMPD_critical) {
7252     DirName = cast<OMPCriticalDirective>(D)->getDirectiveName();
7253     DirName = getDerived().TransformDeclarationNameInfo(DirName);
7254   }
7255   OpenMPDirectiveKind CancelRegion = OMPD_unknown;
7256   if (D->getDirectiveKind() == OMPD_cancellation_point) {
7257     CancelRegion = cast<OMPCancellationPointDirective>(D)->getCancelRegion();
7258   } else if (D->getDirectiveKind() == OMPD_cancel) {
7259     CancelRegion = cast<OMPCancelDirective>(D)->getCancelRegion();
7260   }
7261 
7262   return getDerived().RebuildOMPExecutableDirective(
7263       D->getDirectiveKind(), DirName, CancelRegion, TClauses,
7264       AssociatedStmt.get(), D->getLocStart(), D->getLocEnd());
7265 }
7266 
7267 template <typename Derived>
7268 StmtResult
7269 TreeTransform<Derived>::TransformOMPParallelDirective(OMPParallelDirective *D) {
7270   DeclarationNameInfo DirName;
7271   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel, DirName, nullptr,
7272                                              D->getLocStart());
7273   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7274   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7275   return Res;
7276 }
7277 
7278 template <typename Derived>
7279 StmtResult
7280 TreeTransform<Derived>::TransformOMPSimdDirective(OMPSimdDirective *D) {
7281   DeclarationNameInfo DirName;
7282   getDerived().getSema().StartOpenMPDSABlock(OMPD_simd, DirName, nullptr,
7283                                              D->getLocStart());
7284   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7285   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7286   return Res;
7287 }
7288 
7289 template <typename Derived>
7290 StmtResult
7291 TreeTransform<Derived>::TransformOMPForDirective(OMPForDirective *D) {
7292   DeclarationNameInfo DirName;
7293   getDerived().getSema().StartOpenMPDSABlock(OMPD_for, DirName, nullptr,
7294                                              D->getLocStart());
7295   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7296   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7297   return Res;
7298 }
7299 
7300 template <typename Derived>
7301 StmtResult
7302 TreeTransform<Derived>::TransformOMPForSimdDirective(OMPForSimdDirective *D) {
7303   DeclarationNameInfo DirName;
7304   getDerived().getSema().StartOpenMPDSABlock(OMPD_for_simd, DirName, nullptr,
7305                                              D->getLocStart());
7306   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7307   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7308   return Res;
7309 }
7310 
7311 template <typename Derived>
7312 StmtResult
7313 TreeTransform<Derived>::TransformOMPSectionsDirective(OMPSectionsDirective *D) {
7314   DeclarationNameInfo DirName;
7315   getDerived().getSema().StartOpenMPDSABlock(OMPD_sections, DirName, nullptr,
7316                                              D->getLocStart());
7317   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7318   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7319   return Res;
7320 }
7321 
7322 template <typename Derived>
7323 StmtResult
7324 TreeTransform<Derived>::TransformOMPSectionDirective(OMPSectionDirective *D) {
7325   DeclarationNameInfo DirName;
7326   getDerived().getSema().StartOpenMPDSABlock(OMPD_section, DirName, nullptr,
7327                                              D->getLocStart());
7328   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7329   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7330   return Res;
7331 }
7332 
7333 template <typename Derived>
7334 StmtResult
7335 TreeTransform<Derived>::TransformOMPSingleDirective(OMPSingleDirective *D) {
7336   DeclarationNameInfo DirName;
7337   getDerived().getSema().StartOpenMPDSABlock(OMPD_single, DirName, nullptr,
7338                                              D->getLocStart());
7339   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7340   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7341   return Res;
7342 }
7343 
7344 template <typename Derived>
7345 StmtResult
7346 TreeTransform<Derived>::TransformOMPMasterDirective(OMPMasterDirective *D) {
7347   DeclarationNameInfo DirName;
7348   getDerived().getSema().StartOpenMPDSABlock(OMPD_master, DirName, nullptr,
7349                                              D->getLocStart());
7350   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7351   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7352   return Res;
7353 }
7354 
7355 template <typename Derived>
7356 StmtResult
7357 TreeTransform<Derived>::TransformOMPCriticalDirective(OMPCriticalDirective *D) {
7358   getDerived().getSema().StartOpenMPDSABlock(
7359       OMPD_critical, D->getDirectiveName(), nullptr, D->getLocStart());
7360   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7361   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7362   return Res;
7363 }
7364 
7365 template <typename Derived>
7366 StmtResult TreeTransform<Derived>::TransformOMPParallelForDirective(
7367     OMPParallelForDirective *D) {
7368   DeclarationNameInfo DirName;
7369   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_for, DirName,
7370                                              nullptr, D->getLocStart());
7371   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7372   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7373   return Res;
7374 }
7375 
7376 template <typename Derived>
7377 StmtResult TreeTransform<Derived>::TransformOMPParallelForSimdDirective(
7378     OMPParallelForSimdDirective *D) {
7379   DeclarationNameInfo DirName;
7380   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_for_simd, DirName,
7381                                              nullptr, D->getLocStart());
7382   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7383   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7384   return Res;
7385 }
7386 
7387 template <typename Derived>
7388 StmtResult TreeTransform<Derived>::TransformOMPParallelSectionsDirective(
7389     OMPParallelSectionsDirective *D) {
7390   DeclarationNameInfo DirName;
7391   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_sections, DirName,
7392                                              nullptr, D->getLocStart());
7393   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7394   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7395   return Res;
7396 }
7397 
7398 template <typename Derived>
7399 StmtResult
7400 TreeTransform<Derived>::TransformOMPTaskDirective(OMPTaskDirective *D) {
7401   DeclarationNameInfo DirName;
7402   getDerived().getSema().StartOpenMPDSABlock(OMPD_task, DirName, nullptr,
7403                                              D->getLocStart());
7404   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7405   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7406   return Res;
7407 }
7408 
7409 template <typename Derived>
7410 StmtResult TreeTransform<Derived>::TransformOMPTaskyieldDirective(
7411     OMPTaskyieldDirective *D) {
7412   DeclarationNameInfo DirName;
7413   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskyield, DirName, nullptr,
7414                                              D->getLocStart());
7415   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7416   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7417   return Res;
7418 }
7419 
7420 template <typename Derived>
7421 StmtResult
7422 TreeTransform<Derived>::TransformOMPBarrierDirective(OMPBarrierDirective *D) {
7423   DeclarationNameInfo DirName;
7424   getDerived().getSema().StartOpenMPDSABlock(OMPD_barrier, DirName, nullptr,
7425                                              D->getLocStart());
7426   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7427   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7428   return Res;
7429 }
7430 
7431 template <typename Derived>
7432 StmtResult
7433 TreeTransform<Derived>::TransformOMPTaskwaitDirective(OMPTaskwaitDirective *D) {
7434   DeclarationNameInfo DirName;
7435   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskwait, DirName, nullptr,
7436                                              D->getLocStart());
7437   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7438   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7439   return Res;
7440 }
7441 
7442 template <typename Derived>
7443 StmtResult TreeTransform<Derived>::TransformOMPTaskgroupDirective(
7444     OMPTaskgroupDirective *D) {
7445   DeclarationNameInfo DirName;
7446   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskgroup, DirName, nullptr,
7447                                              D->getLocStart());
7448   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7449   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7450   return Res;
7451 }
7452 
7453 template <typename Derived>
7454 StmtResult
7455 TreeTransform<Derived>::TransformOMPFlushDirective(OMPFlushDirective *D) {
7456   DeclarationNameInfo DirName;
7457   getDerived().getSema().StartOpenMPDSABlock(OMPD_flush, DirName, nullptr,
7458                                              D->getLocStart());
7459   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7460   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7461   return Res;
7462 }
7463 
7464 template <typename Derived>
7465 StmtResult
7466 TreeTransform<Derived>::TransformOMPOrderedDirective(OMPOrderedDirective *D) {
7467   DeclarationNameInfo DirName;
7468   getDerived().getSema().StartOpenMPDSABlock(OMPD_ordered, DirName, nullptr,
7469                                              D->getLocStart());
7470   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7471   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7472   return Res;
7473 }
7474 
7475 template <typename Derived>
7476 StmtResult
7477 TreeTransform<Derived>::TransformOMPAtomicDirective(OMPAtomicDirective *D) {
7478   DeclarationNameInfo DirName;
7479   getDerived().getSema().StartOpenMPDSABlock(OMPD_atomic, DirName, nullptr,
7480                                              D->getLocStart());
7481   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7482   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7483   return Res;
7484 }
7485 
7486 template <typename Derived>
7487 StmtResult
7488 TreeTransform<Derived>::TransformOMPTargetDirective(OMPTargetDirective *D) {
7489   DeclarationNameInfo DirName;
7490   getDerived().getSema().StartOpenMPDSABlock(OMPD_target, DirName, nullptr,
7491                                              D->getLocStart());
7492   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7493   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7494   return Res;
7495 }
7496 
7497 template <typename Derived>
7498 StmtResult TreeTransform<Derived>::TransformOMPTargetDataDirective(
7499     OMPTargetDataDirective *D) {
7500   DeclarationNameInfo DirName;
7501   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_data, DirName, nullptr,
7502                                              D->getLocStart());
7503   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7504   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7505   return Res;
7506 }
7507 
7508 template <typename Derived>
7509 StmtResult TreeTransform<Derived>::TransformOMPTargetEnterDataDirective(
7510     OMPTargetEnterDataDirective *D) {
7511   DeclarationNameInfo DirName;
7512   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_enter_data, DirName,
7513                                              nullptr, D->getLocStart());
7514   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7515   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7516   return Res;
7517 }
7518 
7519 template <typename Derived>
7520 StmtResult TreeTransform<Derived>::TransformOMPTargetExitDataDirective(
7521     OMPTargetExitDataDirective *D) {
7522   DeclarationNameInfo DirName;
7523   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_exit_data, DirName,
7524                                              nullptr, D->getLocStart());
7525   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7526   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7527   return Res;
7528 }
7529 
7530 template <typename Derived>
7531 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelDirective(
7532     OMPTargetParallelDirective *D) {
7533   DeclarationNameInfo DirName;
7534   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel, DirName,
7535                                              nullptr, D->getLocStart());
7536   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7537   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7538   return Res;
7539 }
7540 
7541 template <typename Derived>
7542 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelForDirective(
7543     OMPTargetParallelForDirective *D) {
7544   DeclarationNameInfo DirName;
7545   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel_for, DirName,
7546                                              nullptr, D->getLocStart());
7547   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7548   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7549   return Res;
7550 }
7551 
7552 template <typename Derived>
7553 StmtResult TreeTransform<Derived>::TransformOMPTargetUpdateDirective(
7554     OMPTargetUpdateDirective *D) {
7555   DeclarationNameInfo DirName;
7556   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_update, DirName,
7557                                              nullptr, D->getLocStart());
7558   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7559   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7560   return Res;
7561 }
7562 
7563 template <typename Derived>
7564 StmtResult
7565 TreeTransform<Derived>::TransformOMPTeamsDirective(OMPTeamsDirective *D) {
7566   DeclarationNameInfo DirName;
7567   getDerived().getSema().StartOpenMPDSABlock(OMPD_teams, DirName, nullptr,
7568                                              D->getLocStart());
7569   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7570   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7571   return Res;
7572 }
7573 
7574 template <typename Derived>
7575 StmtResult TreeTransform<Derived>::TransformOMPCancellationPointDirective(
7576     OMPCancellationPointDirective *D) {
7577   DeclarationNameInfo DirName;
7578   getDerived().getSema().StartOpenMPDSABlock(OMPD_cancellation_point, DirName,
7579                                              nullptr, D->getLocStart());
7580   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7581   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7582   return Res;
7583 }
7584 
7585 template <typename Derived>
7586 StmtResult
7587 TreeTransform<Derived>::TransformOMPCancelDirective(OMPCancelDirective *D) {
7588   DeclarationNameInfo DirName;
7589   getDerived().getSema().StartOpenMPDSABlock(OMPD_cancel, DirName, nullptr,
7590                                              D->getLocStart());
7591   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7592   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7593   return Res;
7594 }
7595 
7596 template <typename Derived>
7597 StmtResult
7598 TreeTransform<Derived>::TransformOMPTaskLoopDirective(OMPTaskLoopDirective *D) {
7599   DeclarationNameInfo DirName;
7600   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskloop, DirName, nullptr,
7601                                              D->getLocStart());
7602   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7603   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7604   return Res;
7605 }
7606 
7607 template <typename Derived>
7608 StmtResult TreeTransform<Derived>::TransformOMPTaskLoopSimdDirective(
7609     OMPTaskLoopSimdDirective *D) {
7610   DeclarationNameInfo DirName;
7611   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskloop_simd, DirName,
7612                                              nullptr, D->getLocStart());
7613   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7614   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7615   return Res;
7616 }
7617 
7618 template <typename Derived>
7619 StmtResult TreeTransform<Derived>::TransformOMPDistributeDirective(
7620     OMPDistributeDirective *D) {
7621   DeclarationNameInfo DirName;
7622   getDerived().getSema().StartOpenMPDSABlock(OMPD_distribute, DirName, nullptr,
7623                                              D->getLocStart());
7624   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7625   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7626   return Res;
7627 }
7628 
7629 template <typename Derived>
7630 StmtResult TreeTransform<Derived>::TransformOMPDistributeParallelForDirective(
7631     OMPDistributeParallelForDirective *D) {
7632   DeclarationNameInfo DirName;
7633   getDerived().getSema().StartOpenMPDSABlock(
7634       OMPD_distribute_parallel_for, DirName, nullptr, D->getLocStart());
7635   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7636   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7637   return Res;
7638 }
7639 
7640 template <typename Derived>
7641 StmtResult
7642 TreeTransform<Derived>::TransformOMPDistributeParallelForSimdDirective(
7643     OMPDistributeParallelForSimdDirective *D) {
7644   DeclarationNameInfo DirName;
7645   getDerived().getSema().StartOpenMPDSABlock(
7646       OMPD_distribute_parallel_for_simd, DirName, nullptr, D->getLocStart());
7647   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7648   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7649   return Res;
7650 }
7651 
7652 template <typename Derived>
7653 StmtResult TreeTransform<Derived>::TransformOMPDistributeSimdDirective(
7654     OMPDistributeSimdDirective *D) {
7655   DeclarationNameInfo DirName;
7656   getDerived().getSema().StartOpenMPDSABlock(OMPD_distribute_simd, DirName,
7657                                              nullptr, D->getLocStart());
7658   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7659   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7660   return Res;
7661 }
7662 
7663 template <typename Derived>
7664 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelForSimdDirective(
7665     OMPTargetParallelForSimdDirective *D) {
7666   DeclarationNameInfo DirName;
7667   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel_for_simd,
7668                                              DirName, nullptr,
7669                                              D->getLocStart());
7670   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7671   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7672   return Res;
7673 }
7674 
7675 template <typename Derived>
7676 StmtResult TreeTransform<Derived>::TransformOMPTargetSimdDirective(
7677     OMPTargetSimdDirective *D) {
7678   DeclarationNameInfo DirName;
7679   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_simd, DirName, nullptr,
7680                                              D->getLocStart());
7681   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7682   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7683   return Res;
7684 }
7685 
7686 template <typename Derived>
7687 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeDirective(
7688     OMPTeamsDistributeDirective *D) {
7689   DeclarationNameInfo DirName;
7690   getDerived().getSema().StartOpenMPDSABlock(OMPD_teams_distribute, DirName,
7691                                              nullptr, D->getLocStart());
7692   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7693   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7694   return Res;
7695 }
7696 
7697 template <typename Derived>
7698 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeSimdDirective(
7699     OMPTeamsDistributeSimdDirective *D) {
7700   DeclarationNameInfo DirName;
7701   getDerived().getSema().StartOpenMPDSABlock(
7702       OMPD_teams_distribute_simd, DirName, nullptr, D->getLocStart());
7703   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7704   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7705   return Res;
7706 }
7707 
7708 template <typename Derived>
7709 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeParallelForSimdDirective(
7710     OMPTeamsDistributeParallelForSimdDirective *D) {
7711   DeclarationNameInfo DirName;
7712   getDerived().getSema().StartOpenMPDSABlock(
7713       OMPD_teams_distribute_parallel_for_simd, DirName, nullptr, D->getLocStart());
7714   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7715   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7716   return Res;
7717 }
7718 
7719 template <typename Derived>
7720 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeParallelForDirective(
7721     OMPTeamsDistributeParallelForDirective *D) {
7722   DeclarationNameInfo DirName;
7723   getDerived().getSema().StartOpenMPDSABlock(OMPD_teams_distribute_parallel_for,
7724       DirName, nullptr, D->getLocStart());
7725   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7726   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7727   return Res;
7728 }
7729 
7730 
7731 //===----------------------------------------------------------------------===//
7732 // OpenMP clause transformation
7733 //===----------------------------------------------------------------------===//
7734 template <typename Derived>
7735 OMPClause *TreeTransform<Derived>::TransformOMPIfClause(OMPIfClause *C) {
7736   ExprResult Cond = getDerived().TransformExpr(C->getCondition());
7737   if (Cond.isInvalid())
7738     return nullptr;
7739   return getDerived().RebuildOMPIfClause(
7740       C->getNameModifier(), Cond.get(), C->getLocStart(), C->getLParenLoc(),
7741       C->getNameModifierLoc(), C->getColonLoc(), C->getLocEnd());
7742 }
7743 
7744 template <typename Derived>
7745 OMPClause *TreeTransform<Derived>::TransformOMPFinalClause(OMPFinalClause *C) {
7746   ExprResult Cond = getDerived().TransformExpr(C->getCondition());
7747   if (Cond.isInvalid())
7748     return nullptr;
7749   return getDerived().RebuildOMPFinalClause(Cond.get(), C->getLocStart(),
7750                                             C->getLParenLoc(), C->getLocEnd());
7751 }
7752 
7753 template <typename Derived>
7754 OMPClause *
7755 TreeTransform<Derived>::TransformOMPNumThreadsClause(OMPNumThreadsClause *C) {
7756   ExprResult NumThreads = getDerived().TransformExpr(C->getNumThreads());
7757   if (NumThreads.isInvalid())
7758     return nullptr;
7759   return getDerived().RebuildOMPNumThreadsClause(
7760       NumThreads.get(), C->getLocStart(), C->getLParenLoc(), C->getLocEnd());
7761 }
7762 
7763 template <typename Derived>
7764 OMPClause *
7765 TreeTransform<Derived>::TransformOMPSafelenClause(OMPSafelenClause *C) {
7766   ExprResult E = getDerived().TransformExpr(C->getSafelen());
7767   if (E.isInvalid())
7768     return nullptr;
7769   return getDerived().RebuildOMPSafelenClause(
7770       E.get(), C->getLocStart(), C->getLParenLoc(), C->getLocEnd());
7771 }
7772 
7773 template <typename Derived>
7774 OMPClause *
7775 TreeTransform<Derived>::TransformOMPSimdlenClause(OMPSimdlenClause *C) {
7776   ExprResult E = getDerived().TransformExpr(C->getSimdlen());
7777   if (E.isInvalid())
7778     return nullptr;
7779   return getDerived().RebuildOMPSimdlenClause(
7780       E.get(), C->getLocStart(), C->getLParenLoc(), C->getLocEnd());
7781 }
7782 
7783 template <typename Derived>
7784 OMPClause *
7785 TreeTransform<Derived>::TransformOMPCollapseClause(OMPCollapseClause *C) {
7786   ExprResult E = getDerived().TransformExpr(C->getNumForLoops());
7787   if (E.isInvalid())
7788     return nullptr;
7789   return getDerived().RebuildOMPCollapseClause(
7790       E.get(), C->getLocStart(), C->getLParenLoc(), C->getLocEnd());
7791 }
7792 
7793 template <typename Derived>
7794 OMPClause *
7795 TreeTransform<Derived>::TransformOMPDefaultClause(OMPDefaultClause *C) {
7796   return getDerived().RebuildOMPDefaultClause(
7797       C->getDefaultKind(), C->getDefaultKindKwLoc(), C->getLocStart(),
7798       C->getLParenLoc(), C->getLocEnd());
7799 }
7800 
7801 template <typename Derived>
7802 OMPClause *
7803 TreeTransform<Derived>::TransformOMPProcBindClause(OMPProcBindClause *C) {
7804   return getDerived().RebuildOMPProcBindClause(
7805       C->getProcBindKind(), C->getProcBindKindKwLoc(), C->getLocStart(),
7806       C->getLParenLoc(), C->getLocEnd());
7807 }
7808 
7809 template <typename Derived>
7810 OMPClause *
7811 TreeTransform<Derived>::TransformOMPScheduleClause(OMPScheduleClause *C) {
7812   ExprResult E = getDerived().TransformExpr(C->getChunkSize());
7813   if (E.isInvalid())
7814     return nullptr;
7815   return getDerived().RebuildOMPScheduleClause(
7816       C->getFirstScheduleModifier(), C->getSecondScheduleModifier(),
7817       C->getScheduleKind(), E.get(), C->getLocStart(), C->getLParenLoc(),
7818       C->getFirstScheduleModifierLoc(), C->getSecondScheduleModifierLoc(),
7819       C->getScheduleKindLoc(), C->getCommaLoc(), C->getLocEnd());
7820 }
7821 
7822 template <typename Derived>
7823 OMPClause *
7824 TreeTransform<Derived>::TransformOMPOrderedClause(OMPOrderedClause *C) {
7825   ExprResult E;
7826   if (auto *Num = C->getNumForLoops()) {
7827     E = getDerived().TransformExpr(Num);
7828     if (E.isInvalid())
7829       return nullptr;
7830   }
7831   return getDerived().RebuildOMPOrderedClause(C->getLocStart(), C->getLocEnd(),
7832                                               C->getLParenLoc(), E.get());
7833 }
7834 
7835 template <typename Derived>
7836 OMPClause *
7837 TreeTransform<Derived>::TransformOMPNowaitClause(OMPNowaitClause *C) {
7838   // No need to rebuild this clause, no template-dependent parameters.
7839   return C;
7840 }
7841 
7842 template <typename Derived>
7843 OMPClause *
7844 TreeTransform<Derived>::TransformOMPUntiedClause(OMPUntiedClause *C) {
7845   // No need to rebuild this clause, no template-dependent parameters.
7846   return C;
7847 }
7848 
7849 template <typename Derived>
7850 OMPClause *
7851 TreeTransform<Derived>::TransformOMPMergeableClause(OMPMergeableClause *C) {
7852   // No need to rebuild this clause, no template-dependent parameters.
7853   return C;
7854 }
7855 
7856 template <typename Derived>
7857 OMPClause *TreeTransform<Derived>::TransformOMPReadClause(OMPReadClause *C) {
7858   // No need to rebuild this clause, no template-dependent parameters.
7859   return C;
7860 }
7861 
7862 template <typename Derived>
7863 OMPClause *TreeTransform<Derived>::TransformOMPWriteClause(OMPWriteClause *C) {
7864   // No need to rebuild this clause, no template-dependent parameters.
7865   return C;
7866 }
7867 
7868 template <typename Derived>
7869 OMPClause *
7870 TreeTransform<Derived>::TransformOMPUpdateClause(OMPUpdateClause *C) {
7871   // No need to rebuild this clause, no template-dependent parameters.
7872   return C;
7873 }
7874 
7875 template <typename Derived>
7876 OMPClause *
7877 TreeTransform<Derived>::TransformOMPCaptureClause(OMPCaptureClause *C) {
7878   // No need to rebuild this clause, no template-dependent parameters.
7879   return C;
7880 }
7881 
7882 template <typename Derived>
7883 OMPClause *
7884 TreeTransform<Derived>::TransformOMPSeqCstClause(OMPSeqCstClause *C) {
7885   // No need to rebuild this clause, no template-dependent parameters.
7886   return C;
7887 }
7888 
7889 template <typename Derived>
7890 OMPClause *
7891 TreeTransform<Derived>::TransformOMPThreadsClause(OMPThreadsClause *C) {
7892   // No need to rebuild this clause, no template-dependent parameters.
7893   return C;
7894 }
7895 
7896 template <typename Derived>
7897 OMPClause *TreeTransform<Derived>::TransformOMPSIMDClause(OMPSIMDClause *C) {
7898   // No need to rebuild this clause, no template-dependent parameters.
7899   return C;
7900 }
7901 
7902 template <typename Derived>
7903 OMPClause *
7904 TreeTransform<Derived>::TransformOMPNogroupClause(OMPNogroupClause *C) {
7905   // No need to rebuild this clause, no template-dependent parameters.
7906   return C;
7907 }
7908 
7909 template <typename Derived>
7910 OMPClause *
7911 TreeTransform<Derived>::TransformOMPPrivateClause(OMPPrivateClause *C) {
7912   llvm::SmallVector<Expr *, 16> Vars;
7913   Vars.reserve(C->varlist_size());
7914   for (auto *VE : C->varlists()) {
7915     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
7916     if (EVar.isInvalid())
7917       return nullptr;
7918     Vars.push_back(EVar.get());
7919   }
7920   return getDerived().RebuildOMPPrivateClause(
7921       Vars, C->getLocStart(), C->getLParenLoc(), C->getLocEnd());
7922 }
7923 
7924 template <typename Derived>
7925 OMPClause *TreeTransform<Derived>::TransformOMPFirstprivateClause(
7926     OMPFirstprivateClause *C) {
7927   llvm::SmallVector<Expr *, 16> Vars;
7928   Vars.reserve(C->varlist_size());
7929   for (auto *VE : C->varlists()) {
7930     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
7931     if (EVar.isInvalid())
7932       return nullptr;
7933     Vars.push_back(EVar.get());
7934   }
7935   return getDerived().RebuildOMPFirstprivateClause(
7936       Vars, C->getLocStart(), C->getLParenLoc(), C->getLocEnd());
7937 }
7938 
7939 template <typename Derived>
7940 OMPClause *
7941 TreeTransform<Derived>::TransformOMPLastprivateClause(OMPLastprivateClause *C) {
7942   llvm::SmallVector<Expr *, 16> Vars;
7943   Vars.reserve(C->varlist_size());
7944   for (auto *VE : C->varlists()) {
7945     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
7946     if (EVar.isInvalid())
7947       return nullptr;
7948     Vars.push_back(EVar.get());
7949   }
7950   return getDerived().RebuildOMPLastprivateClause(
7951       Vars, C->getLocStart(), C->getLParenLoc(), C->getLocEnd());
7952 }
7953 
7954 template <typename Derived>
7955 OMPClause *
7956 TreeTransform<Derived>::TransformOMPSharedClause(OMPSharedClause *C) {
7957   llvm::SmallVector<Expr *, 16> Vars;
7958   Vars.reserve(C->varlist_size());
7959   for (auto *VE : C->varlists()) {
7960     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
7961     if (EVar.isInvalid())
7962       return nullptr;
7963     Vars.push_back(EVar.get());
7964   }
7965   return getDerived().RebuildOMPSharedClause(Vars, C->getLocStart(),
7966                                              C->getLParenLoc(), C->getLocEnd());
7967 }
7968 
7969 template <typename Derived>
7970 OMPClause *
7971 TreeTransform<Derived>::TransformOMPReductionClause(OMPReductionClause *C) {
7972   llvm::SmallVector<Expr *, 16> Vars;
7973   Vars.reserve(C->varlist_size());
7974   for (auto *VE : C->varlists()) {
7975     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
7976     if (EVar.isInvalid())
7977       return nullptr;
7978     Vars.push_back(EVar.get());
7979   }
7980   CXXScopeSpec ReductionIdScopeSpec;
7981   ReductionIdScopeSpec.Adopt(C->getQualifierLoc());
7982 
7983   DeclarationNameInfo NameInfo = C->getNameInfo();
7984   if (NameInfo.getName()) {
7985     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
7986     if (!NameInfo.getName())
7987       return nullptr;
7988   }
7989   // Build a list of all UDR decls with the same names ranged by the Scopes.
7990   // The Scope boundary is a duplication of the previous decl.
7991   llvm::SmallVector<Expr *, 16> UnresolvedReductions;
7992   for (auto *E : C->reduction_ops()) {
7993     // Transform all the decls.
7994     if (E) {
7995       auto *ULE = cast<UnresolvedLookupExpr>(E);
7996       UnresolvedSet<8> Decls;
7997       for (auto *D : ULE->decls()) {
7998         NamedDecl *InstD =
7999             cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D));
8000         Decls.addDecl(InstD, InstD->getAccess());
8001       }
8002       UnresolvedReductions.push_back(
8003        UnresolvedLookupExpr::Create(
8004           SemaRef.Context, /*NamingClass=*/nullptr,
8005           ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context),
8006           NameInfo, /*ADL=*/true, ULE->isOverloaded(),
8007           Decls.begin(), Decls.end()));
8008     } else
8009       UnresolvedReductions.push_back(nullptr);
8010   }
8011   return getDerived().RebuildOMPReductionClause(
8012       Vars, C->getLocStart(), C->getLParenLoc(), C->getColonLoc(),
8013       C->getLocEnd(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions);
8014 }
8015 
8016 template <typename Derived>
8017 OMPClause *
8018 TreeTransform<Derived>::TransformOMPLinearClause(OMPLinearClause *C) {
8019   llvm::SmallVector<Expr *, 16> Vars;
8020   Vars.reserve(C->varlist_size());
8021   for (auto *VE : C->varlists()) {
8022     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8023     if (EVar.isInvalid())
8024       return nullptr;
8025     Vars.push_back(EVar.get());
8026   }
8027   ExprResult Step = getDerived().TransformExpr(C->getStep());
8028   if (Step.isInvalid())
8029     return nullptr;
8030   return getDerived().RebuildOMPLinearClause(
8031       Vars, Step.get(), C->getLocStart(), C->getLParenLoc(), C->getModifier(),
8032       C->getModifierLoc(), C->getColonLoc(), C->getLocEnd());
8033 }
8034 
8035 template <typename Derived>
8036 OMPClause *
8037 TreeTransform<Derived>::TransformOMPAlignedClause(OMPAlignedClause *C) {
8038   llvm::SmallVector<Expr *, 16> Vars;
8039   Vars.reserve(C->varlist_size());
8040   for (auto *VE : C->varlists()) {
8041     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8042     if (EVar.isInvalid())
8043       return nullptr;
8044     Vars.push_back(EVar.get());
8045   }
8046   ExprResult Alignment = getDerived().TransformExpr(C->getAlignment());
8047   if (Alignment.isInvalid())
8048     return nullptr;
8049   return getDerived().RebuildOMPAlignedClause(
8050       Vars, Alignment.get(), C->getLocStart(), C->getLParenLoc(),
8051       C->getColonLoc(), C->getLocEnd());
8052 }
8053 
8054 template <typename Derived>
8055 OMPClause *
8056 TreeTransform<Derived>::TransformOMPCopyinClause(OMPCopyinClause *C) {
8057   llvm::SmallVector<Expr *, 16> Vars;
8058   Vars.reserve(C->varlist_size());
8059   for (auto *VE : C->varlists()) {
8060     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8061     if (EVar.isInvalid())
8062       return nullptr;
8063     Vars.push_back(EVar.get());
8064   }
8065   return getDerived().RebuildOMPCopyinClause(Vars, C->getLocStart(),
8066                                              C->getLParenLoc(), C->getLocEnd());
8067 }
8068 
8069 template <typename Derived>
8070 OMPClause *
8071 TreeTransform<Derived>::TransformOMPCopyprivateClause(OMPCopyprivateClause *C) {
8072   llvm::SmallVector<Expr *, 16> Vars;
8073   Vars.reserve(C->varlist_size());
8074   for (auto *VE : C->varlists()) {
8075     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8076     if (EVar.isInvalid())
8077       return nullptr;
8078     Vars.push_back(EVar.get());
8079   }
8080   return getDerived().RebuildOMPCopyprivateClause(
8081       Vars, C->getLocStart(), C->getLParenLoc(), C->getLocEnd());
8082 }
8083 
8084 template <typename Derived>
8085 OMPClause *TreeTransform<Derived>::TransformOMPFlushClause(OMPFlushClause *C) {
8086   llvm::SmallVector<Expr *, 16> Vars;
8087   Vars.reserve(C->varlist_size());
8088   for (auto *VE : C->varlists()) {
8089     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8090     if (EVar.isInvalid())
8091       return nullptr;
8092     Vars.push_back(EVar.get());
8093   }
8094   return getDerived().RebuildOMPFlushClause(Vars, C->getLocStart(),
8095                                             C->getLParenLoc(), C->getLocEnd());
8096 }
8097 
8098 template <typename Derived>
8099 OMPClause *
8100 TreeTransform<Derived>::TransformOMPDependClause(OMPDependClause *C) {
8101   llvm::SmallVector<Expr *, 16> Vars;
8102   Vars.reserve(C->varlist_size());
8103   for (auto *VE : C->varlists()) {
8104     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8105     if (EVar.isInvalid())
8106       return nullptr;
8107     Vars.push_back(EVar.get());
8108   }
8109   return getDerived().RebuildOMPDependClause(
8110       C->getDependencyKind(), C->getDependencyLoc(), C->getColonLoc(), Vars,
8111       C->getLocStart(), C->getLParenLoc(), C->getLocEnd());
8112 }
8113 
8114 template <typename Derived>
8115 OMPClause *
8116 TreeTransform<Derived>::TransformOMPDeviceClause(OMPDeviceClause *C) {
8117   ExprResult E = getDerived().TransformExpr(C->getDevice());
8118   if (E.isInvalid())
8119     return nullptr;
8120   return getDerived().RebuildOMPDeviceClause(
8121       E.get(), C->getLocStart(), C->getLParenLoc(), C->getLocEnd());
8122 }
8123 
8124 template <typename Derived>
8125 OMPClause *TreeTransform<Derived>::TransformOMPMapClause(OMPMapClause *C) {
8126   llvm::SmallVector<Expr *, 16> Vars;
8127   Vars.reserve(C->varlist_size());
8128   for (auto *VE : C->varlists()) {
8129     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8130     if (EVar.isInvalid())
8131       return nullptr;
8132     Vars.push_back(EVar.get());
8133   }
8134   return getDerived().RebuildOMPMapClause(
8135       C->getMapTypeModifier(), C->getMapType(), C->isImplicitMapType(),
8136       C->getMapLoc(), C->getColonLoc(), Vars, C->getLocStart(),
8137       C->getLParenLoc(), C->getLocEnd());
8138 }
8139 
8140 template <typename Derived>
8141 OMPClause *
8142 TreeTransform<Derived>::TransformOMPNumTeamsClause(OMPNumTeamsClause *C) {
8143   ExprResult E = getDerived().TransformExpr(C->getNumTeams());
8144   if (E.isInvalid())
8145     return nullptr;
8146   return getDerived().RebuildOMPNumTeamsClause(
8147       E.get(), C->getLocStart(), C->getLParenLoc(), C->getLocEnd());
8148 }
8149 
8150 template <typename Derived>
8151 OMPClause *
8152 TreeTransform<Derived>::TransformOMPThreadLimitClause(OMPThreadLimitClause *C) {
8153   ExprResult E = getDerived().TransformExpr(C->getThreadLimit());
8154   if (E.isInvalid())
8155     return nullptr;
8156   return getDerived().RebuildOMPThreadLimitClause(
8157       E.get(), C->getLocStart(), C->getLParenLoc(), C->getLocEnd());
8158 }
8159 
8160 template <typename Derived>
8161 OMPClause *
8162 TreeTransform<Derived>::TransformOMPPriorityClause(OMPPriorityClause *C) {
8163   ExprResult E = getDerived().TransformExpr(C->getPriority());
8164   if (E.isInvalid())
8165     return nullptr;
8166   return getDerived().RebuildOMPPriorityClause(
8167       E.get(), C->getLocStart(), C->getLParenLoc(), C->getLocEnd());
8168 }
8169 
8170 template <typename Derived>
8171 OMPClause *
8172 TreeTransform<Derived>::TransformOMPGrainsizeClause(OMPGrainsizeClause *C) {
8173   ExprResult E = getDerived().TransformExpr(C->getGrainsize());
8174   if (E.isInvalid())
8175     return nullptr;
8176   return getDerived().RebuildOMPGrainsizeClause(
8177       E.get(), C->getLocStart(), C->getLParenLoc(), C->getLocEnd());
8178 }
8179 
8180 template <typename Derived>
8181 OMPClause *
8182 TreeTransform<Derived>::TransformOMPNumTasksClause(OMPNumTasksClause *C) {
8183   ExprResult E = getDerived().TransformExpr(C->getNumTasks());
8184   if (E.isInvalid())
8185     return nullptr;
8186   return getDerived().RebuildOMPNumTasksClause(
8187       E.get(), C->getLocStart(), C->getLParenLoc(), C->getLocEnd());
8188 }
8189 
8190 template <typename Derived>
8191 OMPClause *TreeTransform<Derived>::TransformOMPHintClause(OMPHintClause *C) {
8192   ExprResult E = getDerived().TransformExpr(C->getHint());
8193   if (E.isInvalid())
8194     return nullptr;
8195   return getDerived().RebuildOMPHintClause(E.get(), C->getLocStart(),
8196                                            C->getLParenLoc(), C->getLocEnd());
8197 }
8198 
8199 template <typename Derived>
8200 OMPClause *TreeTransform<Derived>::TransformOMPDistScheduleClause(
8201     OMPDistScheduleClause *C) {
8202   ExprResult E = getDerived().TransformExpr(C->getChunkSize());
8203   if (E.isInvalid())
8204     return nullptr;
8205   return getDerived().RebuildOMPDistScheduleClause(
8206       C->getDistScheduleKind(), E.get(), C->getLocStart(), C->getLParenLoc(),
8207       C->getDistScheduleKindLoc(), C->getCommaLoc(), C->getLocEnd());
8208 }
8209 
8210 template <typename Derived>
8211 OMPClause *
8212 TreeTransform<Derived>::TransformOMPDefaultmapClause(OMPDefaultmapClause *C) {
8213   return C;
8214 }
8215 
8216 template <typename Derived>
8217 OMPClause *TreeTransform<Derived>::TransformOMPToClause(OMPToClause *C) {
8218   llvm::SmallVector<Expr *, 16> Vars;
8219   Vars.reserve(C->varlist_size());
8220   for (auto *VE : C->varlists()) {
8221     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8222     if (EVar.isInvalid())
8223       return 0;
8224     Vars.push_back(EVar.get());
8225   }
8226   return getDerived().RebuildOMPToClause(Vars, C->getLocStart(),
8227                                          C->getLParenLoc(), C->getLocEnd());
8228 }
8229 
8230 template <typename Derived>
8231 OMPClause *TreeTransform<Derived>::TransformOMPFromClause(OMPFromClause *C) {
8232   llvm::SmallVector<Expr *, 16> Vars;
8233   Vars.reserve(C->varlist_size());
8234   for (auto *VE : C->varlists()) {
8235     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8236     if (EVar.isInvalid())
8237       return 0;
8238     Vars.push_back(EVar.get());
8239   }
8240   return getDerived().RebuildOMPFromClause(Vars, C->getLocStart(),
8241                                            C->getLParenLoc(), C->getLocEnd());
8242 }
8243 
8244 template <typename Derived>
8245 OMPClause *TreeTransform<Derived>::TransformOMPUseDevicePtrClause(
8246     OMPUseDevicePtrClause *C) {
8247   llvm::SmallVector<Expr *, 16> Vars;
8248   Vars.reserve(C->varlist_size());
8249   for (auto *VE : C->varlists()) {
8250     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8251     if (EVar.isInvalid())
8252       return nullptr;
8253     Vars.push_back(EVar.get());
8254   }
8255   return getDerived().RebuildOMPUseDevicePtrClause(
8256       Vars, C->getLocStart(), C->getLParenLoc(), C->getLocEnd());
8257 }
8258 
8259 template <typename Derived>
8260 OMPClause *
8261 TreeTransform<Derived>::TransformOMPIsDevicePtrClause(OMPIsDevicePtrClause *C) {
8262   llvm::SmallVector<Expr *, 16> Vars;
8263   Vars.reserve(C->varlist_size());
8264   for (auto *VE : C->varlists()) {
8265     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8266     if (EVar.isInvalid())
8267       return nullptr;
8268     Vars.push_back(EVar.get());
8269   }
8270   return getDerived().RebuildOMPIsDevicePtrClause(
8271       Vars, C->getLocStart(), C->getLParenLoc(), C->getLocEnd());
8272 }
8273 
8274 //===----------------------------------------------------------------------===//
8275 // Expression transformation
8276 //===----------------------------------------------------------------------===//
8277 template<typename Derived>
8278 ExprResult
8279 TreeTransform<Derived>::TransformPredefinedExpr(PredefinedExpr *E) {
8280   if (!E->isTypeDependent())
8281     return E;
8282 
8283   return getDerived().RebuildPredefinedExpr(E->getLocation(),
8284                                             E->getIdentType());
8285 }
8286 
8287 template<typename Derived>
8288 ExprResult
8289 TreeTransform<Derived>::TransformDeclRefExpr(DeclRefExpr *E) {
8290   NestedNameSpecifierLoc QualifierLoc;
8291   if (E->getQualifierLoc()) {
8292     QualifierLoc
8293       = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
8294     if (!QualifierLoc)
8295       return ExprError();
8296   }
8297 
8298   ValueDecl *ND
8299     = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getLocation(),
8300                                                          E->getDecl()));
8301   if (!ND)
8302     return ExprError();
8303 
8304   DeclarationNameInfo NameInfo = E->getNameInfo();
8305   if (NameInfo.getName()) {
8306     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
8307     if (!NameInfo.getName())
8308       return ExprError();
8309   }
8310 
8311   if (!getDerived().AlwaysRebuild() &&
8312       QualifierLoc == E->getQualifierLoc() &&
8313       ND == E->getDecl() &&
8314       NameInfo.getName() == E->getDecl()->getDeclName() &&
8315       !E->hasExplicitTemplateArgs()) {
8316 
8317     // Mark it referenced in the new context regardless.
8318     // FIXME: this is a bit instantiation-specific.
8319     SemaRef.MarkDeclRefReferenced(E);
8320 
8321     return E;
8322   }
8323 
8324   TemplateArgumentListInfo TransArgs, *TemplateArgs = nullptr;
8325   if (E->hasExplicitTemplateArgs()) {
8326     TemplateArgs = &TransArgs;
8327     TransArgs.setLAngleLoc(E->getLAngleLoc());
8328     TransArgs.setRAngleLoc(E->getRAngleLoc());
8329     if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
8330                                                 E->getNumTemplateArgs(),
8331                                                 TransArgs))
8332       return ExprError();
8333   }
8334 
8335   return getDerived().RebuildDeclRefExpr(QualifierLoc, ND, NameInfo,
8336                                          TemplateArgs);
8337 }
8338 
8339 template<typename Derived>
8340 ExprResult
8341 TreeTransform<Derived>::TransformIntegerLiteral(IntegerLiteral *E) {
8342   return E;
8343 }
8344 
8345 template<typename Derived>
8346 ExprResult
8347 TreeTransform<Derived>::TransformFloatingLiteral(FloatingLiteral *E) {
8348   return E;
8349 }
8350 
8351 template<typename Derived>
8352 ExprResult
8353 TreeTransform<Derived>::TransformImaginaryLiteral(ImaginaryLiteral *E) {
8354   return E;
8355 }
8356 
8357 template<typename Derived>
8358 ExprResult
8359 TreeTransform<Derived>::TransformStringLiteral(StringLiteral *E) {
8360   return E;
8361 }
8362 
8363 template<typename Derived>
8364 ExprResult
8365 TreeTransform<Derived>::TransformCharacterLiteral(CharacterLiteral *E) {
8366   return E;
8367 }
8368 
8369 template<typename Derived>
8370 ExprResult
8371 TreeTransform<Derived>::TransformUserDefinedLiteral(UserDefinedLiteral *E) {
8372   if (FunctionDecl *FD = E->getDirectCallee())
8373     SemaRef.MarkFunctionReferenced(E->getLocStart(), FD);
8374   return SemaRef.MaybeBindToTemporary(E);
8375 }
8376 
8377 template<typename Derived>
8378 ExprResult
8379 TreeTransform<Derived>::TransformGenericSelectionExpr(GenericSelectionExpr *E) {
8380   ExprResult ControllingExpr =
8381     getDerived().TransformExpr(E->getControllingExpr());
8382   if (ControllingExpr.isInvalid())
8383     return ExprError();
8384 
8385   SmallVector<Expr *, 4> AssocExprs;
8386   SmallVector<TypeSourceInfo *, 4> AssocTypes;
8387   for (unsigned i = 0; i != E->getNumAssocs(); ++i) {
8388     TypeSourceInfo *TS = E->getAssocTypeSourceInfo(i);
8389     if (TS) {
8390       TypeSourceInfo *AssocType = getDerived().TransformType(TS);
8391       if (!AssocType)
8392         return ExprError();
8393       AssocTypes.push_back(AssocType);
8394     } else {
8395       AssocTypes.push_back(nullptr);
8396     }
8397 
8398     ExprResult AssocExpr = getDerived().TransformExpr(E->getAssocExpr(i));
8399     if (AssocExpr.isInvalid())
8400       return ExprError();
8401     AssocExprs.push_back(AssocExpr.get());
8402   }
8403 
8404   return getDerived().RebuildGenericSelectionExpr(E->getGenericLoc(),
8405                                                   E->getDefaultLoc(),
8406                                                   E->getRParenLoc(),
8407                                                   ControllingExpr.get(),
8408                                                   AssocTypes,
8409                                                   AssocExprs);
8410 }
8411 
8412 template<typename Derived>
8413 ExprResult
8414 TreeTransform<Derived>::TransformParenExpr(ParenExpr *E) {
8415   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
8416   if (SubExpr.isInvalid())
8417     return ExprError();
8418 
8419   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr())
8420     return E;
8421 
8422   return getDerived().RebuildParenExpr(SubExpr.get(), E->getLParen(),
8423                                        E->getRParen());
8424 }
8425 
8426 /// \brief The operand of a unary address-of operator has special rules: it's
8427 /// allowed to refer to a non-static member of a class even if there's no 'this'
8428 /// object available.
8429 template<typename Derived>
8430 ExprResult
8431 TreeTransform<Derived>::TransformAddressOfOperand(Expr *E) {
8432   if (DependentScopeDeclRefExpr *DRE = dyn_cast<DependentScopeDeclRefExpr>(E))
8433     return getDerived().TransformDependentScopeDeclRefExpr(DRE, true, nullptr);
8434   else
8435     return getDerived().TransformExpr(E);
8436 }
8437 
8438 template<typename Derived>
8439 ExprResult
8440 TreeTransform<Derived>::TransformUnaryOperator(UnaryOperator *E) {
8441   ExprResult SubExpr;
8442   if (E->getOpcode() == UO_AddrOf)
8443     SubExpr = TransformAddressOfOperand(E->getSubExpr());
8444   else
8445     SubExpr = TransformExpr(E->getSubExpr());
8446   if (SubExpr.isInvalid())
8447     return ExprError();
8448 
8449   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr())
8450     return E;
8451 
8452   return getDerived().RebuildUnaryOperator(E->getOperatorLoc(),
8453                                            E->getOpcode(),
8454                                            SubExpr.get());
8455 }
8456 
8457 template<typename Derived>
8458 ExprResult
8459 TreeTransform<Derived>::TransformOffsetOfExpr(OffsetOfExpr *E) {
8460   // Transform the type.
8461   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo());
8462   if (!Type)
8463     return ExprError();
8464 
8465   // Transform all of the components into components similar to what the
8466   // parser uses.
8467   // FIXME: It would be slightly more efficient in the non-dependent case to
8468   // just map FieldDecls, rather than requiring the rebuilder to look for
8469   // the fields again. However, __builtin_offsetof is rare enough in
8470   // template code that we don't care.
8471   bool ExprChanged = false;
8472   typedef Sema::OffsetOfComponent Component;
8473   SmallVector<Component, 4> Components;
8474   for (unsigned I = 0, N = E->getNumComponents(); I != N; ++I) {
8475     const OffsetOfNode &ON = E->getComponent(I);
8476     Component Comp;
8477     Comp.isBrackets = true;
8478     Comp.LocStart = ON.getSourceRange().getBegin();
8479     Comp.LocEnd = ON.getSourceRange().getEnd();
8480     switch (ON.getKind()) {
8481     case OffsetOfNode::Array: {
8482       Expr *FromIndex = E->getIndexExpr(ON.getArrayExprIndex());
8483       ExprResult Index = getDerived().TransformExpr(FromIndex);
8484       if (Index.isInvalid())
8485         return ExprError();
8486 
8487       ExprChanged = ExprChanged || Index.get() != FromIndex;
8488       Comp.isBrackets = true;
8489       Comp.U.E = Index.get();
8490       break;
8491     }
8492 
8493     case OffsetOfNode::Field:
8494     case OffsetOfNode::Identifier:
8495       Comp.isBrackets = false;
8496       Comp.U.IdentInfo = ON.getFieldName();
8497       if (!Comp.U.IdentInfo)
8498         continue;
8499 
8500       break;
8501 
8502     case OffsetOfNode::Base:
8503       // Will be recomputed during the rebuild.
8504       continue;
8505     }
8506 
8507     Components.push_back(Comp);
8508   }
8509 
8510   // If nothing changed, retain the existing expression.
8511   if (!getDerived().AlwaysRebuild() &&
8512       Type == E->getTypeSourceInfo() &&
8513       !ExprChanged)
8514     return E;
8515 
8516   // Build a new offsetof expression.
8517   return getDerived().RebuildOffsetOfExpr(E->getOperatorLoc(), Type,
8518                                           Components, E->getRParenLoc());
8519 }
8520 
8521 template<typename Derived>
8522 ExprResult
8523 TreeTransform<Derived>::TransformOpaqueValueExpr(OpaqueValueExpr *E) {
8524   assert((!E->getSourceExpr() || getDerived().AlreadyTransformed(E->getType())) &&
8525          "opaque value expression requires transformation");
8526   return E;
8527 }
8528 
8529 template<typename Derived>
8530 ExprResult
8531 TreeTransform<Derived>::TransformTypoExpr(TypoExpr *E) {
8532   return E;
8533 }
8534 
8535 template<typename Derived>
8536 ExprResult
8537 TreeTransform<Derived>::TransformPseudoObjectExpr(PseudoObjectExpr *E) {
8538   // Rebuild the syntactic form.  The original syntactic form has
8539   // opaque-value expressions in it, so strip those away and rebuild
8540   // the result.  This is a really awful way of doing this, but the
8541   // better solution (rebuilding the semantic expressions and
8542   // rebinding OVEs as necessary) doesn't work; we'd need
8543   // TreeTransform to not strip away implicit conversions.
8544   Expr *newSyntacticForm = SemaRef.recreateSyntacticForm(E);
8545   ExprResult result = getDerived().TransformExpr(newSyntacticForm);
8546   if (result.isInvalid()) return ExprError();
8547 
8548   // If that gives us a pseudo-object result back, the pseudo-object
8549   // expression must have been an lvalue-to-rvalue conversion which we
8550   // should reapply.
8551   if (result.get()->hasPlaceholderType(BuiltinType::PseudoObject))
8552     result = SemaRef.checkPseudoObjectRValue(result.get());
8553 
8554   return result;
8555 }
8556 
8557 template<typename Derived>
8558 ExprResult
8559 TreeTransform<Derived>::TransformUnaryExprOrTypeTraitExpr(
8560                                                 UnaryExprOrTypeTraitExpr *E) {
8561   if (E->isArgumentType()) {
8562     TypeSourceInfo *OldT = E->getArgumentTypeInfo();
8563 
8564     TypeSourceInfo *NewT = getDerived().TransformType(OldT);
8565     if (!NewT)
8566       return ExprError();
8567 
8568     if (!getDerived().AlwaysRebuild() && OldT == NewT)
8569       return E;
8570 
8571     return getDerived().RebuildUnaryExprOrTypeTrait(NewT, E->getOperatorLoc(),
8572                                                     E->getKind(),
8573                                                     E->getSourceRange());
8574   }
8575 
8576   // C++0x [expr.sizeof]p1:
8577   //   The operand is either an expression, which is an unevaluated operand
8578   //   [...]
8579   EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated,
8580                                                Sema::ReuseLambdaContextDecl);
8581 
8582   // Try to recover if we have something like sizeof(T::X) where X is a type.
8583   // Notably, there must be *exactly* one set of parens if X is a type.
8584   TypeSourceInfo *RecoveryTSI = nullptr;
8585   ExprResult SubExpr;
8586   auto *PE = dyn_cast<ParenExpr>(E->getArgumentExpr());
8587   if (auto *DRE =
8588           PE ? dyn_cast<DependentScopeDeclRefExpr>(PE->getSubExpr()) : nullptr)
8589     SubExpr = getDerived().TransformParenDependentScopeDeclRefExpr(
8590         PE, DRE, false, &RecoveryTSI);
8591   else
8592     SubExpr = getDerived().TransformExpr(E->getArgumentExpr());
8593 
8594   if (RecoveryTSI) {
8595     return getDerived().RebuildUnaryExprOrTypeTrait(
8596         RecoveryTSI, E->getOperatorLoc(), E->getKind(), E->getSourceRange());
8597   } else if (SubExpr.isInvalid())
8598     return ExprError();
8599 
8600   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getArgumentExpr())
8601     return E;
8602 
8603   return getDerived().RebuildUnaryExprOrTypeTrait(SubExpr.get(),
8604                                                   E->getOperatorLoc(),
8605                                                   E->getKind(),
8606                                                   E->getSourceRange());
8607 }
8608 
8609 template<typename Derived>
8610 ExprResult
8611 TreeTransform<Derived>::TransformArraySubscriptExpr(ArraySubscriptExpr *E) {
8612   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
8613   if (LHS.isInvalid())
8614     return ExprError();
8615 
8616   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
8617   if (RHS.isInvalid())
8618     return ExprError();
8619 
8620 
8621   if (!getDerived().AlwaysRebuild() &&
8622       LHS.get() == E->getLHS() &&
8623       RHS.get() == E->getRHS())
8624     return E;
8625 
8626   return getDerived().RebuildArraySubscriptExpr(LHS.get(),
8627                                            /*FIXME:*/E->getLHS()->getLocStart(),
8628                                                 RHS.get(),
8629                                                 E->getRBracketLoc());
8630 }
8631 
8632 template <typename Derived>
8633 ExprResult
8634 TreeTransform<Derived>::TransformOMPArraySectionExpr(OMPArraySectionExpr *E) {
8635   ExprResult Base = getDerived().TransformExpr(E->getBase());
8636   if (Base.isInvalid())
8637     return ExprError();
8638 
8639   ExprResult LowerBound;
8640   if (E->getLowerBound()) {
8641     LowerBound = getDerived().TransformExpr(E->getLowerBound());
8642     if (LowerBound.isInvalid())
8643       return ExprError();
8644   }
8645 
8646   ExprResult Length;
8647   if (E->getLength()) {
8648     Length = getDerived().TransformExpr(E->getLength());
8649     if (Length.isInvalid())
8650       return ExprError();
8651   }
8652 
8653   if (!getDerived().AlwaysRebuild() && Base.get() == E->getBase() &&
8654       LowerBound.get() == E->getLowerBound() && Length.get() == E->getLength())
8655     return E;
8656 
8657   return getDerived().RebuildOMPArraySectionExpr(
8658       Base.get(), E->getBase()->getLocEnd(), LowerBound.get(), E->getColonLoc(),
8659       Length.get(), E->getRBracketLoc());
8660 }
8661 
8662 template<typename Derived>
8663 ExprResult
8664 TreeTransform<Derived>::TransformCallExpr(CallExpr *E) {
8665   // Transform the callee.
8666   ExprResult Callee = getDerived().TransformExpr(E->getCallee());
8667   if (Callee.isInvalid())
8668     return ExprError();
8669 
8670   // Transform arguments.
8671   bool ArgChanged = false;
8672   SmallVector<Expr*, 8> Args;
8673   if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
8674                                   &ArgChanged))
8675     return ExprError();
8676 
8677   if (!getDerived().AlwaysRebuild() &&
8678       Callee.get() == E->getCallee() &&
8679       !ArgChanged)
8680     return SemaRef.MaybeBindToTemporary(E);
8681 
8682   // FIXME: Wrong source location information for the '('.
8683   SourceLocation FakeLParenLoc
8684     = ((Expr *)Callee.get())->getSourceRange().getBegin();
8685   return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc,
8686                                       Args,
8687                                       E->getRParenLoc());
8688 }
8689 
8690 template<typename Derived>
8691 ExprResult
8692 TreeTransform<Derived>::TransformMemberExpr(MemberExpr *E) {
8693   ExprResult Base = getDerived().TransformExpr(E->getBase());
8694   if (Base.isInvalid())
8695     return ExprError();
8696 
8697   NestedNameSpecifierLoc QualifierLoc;
8698   if (E->hasQualifier()) {
8699     QualifierLoc
8700       = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
8701 
8702     if (!QualifierLoc)
8703       return ExprError();
8704   }
8705   SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc();
8706 
8707   ValueDecl *Member
8708     = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getMemberLoc(),
8709                                                          E->getMemberDecl()));
8710   if (!Member)
8711     return ExprError();
8712 
8713   NamedDecl *FoundDecl = E->getFoundDecl();
8714   if (FoundDecl == E->getMemberDecl()) {
8715     FoundDecl = Member;
8716   } else {
8717     FoundDecl = cast_or_null<NamedDecl>(
8718                    getDerived().TransformDecl(E->getMemberLoc(), FoundDecl));
8719     if (!FoundDecl)
8720       return ExprError();
8721   }
8722 
8723   if (!getDerived().AlwaysRebuild() &&
8724       Base.get() == E->getBase() &&
8725       QualifierLoc == E->getQualifierLoc() &&
8726       Member == E->getMemberDecl() &&
8727       FoundDecl == E->getFoundDecl() &&
8728       !E->hasExplicitTemplateArgs()) {
8729 
8730     // Mark it referenced in the new context regardless.
8731     // FIXME: this is a bit instantiation-specific.
8732     SemaRef.MarkMemberReferenced(E);
8733 
8734     return E;
8735   }
8736 
8737   TemplateArgumentListInfo TransArgs;
8738   if (E->hasExplicitTemplateArgs()) {
8739     TransArgs.setLAngleLoc(E->getLAngleLoc());
8740     TransArgs.setRAngleLoc(E->getRAngleLoc());
8741     if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
8742                                                 E->getNumTemplateArgs(),
8743                                                 TransArgs))
8744       return ExprError();
8745   }
8746 
8747   // FIXME: Bogus source location for the operator
8748   SourceLocation FakeOperatorLoc =
8749       SemaRef.getLocForEndOfToken(E->getBase()->getSourceRange().getEnd());
8750 
8751   // FIXME: to do this check properly, we will need to preserve the
8752   // first-qualifier-in-scope here, just in case we had a dependent
8753   // base (and therefore couldn't do the check) and a
8754   // nested-name-qualifier (and therefore could do the lookup).
8755   NamedDecl *FirstQualifierInScope = nullptr;
8756 
8757   return getDerived().RebuildMemberExpr(Base.get(), FakeOperatorLoc,
8758                                         E->isArrow(),
8759                                         QualifierLoc,
8760                                         TemplateKWLoc,
8761                                         E->getMemberNameInfo(),
8762                                         Member,
8763                                         FoundDecl,
8764                                         (E->hasExplicitTemplateArgs()
8765                                            ? &TransArgs : nullptr),
8766                                         FirstQualifierInScope);
8767 }
8768 
8769 template<typename Derived>
8770 ExprResult
8771 TreeTransform<Derived>::TransformBinaryOperator(BinaryOperator *E) {
8772   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
8773   if (LHS.isInvalid())
8774     return ExprError();
8775 
8776   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
8777   if (RHS.isInvalid())
8778     return ExprError();
8779 
8780   if (!getDerived().AlwaysRebuild() &&
8781       LHS.get() == E->getLHS() &&
8782       RHS.get() == E->getRHS())
8783     return E;
8784 
8785   Sema::FPContractStateRAII FPContractState(getSema());
8786   getSema().FPFeatures.fp_contract = E->isFPContractable();
8787 
8788   return getDerived().RebuildBinaryOperator(E->getOperatorLoc(), E->getOpcode(),
8789                                             LHS.get(), RHS.get());
8790 }
8791 
8792 template<typename Derived>
8793 ExprResult
8794 TreeTransform<Derived>::TransformCompoundAssignOperator(
8795                                                       CompoundAssignOperator *E) {
8796   return getDerived().TransformBinaryOperator(E);
8797 }
8798 
8799 template<typename Derived>
8800 ExprResult TreeTransform<Derived>::
8801 TransformBinaryConditionalOperator(BinaryConditionalOperator *e) {
8802   // Just rebuild the common and RHS expressions and see whether we
8803   // get any changes.
8804 
8805   ExprResult commonExpr = getDerived().TransformExpr(e->getCommon());
8806   if (commonExpr.isInvalid())
8807     return ExprError();
8808 
8809   ExprResult rhs = getDerived().TransformExpr(e->getFalseExpr());
8810   if (rhs.isInvalid())
8811     return ExprError();
8812 
8813   if (!getDerived().AlwaysRebuild() &&
8814       commonExpr.get() == e->getCommon() &&
8815       rhs.get() == e->getFalseExpr())
8816     return e;
8817 
8818   return getDerived().RebuildConditionalOperator(commonExpr.get(),
8819                                                  e->getQuestionLoc(),
8820                                                  nullptr,
8821                                                  e->getColonLoc(),
8822                                                  rhs.get());
8823 }
8824 
8825 template<typename Derived>
8826 ExprResult
8827 TreeTransform<Derived>::TransformConditionalOperator(ConditionalOperator *E) {
8828   ExprResult Cond = getDerived().TransformExpr(E->getCond());
8829   if (Cond.isInvalid())
8830     return ExprError();
8831 
8832   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
8833   if (LHS.isInvalid())
8834     return ExprError();
8835 
8836   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
8837   if (RHS.isInvalid())
8838     return ExprError();
8839 
8840   if (!getDerived().AlwaysRebuild() &&
8841       Cond.get() == E->getCond() &&
8842       LHS.get() == E->getLHS() &&
8843       RHS.get() == E->getRHS())
8844     return E;
8845 
8846   return getDerived().RebuildConditionalOperator(Cond.get(),
8847                                                  E->getQuestionLoc(),
8848                                                  LHS.get(),
8849                                                  E->getColonLoc(),
8850                                                  RHS.get());
8851 }
8852 
8853 template<typename Derived>
8854 ExprResult
8855 TreeTransform<Derived>::TransformImplicitCastExpr(ImplicitCastExpr *E) {
8856   // Implicit casts are eliminated during transformation, since they
8857   // will be recomputed by semantic analysis after transformation.
8858   return getDerived().TransformExpr(E->getSubExprAsWritten());
8859 }
8860 
8861 template<typename Derived>
8862 ExprResult
8863 TreeTransform<Derived>::TransformCStyleCastExpr(CStyleCastExpr *E) {
8864   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten());
8865   if (!Type)
8866     return ExprError();
8867 
8868   ExprResult SubExpr
8869     = getDerived().TransformExpr(E->getSubExprAsWritten());
8870   if (SubExpr.isInvalid())
8871     return ExprError();
8872 
8873   if (!getDerived().AlwaysRebuild() &&
8874       Type == E->getTypeInfoAsWritten() &&
8875       SubExpr.get() == E->getSubExpr())
8876     return E;
8877 
8878   return getDerived().RebuildCStyleCastExpr(E->getLParenLoc(),
8879                                             Type,
8880                                             E->getRParenLoc(),
8881                                             SubExpr.get());
8882 }
8883 
8884 template<typename Derived>
8885 ExprResult
8886 TreeTransform<Derived>::TransformCompoundLiteralExpr(CompoundLiteralExpr *E) {
8887   TypeSourceInfo *OldT = E->getTypeSourceInfo();
8888   TypeSourceInfo *NewT = getDerived().TransformType(OldT);
8889   if (!NewT)
8890     return ExprError();
8891 
8892   ExprResult Init = getDerived().TransformExpr(E->getInitializer());
8893   if (Init.isInvalid())
8894     return ExprError();
8895 
8896   if (!getDerived().AlwaysRebuild() &&
8897       OldT == NewT &&
8898       Init.get() == E->getInitializer())
8899     return SemaRef.MaybeBindToTemporary(E);
8900 
8901   // Note: the expression type doesn't necessarily match the
8902   // type-as-written, but that's okay, because it should always be
8903   // derivable from the initializer.
8904 
8905   return getDerived().RebuildCompoundLiteralExpr(E->getLParenLoc(), NewT,
8906                                    /*FIXME:*/E->getInitializer()->getLocEnd(),
8907                                                  Init.get());
8908 }
8909 
8910 template<typename Derived>
8911 ExprResult
8912 TreeTransform<Derived>::TransformExtVectorElementExpr(ExtVectorElementExpr *E) {
8913   ExprResult Base = getDerived().TransformExpr(E->getBase());
8914   if (Base.isInvalid())
8915     return ExprError();
8916 
8917   if (!getDerived().AlwaysRebuild() &&
8918       Base.get() == E->getBase())
8919     return E;
8920 
8921   // FIXME: Bad source location
8922   SourceLocation FakeOperatorLoc =
8923       SemaRef.getLocForEndOfToken(E->getBase()->getLocEnd());
8924   return getDerived().RebuildExtVectorElementExpr(Base.get(), FakeOperatorLoc,
8925                                                   E->getAccessorLoc(),
8926                                                   E->getAccessor());
8927 }
8928 
8929 template<typename Derived>
8930 ExprResult
8931 TreeTransform<Derived>::TransformInitListExpr(InitListExpr *E) {
8932   if (InitListExpr *Syntactic = E->getSyntacticForm())
8933     E = Syntactic;
8934 
8935   bool InitChanged = false;
8936 
8937   SmallVector<Expr*, 4> Inits;
8938   if (getDerived().TransformExprs(E->getInits(), E->getNumInits(), false,
8939                                   Inits, &InitChanged))
8940     return ExprError();
8941 
8942   if (!getDerived().AlwaysRebuild() && !InitChanged) {
8943     // FIXME: Attempt to reuse the existing syntactic form of the InitListExpr
8944     // in some cases. We can't reuse it in general, because the syntactic and
8945     // semantic forms are linked, and we can't know that semantic form will
8946     // match even if the syntactic form does.
8947   }
8948 
8949   return getDerived().RebuildInitList(E->getLBraceLoc(), Inits,
8950                                       E->getRBraceLoc(), E->getType());
8951 }
8952 
8953 template<typename Derived>
8954 ExprResult
8955 TreeTransform<Derived>::TransformDesignatedInitExpr(DesignatedInitExpr *E) {
8956   Designation Desig;
8957 
8958   // transform the initializer value
8959   ExprResult Init = getDerived().TransformExpr(E->getInit());
8960   if (Init.isInvalid())
8961     return ExprError();
8962 
8963   // transform the designators.
8964   SmallVector<Expr*, 4> ArrayExprs;
8965   bool ExprChanged = false;
8966   for (const DesignatedInitExpr::Designator &D : E->designators()) {
8967     if (D.isFieldDesignator()) {
8968       Desig.AddDesignator(Designator::getField(D.getFieldName(),
8969                                                D.getDotLoc(),
8970                                                D.getFieldLoc()));
8971       if (D.getField()) {
8972         FieldDecl *Field = cast_or_null<FieldDecl>(
8973             getDerived().TransformDecl(D.getFieldLoc(), D.getField()));
8974         if (Field != D.getField())
8975           // Rebuild the expression when the transformed FieldDecl is
8976           // different to the already assigned FieldDecl.
8977           ExprChanged = true;
8978       } else {
8979         // Ensure that the designator expression is rebuilt when there isn't
8980         // a resolved FieldDecl in the designator as we don't want to assign
8981         // a FieldDecl to a pattern designator that will be instantiated again.
8982         ExprChanged = true;
8983       }
8984       continue;
8985     }
8986 
8987     if (D.isArrayDesignator()) {
8988       ExprResult Index = getDerived().TransformExpr(E->getArrayIndex(D));
8989       if (Index.isInvalid())
8990         return ExprError();
8991 
8992       Desig.AddDesignator(
8993           Designator::getArray(Index.get(), D.getLBracketLoc()));
8994 
8995       ExprChanged = ExprChanged || Init.get() != E->getArrayIndex(D);
8996       ArrayExprs.push_back(Index.get());
8997       continue;
8998     }
8999 
9000     assert(D.isArrayRangeDesignator() && "New kind of designator?");
9001     ExprResult Start
9002       = getDerived().TransformExpr(E->getArrayRangeStart(D));
9003     if (Start.isInvalid())
9004       return ExprError();
9005 
9006     ExprResult End = getDerived().TransformExpr(E->getArrayRangeEnd(D));
9007     if (End.isInvalid())
9008       return ExprError();
9009 
9010     Desig.AddDesignator(Designator::getArrayRange(Start.get(),
9011                                                   End.get(),
9012                                                   D.getLBracketLoc(),
9013                                                   D.getEllipsisLoc()));
9014 
9015     ExprChanged = ExprChanged || Start.get() != E->getArrayRangeStart(D) ||
9016                   End.get() != E->getArrayRangeEnd(D);
9017 
9018     ArrayExprs.push_back(Start.get());
9019     ArrayExprs.push_back(End.get());
9020   }
9021 
9022   if (!getDerived().AlwaysRebuild() &&
9023       Init.get() == E->getInit() &&
9024       !ExprChanged)
9025     return E;
9026 
9027   return getDerived().RebuildDesignatedInitExpr(Desig, ArrayExprs,
9028                                                 E->getEqualOrColonLoc(),
9029                                                 E->usesGNUSyntax(), Init.get());
9030 }
9031 
9032 // Seems that if TransformInitListExpr() only works on the syntactic form of an
9033 // InitListExpr, then a DesignatedInitUpdateExpr is not encountered.
9034 template<typename Derived>
9035 ExprResult
9036 TreeTransform<Derived>::TransformDesignatedInitUpdateExpr(
9037     DesignatedInitUpdateExpr *E) {
9038   llvm_unreachable("Unexpected DesignatedInitUpdateExpr in syntactic form of "
9039                    "initializer");
9040   return ExprError();
9041 }
9042 
9043 template<typename Derived>
9044 ExprResult
9045 TreeTransform<Derived>::TransformNoInitExpr(
9046     NoInitExpr *E) {
9047   llvm_unreachable("Unexpected NoInitExpr in syntactic form of initializer");
9048   return ExprError();
9049 }
9050 
9051 template<typename Derived>
9052 ExprResult
9053 TreeTransform<Derived>::TransformArrayInitLoopExpr(ArrayInitLoopExpr *E) {
9054   llvm_unreachable("Unexpected ArrayInitLoopExpr outside of initializer");
9055   return ExprError();
9056 }
9057 
9058 template<typename Derived>
9059 ExprResult
9060 TreeTransform<Derived>::TransformArrayInitIndexExpr(ArrayInitIndexExpr *E) {
9061   llvm_unreachable("Unexpected ArrayInitIndexExpr outside of initializer");
9062   return ExprError();
9063 }
9064 
9065 template<typename Derived>
9066 ExprResult
9067 TreeTransform<Derived>::TransformImplicitValueInitExpr(
9068                                                      ImplicitValueInitExpr *E) {
9069   TemporaryBase Rebase(*this, E->getLocStart(), DeclarationName());
9070 
9071   // FIXME: Will we ever have proper type location here? Will we actually
9072   // need to transform the type?
9073   QualType T = getDerived().TransformType(E->getType());
9074   if (T.isNull())
9075     return ExprError();
9076 
9077   if (!getDerived().AlwaysRebuild() &&
9078       T == E->getType())
9079     return E;
9080 
9081   return getDerived().RebuildImplicitValueInitExpr(T);
9082 }
9083 
9084 template<typename Derived>
9085 ExprResult
9086 TreeTransform<Derived>::TransformVAArgExpr(VAArgExpr *E) {
9087   TypeSourceInfo *TInfo = getDerived().TransformType(E->getWrittenTypeInfo());
9088   if (!TInfo)
9089     return ExprError();
9090 
9091   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
9092   if (SubExpr.isInvalid())
9093     return ExprError();
9094 
9095   if (!getDerived().AlwaysRebuild() &&
9096       TInfo == E->getWrittenTypeInfo() &&
9097       SubExpr.get() == E->getSubExpr())
9098     return E;
9099 
9100   return getDerived().RebuildVAArgExpr(E->getBuiltinLoc(), SubExpr.get(),
9101                                        TInfo, E->getRParenLoc());
9102 }
9103 
9104 template<typename Derived>
9105 ExprResult
9106 TreeTransform<Derived>::TransformParenListExpr(ParenListExpr *E) {
9107   bool ArgumentChanged = false;
9108   SmallVector<Expr*, 4> Inits;
9109   if (TransformExprs(E->getExprs(), E->getNumExprs(), true, Inits,
9110                      &ArgumentChanged))
9111     return ExprError();
9112 
9113   return getDerived().RebuildParenListExpr(E->getLParenLoc(),
9114                                            Inits,
9115                                            E->getRParenLoc());
9116 }
9117 
9118 /// \brief Transform an address-of-label expression.
9119 ///
9120 /// By default, the transformation of an address-of-label expression always
9121 /// rebuilds the expression, so that the label identifier can be resolved to
9122 /// the corresponding label statement by semantic analysis.
9123 template<typename Derived>
9124 ExprResult
9125 TreeTransform<Derived>::TransformAddrLabelExpr(AddrLabelExpr *E) {
9126   Decl *LD = getDerived().TransformDecl(E->getLabel()->getLocation(),
9127                                         E->getLabel());
9128   if (!LD)
9129     return ExprError();
9130 
9131   return getDerived().RebuildAddrLabelExpr(E->getAmpAmpLoc(), E->getLabelLoc(),
9132                                            cast<LabelDecl>(LD));
9133 }
9134 
9135 template<typename Derived>
9136 ExprResult
9137 TreeTransform<Derived>::TransformStmtExpr(StmtExpr *E) {
9138   SemaRef.ActOnStartStmtExpr();
9139   StmtResult SubStmt
9140     = getDerived().TransformCompoundStmt(E->getSubStmt(), true);
9141   if (SubStmt.isInvalid()) {
9142     SemaRef.ActOnStmtExprError();
9143     return ExprError();
9144   }
9145 
9146   if (!getDerived().AlwaysRebuild() &&
9147       SubStmt.get() == E->getSubStmt()) {
9148     // Calling this an 'error' is unintuitive, but it does the right thing.
9149     SemaRef.ActOnStmtExprError();
9150     return SemaRef.MaybeBindToTemporary(E);
9151   }
9152 
9153   return getDerived().RebuildStmtExpr(E->getLParenLoc(),
9154                                       SubStmt.get(),
9155                                       E->getRParenLoc());
9156 }
9157 
9158 template<typename Derived>
9159 ExprResult
9160 TreeTransform<Derived>::TransformChooseExpr(ChooseExpr *E) {
9161   ExprResult Cond = getDerived().TransformExpr(E->getCond());
9162   if (Cond.isInvalid())
9163     return ExprError();
9164 
9165   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
9166   if (LHS.isInvalid())
9167     return ExprError();
9168 
9169   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
9170   if (RHS.isInvalid())
9171     return ExprError();
9172 
9173   if (!getDerived().AlwaysRebuild() &&
9174       Cond.get() == E->getCond() &&
9175       LHS.get() == E->getLHS() &&
9176       RHS.get() == E->getRHS())
9177     return E;
9178 
9179   return getDerived().RebuildChooseExpr(E->getBuiltinLoc(),
9180                                         Cond.get(), LHS.get(), RHS.get(),
9181                                         E->getRParenLoc());
9182 }
9183 
9184 template<typename Derived>
9185 ExprResult
9186 TreeTransform<Derived>::TransformGNUNullExpr(GNUNullExpr *E) {
9187   return E;
9188 }
9189 
9190 template<typename Derived>
9191 ExprResult
9192 TreeTransform<Derived>::TransformCXXOperatorCallExpr(CXXOperatorCallExpr *E) {
9193   switch (E->getOperator()) {
9194   case OO_New:
9195   case OO_Delete:
9196   case OO_Array_New:
9197   case OO_Array_Delete:
9198     llvm_unreachable("new and delete operators cannot use CXXOperatorCallExpr");
9199 
9200   case OO_Call: {
9201     // This is a call to an object's operator().
9202     assert(E->getNumArgs() >= 1 && "Object call is missing arguments");
9203 
9204     // Transform the object itself.
9205     ExprResult Object = getDerived().TransformExpr(E->getArg(0));
9206     if (Object.isInvalid())
9207       return ExprError();
9208 
9209     // FIXME: Poor location information
9210     SourceLocation FakeLParenLoc = SemaRef.getLocForEndOfToken(
9211         static_cast<Expr *>(Object.get())->getLocEnd());
9212 
9213     // Transform the call arguments.
9214     SmallVector<Expr*, 8> Args;
9215     if (getDerived().TransformExprs(E->getArgs() + 1, E->getNumArgs() - 1, true,
9216                                     Args))
9217       return ExprError();
9218 
9219     return getDerived().RebuildCallExpr(Object.get(), FakeLParenLoc,
9220                                         Args,
9221                                         E->getLocEnd());
9222   }
9223 
9224 #define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly) \
9225   case OO_##Name:
9226 #define OVERLOADED_OPERATOR_MULTI(Name,Spelling,Unary,Binary,MemberOnly)
9227 #include "clang/Basic/OperatorKinds.def"
9228   case OO_Subscript:
9229     // Handled below.
9230     break;
9231 
9232   case OO_Conditional:
9233     llvm_unreachable("conditional operator is not actually overloadable");
9234 
9235   case OO_None:
9236   case NUM_OVERLOADED_OPERATORS:
9237     llvm_unreachable("not an overloaded operator?");
9238   }
9239 
9240   ExprResult Callee = getDerived().TransformExpr(E->getCallee());
9241   if (Callee.isInvalid())
9242     return ExprError();
9243 
9244   ExprResult First;
9245   if (E->getOperator() == OO_Amp)
9246     First = getDerived().TransformAddressOfOperand(E->getArg(0));
9247   else
9248     First = getDerived().TransformExpr(E->getArg(0));
9249   if (First.isInvalid())
9250     return ExprError();
9251 
9252   ExprResult Second;
9253   if (E->getNumArgs() == 2) {
9254     Second = getDerived().TransformExpr(E->getArg(1));
9255     if (Second.isInvalid())
9256       return ExprError();
9257   }
9258 
9259   if (!getDerived().AlwaysRebuild() &&
9260       Callee.get() == E->getCallee() &&
9261       First.get() == E->getArg(0) &&
9262       (E->getNumArgs() != 2 || Second.get() == E->getArg(1)))
9263     return SemaRef.MaybeBindToTemporary(E);
9264 
9265   Sema::FPContractStateRAII FPContractState(getSema());
9266   getSema().FPFeatures.fp_contract = E->isFPContractable();
9267 
9268   return getDerived().RebuildCXXOperatorCallExpr(E->getOperator(),
9269                                                  E->getOperatorLoc(),
9270                                                  Callee.get(),
9271                                                  First.get(),
9272                                                  Second.get());
9273 }
9274 
9275 template<typename Derived>
9276 ExprResult
9277 TreeTransform<Derived>::TransformCXXMemberCallExpr(CXXMemberCallExpr *E) {
9278   return getDerived().TransformCallExpr(E);
9279 }
9280 
9281 template<typename Derived>
9282 ExprResult
9283 TreeTransform<Derived>::TransformCUDAKernelCallExpr(CUDAKernelCallExpr *E) {
9284   // Transform the callee.
9285   ExprResult Callee = getDerived().TransformExpr(E->getCallee());
9286   if (Callee.isInvalid())
9287     return ExprError();
9288 
9289   // Transform exec config.
9290   ExprResult EC = getDerived().TransformCallExpr(E->getConfig());
9291   if (EC.isInvalid())
9292     return ExprError();
9293 
9294   // Transform arguments.
9295   bool ArgChanged = false;
9296   SmallVector<Expr*, 8> Args;
9297   if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
9298                                   &ArgChanged))
9299     return ExprError();
9300 
9301   if (!getDerived().AlwaysRebuild() &&
9302       Callee.get() == E->getCallee() &&
9303       !ArgChanged)
9304     return SemaRef.MaybeBindToTemporary(E);
9305 
9306   // FIXME: Wrong source location information for the '('.
9307   SourceLocation FakeLParenLoc
9308     = ((Expr *)Callee.get())->getSourceRange().getBegin();
9309   return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc,
9310                                       Args,
9311                                       E->getRParenLoc(), EC.get());
9312 }
9313 
9314 template<typename Derived>
9315 ExprResult
9316 TreeTransform<Derived>::TransformCXXNamedCastExpr(CXXNamedCastExpr *E) {
9317   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten());
9318   if (!Type)
9319     return ExprError();
9320 
9321   ExprResult SubExpr
9322     = getDerived().TransformExpr(E->getSubExprAsWritten());
9323   if (SubExpr.isInvalid())
9324     return ExprError();
9325 
9326   if (!getDerived().AlwaysRebuild() &&
9327       Type == E->getTypeInfoAsWritten() &&
9328       SubExpr.get() == E->getSubExpr())
9329     return E;
9330   return getDerived().RebuildCXXNamedCastExpr(
9331       E->getOperatorLoc(), E->getStmtClass(), E->getAngleBrackets().getBegin(),
9332       Type, E->getAngleBrackets().getEnd(),
9333       // FIXME. this should be '(' location
9334       E->getAngleBrackets().getEnd(), SubExpr.get(), E->getRParenLoc());
9335 }
9336 
9337 template<typename Derived>
9338 ExprResult
9339 TreeTransform<Derived>::TransformCXXStaticCastExpr(CXXStaticCastExpr *E) {
9340   return getDerived().TransformCXXNamedCastExpr(E);
9341 }
9342 
9343 template<typename Derived>
9344 ExprResult
9345 TreeTransform<Derived>::TransformCXXDynamicCastExpr(CXXDynamicCastExpr *E) {
9346   return getDerived().TransformCXXNamedCastExpr(E);
9347 }
9348 
9349 template<typename Derived>
9350 ExprResult
9351 TreeTransform<Derived>::TransformCXXReinterpretCastExpr(
9352                                                       CXXReinterpretCastExpr *E) {
9353   return getDerived().TransformCXXNamedCastExpr(E);
9354 }
9355 
9356 template<typename Derived>
9357 ExprResult
9358 TreeTransform<Derived>::TransformCXXConstCastExpr(CXXConstCastExpr *E) {
9359   return getDerived().TransformCXXNamedCastExpr(E);
9360 }
9361 
9362 template<typename Derived>
9363 ExprResult
9364 TreeTransform<Derived>::TransformCXXFunctionalCastExpr(
9365                                                      CXXFunctionalCastExpr *E) {
9366   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten());
9367   if (!Type)
9368     return ExprError();
9369 
9370   ExprResult SubExpr
9371     = getDerived().TransformExpr(E->getSubExprAsWritten());
9372   if (SubExpr.isInvalid())
9373     return ExprError();
9374 
9375   if (!getDerived().AlwaysRebuild() &&
9376       Type == E->getTypeInfoAsWritten() &&
9377       SubExpr.get() == E->getSubExpr())
9378     return E;
9379 
9380   return getDerived().RebuildCXXFunctionalCastExpr(Type,
9381                                                    E->getLParenLoc(),
9382                                                    SubExpr.get(),
9383                                                    E->getRParenLoc());
9384 }
9385 
9386 template<typename Derived>
9387 ExprResult
9388 TreeTransform<Derived>::TransformCXXTypeidExpr(CXXTypeidExpr *E) {
9389   if (E->isTypeOperand()) {
9390     TypeSourceInfo *TInfo
9391       = getDerived().TransformType(E->getTypeOperandSourceInfo());
9392     if (!TInfo)
9393       return ExprError();
9394 
9395     if (!getDerived().AlwaysRebuild() &&
9396         TInfo == E->getTypeOperandSourceInfo())
9397       return E;
9398 
9399     return getDerived().RebuildCXXTypeidExpr(E->getType(),
9400                                              E->getLocStart(),
9401                                              TInfo,
9402                                              E->getLocEnd());
9403   }
9404 
9405   // We don't know whether the subexpression is potentially evaluated until
9406   // after we perform semantic analysis.  We speculatively assume it is
9407   // unevaluated; it will get fixed later if the subexpression is in fact
9408   // potentially evaluated.
9409   EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated,
9410                                                Sema::ReuseLambdaContextDecl);
9411 
9412   ExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand());
9413   if (SubExpr.isInvalid())
9414     return ExprError();
9415 
9416   if (!getDerived().AlwaysRebuild() &&
9417       SubExpr.get() == E->getExprOperand())
9418     return E;
9419 
9420   return getDerived().RebuildCXXTypeidExpr(E->getType(),
9421                                            E->getLocStart(),
9422                                            SubExpr.get(),
9423                                            E->getLocEnd());
9424 }
9425 
9426 template<typename Derived>
9427 ExprResult
9428 TreeTransform<Derived>::TransformCXXUuidofExpr(CXXUuidofExpr *E) {
9429   if (E->isTypeOperand()) {
9430     TypeSourceInfo *TInfo
9431       = getDerived().TransformType(E->getTypeOperandSourceInfo());
9432     if (!TInfo)
9433       return ExprError();
9434 
9435     if (!getDerived().AlwaysRebuild() &&
9436         TInfo == E->getTypeOperandSourceInfo())
9437       return E;
9438 
9439     return getDerived().RebuildCXXUuidofExpr(E->getType(),
9440                                              E->getLocStart(),
9441                                              TInfo,
9442                                              E->getLocEnd());
9443   }
9444 
9445   EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated);
9446 
9447   ExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand());
9448   if (SubExpr.isInvalid())
9449     return ExprError();
9450 
9451   if (!getDerived().AlwaysRebuild() &&
9452       SubExpr.get() == E->getExprOperand())
9453     return E;
9454 
9455   return getDerived().RebuildCXXUuidofExpr(E->getType(),
9456                                            E->getLocStart(),
9457                                            SubExpr.get(),
9458                                            E->getLocEnd());
9459 }
9460 
9461 template<typename Derived>
9462 ExprResult
9463 TreeTransform<Derived>::TransformCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) {
9464   return E;
9465 }
9466 
9467 template<typename Derived>
9468 ExprResult
9469 TreeTransform<Derived>::TransformCXXNullPtrLiteralExpr(
9470                                                      CXXNullPtrLiteralExpr *E) {
9471   return E;
9472 }
9473 
9474 template<typename Derived>
9475 ExprResult
9476 TreeTransform<Derived>::TransformCXXThisExpr(CXXThisExpr *E) {
9477   QualType T = getSema().getCurrentThisType();
9478 
9479   if (!getDerived().AlwaysRebuild() && T == E->getType()) {
9480     // Make sure that we capture 'this'.
9481     getSema().CheckCXXThisCapture(E->getLocStart());
9482     return E;
9483   }
9484 
9485   return getDerived().RebuildCXXThisExpr(E->getLocStart(), T, E->isImplicit());
9486 }
9487 
9488 template<typename Derived>
9489 ExprResult
9490 TreeTransform<Derived>::TransformCXXThrowExpr(CXXThrowExpr *E) {
9491   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
9492   if (SubExpr.isInvalid())
9493     return ExprError();
9494 
9495   if (!getDerived().AlwaysRebuild() &&
9496       SubExpr.get() == E->getSubExpr())
9497     return E;
9498 
9499   return getDerived().RebuildCXXThrowExpr(E->getThrowLoc(), SubExpr.get(),
9500                                           E->isThrownVariableInScope());
9501 }
9502 
9503 template<typename Derived>
9504 ExprResult
9505 TreeTransform<Derived>::TransformCXXDefaultArgExpr(CXXDefaultArgExpr *E) {
9506   ParmVarDecl *Param
9507     = cast_or_null<ParmVarDecl>(getDerived().TransformDecl(E->getLocStart(),
9508                                                            E->getParam()));
9509   if (!Param)
9510     return ExprError();
9511 
9512   if (!getDerived().AlwaysRebuild() &&
9513       Param == E->getParam())
9514     return E;
9515 
9516   return getDerived().RebuildCXXDefaultArgExpr(E->getUsedLocation(), Param);
9517 }
9518 
9519 template<typename Derived>
9520 ExprResult
9521 TreeTransform<Derived>::TransformCXXDefaultInitExpr(CXXDefaultInitExpr *E) {
9522   FieldDecl *Field
9523     = cast_or_null<FieldDecl>(getDerived().TransformDecl(E->getLocStart(),
9524                                                          E->getField()));
9525   if (!Field)
9526     return ExprError();
9527 
9528   if (!getDerived().AlwaysRebuild() && Field == E->getField())
9529     return E;
9530 
9531   return getDerived().RebuildCXXDefaultInitExpr(E->getExprLoc(), Field);
9532 }
9533 
9534 template<typename Derived>
9535 ExprResult
9536 TreeTransform<Derived>::TransformCXXScalarValueInitExpr(
9537                                                     CXXScalarValueInitExpr *E) {
9538   TypeSourceInfo *T = getDerived().TransformType(E->getTypeSourceInfo());
9539   if (!T)
9540     return ExprError();
9541 
9542   if (!getDerived().AlwaysRebuild() &&
9543       T == E->getTypeSourceInfo())
9544     return E;
9545 
9546   return getDerived().RebuildCXXScalarValueInitExpr(T,
9547                                           /*FIXME:*/T->getTypeLoc().getEndLoc(),
9548                                                     E->getRParenLoc());
9549 }
9550 
9551 template<typename Derived>
9552 ExprResult
9553 TreeTransform<Derived>::TransformCXXNewExpr(CXXNewExpr *E) {
9554   // Transform the type that we're allocating
9555   TypeSourceInfo *AllocTypeInfo
9556     = getDerived().TransformType(E->getAllocatedTypeSourceInfo());
9557   if (!AllocTypeInfo)
9558     return ExprError();
9559 
9560   // Transform the size of the array we're allocating (if any).
9561   ExprResult ArraySize = getDerived().TransformExpr(E->getArraySize());
9562   if (ArraySize.isInvalid())
9563     return ExprError();
9564 
9565   // Transform the placement arguments (if any).
9566   bool ArgumentChanged = false;
9567   SmallVector<Expr*, 8> PlacementArgs;
9568   if (getDerived().TransformExprs(E->getPlacementArgs(),
9569                                   E->getNumPlacementArgs(), true,
9570                                   PlacementArgs, &ArgumentChanged))
9571     return ExprError();
9572 
9573   // Transform the initializer (if any).
9574   Expr *OldInit = E->getInitializer();
9575   ExprResult NewInit;
9576   if (OldInit)
9577     NewInit = getDerived().TransformInitializer(OldInit, true);
9578   if (NewInit.isInvalid())
9579     return ExprError();
9580 
9581   // Transform new operator and delete operator.
9582   FunctionDecl *OperatorNew = nullptr;
9583   if (E->getOperatorNew()) {
9584     OperatorNew = cast_or_null<FunctionDecl>(
9585                                  getDerived().TransformDecl(E->getLocStart(),
9586                                                          E->getOperatorNew()));
9587     if (!OperatorNew)
9588       return ExprError();
9589   }
9590 
9591   FunctionDecl *OperatorDelete = nullptr;
9592   if (E->getOperatorDelete()) {
9593     OperatorDelete = cast_or_null<FunctionDecl>(
9594                                    getDerived().TransformDecl(E->getLocStart(),
9595                                                        E->getOperatorDelete()));
9596     if (!OperatorDelete)
9597       return ExprError();
9598   }
9599 
9600   if (!getDerived().AlwaysRebuild() &&
9601       AllocTypeInfo == E->getAllocatedTypeSourceInfo() &&
9602       ArraySize.get() == E->getArraySize() &&
9603       NewInit.get() == OldInit &&
9604       OperatorNew == E->getOperatorNew() &&
9605       OperatorDelete == E->getOperatorDelete() &&
9606       !ArgumentChanged) {
9607     // Mark any declarations we need as referenced.
9608     // FIXME: instantiation-specific.
9609     if (OperatorNew)
9610       SemaRef.MarkFunctionReferenced(E->getLocStart(), OperatorNew);
9611     if (OperatorDelete)
9612       SemaRef.MarkFunctionReferenced(E->getLocStart(), OperatorDelete);
9613 
9614     if (E->isArray() && !E->getAllocatedType()->isDependentType()) {
9615       QualType ElementType
9616         = SemaRef.Context.getBaseElementType(E->getAllocatedType());
9617       if (const RecordType *RecordT = ElementType->getAs<RecordType>()) {
9618         CXXRecordDecl *Record = cast<CXXRecordDecl>(RecordT->getDecl());
9619         if (CXXDestructorDecl *Destructor = SemaRef.LookupDestructor(Record)) {
9620           SemaRef.MarkFunctionReferenced(E->getLocStart(), Destructor);
9621         }
9622       }
9623     }
9624 
9625     return E;
9626   }
9627 
9628   QualType AllocType = AllocTypeInfo->getType();
9629   if (!ArraySize.get()) {
9630     // If no array size was specified, but the new expression was
9631     // instantiated with an array type (e.g., "new T" where T is
9632     // instantiated with "int[4]"), extract the outer bound from the
9633     // array type as our array size. We do this with constant and
9634     // dependently-sized array types.
9635     const ArrayType *ArrayT = SemaRef.Context.getAsArrayType(AllocType);
9636     if (!ArrayT) {
9637       // Do nothing
9638     } else if (const ConstantArrayType *ConsArrayT
9639                                      = dyn_cast<ConstantArrayType>(ArrayT)) {
9640       ArraySize = IntegerLiteral::Create(SemaRef.Context, ConsArrayT->getSize(),
9641                                          SemaRef.Context.getSizeType(),
9642                                          /*FIXME:*/ E->getLocStart());
9643       AllocType = ConsArrayT->getElementType();
9644     } else if (const DependentSizedArrayType *DepArrayT
9645                               = dyn_cast<DependentSizedArrayType>(ArrayT)) {
9646       if (DepArrayT->getSizeExpr()) {
9647         ArraySize = DepArrayT->getSizeExpr();
9648         AllocType = DepArrayT->getElementType();
9649       }
9650     }
9651   }
9652 
9653   return getDerived().RebuildCXXNewExpr(E->getLocStart(),
9654                                         E->isGlobalNew(),
9655                                         /*FIXME:*/E->getLocStart(),
9656                                         PlacementArgs,
9657                                         /*FIXME:*/E->getLocStart(),
9658                                         E->getTypeIdParens(),
9659                                         AllocType,
9660                                         AllocTypeInfo,
9661                                         ArraySize.get(),
9662                                         E->getDirectInitRange(),
9663                                         NewInit.get());
9664 }
9665 
9666 template<typename Derived>
9667 ExprResult
9668 TreeTransform<Derived>::TransformCXXDeleteExpr(CXXDeleteExpr *E) {
9669   ExprResult Operand = getDerived().TransformExpr(E->getArgument());
9670   if (Operand.isInvalid())
9671     return ExprError();
9672 
9673   // Transform the delete operator, if known.
9674   FunctionDecl *OperatorDelete = nullptr;
9675   if (E->getOperatorDelete()) {
9676     OperatorDelete = cast_or_null<FunctionDecl>(
9677                                    getDerived().TransformDecl(E->getLocStart(),
9678                                                        E->getOperatorDelete()));
9679     if (!OperatorDelete)
9680       return ExprError();
9681   }
9682 
9683   if (!getDerived().AlwaysRebuild() &&
9684       Operand.get() == E->getArgument() &&
9685       OperatorDelete == E->getOperatorDelete()) {
9686     // Mark any declarations we need as referenced.
9687     // FIXME: instantiation-specific.
9688     if (OperatorDelete)
9689       SemaRef.MarkFunctionReferenced(E->getLocStart(), OperatorDelete);
9690 
9691     if (!E->getArgument()->isTypeDependent()) {
9692       QualType Destroyed = SemaRef.Context.getBaseElementType(
9693                                                          E->getDestroyedType());
9694       if (const RecordType *DestroyedRec = Destroyed->getAs<RecordType>()) {
9695         CXXRecordDecl *Record = cast<CXXRecordDecl>(DestroyedRec->getDecl());
9696         SemaRef.MarkFunctionReferenced(E->getLocStart(),
9697                                        SemaRef.LookupDestructor(Record));
9698       }
9699     }
9700 
9701     return E;
9702   }
9703 
9704   return getDerived().RebuildCXXDeleteExpr(E->getLocStart(),
9705                                            E->isGlobalDelete(),
9706                                            E->isArrayForm(),
9707                                            Operand.get());
9708 }
9709 
9710 template<typename Derived>
9711 ExprResult
9712 TreeTransform<Derived>::TransformCXXPseudoDestructorExpr(
9713                                                      CXXPseudoDestructorExpr *E) {
9714   ExprResult Base = getDerived().TransformExpr(E->getBase());
9715   if (Base.isInvalid())
9716     return ExprError();
9717 
9718   ParsedType ObjectTypePtr;
9719   bool MayBePseudoDestructor = false;
9720   Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(),
9721                                               E->getOperatorLoc(),
9722                                         E->isArrow()? tok::arrow : tok::period,
9723                                               ObjectTypePtr,
9724                                               MayBePseudoDestructor);
9725   if (Base.isInvalid())
9726     return ExprError();
9727 
9728   QualType ObjectType = ObjectTypePtr.get();
9729   NestedNameSpecifierLoc QualifierLoc = E->getQualifierLoc();
9730   if (QualifierLoc) {
9731     QualifierLoc
9732       = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc, ObjectType);
9733     if (!QualifierLoc)
9734       return ExprError();
9735   }
9736   CXXScopeSpec SS;
9737   SS.Adopt(QualifierLoc);
9738 
9739   PseudoDestructorTypeStorage Destroyed;
9740   if (E->getDestroyedTypeInfo()) {
9741     TypeSourceInfo *DestroyedTypeInfo
9742       = getDerived().TransformTypeInObjectScope(E->getDestroyedTypeInfo(),
9743                                                 ObjectType, nullptr, SS);
9744     if (!DestroyedTypeInfo)
9745       return ExprError();
9746     Destroyed = DestroyedTypeInfo;
9747   } else if (!ObjectType.isNull() && ObjectType->isDependentType()) {
9748     // We aren't likely to be able to resolve the identifier down to a type
9749     // now anyway, so just retain the identifier.
9750     Destroyed = PseudoDestructorTypeStorage(E->getDestroyedTypeIdentifier(),
9751                                             E->getDestroyedTypeLoc());
9752   } else {
9753     // Look for a destructor known with the given name.
9754     ParsedType T = SemaRef.getDestructorName(E->getTildeLoc(),
9755                                               *E->getDestroyedTypeIdentifier(),
9756                                                 E->getDestroyedTypeLoc(),
9757                                                 /*Scope=*/nullptr,
9758                                                 SS, ObjectTypePtr,
9759                                                 false);
9760     if (!T)
9761       return ExprError();
9762 
9763     Destroyed
9764       = SemaRef.Context.getTrivialTypeSourceInfo(SemaRef.GetTypeFromParser(T),
9765                                                  E->getDestroyedTypeLoc());
9766   }
9767 
9768   TypeSourceInfo *ScopeTypeInfo = nullptr;
9769   if (E->getScopeTypeInfo()) {
9770     CXXScopeSpec EmptySS;
9771     ScopeTypeInfo = getDerived().TransformTypeInObjectScope(
9772                       E->getScopeTypeInfo(), ObjectType, nullptr, EmptySS);
9773     if (!ScopeTypeInfo)
9774       return ExprError();
9775   }
9776 
9777   return getDerived().RebuildCXXPseudoDestructorExpr(Base.get(),
9778                                                      E->getOperatorLoc(),
9779                                                      E->isArrow(),
9780                                                      SS,
9781                                                      ScopeTypeInfo,
9782                                                      E->getColonColonLoc(),
9783                                                      E->getTildeLoc(),
9784                                                      Destroyed);
9785 }
9786 
9787 template<typename Derived>
9788 ExprResult
9789 TreeTransform<Derived>::TransformUnresolvedLookupExpr(
9790                                                   UnresolvedLookupExpr *Old) {
9791   LookupResult R(SemaRef, Old->getName(), Old->getNameLoc(),
9792                  Sema::LookupOrdinaryName);
9793 
9794   // Transform all the decls.
9795   for (UnresolvedLookupExpr::decls_iterator I = Old->decls_begin(),
9796          E = Old->decls_end(); I != E; ++I) {
9797     NamedDecl *InstD = static_cast<NamedDecl*>(
9798                                  getDerived().TransformDecl(Old->getNameLoc(),
9799                                                             *I));
9800     if (!InstD) {
9801       // Silently ignore these if a UsingShadowDecl instantiated to nothing.
9802       // This can happen because of dependent hiding.
9803       if (isa<UsingShadowDecl>(*I))
9804         continue;
9805       else {
9806         R.clear();
9807         return ExprError();
9808       }
9809     }
9810 
9811     // Expand using declarations.
9812     if (isa<UsingDecl>(InstD)) {
9813       UsingDecl *UD = cast<UsingDecl>(InstD);
9814       for (auto *I : UD->shadows())
9815         R.addDecl(I);
9816       continue;
9817     }
9818 
9819     R.addDecl(InstD);
9820   }
9821 
9822   // Resolve a kind, but don't do any further analysis.  If it's
9823   // ambiguous, the callee needs to deal with it.
9824   R.resolveKind();
9825 
9826   // Rebuild the nested-name qualifier, if present.
9827   CXXScopeSpec SS;
9828   if (Old->getQualifierLoc()) {
9829     NestedNameSpecifierLoc QualifierLoc
9830       = getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc());
9831     if (!QualifierLoc)
9832       return ExprError();
9833 
9834     SS.Adopt(QualifierLoc);
9835   }
9836 
9837   if (Old->getNamingClass()) {
9838     CXXRecordDecl *NamingClass
9839       = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl(
9840                                                             Old->getNameLoc(),
9841                                                         Old->getNamingClass()));
9842     if (!NamingClass) {
9843       R.clear();
9844       return ExprError();
9845     }
9846 
9847     R.setNamingClass(NamingClass);
9848   }
9849 
9850   SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc();
9851 
9852   // If we have neither explicit template arguments, nor the template keyword,
9853   // it's a normal declaration name or member reference.
9854   if (!Old->hasExplicitTemplateArgs() && !TemplateKWLoc.isValid()) {
9855     NamedDecl *D = R.getAsSingle<NamedDecl>();
9856     // In a C++11 unevaluated context, an UnresolvedLookupExpr might refer to an
9857     // instance member. In other contexts, BuildPossibleImplicitMemberExpr will
9858     // give a good diagnostic.
9859     if (D && D->isCXXInstanceMember()) {
9860       return SemaRef.BuildPossibleImplicitMemberExpr(SS, TemplateKWLoc, R,
9861                                                      /*TemplateArgs=*/nullptr,
9862                                                      /*Scope=*/nullptr);
9863     }
9864 
9865     return getDerived().RebuildDeclarationNameExpr(SS, R, Old->requiresADL());
9866   }
9867 
9868   // If we have template arguments, rebuild them, then rebuild the
9869   // templateid expression.
9870   TemplateArgumentListInfo TransArgs(Old->getLAngleLoc(), Old->getRAngleLoc());
9871   if (Old->hasExplicitTemplateArgs() &&
9872       getDerived().TransformTemplateArguments(Old->getTemplateArgs(),
9873                                               Old->getNumTemplateArgs(),
9874                                               TransArgs)) {
9875     R.clear();
9876     return ExprError();
9877   }
9878 
9879   return getDerived().RebuildTemplateIdExpr(SS, TemplateKWLoc, R,
9880                                             Old->requiresADL(), &TransArgs);
9881 }
9882 
9883 template<typename Derived>
9884 ExprResult
9885 TreeTransform<Derived>::TransformTypeTraitExpr(TypeTraitExpr *E) {
9886   bool ArgChanged = false;
9887   SmallVector<TypeSourceInfo *, 4> Args;
9888   for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) {
9889     TypeSourceInfo *From = E->getArg(I);
9890     TypeLoc FromTL = From->getTypeLoc();
9891     if (!FromTL.getAs<PackExpansionTypeLoc>()) {
9892       TypeLocBuilder TLB;
9893       TLB.reserve(FromTL.getFullDataSize());
9894       QualType To = getDerived().TransformType(TLB, FromTL);
9895       if (To.isNull())
9896         return ExprError();
9897 
9898       if (To == From->getType())
9899         Args.push_back(From);
9900       else {
9901         Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
9902         ArgChanged = true;
9903       }
9904       continue;
9905     }
9906 
9907     ArgChanged = true;
9908 
9909     // We have a pack expansion. Instantiate it.
9910     PackExpansionTypeLoc ExpansionTL = FromTL.castAs<PackExpansionTypeLoc>();
9911     TypeLoc PatternTL = ExpansionTL.getPatternLoc();
9912     SmallVector<UnexpandedParameterPack, 2> Unexpanded;
9913     SemaRef.collectUnexpandedParameterPacks(PatternTL, Unexpanded);
9914 
9915     // Determine whether the set of unexpanded parameter packs can and should
9916     // be expanded.
9917     bool Expand = true;
9918     bool RetainExpansion = false;
9919     Optional<unsigned> OrigNumExpansions =
9920         ExpansionTL.getTypePtr()->getNumExpansions();
9921     Optional<unsigned> NumExpansions = OrigNumExpansions;
9922     if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(),
9923                                              PatternTL.getSourceRange(),
9924                                              Unexpanded,
9925                                              Expand, RetainExpansion,
9926                                              NumExpansions))
9927       return ExprError();
9928 
9929     if (!Expand) {
9930       // The transform has determined that we should perform a simple
9931       // transformation on the pack expansion, producing another pack
9932       // expansion.
9933       Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
9934 
9935       TypeLocBuilder TLB;
9936       TLB.reserve(From->getTypeLoc().getFullDataSize());
9937 
9938       QualType To = getDerived().TransformType(TLB, PatternTL);
9939       if (To.isNull())
9940         return ExprError();
9941 
9942       To = getDerived().RebuildPackExpansionType(To,
9943                                                  PatternTL.getSourceRange(),
9944                                                  ExpansionTL.getEllipsisLoc(),
9945                                                  NumExpansions);
9946       if (To.isNull())
9947         return ExprError();
9948 
9949       PackExpansionTypeLoc ToExpansionTL
9950         = TLB.push<PackExpansionTypeLoc>(To);
9951       ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc());
9952       Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
9953       continue;
9954     }
9955 
9956     // Expand the pack expansion by substituting for each argument in the
9957     // pack(s).
9958     for (unsigned I = 0; I != *NumExpansions; ++I) {
9959       Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(SemaRef, I);
9960       TypeLocBuilder TLB;
9961       TLB.reserve(PatternTL.getFullDataSize());
9962       QualType To = getDerived().TransformType(TLB, PatternTL);
9963       if (To.isNull())
9964         return ExprError();
9965 
9966       if (To->containsUnexpandedParameterPack()) {
9967         To = getDerived().RebuildPackExpansionType(To,
9968                                                    PatternTL.getSourceRange(),
9969                                                    ExpansionTL.getEllipsisLoc(),
9970                                                    NumExpansions);
9971         if (To.isNull())
9972           return ExprError();
9973 
9974         PackExpansionTypeLoc ToExpansionTL
9975           = TLB.push<PackExpansionTypeLoc>(To);
9976         ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc());
9977       }
9978 
9979       Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
9980     }
9981 
9982     if (!RetainExpansion)
9983       continue;
9984 
9985     // If we're supposed to retain a pack expansion, do so by temporarily
9986     // forgetting the partially-substituted parameter pack.
9987     ForgetPartiallySubstitutedPackRAII Forget(getDerived());
9988 
9989     TypeLocBuilder TLB;
9990     TLB.reserve(From->getTypeLoc().getFullDataSize());
9991 
9992     QualType To = getDerived().TransformType(TLB, PatternTL);
9993     if (To.isNull())
9994       return ExprError();
9995 
9996     To = getDerived().RebuildPackExpansionType(To,
9997                                                PatternTL.getSourceRange(),
9998                                                ExpansionTL.getEllipsisLoc(),
9999                                                NumExpansions);
10000     if (To.isNull())
10001       return ExprError();
10002 
10003     PackExpansionTypeLoc ToExpansionTL
10004       = TLB.push<PackExpansionTypeLoc>(To);
10005     ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc());
10006     Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
10007   }
10008 
10009   if (!getDerived().AlwaysRebuild() && !ArgChanged)
10010     return E;
10011 
10012   return getDerived().RebuildTypeTrait(E->getTrait(),
10013                                        E->getLocStart(),
10014                                        Args,
10015                                        E->getLocEnd());
10016 }
10017 
10018 template<typename Derived>
10019 ExprResult
10020 TreeTransform<Derived>::TransformArrayTypeTraitExpr(ArrayTypeTraitExpr *E) {
10021   TypeSourceInfo *T = getDerived().TransformType(E->getQueriedTypeSourceInfo());
10022   if (!T)
10023     return ExprError();
10024 
10025   if (!getDerived().AlwaysRebuild() &&
10026       T == E->getQueriedTypeSourceInfo())
10027     return E;
10028 
10029   ExprResult SubExpr;
10030   {
10031     EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated);
10032     SubExpr = getDerived().TransformExpr(E->getDimensionExpression());
10033     if (SubExpr.isInvalid())
10034       return ExprError();
10035 
10036     if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getDimensionExpression())
10037       return E;
10038   }
10039 
10040   return getDerived().RebuildArrayTypeTrait(E->getTrait(),
10041                                             E->getLocStart(),
10042                                             T,
10043                                             SubExpr.get(),
10044                                             E->getLocEnd());
10045 }
10046 
10047 template<typename Derived>
10048 ExprResult
10049 TreeTransform<Derived>::TransformExpressionTraitExpr(ExpressionTraitExpr *E) {
10050   ExprResult SubExpr;
10051   {
10052     EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated);
10053     SubExpr = getDerived().TransformExpr(E->getQueriedExpression());
10054     if (SubExpr.isInvalid())
10055       return ExprError();
10056 
10057     if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getQueriedExpression())
10058       return E;
10059   }
10060 
10061   return getDerived().RebuildExpressionTrait(
10062       E->getTrait(), E->getLocStart(), SubExpr.get(), E->getLocEnd());
10063 }
10064 
10065 template <typename Derived>
10066 ExprResult TreeTransform<Derived>::TransformParenDependentScopeDeclRefExpr(
10067     ParenExpr *PE, DependentScopeDeclRefExpr *DRE, bool AddrTaken,
10068     TypeSourceInfo **RecoveryTSI) {
10069   ExprResult NewDRE = getDerived().TransformDependentScopeDeclRefExpr(
10070       DRE, AddrTaken, RecoveryTSI);
10071 
10072   // Propagate both errors and recovered types, which return ExprEmpty.
10073   if (!NewDRE.isUsable())
10074     return NewDRE;
10075 
10076   // We got an expr, wrap it up in parens.
10077   if (!getDerived().AlwaysRebuild() && NewDRE.get() == DRE)
10078     return PE;
10079   return getDerived().RebuildParenExpr(NewDRE.get(), PE->getLParen(),
10080                                        PE->getRParen());
10081 }
10082 
10083 template <typename Derived>
10084 ExprResult TreeTransform<Derived>::TransformDependentScopeDeclRefExpr(
10085     DependentScopeDeclRefExpr *E) {
10086   return TransformDependentScopeDeclRefExpr(E, /*IsAddressOfOperand=*/false,
10087                                             nullptr);
10088 }
10089 
10090 template<typename Derived>
10091 ExprResult
10092 TreeTransform<Derived>::TransformDependentScopeDeclRefExpr(
10093                                                DependentScopeDeclRefExpr *E,
10094                                                bool IsAddressOfOperand,
10095                                                TypeSourceInfo **RecoveryTSI) {
10096   assert(E->getQualifierLoc());
10097   NestedNameSpecifierLoc QualifierLoc
10098   = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
10099   if (!QualifierLoc)
10100     return ExprError();
10101   SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc();
10102 
10103   // TODO: If this is a conversion-function-id, verify that the
10104   // destination type name (if present) resolves the same way after
10105   // instantiation as it did in the local scope.
10106 
10107   DeclarationNameInfo NameInfo
10108     = getDerived().TransformDeclarationNameInfo(E->getNameInfo());
10109   if (!NameInfo.getName())
10110     return ExprError();
10111 
10112   if (!E->hasExplicitTemplateArgs()) {
10113     if (!getDerived().AlwaysRebuild() &&
10114         QualifierLoc == E->getQualifierLoc() &&
10115         // Note: it is sufficient to compare the Name component of NameInfo:
10116         // if name has not changed, DNLoc has not changed either.
10117         NameInfo.getName() == E->getDeclName())
10118       return E;
10119 
10120     return getDerived().RebuildDependentScopeDeclRefExpr(
10121         QualifierLoc, TemplateKWLoc, NameInfo, /*TemplateArgs=*/nullptr,
10122         IsAddressOfOperand, RecoveryTSI);
10123   }
10124 
10125   TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc());
10126   if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
10127                                               E->getNumTemplateArgs(),
10128                                               TransArgs))
10129     return ExprError();
10130 
10131   return getDerived().RebuildDependentScopeDeclRefExpr(
10132       QualifierLoc, TemplateKWLoc, NameInfo, &TransArgs, IsAddressOfOperand,
10133       RecoveryTSI);
10134 }
10135 
10136 template<typename Derived>
10137 ExprResult
10138 TreeTransform<Derived>::TransformCXXConstructExpr(CXXConstructExpr *E) {
10139   // CXXConstructExprs other than for list-initialization and
10140   // CXXTemporaryObjectExpr are always implicit, so when we have
10141   // a 1-argument construction we just transform that argument.
10142   if ((E->getNumArgs() == 1 ||
10143        (E->getNumArgs() > 1 && getDerived().DropCallArgument(E->getArg(1)))) &&
10144       (!getDerived().DropCallArgument(E->getArg(0))) &&
10145       !E->isListInitialization())
10146     return getDerived().TransformExpr(E->getArg(0));
10147 
10148   TemporaryBase Rebase(*this, /*FIXME*/E->getLocStart(), DeclarationName());
10149 
10150   QualType T = getDerived().TransformType(E->getType());
10151   if (T.isNull())
10152     return ExprError();
10153 
10154   CXXConstructorDecl *Constructor
10155     = cast_or_null<CXXConstructorDecl>(
10156                                 getDerived().TransformDecl(E->getLocStart(),
10157                                                          E->getConstructor()));
10158   if (!Constructor)
10159     return ExprError();
10160 
10161   bool ArgumentChanged = false;
10162   SmallVector<Expr*, 8> Args;
10163   if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
10164                                   &ArgumentChanged))
10165     return ExprError();
10166 
10167   if (!getDerived().AlwaysRebuild() &&
10168       T == E->getType() &&
10169       Constructor == E->getConstructor() &&
10170       !ArgumentChanged) {
10171     // Mark the constructor as referenced.
10172     // FIXME: Instantiation-specific
10173     SemaRef.MarkFunctionReferenced(E->getLocStart(), Constructor);
10174     return E;
10175   }
10176 
10177   return getDerived().RebuildCXXConstructExpr(T, /*FIXME:*/E->getLocStart(),
10178                                               Constructor,
10179                                               E->isElidable(), Args,
10180                                               E->hadMultipleCandidates(),
10181                                               E->isListInitialization(),
10182                                               E->isStdInitListInitialization(),
10183                                               E->requiresZeroInitialization(),
10184                                               E->getConstructionKind(),
10185                                               E->getParenOrBraceRange());
10186 }
10187 
10188 template<typename Derived>
10189 ExprResult TreeTransform<Derived>::TransformCXXInheritedCtorInitExpr(
10190     CXXInheritedCtorInitExpr *E) {
10191   QualType T = getDerived().TransformType(E->getType());
10192   if (T.isNull())
10193     return ExprError();
10194 
10195   CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>(
10196       getDerived().TransformDecl(E->getLocStart(), E->getConstructor()));
10197   if (!Constructor)
10198     return ExprError();
10199 
10200   if (!getDerived().AlwaysRebuild() &&
10201       T == E->getType() &&
10202       Constructor == E->getConstructor()) {
10203     // Mark the constructor as referenced.
10204     // FIXME: Instantiation-specific
10205     SemaRef.MarkFunctionReferenced(E->getLocStart(), Constructor);
10206     return E;
10207   }
10208 
10209   return getDerived().RebuildCXXInheritedCtorInitExpr(
10210       T, E->getLocation(), Constructor,
10211       E->constructsVBase(), E->inheritedFromVBase());
10212 }
10213 
10214 /// \brief Transform a C++ temporary-binding expression.
10215 ///
10216 /// Since CXXBindTemporaryExpr nodes are implicitly generated, we just
10217 /// transform the subexpression and return that.
10218 template<typename Derived>
10219 ExprResult
10220 TreeTransform<Derived>::TransformCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) {
10221   return getDerived().TransformExpr(E->getSubExpr());
10222 }
10223 
10224 /// \brief Transform a C++ expression that contains cleanups that should
10225 /// be run after the expression is evaluated.
10226 ///
10227 /// Since ExprWithCleanups nodes are implicitly generated, we
10228 /// just transform the subexpression and return that.
10229 template<typename Derived>
10230 ExprResult
10231 TreeTransform<Derived>::TransformExprWithCleanups(ExprWithCleanups *E) {
10232   return getDerived().TransformExpr(E->getSubExpr());
10233 }
10234 
10235 template<typename Derived>
10236 ExprResult
10237 TreeTransform<Derived>::TransformCXXTemporaryObjectExpr(
10238                                                     CXXTemporaryObjectExpr *E) {
10239   TypeSourceInfo *T = getDerived().TransformType(E->getTypeSourceInfo());
10240   if (!T)
10241     return ExprError();
10242 
10243   CXXConstructorDecl *Constructor
10244     = cast_or_null<CXXConstructorDecl>(
10245                                   getDerived().TransformDecl(E->getLocStart(),
10246                                                          E->getConstructor()));
10247   if (!Constructor)
10248     return ExprError();
10249 
10250   bool ArgumentChanged = false;
10251   SmallVector<Expr*, 8> Args;
10252   Args.reserve(E->getNumArgs());
10253   if (TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
10254                      &ArgumentChanged))
10255     return ExprError();
10256 
10257   if (!getDerived().AlwaysRebuild() &&
10258       T == E->getTypeSourceInfo() &&
10259       Constructor == E->getConstructor() &&
10260       !ArgumentChanged) {
10261     // FIXME: Instantiation-specific
10262     SemaRef.MarkFunctionReferenced(E->getLocStart(), Constructor);
10263     return SemaRef.MaybeBindToTemporary(E);
10264   }
10265 
10266   // FIXME: Pass in E->isListInitialization().
10267   return getDerived().RebuildCXXTemporaryObjectExpr(T,
10268                                           /*FIXME:*/T->getTypeLoc().getEndLoc(),
10269                                                     Args,
10270                                                     E->getLocEnd());
10271 }
10272 
10273 template<typename Derived>
10274 ExprResult
10275 TreeTransform<Derived>::TransformLambdaExpr(LambdaExpr *E) {
10276   // Transform any init-capture expressions before entering the scope of the
10277   // lambda body, because they are not semantically within that scope.
10278   typedef std::pair<ExprResult, QualType> InitCaptureInfoTy;
10279   SmallVector<InitCaptureInfoTy, 8> InitCaptureExprsAndTypes;
10280   InitCaptureExprsAndTypes.resize(E->explicit_capture_end() -
10281                                   E->explicit_capture_begin());
10282   for (LambdaExpr::capture_iterator C = E->capture_begin(),
10283                                     CEnd = E->capture_end();
10284        C != CEnd; ++C) {
10285     if (!E->isInitCapture(C))
10286       continue;
10287     EnterExpressionEvaluationContext EEEC(getSema(),
10288                                           Sema::PotentiallyEvaluated);
10289     ExprResult NewExprInitResult = getDerived().TransformInitializer(
10290         C->getCapturedVar()->getInit(),
10291         C->getCapturedVar()->getInitStyle() == VarDecl::CallInit);
10292 
10293     if (NewExprInitResult.isInvalid())
10294       return ExprError();
10295     Expr *NewExprInit = NewExprInitResult.get();
10296 
10297     VarDecl *OldVD = C->getCapturedVar();
10298     QualType NewInitCaptureType =
10299         getSema().buildLambdaInitCaptureInitialization(
10300             C->getLocation(), OldVD->getType()->isReferenceType(),
10301             OldVD->getIdentifier(),
10302             C->getCapturedVar()->getInitStyle() != VarDecl::CInit, NewExprInit);
10303     NewExprInitResult = NewExprInit;
10304     InitCaptureExprsAndTypes[C - E->capture_begin()] =
10305         std::make_pair(NewExprInitResult, NewInitCaptureType);
10306   }
10307 
10308   // Transform the template parameters, and add them to the current
10309   // instantiation scope. The null case is handled correctly.
10310   auto TPL = getDerived().TransformTemplateParameterList(
10311       E->getTemplateParameterList());
10312 
10313   // Transform the type of the original lambda's call operator.
10314   // The transformation MUST be done in the CurrentInstantiationScope since
10315   // it introduces a mapping of the original to the newly created
10316   // transformed parameters.
10317   TypeSourceInfo *NewCallOpTSI = nullptr;
10318   {
10319     TypeSourceInfo *OldCallOpTSI = E->getCallOperator()->getTypeSourceInfo();
10320     FunctionProtoTypeLoc OldCallOpFPTL =
10321         OldCallOpTSI->getTypeLoc().getAs<FunctionProtoTypeLoc>();
10322 
10323     TypeLocBuilder NewCallOpTLBuilder;
10324     SmallVector<QualType, 4> ExceptionStorage;
10325     TreeTransform *This = this; // Work around gcc.gnu.org/PR56135.
10326     QualType NewCallOpType = TransformFunctionProtoType(
10327         NewCallOpTLBuilder, OldCallOpFPTL, nullptr, 0,
10328         [&](FunctionProtoType::ExceptionSpecInfo &ESI, bool &Changed) {
10329           return This->TransformExceptionSpec(OldCallOpFPTL.getBeginLoc(), ESI,
10330                                               ExceptionStorage, Changed);
10331         });
10332     if (NewCallOpType.isNull())
10333       return ExprError();
10334     NewCallOpTSI = NewCallOpTLBuilder.getTypeSourceInfo(getSema().Context,
10335                                                         NewCallOpType);
10336   }
10337 
10338   LambdaScopeInfo *LSI = getSema().PushLambdaScope();
10339   Sema::FunctionScopeRAII FuncScopeCleanup(getSema());
10340   LSI->GLTemplateParameterList = TPL;
10341 
10342   // Create the local class that will describe the lambda.
10343   CXXRecordDecl *Class
10344     = getSema().createLambdaClosureType(E->getIntroducerRange(),
10345                                         NewCallOpTSI,
10346                                         /*KnownDependent=*/false,
10347                                         E->getCaptureDefault());
10348   getDerived().transformedLocalDecl(E->getLambdaClass(), Class);
10349 
10350   // Build the call operator.
10351   CXXMethodDecl *NewCallOperator = getSema().startLambdaDefinition(
10352       Class, E->getIntroducerRange(), NewCallOpTSI,
10353       E->getCallOperator()->getLocEnd(),
10354       NewCallOpTSI->getTypeLoc().castAs<FunctionProtoTypeLoc>().getParams(),
10355       E->getCallOperator()->isConstexpr());
10356 
10357   LSI->CallOperator = NewCallOperator;
10358 
10359   getDerived().transformAttrs(E->getCallOperator(), NewCallOperator);
10360   getDerived().transformedLocalDecl(E->getCallOperator(), NewCallOperator);
10361 
10362   // Introduce the context of the call operator.
10363   Sema::ContextRAII SavedContext(getSema(), NewCallOperator,
10364                                  /*NewThisContext*/false);
10365 
10366   // Enter the scope of the lambda.
10367   getSema().buildLambdaScope(LSI, NewCallOperator,
10368                              E->getIntroducerRange(),
10369                              E->getCaptureDefault(),
10370                              E->getCaptureDefaultLoc(),
10371                              E->hasExplicitParameters(),
10372                              E->hasExplicitResultType(),
10373                              E->isMutable());
10374 
10375   bool Invalid = false;
10376 
10377   // Transform captures.
10378   bool FinishedExplicitCaptures = false;
10379   for (LambdaExpr::capture_iterator C = E->capture_begin(),
10380                                  CEnd = E->capture_end();
10381        C != CEnd; ++C) {
10382     // When we hit the first implicit capture, tell Sema that we've finished
10383     // the list of explicit captures.
10384     if (!FinishedExplicitCaptures && C->isImplicit()) {
10385       getSema().finishLambdaExplicitCaptures(LSI);
10386       FinishedExplicitCaptures = true;
10387     }
10388 
10389     // Capturing 'this' is trivial.
10390     if (C->capturesThis()) {
10391       getSema().CheckCXXThisCapture(C->getLocation(), C->isExplicit(),
10392                                     /*BuildAndDiagnose*/ true, nullptr,
10393                                     C->getCaptureKind() == LCK_StarThis);
10394       continue;
10395     }
10396     // Captured expression will be recaptured during captured variables
10397     // rebuilding.
10398     if (C->capturesVLAType())
10399       continue;
10400 
10401     // Rebuild init-captures, including the implied field declaration.
10402     if (E->isInitCapture(C)) {
10403       InitCaptureInfoTy InitExprTypePair =
10404           InitCaptureExprsAndTypes[C - E->capture_begin()];
10405       ExprResult Init = InitExprTypePair.first;
10406       QualType InitQualType = InitExprTypePair.second;
10407       if (Init.isInvalid() || InitQualType.isNull()) {
10408         Invalid = true;
10409         continue;
10410       }
10411       VarDecl *OldVD = C->getCapturedVar();
10412       VarDecl *NewVD = getSema().createLambdaInitCaptureVarDecl(
10413           OldVD->getLocation(), InitExprTypePair.second, OldVD->getIdentifier(),
10414           OldVD->getInitStyle(), Init.get());
10415       if (!NewVD)
10416         Invalid = true;
10417       else {
10418         getDerived().transformedLocalDecl(OldVD, NewVD);
10419       }
10420       getSema().buildInitCaptureField(LSI, NewVD);
10421       continue;
10422     }
10423 
10424     assert(C->capturesVariable() && "unexpected kind of lambda capture");
10425 
10426     // Determine the capture kind for Sema.
10427     Sema::TryCaptureKind Kind
10428       = C->isImplicit()? Sema::TryCapture_Implicit
10429                        : C->getCaptureKind() == LCK_ByCopy
10430                            ? Sema::TryCapture_ExplicitByVal
10431                            : Sema::TryCapture_ExplicitByRef;
10432     SourceLocation EllipsisLoc;
10433     if (C->isPackExpansion()) {
10434       UnexpandedParameterPack Unexpanded(C->getCapturedVar(), C->getLocation());
10435       bool ShouldExpand = false;
10436       bool RetainExpansion = false;
10437       Optional<unsigned> NumExpansions;
10438       if (getDerived().TryExpandParameterPacks(C->getEllipsisLoc(),
10439                                                C->getLocation(),
10440                                                Unexpanded,
10441                                                ShouldExpand, RetainExpansion,
10442                                                NumExpansions)) {
10443         Invalid = true;
10444         continue;
10445       }
10446 
10447       if (ShouldExpand) {
10448         // The transform has determined that we should perform an expansion;
10449         // transform and capture each of the arguments.
10450         // expansion of the pattern. Do so.
10451         VarDecl *Pack = C->getCapturedVar();
10452         for (unsigned I = 0; I != *NumExpansions; ++I) {
10453           Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
10454           VarDecl *CapturedVar
10455             = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(),
10456                                                                Pack));
10457           if (!CapturedVar) {
10458             Invalid = true;
10459             continue;
10460           }
10461 
10462           // Capture the transformed variable.
10463           getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind);
10464         }
10465 
10466         // FIXME: Retain a pack expansion if RetainExpansion is true.
10467 
10468         continue;
10469       }
10470 
10471       EllipsisLoc = C->getEllipsisLoc();
10472     }
10473 
10474     // Transform the captured variable.
10475     VarDecl *CapturedVar
10476       = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(),
10477                                                          C->getCapturedVar()));
10478     if (!CapturedVar || CapturedVar->isInvalidDecl()) {
10479       Invalid = true;
10480       continue;
10481     }
10482 
10483     // Capture the transformed variable.
10484     getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind,
10485                                  EllipsisLoc);
10486   }
10487   if (!FinishedExplicitCaptures)
10488     getSema().finishLambdaExplicitCaptures(LSI);
10489 
10490   // Enter a new evaluation context to insulate the lambda from any
10491   // cleanups from the enclosing full-expression.
10492   getSema().PushExpressionEvaluationContext(Sema::PotentiallyEvaluated);
10493 
10494   // Instantiate the body of the lambda expression.
10495   StmtResult Body =
10496       Invalid ? StmtError() : getDerived().TransformStmt(E->getBody());
10497 
10498   // ActOnLambda* will pop the function scope for us.
10499   FuncScopeCleanup.disable();
10500 
10501   if (Body.isInvalid()) {
10502     SavedContext.pop();
10503     getSema().ActOnLambdaError(E->getLocStart(), /*CurScope=*/nullptr,
10504                                /*IsInstantiation=*/true);
10505     return ExprError();
10506   }
10507 
10508   // Copy the LSI before ActOnFinishFunctionBody removes it.
10509   // FIXME: This is dumb. Store the lambda information somewhere that outlives
10510   // the call operator.
10511   auto LSICopy = *LSI;
10512   getSema().ActOnFinishFunctionBody(NewCallOperator, Body.get(),
10513                                     /*IsInstantiation*/ true);
10514   SavedContext.pop();
10515 
10516   return getSema().BuildLambdaExpr(E->getLocStart(), Body.get()->getLocEnd(),
10517                                    &LSICopy);
10518 }
10519 
10520 template<typename Derived>
10521 ExprResult
10522 TreeTransform<Derived>::TransformCXXUnresolvedConstructExpr(
10523                                                   CXXUnresolvedConstructExpr *E) {
10524   TypeSourceInfo *T = getDerived().TransformType(E->getTypeSourceInfo());
10525   if (!T)
10526     return ExprError();
10527 
10528   bool ArgumentChanged = false;
10529   SmallVector<Expr*, 8> Args;
10530   Args.reserve(E->arg_size());
10531   if (getDerived().TransformExprs(E->arg_begin(), E->arg_size(), true, Args,
10532                                   &ArgumentChanged))
10533     return ExprError();
10534 
10535   if (!getDerived().AlwaysRebuild() &&
10536       T == E->getTypeSourceInfo() &&
10537       !ArgumentChanged)
10538     return E;
10539 
10540   // FIXME: we're faking the locations of the commas
10541   return getDerived().RebuildCXXUnresolvedConstructExpr(T,
10542                                                         E->getLParenLoc(),
10543                                                         Args,
10544                                                         E->getRParenLoc());
10545 }
10546 
10547 template<typename Derived>
10548 ExprResult
10549 TreeTransform<Derived>::TransformCXXDependentScopeMemberExpr(
10550                                              CXXDependentScopeMemberExpr *E) {
10551   // Transform the base of the expression.
10552   ExprResult Base((Expr*) nullptr);
10553   Expr *OldBase;
10554   QualType BaseType;
10555   QualType ObjectType;
10556   if (!E->isImplicitAccess()) {
10557     OldBase = E->getBase();
10558     Base = getDerived().TransformExpr(OldBase);
10559     if (Base.isInvalid())
10560       return ExprError();
10561 
10562     // Start the member reference and compute the object's type.
10563     ParsedType ObjectTy;
10564     bool MayBePseudoDestructor = false;
10565     Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(),
10566                                                 E->getOperatorLoc(),
10567                                       E->isArrow()? tok::arrow : tok::period,
10568                                                 ObjectTy,
10569                                                 MayBePseudoDestructor);
10570     if (Base.isInvalid())
10571       return ExprError();
10572 
10573     ObjectType = ObjectTy.get();
10574     BaseType = ((Expr*) Base.get())->getType();
10575   } else {
10576     OldBase = nullptr;
10577     BaseType = getDerived().TransformType(E->getBaseType());
10578     ObjectType = BaseType->getAs<PointerType>()->getPointeeType();
10579   }
10580 
10581   // Transform the first part of the nested-name-specifier that qualifies
10582   // the member name.
10583   NamedDecl *FirstQualifierInScope
10584     = getDerived().TransformFirstQualifierInScope(
10585                                             E->getFirstQualifierFoundInScope(),
10586                                             E->getQualifierLoc().getBeginLoc());
10587 
10588   NestedNameSpecifierLoc QualifierLoc;
10589   if (E->getQualifier()) {
10590     QualifierLoc
10591       = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc(),
10592                                                      ObjectType,
10593                                                      FirstQualifierInScope);
10594     if (!QualifierLoc)
10595       return ExprError();
10596   }
10597 
10598   SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc();
10599 
10600   // TODO: If this is a conversion-function-id, verify that the
10601   // destination type name (if present) resolves the same way after
10602   // instantiation as it did in the local scope.
10603 
10604   DeclarationNameInfo NameInfo
10605     = getDerived().TransformDeclarationNameInfo(E->getMemberNameInfo());
10606   if (!NameInfo.getName())
10607     return ExprError();
10608 
10609   if (!E->hasExplicitTemplateArgs()) {
10610     // This is a reference to a member without an explicitly-specified
10611     // template argument list. Optimize for this common case.
10612     if (!getDerived().AlwaysRebuild() &&
10613         Base.get() == OldBase &&
10614         BaseType == E->getBaseType() &&
10615         QualifierLoc == E->getQualifierLoc() &&
10616         NameInfo.getName() == E->getMember() &&
10617         FirstQualifierInScope == E->getFirstQualifierFoundInScope())
10618       return E;
10619 
10620     return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(),
10621                                                        BaseType,
10622                                                        E->isArrow(),
10623                                                        E->getOperatorLoc(),
10624                                                        QualifierLoc,
10625                                                        TemplateKWLoc,
10626                                                        FirstQualifierInScope,
10627                                                        NameInfo,
10628                                                        /*TemplateArgs*/nullptr);
10629   }
10630 
10631   TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc());
10632   if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
10633                                               E->getNumTemplateArgs(),
10634                                               TransArgs))
10635     return ExprError();
10636 
10637   return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(),
10638                                                      BaseType,
10639                                                      E->isArrow(),
10640                                                      E->getOperatorLoc(),
10641                                                      QualifierLoc,
10642                                                      TemplateKWLoc,
10643                                                      FirstQualifierInScope,
10644                                                      NameInfo,
10645                                                      &TransArgs);
10646 }
10647 
10648 template<typename Derived>
10649 ExprResult
10650 TreeTransform<Derived>::TransformUnresolvedMemberExpr(UnresolvedMemberExpr *Old) {
10651   // Transform the base of the expression.
10652   ExprResult Base((Expr*) nullptr);
10653   QualType BaseType;
10654   if (!Old->isImplicitAccess()) {
10655     Base = getDerived().TransformExpr(Old->getBase());
10656     if (Base.isInvalid())
10657       return ExprError();
10658     Base = getSema().PerformMemberExprBaseConversion(Base.get(),
10659                                                      Old->isArrow());
10660     if (Base.isInvalid())
10661       return ExprError();
10662     BaseType = Base.get()->getType();
10663   } else {
10664     BaseType = getDerived().TransformType(Old->getBaseType());
10665   }
10666 
10667   NestedNameSpecifierLoc QualifierLoc;
10668   if (Old->getQualifierLoc()) {
10669     QualifierLoc
10670     = getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc());
10671     if (!QualifierLoc)
10672       return ExprError();
10673   }
10674 
10675   SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc();
10676 
10677   LookupResult R(SemaRef, Old->getMemberNameInfo(),
10678                  Sema::LookupOrdinaryName);
10679 
10680   // Transform all the decls.
10681   for (UnresolvedMemberExpr::decls_iterator I = Old->decls_begin(),
10682          E = Old->decls_end(); I != E; ++I) {
10683     NamedDecl *InstD = static_cast<NamedDecl*>(
10684                                 getDerived().TransformDecl(Old->getMemberLoc(),
10685                                                            *I));
10686     if (!InstD) {
10687       // Silently ignore these if a UsingShadowDecl instantiated to nothing.
10688       // This can happen because of dependent hiding.
10689       if (isa<UsingShadowDecl>(*I))
10690         continue;
10691       else {
10692         R.clear();
10693         return ExprError();
10694       }
10695     }
10696 
10697     // Expand using declarations.
10698     if (isa<UsingDecl>(InstD)) {
10699       UsingDecl *UD = cast<UsingDecl>(InstD);
10700       for (auto *I : UD->shadows())
10701         R.addDecl(I);
10702       continue;
10703     }
10704 
10705     R.addDecl(InstD);
10706   }
10707 
10708   R.resolveKind();
10709 
10710   // Determine the naming class.
10711   if (Old->getNamingClass()) {
10712     CXXRecordDecl *NamingClass
10713       = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl(
10714                                                           Old->getMemberLoc(),
10715                                                         Old->getNamingClass()));
10716     if (!NamingClass)
10717       return ExprError();
10718 
10719     R.setNamingClass(NamingClass);
10720   }
10721 
10722   TemplateArgumentListInfo TransArgs;
10723   if (Old->hasExplicitTemplateArgs()) {
10724     TransArgs.setLAngleLoc(Old->getLAngleLoc());
10725     TransArgs.setRAngleLoc(Old->getRAngleLoc());
10726     if (getDerived().TransformTemplateArguments(Old->getTemplateArgs(),
10727                                                 Old->getNumTemplateArgs(),
10728                                                 TransArgs))
10729       return ExprError();
10730   }
10731 
10732   // FIXME: to do this check properly, we will need to preserve the
10733   // first-qualifier-in-scope here, just in case we had a dependent
10734   // base (and therefore couldn't do the check) and a
10735   // nested-name-qualifier (and therefore could do the lookup).
10736   NamedDecl *FirstQualifierInScope = nullptr;
10737 
10738   return getDerived().RebuildUnresolvedMemberExpr(Base.get(),
10739                                                   BaseType,
10740                                                   Old->getOperatorLoc(),
10741                                                   Old->isArrow(),
10742                                                   QualifierLoc,
10743                                                   TemplateKWLoc,
10744                                                   FirstQualifierInScope,
10745                                                   R,
10746                                               (Old->hasExplicitTemplateArgs()
10747                                                   ? &TransArgs : nullptr));
10748 }
10749 
10750 template<typename Derived>
10751 ExprResult
10752 TreeTransform<Derived>::TransformCXXNoexceptExpr(CXXNoexceptExpr *E) {
10753   EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated);
10754   ExprResult SubExpr = getDerived().TransformExpr(E->getOperand());
10755   if (SubExpr.isInvalid())
10756     return ExprError();
10757 
10758   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getOperand())
10759     return E;
10760 
10761   return getDerived().RebuildCXXNoexceptExpr(E->getSourceRange(),SubExpr.get());
10762 }
10763 
10764 template<typename Derived>
10765 ExprResult
10766 TreeTransform<Derived>::TransformPackExpansionExpr(PackExpansionExpr *E) {
10767   ExprResult Pattern = getDerived().TransformExpr(E->getPattern());
10768   if (Pattern.isInvalid())
10769     return ExprError();
10770 
10771   if (!getDerived().AlwaysRebuild() && Pattern.get() == E->getPattern())
10772     return E;
10773 
10774   return getDerived().RebuildPackExpansion(Pattern.get(), E->getEllipsisLoc(),
10775                                            E->getNumExpansions());
10776 }
10777 
10778 template<typename Derived>
10779 ExprResult
10780 TreeTransform<Derived>::TransformSizeOfPackExpr(SizeOfPackExpr *E) {
10781   // If E is not value-dependent, then nothing will change when we transform it.
10782   // Note: This is an instantiation-centric view.
10783   if (!E->isValueDependent())
10784     return E;
10785 
10786   EnterExpressionEvaluationContext Unevaluated(getSema(), Sema::Unevaluated);
10787 
10788   ArrayRef<TemplateArgument> PackArgs;
10789   TemplateArgument ArgStorage;
10790 
10791   // Find the argument list to transform.
10792   if (E->isPartiallySubstituted()) {
10793     PackArgs = E->getPartialArguments();
10794   } else if (E->isValueDependent()) {
10795     UnexpandedParameterPack Unexpanded(E->getPack(), E->getPackLoc());
10796     bool ShouldExpand = false;
10797     bool RetainExpansion = false;
10798     Optional<unsigned> NumExpansions;
10799     if (getDerived().TryExpandParameterPacks(E->getOperatorLoc(), E->getPackLoc(),
10800                                              Unexpanded,
10801                                              ShouldExpand, RetainExpansion,
10802                                              NumExpansions))
10803       return ExprError();
10804 
10805     // If we need to expand the pack, build a template argument from it and
10806     // expand that.
10807     if (ShouldExpand) {
10808       auto *Pack = E->getPack();
10809       if (auto *TTPD = dyn_cast<TemplateTypeParmDecl>(Pack)) {
10810         ArgStorage = getSema().Context.getPackExpansionType(
10811             getSema().Context.getTypeDeclType(TTPD), None);
10812       } else if (auto *TTPD = dyn_cast<TemplateTemplateParmDecl>(Pack)) {
10813         ArgStorage = TemplateArgument(TemplateName(TTPD), None);
10814       } else {
10815         auto *VD = cast<ValueDecl>(Pack);
10816         ExprResult DRE = getSema().BuildDeclRefExpr(VD, VD->getType(),
10817                                                     VK_RValue, E->getPackLoc());
10818         if (DRE.isInvalid())
10819           return ExprError();
10820         ArgStorage = new (getSema().Context) PackExpansionExpr(
10821             getSema().Context.DependentTy, DRE.get(), E->getPackLoc(), None);
10822       }
10823       PackArgs = ArgStorage;
10824     }
10825   }
10826 
10827   // If we're not expanding the pack, just transform the decl.
10828   if (!PackArgs.size()) {
10829     auto *Pack = cast_or_null<NamedDecl>(
10830         getDerived().TransformDecl(E->getPackLoc(), E->getPack()));
10831     if (!Pack)
10832       return ExprError();
10833     return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), Pack,
10834                                               E->getPackLoc(),
10835                                               E->getRParenLoc(), None, None);
10836   }
10837 
10838   // Try to compute the result without performing a partial substitution.
10839   Optional<unsigned> Result = 0;
10840   for (const TemplateArgument &Arg : PackArgs) {
10841     if (!Arg.isPackExpansion()) {
10842       Result = *Result + 1;
10843       continue;
10844     }
10845 
10846     TemplateArgumentLoc ArgLoc;
10847     InventTemplateArgumentLoc(Arg, ArgLoc);
10848 
10849     // Find the pattern of the pack expansion.
10850     SourceLocation Ellipsis;
10851     Optional<unsigned> OrigNumExpansions;
10852     TemplateArgumentLoc Pattern =
10853         getSema().getTemplateArgumentPackExpansionPattern(ArgLoc, Ellipsis,
10854                                                           OrigNumExpansions);
10855 
10856     // Substitute under the pack expansion. Do not expand the pack (yet).
10857     TemplateArgumentLoc OutPattern;
10858     Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
10859     if (getDerived().TransformTemplateArgument(Pattern, OutPattern,
10860                                                /*Uneval*/ true))
10861       return true;
10862 
10863     // See if we can determine the number of arguments from the result.
10864     Optional<unsigned> NumExpansions =
10865         getSema().getFullyPackExpandedSize(OutPattern.getArgument());
10866     if (!NumExpansions) {
10867       // No: we must be in an alias template expansion, and we're going to need
10868       // to actually expand the packs.
10869       Result = None;
10870       break;
10871     }
10872 
10873     Result = *Result + *NumExpansions;
10874   }
10875 
10876   // Common case: we could determine the number of expansions without
10877   // substituting.
10878   if (Result)
10879     return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(),
10880                                               E->getPackLoc(),
10881                                               E->getRParenLoc(), *Result, None);
10882 
10883   TemplateArgumentListInfo TransformedPackArgs(E->getPackLoc(),
10884                                                E->getPackLoc());
10885   {
10886     TemporaryBase Rebase(*this, E->getPackLoc(), getBaseEntity());
10887     typedef TemplateArgumentLocInventIterator<
10888         Derived, const TemplateArgument*> PackLocIterator;
10889     if (TransformTemplateArguments(PackLocIterator(*this, PackArgs.begin()),
10890                                    PackLocIterator(*this, PackArgs.end()),
10891                                    TransformedPackArgs, /*Uneval*/true))
10892       return ExprError();
10893   }
10894 
10895   // Check whether we managed to fully-expand the pack.
10896   // FIXME: Is it possible for us to do so and not hit the early exit path?
10897   SmallVector<TemplateArgument, 8> Args;
10898   bool PartialSubstitution = false;
10899   for (auto &Loc : TransformedPackArgs.arguments()) {
10900     Args.push_back(Loc.getArgument());
10901     if (Loc.getArgument().isPackExpansion())
10902       PartialSubstitution = true;
10903   }
10904 
10905   if (PartialSubstitution)
10906     return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(),
10907                                               E->getPackLoc(),
10908                                               E->getRParenLoc(), None, Args);
10909 
10910   return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(),
10911                                             E->getPackLoc(), E->getRParenLoc(),
10912                                             Args.size(), None);
10913 }
10914 
10915 template<typename Derived>
10916 ExprResult
10917 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmPackExpr(
10918                                           SubstNonTypeTemplateParmPackExpr *E) {
10919   // Default behavior is to do nothing with this transformation.
10920   return E;
10921 }
10922 
10923 template<typename Derived>
10924 ExprResult
10925 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmExpr(
10926                                           SubstNonTypeTemplateParmExpr *E) {
10927   // Default behavior is to do nothing with this transformation.
10928   return E;
10929 }
10930 
10931 template<typename Derived>
10932 ExprResult
10933 TreeTransform<Derived>::TransformFunctionParmPackExpr(FunctionParmPackExpr *E) {
10934   // Default behavior is to do nothing with this transformation.
10935   return E;
10936 }
10937 
10938 template<typename Derived>
10939 ExprResult
10940 TreeTransform<Derived>::TransformMaterializeTemporaryExpr(
10941                                                   MaterializeTemporaryExpr *E) {
10942   return getDerived().TransformExpr(E->GetTemporaryExpr());
10943 }
10944 
10945 template<typename Derived>
10946 ExprResult
10947 TreeTransform<Derived>::TransformCXXFoldExpr(CXXFoldExpr *E) {
10948   Expr *Pattern = E->getPattern();
10949 
10950   SmallVector<UnexpandedParameterPack, 2> Unexpanded;
10951   getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
10952   assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
10953 
10954   // Determine whether the set of unexpanded parameter packs can and should
10955   // be expanded.
10956   bool Expand = true;
10957   bool RetainExpansion = false;
10958   Optional<unsigned> NumExpansions;
10959   if (getDerived().TryExpandParameterPacks(E->getEllipsisLoc(),
10960                                            Pattern->getSourceRange(),
10961                                            Unexpanded,
10962                                            Expand, RetainExpansion,
10963                                            NumExpansions))
10964     return true;
10965 
10966   if (!Expand) {
10967     // Do not expand any packs here, just transform and rebuild a fold
10968     // expression.
10969     Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
10970 
10971     ExprResult LHS =
10972         E->getLHS() ? getDerived().TransformExpr(E->getLHS()) : ExprResult();
10973     if (LHS.isInvalid())
10974       return true;
10975 
10976     ExprResult RHS =
10977         E->getRHS() ? getDerived().TransformExpr(E->getRHS()) : ExprResult();
10978     if (RHS.isInvalid())
10979       return true;
10980 
10981     if (!getDerived().AlwaysRebuild() &&
10982         LHS.get() == E->getLHS() && RHS.get() == E->getRHS())
10983       return E;
10984 
10985     return getDerived().RebuildCXXFoldExpr(
10986         E->getLocStart(), LHS.get(), E->getOperator(), E->getEllipsisLoc(),
10987         RHS.get(), E->getLocEnd());
10988   }
10989 
10990   // The transform has determined that we should perform an elementwise
10991   // expansion of the pattern. Do so.
10992   ExprResult Result = getDerived().TransformExpr(E->getInit());
10993   if (Result.isInvalid())
10994     return true;
10995   bool LeftFold = E->isLeftFold();
10996 
10997   // If we're retaining an expansion for a right fold, it is the innermost
10998   // component and takes the init (if any).
10999   if (!LeftFold && RetainExpansion) {
11000     ForgetPartiallySubstitutedPackRAII Forget(getDerived());
11001 
11002     ExprResult Out = getDerived().TransformExpr(Pattern);
11003     if (Out.isInvalid())
11004       return true;
11005 
11006     Result = getDerived().RebuildCXXFoldExpr(
11007         E->getLocStart(), Out.get(), E->getOperator(), E->getEllipsisLoc(),
11008         Result.get(), E->getLocEnd());
11009     if (Result.isInvalid())
11010       return true;
11011   }
11012 
11013   for (unsigned I = 0; I != *NumExpansions; ++I) {
11014     Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(
11015         getSema(), LeftFold ? I : *NumExpansions - I - 1);
11016     ExprResult Out = getDerived().TransformExpr(Pattern);
11017     if (Out.isInvalid())
11018       return true;
11019 
11020     if (Out.get()->containsUnexpandedParameterPack()) {
11021       // We still have a pack; retain a pack expansion for this slice.
11022       Result = getDerived().RebuildCXXFoldExpr(
11023           E->getLocStart(),
11024           LeftFold ? Result.get() : Out.get(),
11025           E->getOperator(), E->getEllipsisLoc(),
11026           LeftFold ? Out.get() : Result.get(),
11027           E->getLocEnd());
11028     } else if (Result.isUsable()) {
11029       // We've got down to a single element; build a binary operator.
11030       Result = getDerived().RebuildBinaryOperator(
11031           E->getEllipsisLoc(), E->getOperator(),
11032           LeftFold ? Result.get() : Out.get(),
11033           LeftFold ? Out.get() : Result.get());
11034     } else
11035       Result = Out;
11036 
11037     if (Result.isInvalid())
11038       return true;
11039   }
11040 
11041   // If we're retaining an expansion for a left fold, it is the outermost
11042   // component and takes the complete expansion so far as its init (if any).
11043   if (LeftFold && RetainExpansion) {
11044     ForgetPartiallySubstitutedPackRAII Forget(getDerived());
11045 
11046     ExprResult Out = getDerived().TransformExpr(Pattern);
11047     if (Out.isInvalid())
11048       return true;
11049 
11050     Result = getDerived().RebuildCXXFoldExpr(
11051         E->getLocStart(), Result.get(),
11052         E->getOperator(), E->getEllipsisLoc(),
11053         Out.get(), E->getLocEnd());
11054     if (Result.isInvalid())
11055       return true;
11056   }
11057 
11058   // If we had no init and an empty pack, and we're not retaining an expansion,
11059   // then produce a fallback value or error.
11060   if (Result.isUnset())
11061     return getDerived().RebuildEmptyCXXFoldExpr(E->getEllipsisLoc(),
11062                                                 E->getOperator());
11063 
11064   return Result;
11065 }
11066 
11067 template<typename Derived>
11068 ExprResult
11069 TreeTransform<Derived>::TransformCXXStdInitializerListExpr(
11070     CXXStdInitializerListExpr *E) {
11071   return getDerived().TransformExpr(E->getSubExpr());
11072 }
11073 
11074 template<typename Derived>
11075 ExprResult
11076 TreeTransform<Derived>::TransformObjCStringLiteral(ObjCStringLiteral *E) {
11077   return SemaRef.MaybeBindToTemporary(E);
11078 }
11079 
11080 template<typename Derived>
11081 ExprResult
11082 TreeTransform<Derived>::TransformObjCBoolLiteralExpr(ObjCBoolLiteralExpr *E) {
11083   return E;
11084 }
11085 
11086 template<typename Derived>
11087 ExprResult
11088 TreeTransform<Derived>::TransformObjCBoxedExpr(ObjCBoxedExpr *E) {
11089   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
11090   if (SubExpr.isInvalid())
11091     return ExprError();
11092 
11093   if (!getDerived().AlwaysRebuild() &&
11094       SubExpr.get() == E->getSubExpr())
11095     return E;
11096 
11097   return getDerived().RebuildObjCBoxedExpr(E->getSourceRange(), SubExpr.get());
11098 }
11099 
11100 template<typename Derived>
11101 ExprResult
11102 TreeTransform<Derived>::TransformObjCArrayLiteral(ObjCArrayLiteral *E) {
11103   // Transform each of the elements.
11104   SmallVector<Expr *, 8> Elements;
11105   bool ArgChanged = false;
11106   if (getDerived().TransformExprs(E->getElements(), E->getNumElements(),
11107                                   /*IsCall=*/false, Elements, &ArgChanged))
11108     return ExprError();
11109 
11110   if (!getDerived().AlwaysRebuild() && !ArgChanged)
11111     return SemaRef.MaybeBindToTemporary(E);
11112 
11113   return getDerived().RebuildObjCArrayLiteral(E->getSourceRange(),
11114                                               Elements.data(),
11115                                               Elements.size());
11116 }
11117 
11118 template<typename Derived>
11119 ExprResult
11120 TreeTransform<Derived>::TransformObjCDictionaryLiteral(
11121                                                     ObjCDictionaryLiteral *E) {
11122   // Transform each of the elements.
11123   SmallVector<ObjCDictionaryElement, 8> Elements;
11124   bool ArgChanged = false;
11125   for (unsigned I = 0, N = E->getNumElements(); I != N; ++I) {
11126     ObjCDictionaryElement OrigElement = E->getKeyValueElement(I);
11127 
11128     if (OrigElement.isPackExpansion()) {
11129       // This key/value element is a pack expansion.
11130       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
11131       getSema().collectUnexpandedParameterPacks(OrigElement.Key, Unexpanded);
11132       getSema().collectUnexpandedParameterPacks(OrigElement.Value, Unexpanded);
11133       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
11134 
11135       // Determine whether the set of unexpanded parameter packs can
11136       // and should be expanded.
11137       bool Expand = true;
11138       bool RetainExpansion = false;
11139       Optional<unsigned> OrigNumExpansions = OrigElement.NumExpansions;
11140       Optional<unsigned> NumExpansions = OrigNumExpansions;
11141       SourceRange PatternRange(OrigElement.Key->getLocStart(),
11142                                OrigElement.Value->getLocEnd());
11143      if (getDerived().TryExpandParameterPacks(OrigElement.EllipsisLoc,
11144                                                PatternRange,
11145                                                Unexpanded,
11146                                                Expand, RetainExpansion,
11147                                                NumExpansions))
11148         return ExprError();
11149 
11150       if (!Expand) {
11151         // The transform has determined that we should perform a simple
11152         // transformation on the pack expansion, producing another pack
11153         // expansion.
11154         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
11155         ExprResult Key = getDerived().TransformExpr(OrigElement.Key);
11156         if (Key.isInvalid())
11157           return ExprError();
11158 
11159         if (Key.get() != OrigElement.Key)
11160           ArgChanged = true;
11161 
11162         ExprResult Value = getDerived().TransformExpr(OrigElement.Value);
11163         if (Value.isInvalid())
11164           return ExprError();
11165 
11166         if (Value.get() != OrigElement.Value)
11167           ArgChanged = true;
11168 
11169         ObjCDictionaryElement Expansion = {
11170           Key.get(), Value.get(), OrigElement.EllipsisLoc, NumExpansions
11171         };
11172         Elements.push_back(Expansion);
11173         continue;
11174       }
11175 
11176       // Record right away that the argument was changed.  This needs
11177       // to happen even if the array expands to nothing.
11178       ArgChanged = true;
11179 
11180       // The transform has determined that we should perform an elementwise
11181       // expansion of the pattern. Do so.
11182       for (unsigned I = 0; I != *NumExpansions; ++I) {
11183         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
11184         ExprResult Key = getDerived().TransformExpr(OrigElement.Key);
11185         if (Key.isInvalid())
11186           return ExprError();
11187 
11188         ExprResult Value = getDerived().TransformExpr(OrigElement.Value);
11189         if (Value.isInvalid())
11190           return ExprError();
11191 
11192         ObjCDictionaryElement Element = {
11193           Key.get(), Value.get(), SourceLocation(), NumExpansions
11194         };
11195 
11196         // If any unexpanded parameter packs remain, we still have a
11197         // pack expansion.
11198         // FIXME: Can this really happen?
11199         if (Key.get()->containsUnexpandedParameterPack() ||
11200             Value.get()->containsUnexpandedParameterPack())
11201           Element.EllipsisLoc = OrigElement.EllipsisLoc;
11202 
11203         Elements.push_back(Element);
11204       }
11205 
11206       // FIXME: Retain a pack expansion if RetainExpansion is true.
11207 
11208       // We've finished with this pack expansion.
11209       continue;
11210     }
11211 
11212     // Transform and check key.
11213     ExprResult Key = getDerived().TransformExpr(OrigElement.Key);
11214     if (Key.isInvalid())
11215       return ExprError();
11216 
11217     if (Key.get() != OrigElement.Key)
11218       ArgChanged = true;
11219 
11220     // Transform and check value.
11221     ExprResult Value
11222       = getDerived().TransformExpr(OrigElement.Value);
11223     if (Value.isInvalid())
11224       return ExprError();
11225 
11226     if (Value.get() != OrigElement.Value)
11227       ArgChanged = true;
11228 
11229     ObjCDictionaryElement Element = {
11230       Key.get(), Value.get(), SourceLocation(), None
11231     };
11232     Elements.push_back(Element);
11233   }
11234 
11235   if (!getDerived().AlwaysRebuild() && !ArgChanged)
11236     return SemaRef.MaybeBindToTemporary(E);
11237 
11238   return getDerived().RebuildObjCDictionaryLiteral(E->getSourceRange(),
11239                                                    Elements);
11240 }
11241 
11242 template<typename Derived>
11243 ExprResult
11244 TreeTransform<Derived>::TransformObjCEncodeExpr(ObjCEncodeExpr *E) {
11245   TypeSourceInfo *EncodedTypeInfo
11246     = getDerived().TransformType(E->getEncodedTypeSourceInfo());
11247   if (!EncodedTypeInfo)
11248     return ExprError();
11249 
11250   if (!getDerived().AlwaysRebuild() &&
11251       EncodedTypeInfo == E->getEncodedTypeSourceInfo())
11252     return E;
11253 
11254   return getDerived().RebuildObjCEncodeExpr(E->getAtLoc(),
11255                                             EncodedTypeInfo,
11256                                             E->getRParenLoc());
11257 }
11258 
11259 template<typename Derived>
11260 ExprResult TreeTransform<Derived>::
11261 TransformObjCIndirectCopyRestoreExpr(ObjCIndirectCopyRestoreExpr *E) {
11262   // This is a kind of implicit conversion, and it needs to get dropped
11263   // and recomputed for the same general reasons that ImplicitCastExprs
11264   // do, as well a more specific one: this expression is only valid when
11265   // it appears *immediately* as an argument expression.
11266   return getDerived().TransformExpr(E->getSubExpr());
11267 }
11268 
11269 template<typename Derived>
11270 ExprResult TreeTransform<Derived>::
11271 TransformObjCBridgedCastExpr(ObjCBridgedCastExpr *E) {
11272   TypeSourceInfo *TSInfo
11273     = getDerived().TransformType(E->getTypeInfoAsWritten());
11274   if (!TSInfo)
11275     return ExprError();
11276 
11277   ExprResult Result = getDerived().TransformExpr(E->getSubExpr());
11278   if (Result.isInvalid())
11279     return ExprError();
11280 
11281   if (!getDerived().AlwaysRebuild() &&
11282       TSInfo == E->getTypeInfoAsWritten() &&
11283       Result.get() == E->getSubExpr())
11284     return E;
11285 
11286   return SemaRef.BuildObjCBridgedCast(E->getLParenLoc(), E->getBridgeKind(),
11287                                       E->getBridgeKeywordLoc(), TSInfo,
11288                                       Result.get());
11289 }
11290 
11291 template <typename Derived>
11292 ExprResult TreeTransform<Derived>::TransformObjCAvailabilityCheckExpr(
11293     ObjCAvailabilityCheckExpr *E) {
11294   return E;
11295 }
11296 
11297 template<typename Derived>
11298 ExprResult
11299 TreeTransform<Derived>::TransformObjCMessageExpr(ObjCMessageExpr *E) {
11300   // Transform arguments.
11301   bool ArgChanged = false;
11302   SmallVector<Expr*, 8> Args;
11303   Args.reserve(E->getNumArgs());
11304   if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), false, Args,
11305                                   &ArgChanged))
11306     return ExprError();
11307 
11308   if (E->getReceiverKind() == ObjCMessageExpr::Class) {
11309     // Class message: transform the receiver type.
11310     TypeSourceInfo *ReceiverTypeInfo
11311       = getDerived().TransformType(E->getClassReceiverTypeInfo());
11312     if (!ReceiverTypeInfo)
11313       return ExprError();
11314 
11315     // If nothing changed, just retain the existing message send.
11316     if (!getDerived().AlwaysRebuild() &&
11317         ReceiverTypeInfo == E->getClassReceiverTypeInfo() && !ArgChanged)
11318       return SemaRef.MaybeBindToTemporary(E);
11319 
11320     // Build a new class message send.
11321     SmallVector<SourceLocation, 16> SelLocs;
11322     E->getSelectorLocs(SelLocs);
11323     return getDerived().RebuildObjCMessageExpr(ReceiverTypeInfo,
11324                                                E->getSelector(),
11325                                                SelLocs,
11326                                                E->getMethodDecl(),
11327                                                E->getLeftLoc(),
11328                                                Args,
11329                                                E->getRightLoc());
11330   }
11331   else if (E->getReceiverKind() == ObjCMessageExpr::SuperClass ||
11332            E->getReceiverKind() == ObjCMessageExpr::SuperInstance) {
11333     if (!E->getMethodDecl())
11334       return ExprError();
11335 
11336     // Build a new class message send to 'super'.
11337     SmallVector<SourceLocation, 16> SelLocs;
11338     E->getSelectorLocs(SelLocs);
11339     return getDerived().RebuildObjCMessageExpr(E->getSuperLoc(),
11340                                                E->getSelector(),
11341                                                SelLocs,
11342                                                E->getReceiverType(),
11343                                                E->getMethodDecl(),
11344                                                E->getLeftLoc(),
11345                                                Args,
11346                                                E->getRightLoc());
11347   }
11348 
11349   // Instance message: transform the receiver
11350   assert(E->getReceiverKind() == ObjCMessageExpr::Instance &&
11351          "Only class and instance messages may be instantiated");
11352   ExprResult Receiver
11353     = getDerived().TransformExpr(E->getInstanceReceiver());
11354   if (Receiver.isInvalid())
11355     return ExprError();
11356 
11357   // If nothing changed, just retain the existing message send.
11358   if (!getDerived().AlwaysRebuild() &&
11359       Receiver.get() == E->getInstanceReceiver() && !ArgChanged)
11360     return SemaRef.MaybeBindToTemporary(E);
11361 
11362   // Build a new instance message send.
11363   SmallVector<SourceLocation, 16> SelLocs;
11364   E->getSelectorLocs(SelLocs);
11365   return getDerived().RebuildObjCMessageExpr(Receiver.get(),
11366                                              E->getSelector(),
11367                                              SelLocs,
11368                                              E->getMethodDecl(),
11369                                              E->getLeftLoc(),
11370                                              Args,
11371                                              E->getRightLoc());
11372 }
11373 
11374 template<typename Derived>
11375 ExprResult
11376 TreeTransform<Derived>::TransformObjCSelectorExpr(ObjCSelectorExpr *E) {
11377   return E;
11378 }
11379 
11380 template<typename Derived>
11381 ExprResult
11382 TreeTransform<Derived>::TransformObjCProtocolExpr(ObjCProtocolExpr *E) {
11383   return E;
11384 }
11385 
11386 template<typename Derived>
11387 ExprResult
11388 TreeTransform<Derived>::TransformObjCIvarRefExpr(ObjCIvarRefExpr *E) {
11389   // Transform the base expression.
11390   ExprResult Base = getDerived().TransformExpr(E->getBase());
11391   if (Base.isInvalid())
11392     return ExprError();
11393 
11394   // We don't need to transform the ivar; it will never change.
11395 
11396   // If nothing changed, just retain the existing expression.
11397   if (!getDerived().AlwaysRebuild() &&
11398       Base.get() == E->getBase())
11399     return E;
11400 
11401   return getDerived().RebuildObjCIvarRefExpr(Base.get(), E->getDecl(),
11402                                              E->getLocation(),
11403                                              E->isArrow(), E->isFreeIvar());
11404 }
11405 
11406 template<typename Derived>
11407 ExprResult
11408 TreeTransform<Derived>::TransformObjCPropertyRefExpr(ObjCPropertyRefExpr *E) {
11409   // 'super' and types never change. Property never changes. Just
11410   // retain the existing expression.
11411   if (!E->isObjectReceiver())
11412     return E;
11413 
11414   // Transform the base expression.
11415   ExprResult Base = getDerived().TransformExpr(E->getBase());
11416   if (Base.isInvalid())
11417     return ExprError();
11418 
11419   // We don't need to transform the property; it will never change.
11420 
11421   // If nothing changed, just retain the existing expression.
11422   if (!getDerived().AlwaysRebuild() &&
11423       Base.get() == E->getBase())
11424     return E;
11425 
11426   if (E->isExplicitProperty())
11427     return getDerived().RebuildObjCPropertyRefExpr(Base.get(),
11428                                                    E->getExplicitProperty(),
11429                                                    E->getLocation());
11430 
11431   return getDerived().RebuildObjCPropertyRefExpr(Base.get(),
11432                                                  SemaRef.Context.PseudoObjectTy,
11433                                                  E->getImplicitPropertyGetter(),
11434                                                  E->getImplicitPropertySetter(),
11435                                                  E->getLocation());
11436 }
11437 
11438 template<typename Derived>
11439 ExprResult
11440 TreeTransform<Derived>::TransformObjCSubscriptRefExpr(ObjCSubscriptRefExpr *E) {
11441   // Transform the base expression.
11442   ExprResult Base = getDerived().TransformExpr(E->getBaseExpr());
11443   if (Base.isInvalid())
11444     return ExprError();
11445 
11446   // Transform the key expression.
11447   ExprResult Key = getDerived().TransformExpr(E->getKeyExpr());
11448   if (Key.isInvalid())
11449     return ExprError();
11450 
11451   // If nothing changed, just retain the existing expression.
11452   if (!getDerived().AlwaysRebuild() &&
11453       Key.get() == E->getKeyExpr() && Base.get() == E->getBaseExpr())
11454     return E;
11455 
11456   return getDerived().RebuildObjCSubscriptRefExpr(E->getRBracket(),
11457                                                   Base.get(), Key.get(),
11458                                                   E->getAtIndexMethodDecl(),
11459                                                   E->setAtIndexMethodDecl());
11460 }
11461 
11462 template<typename Derived>
11463 ExprResult
11464 TreeTransform<Derived>::TransformObjCIsaExpr(ObjCIsaExpr *E) {
11465   // Transform the base expression.
11466   ExprResult Base = getDerived().TransformExpr(E->getBase());
11467   if (Base.isInvalid())
11468     return ExprError();
11469 
11470   // If nothing changed, just retain the existing expression.
11471   if (!getDerived().AlwaysRebuild() &&
11472       Base.get() == E->getBase())
11473     return E;
11474 
11475   return getDerived().RebuildObjCIsaExpr(Base.get(), E->getIsaMemberLoc(),
11476                                          E->getOpLoc(),
11477                                          E->isArrow());
11478 }
11479 
11480 template<typename Derived>
11481 ExprResult
11482 TreeTransform<Derived>::TransformShuffleVectorExpr(ShuffleVectorExpr *E) {
11483   bool ArgumentChanged = false;
11484   SmallVector<Expr*, 8> SubExprs;
11485   SubExprs.reserve(E->getNumSubExprs());
11486   if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false,
11487                                   SubExprs, &ArgumentChanged))
11488     return ExprError();
11489 
11490   if (!getDerived().AlwaysRebuild() &&
11491       !ArgumentChanged)
11492     return E;
11493 
11494   return getDerived().RebuildShuffleVectorExpr(E->getBuiltinLoc(),
11495                                                SubExprs,
11496                                                E->getRParenLoc());
11497 }
11498 
11499 template<typename Derived>
11500 ExprResult
11501 TreeTransform<Derived>::TransformConvertVectorExpr(ConvertVectorExpr *E) {
11502   ExprResult SrcExpr = getDerived().TransformExpr(E->getSrcExpr());
11503   if (SrcExpr.isInvalid())
11504     return ExprError();
11505 
11506   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo());
11507   if (!Type)
11508     return ExprError();
11509 
11510   if (!getDerived().AlwaysRebuild() &&
11511       Type == E->getTypeSourceInfo() &&
11512       SrcExpr.get() == E->getSrcExpr())
11513     return E;
11514 
11515   return getDerived().RebuildConvertVectorExpr(E->getBuiltinLoc(),
11516                                                SrcExpr.get(), Type,
11517                                                E->getRParenLoc());
11518 }
11519 
11520 template<typename Derived>
11521 ExprResult
11522 TreeTransform<Derived>::TransformBlockExpr(BlockExpr *E) {
11523   BlockDecl *oldBlock = E->getBlockDecl();
11524 
11525   SemaRef.ActOnBlockStart(E->getCaretLocation(), /*Scope=*/nullptr);
11526   BlockScopeInfo *blockScope = SemaRef.getCurBlock();
11527 
11528   blockScope->TheDecl->setIsVariadic(oldBlock->isVariadic());
11529   blockScope->TheDecl->setBlockMissingReturnType(
11530                          oldBlock->blockMissingReturnType());
11531 
11532   SmallVector<ParmVarDecl*, 4> params;
11533   SmallVector<QualType, 4> paramTypes;
11534 
11535   const FunctionProtoType *exprFunctionType = E->getFunctionType();
11536 
11537   // Parameter substitution.
11538   Sema::ExtParameterInfoBuilder extParamInfos;
11539   if (getDerived().TransformFunctionTypeParams(
11540           E->getCaretLocation(), oldBlock->parameters(), nullptr,
11541           exprFunctionType->getExtParameterInfosOrNull(), paramTypes, &params,
11542           extParamInfos)) {
11543     getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr);
11544     return ExprError();
11545   }
11546 
11547   QualType exprResultType =
11548       getDerived().TransformType(exprFunctionType->getReturnType());
11549 
11550   auto epi = exprFunctionType->getExtProtoInfo();
11551   epi.ExtParameterInfos = extParamInfos.getPointerOrNull(paramTypes.size());
11552 
11553   QualType functionType =
11554     getDerived().RebuildFunctionProtoType(exprResultType, paramTypes, epi);
11555   blockScope->FunctionType = functionType;
11556 
11557   // Set the parameters on the block decl.
11558   if (!params.empty())
11559     blockScope->TheDecl->setParams(params);
11560 
11561   if (!oldBlock->blockMissingReturnType()) {
11562     blockScope->HasImplicitReturnType = false;
11563     blockScope->ReturnType = exprResultType;
11564   }
11565 
11566   // Transform the body
11567   StmtResult body = getDerived().TransformStmt(E->getBody());
11568   if (body.isInvalid()) {
11569     getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr);
11570     return ExprError();
11571   }
11572 
11573 #ifndef NDEBUG
11574   // In builds with assertions, make sure that we captured everything we
11575   // captured before.
11576   if (!SemaRef.getDiagnostics().hasErrorOccurred()) {
11577     for (const auto &I : oldBlock->captures()) {
11578       VarDecl *oldCapture = I.getVariable();
11579 
11580       // Ignore parameter packs.
11581       if (isa<ParmVarDecl>(oldCapture) &&
11582           cast<ParmVarDecl>(oldCapture)->isParameterPack())
11583         continue;
11584 
11585       VarDecl *newCapture =
11586         cast<VarDecl>(getDerived().TransformDecl(E->getCaretLocation(),
11587                                                  oldCapture));
11588       assert(blockScope->CaptureMap.count(newCapture));
11589     }
11590     assert(oldBlock->capturesCXXThis() == blockScope->isCXXThisCaptured());
11591   }
11592 #endif
11593 
11594   return SemaRef.ActOnBlockStmtExpr(E->getCaretLocation(), body.get(),
11595                                     /*Scope=*/nullptr);
11596 }
11597 
11598 template<typename Derived>
11599 ExprResult
11600 TreeTransform<Derived>::TransformAsTypeExpr(AsTypeExpr *E) {
11601   llvm_unreachable("Cannot transform asType expressions yet");
11602 }
11603 
11604 template<typename Derived>
11605 ExprResult
11606 TreeTransform<Derived>::TransformAtomicExpr(AtomicExpr *E) {
11607   QualType RetTy = getDerived().TransformType(E->getType());
11608   bool ArgumentChanged = false;
11609   SmallVector<Expr*, 8> SubExprs;
11610   SubExprs.reserve(E->getNumSubExprs());
11611   if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false,
11612                                   SubExprs, &ArgumentChanged))
11613     return ExprError();
11614 
11615   if (!getDerived().AlwaysRebuild() &&
11616       !ArgumentChanged)
11617     return E;
11618 
11619   return getDerived().RebuildAtomicExpr(E->getBuiltinLoc(), SubExprs,
11620                                         RetTy, E->getOp(), E->getRParenLoc());
11621 }
11622 
11623 //===----------------------------------------------------------------------===//
11624 // Type reconstruction
11625 //===----------------------------------------------------------------------===//
11626 
11627 template<typename Derived>
11628 QualType TreeTransform<Derived>::RebuildPointerType(QualType PointeeType,
11629                                                     SourceLocation Star) {
11630   return SemaRef.BuildPointerType(PointeeType, Star,
11631                                   getDerived().getBaseEntity());
11632 }
11633 
11634 template<typename Derived>
11635 QualType TreeTransform<Derived>::RebuildBlockPointerType(QualType PointeeType,
11636                                                          SourceLocation Star) {
11637   return SemaRef.BuildBlockPointerType(PointeeType, Star,
11638                                        getDerived().getBaseEntity());
11639 }
11640 
11641 template<typename Derived>
11642 QualType
11643 TreeTransform<Derived>::RebuildReferenceType(QualType ReferentType,
11644                                              bool WrittenAsLValue,
11645                                              SourceLocation Sigil) {
11646   return SemaRef.BuildReferenceType(ReferentType, WrittenAsLValue,
11647                                     Sigil, getDerived().getBaseEntity());
11648 }
11649 
11650 template<typename Derived>
11651 QualType
11652 TreeTransform<Derived>::RebuildMemberPointerType(QualType PointeeType,
11653                                                  QualType ClassType,
11654                                                  SourceLocation Sigil) {
11655   return SemaRef.BuildMemberPointerType(PointeeType, ClassType, Sigil,
11656                                         getDerived().getBaseEntity());
11657 }
11658 
11659 template<typename Derived>
11660 QualType TreeTransform<Derived>::RebuildObjCTypeParamType(
11661            const ObjCTypeParamDecl *Decl,
11662            SourceLocation ProtocolLAngleLoc,
11663            ArrayRef<ObjCProtocolDecl *> Protocols,
11664            ArrayRef<SourceLocation> ProtocolLocs,
11665            SourceLocation ProtocolRAngleLoc) {
11666   return SemaRef.BuildObjCTypeParamType(Decl,
11667                                         ProtocolLAngleLoc, Protocols,
11668                                         ProtocolLocs, ProtocolRAngleLoc,
11669                                         /*FailOnError=*/true);
11670 }
11671 
11672 template<typename Derived>
11673 QualType TreeTransform<Derived>::RebuildObjCObjectType(
11674            QualType BaseType,
11675            SourceLocation Loc,
11676            SourceLocation TypeArgsLAngleLoc,
11677            ArrayRef<TypeSourceInfo *> TypeArgs,
11678            SourceLocation TypeArgsRAngleLoc,
11679            SourceLocation ProtocolLAngleLoc,
11680            ArrayRef<ObjCProtocolDecl *> Protocols,
11681            ArrayRef<SourceLocation> ProtocolLocs,
11682            SourceLocation ProtocolRAngleLoc) {
11683   return SemaRef.BuildObjCObjectType(BaseType, Loc, TypeArgsLAngleLoc,
11684                                      TypeArgs, TypeArgsRAngleLoc,
11685                                      ProtocolLAngleLoc, Protocols, ProtocolLocs,
11686                                      ProtocolRAngleLoc,
11687                                      /*FailOnError=*/true);
11688 }
11689 
11690 template<typename Derived>
11691 QualType TreeTransform<Derived>::RebuildObjCObjectPointerType(
11692            QualType PointeeType,
11693            SourceLocation Star) {
11694   return SemaRef.Context.getObjCObjectPointerType(PointeeType);
11695 }
11696 
11697 template<typename Derived>
11698 QualType
11699 TreeTransform<Derived>::RebuildArrayType(QualType ElementType,
11700                                          ArrayType::ArraySizeModifier SizeMod,
11701                                          const llvm::APInt *Size,
11702                                          Expr *SizeExpr,
11703                                          unsigned IndexTypeQuals,
11704                                          SourceRange BracketsRange) {
11705   if (SizeExpr || !Size)
11706     return SemaRef.BuildArrayType(ElementType, SizeMod, SizeExpr,
11707                                   IndexTypeQuals, BracketsRange,
11708                                   getDerived().getBaseEntity());
11709 
11710   QualType Types[] = {
11711     SemaRef.Context.UnsignedCharTy, SemaRef.Context.UnsignedShortTy,
11712     SemaRef.Context.UnsignedIntTy, SemaRef.Context.UnsignedLongTy,
11713     SemaRef.Context.UnsignedLongLongTy, SemaRef.Context.UnsignedInt128Ty
11714   };
11715   const unsigned NumTypes = llvm::array_lengthof(Types);
11716   QualType SizeType;
11717   for (unsigned I = 0; I != NumTypes; ++I)
11718     if (Size->getBitWidth() == SemaRef.Context.getIntWidth(Types[I])) {
11719       SizeType = Types[I];
11720       break;
11721     }
11722 
11723   // Note that we can return a VariableArrayType here in the case where
11724   // the element type was a dependent VariableArrayType.
11725   IntegerLiteral *ArraySize
11726       = IntegerLiteral::Create(SemaRef.Context, *Size, SizeType,
11727                                /*FIXME*/BracketsRange.getBegin());
11728   return SemaRef.BuildArrayType(ElementType, SizeMod, ArraySize,
11729                                 IndexTypeQuals, BracketsRange,
11730                                 getDerived().getBaseEntity());
11731 }
11732 
11733 template<typename Derived>
11734 QualType
11735 TreeTransform<Derived>::RebuildConstantArrayType(QualType ElementType,
11736                                                  ArrayType::ArraySizeModifier SizeMod,
11737                                                  const llvm::APInt &Size,
11738                                                  unsigned IndexTypeQuals,
11739                                                  SourceRange BracketsRange) {
11740   return getDerived().RebuildArrayType(ElementType, SizeMod, &Size, nullptr,
11741                                         IndexTypeQuals, BracketsRange);
11742 }
11743 
11744 template<typename Derived>
11745 QualType
11746 TreeTransform<Derived>::RebuildIncompleteArrayType(QualType ElementType,
11747                                           ArrayType::ArraySizeModifier SizeMod,
11748                                                  unsigned IndexTypeQuals,
11749                                                    SourceRange BracketsRange) {
11750   return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr, nullptr,
11751                                        IndexTypeQuals, BracketsRange);
11752 }
11753 
11754 template<typename Derived>
11755 QualType
11756 TreeTransform<Derived>::RebuildVariableArrayType(QualType ElementType,
11757                                           ArrayType::ArraySizeModifier SizeMod,
11758                                                  Expr *SizeExpr,
11759                                                  unsigned IndexTypeQuals,
11760                                                  SourceRange BracketsRange) {
11761   return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr,
11762                                        SizeExpr,
11763                                        IndexTypeQuals, BracketsRange);
11764 }
11765 
11766 template<typename Derived>
11767 QualType
11768 TreeTransform<Derived>::RebuildDependentSizedArrayType(QualType ElementType,
11769                                           ArrayType::ArraySizeModifier SizeMod,
11770                                                        Expr *SizeExpr,
11771                                                        unsigned IndexTypeQuals,
11772                                                    SourceRange BracketsRange) {
11773   return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr,
11774                                        SizeExpr,
11775                                        IndexTypeQuals, BracketsRange);
11776 }
11777 
11778 template<typename Derived>
11779 QualType TreeTransform<Derived>::RebuildVectorType(QualType ElementType,
11780                                                unsigned NumElements,
11781                                                VectorType::VectorKind VecKind) {
11782   // FIXME: semantic checking!
11783   return SemaRef.Context.getVectorType(ElementType, NumElements, VecKind);
11784 }
11785 
11786 template<typename Derived>
11787 QualType TreeTransform<Derived>::RebuildExtVectorType(QualType ElementType,
11788                                                       unsigned NumElements,
11789                                                  SourceLocation AttributeLoc) {
11790   llvm::APInt numElements(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy),
11791                           NumElements, true);
11792   IntegerLiteral *VectorSize
11793     = IntegerLiteral::Create(SemaRef.Context, numElements, SemaRef.Context.IntTy,
11794                              AttributeLoc);
11795   return SemaRef.BuildExtVectorType(ElementType, VectorSize, AttributeLoc);
11796 }
11797 
11798 template<typename Derived>
11799 QualType
11800 TreeTransform<Derived>::RebuildDependentSizedExtVectorType(QualType ElementType,
11801                                                            Expr *SizeExpr,
11802                                                   SourceLocation AttributeLoc) {
11803   return SemaRef.BuildExtVectorType(ElementType, SizeExpr, AttributeLoc);
11804 }
11805 
11806 template<typename Derived>
11807 QualType TreeTransform<Derived>::RebuildFunctionProtoType(
11808     QualType T,
11809     MutableArrayRef<QualType> ParamTypes,
11810     const FunctionProtoType::ExtProtoInfo &EPI) {
11811   return SemaRef.BuildFunctionType(T, ParamTypes,
11812                                    getDerived().getBaseLocation(),
11813                                    getDerived().getBaseEntity(),
11814                                    EPI);
11815 }
11816 
11817 template<typename Derived>
11818 QualType TreeTransform<Derived>::RebuildFunctionNoProtoType(QualType T) {
11819   return SemaRef.Context.getFunctionNoProtoType(T);
11820 }
11821 
11822 template<typename Derived>
11823 QualType TreeTransform<Derived>::RebuildUnresolvedUsingType(Decl *D) {
11824   assert(D && "no decl found");
11825   if (D->isInvalidDecl()) return QualType();
11826 
11827   // FIXME: Doesn't account for ObjCInterfaceDecl!
11828   TypeDecl *Ty;
11829   if (isa<UsingDecl>(D)) {
11830     UsingDecl *Using = cast<UsingDecl>(D);
11831     assert(Using->hasTypename() &&
11832            "UnresolvedUsingTypenameDecl transformed to non-typename using");
11833 
11834     // A valid resolved using typename decl points to exactly one type decl.
11835     assert(++Using->shadow_begin() == Using->shadow_end());
11836     Ty = cast<TypeDecl>((*Using->shadow_begin())->getTargetDecl());
11837 
11838   } else {
11839     assert(isa<UnresolvedUsingTypenameDecl>(D) &&
11840            "UnresolvedUsingTypenameDecl transformed to non-using decl");
11841     Ty = cast<UnresolvedUsingTypenameDecl>(D);
11842   }
11843 
11844   return SemaRef.Context.getTypeDeclType(Ty);
11845 }
11846 
11847 template<typename Derived>
11848 QualType TreeTransform<Derived>::RebuildTypeOfExprType(Expr *E,
11849                                                        SourceLocation Loc) {
11850   return SemaRef.BuildTypeofExprType(E, Loc);
11851 }
11852 
11853 template<typename Derived>
11854 QualType TreeTransform<Derived>::RebuildTypeOfType(QualType Underlying) {
11855   return SemaRef.Context.getTypeOfType(Underlying);
11856 }
11857 
11858 template<typename Derived>
11859 QualType TreeTransform<Derived>::RebuildDecltypeType(Expr *E,
11860                                                      SourceLocation Loc) {
11861   return SemaRef.BuildDecltypeType(E, Loc);
11862 }
11863 
11864 template<typename Derived>
11865 QualType TreeTransform<Derived>::RebuildUnaryTransformType(QualType BaseType,
11866                                             UnaryTransformType::UTTKind UKind,
11867                                             SourceLocation Loc) {
11868   return SemaRef.BuildUnaryTransformType(BaseType, UKind, Loc);
11869 }
11870 
11871 template<typename Derived>
11872 QualType TreeTransform<Derived>::RebuildTemplateSpecializationType(
11873                                                       TemplateName Template,
11874                                              SourceLocation TemplateNameLoc,
11875                                      TemplateArgumentListInfo &TemplateArgs) {
11876   return SemaRef.CheckTemplateIdType(Template, TemplateNameLoc, TemplateArgs);
11877 }
11878 
11879 template<typename Derived>
11880 QualType TreeTransform<Derived>::RebuildAtomicType(QualType ValueType,
11881                                                    SourceLocation KWLoc) {
11882   return SemaRef.BuildAtomicType(ValueType, KWLoc);
11883 }
11884 
11885 template<typename Derived>
11886 QualType TreeTransform<Derived>::RebuildPipeType(QualType ValueType,
11887                                                  SourceLocation KWLoc,
11888                                                  bool isReadPipe) {
11889   return isReadPipe ? SemaRef.BuildReadPipeType(ValueType, KWLoc)
11890                     : SemaRef.BuildWritePipeType(ValueType, KWLoc);
11891 }
11892 
11893 template<typename Derived>
11894 TemplateName
11895 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS,
11896                                             bool TemplateKW,
11897                                             TemplateDecl *Template) {
11898   return SemaRef.Context.getQualifiedTemplateName(SS.getScopeRep(), TemplateKW,
11899                                                   Template);
11900 }
11901 
11902 template<typename Derived>
11903 TemplateName
11904 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS,
11905                                             const IdentifierInfo &Name,
11906                                             SourceLocation NameLoc,
11907                                             QualType ObjectType,
11908                                             NamedDecl *FirstQualifierInScope) {
11909   UnqualifiedId TemplateName;
11910   TemplateName.setIdentifier(&Name, NameLoc);
11911   Sema::TemplateTy Template;
11912   SourceLocation TemplateKWLoc; // FIXME: retrieve it from caller.
11913   getSema().ActOnDependentTemplateName(/*Scope=*/nullptr,
11914                                        SS, TemplateKWLoc, TemplateName,
11915                                        ParsedType::make(ObjectType),
11916                                        /*EnteringContext=*/false,
11917                                        Template);
11918   return Template.get();
11919 }
11920 
11921 template<typename Derived>
11922 TemplateName
11923 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS,
11924                                             OverloadedOperatorKind Operator,
11925                                             SourceLocation NameLoc,
11926                                             QualType ObjectType) {
11927   UnqualifiedId Name;
11928   // FIXME: Bogus location information.
11929   SourceLocation SymbolLocations[3] = { NameLoc, NameLoc, NameLoc };
11930   Name.setOperatorFunctionId(NameLoc, Operator, SymbolLocations);
11931   SourceLocation TemplateKWLoc; // FIXME: retrieve it from caller.
11932   Sema::TemplateTy Template;
11933   getSema().ActOnDependentTemplateName(/*Scope=*/nullptr,
11934                                        SS, TemplateKWLoc, Name,
11935                                        ParsedType::make(ObjectType),
11936                                        /*EnteringContext=*/false,
11937                                        Template);
11938   return Template.get();
11939 }
11940 
11941 template<typename Derived>
11942 ExprResult
11943 TreeTransform<Derived>::RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op,
11944                                                    SourceLocation OpLoc,
11945                                                    Expr *OrigCallee,
11946                                                    Expr *First,
11947                                                    Expr *Second) {
11948   Expr *Callee = OrigCallee->IgnoreParenCasts();
11949   bool isPostIncDec = Second && (Op == OO_PlusPlus || Op == OO_MinusMinus);
11950 
11951   if (First->getObjectKind() == OK_ObjCProperty) {
11952     BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op);
11953     if (BinaryOperator::isAssignmentOp(Opc))
11954       return SemaRef.checkPseudoObjectAssignment(/*Scope=*/nullptr, OpLoc, Opc,
11955                                                  First, Second);
11956     ExprResult Result = SemaRef.CheckPlaceholderExpr(First);
11957     if (Result.isInvalid())
11958       return ExprError();
11959     First = Result.get();
11960   }
11961 
11962   if (Second && Second->getObjectKind() == OK_ObjCProperty) {
11963     ExprResult Result = SemaRef.CheckPlaceholderExpr(Second);
11964     if (Result.isInvalid())
11965       return ExprError();
11966     Second = Result.get();
11967   }
11968 
11969   // Determine whether this should be a builtin operation.
11970   if (Op == OO_Subscript) {
11971     if (!First->getType()->isOverloadableType() &&
11972         !Second->getType()->isOverloadableType())
11973       return getSema().CreateBuiltinArraySubscriptExpr(First,
11974                                                        Callee->getLocStart(),
11975                                                        Second, OpLoc);
11976   } else if (Op == OO_Arrow) {
11977     // -> is never a builtin operation.
11978     return SemaRef.BuildOverloadedArrowExpr(nullptr, First, OpLoc);
11979   } else if (Second == nullptr || isPostIncDec) {
11980     if (!First->getType()->isOverloadableType()) {
11981       // The argument is not of overloadable type, so try to create a
11982       // built-in unary operation.
11983       UnaryOperatorKind Opc
11984         = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec);
11985 
11986       return getSema().CreateBuiltinUnaryOp(OpLoc, Opc, First);
11987     }
11988   } else {
11989     if (!First->getType()->isOverloadableType() &&
11990         !Second->getType()->isOverloadableType()) {
11991       // Neither of the arguments is an overloadable type, so try to
11992       // create a built-in binary operation.
11993       BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op);
11994       ExprResult Result
11995         = SemaRef.CreateBuiltinBinOp(OpLoc, Opc, First, Second);
11996       if (Result.isInvalid())
11997         return ExprError();
11998 
11999       return Result;
12000     }
12001   }
12002 
12003   // Compute the transformed set of functions (and function templates) to be
12004   // used during overload resolution.
12005   UnresolvedSet<16> Functions;
12006 
12007   if (UnresolvedLookupExpr *ULE = dyn_cast<UnresolvedLookupExpr>(Callee)) {
12008     assert(ULE->requiresADL());
12009     Functions.append(ULE->decls_begin(), ULE->decls_end());
12010   } else {
12011     // If we've resolved this to a particular non-member function, just call
12012     // that function. If we resolved it to a member function,
12013     // CreateOverloaded* will find that function for us.
12014     NamedDecl *ND = cast<DeclRefExpr>(Callee)->getDecl();
12015     if (!isa<CXXMethodDecl>(ND))
12016       Functions.addDecl(ND);
12017   }
12018 
12019   // Add any functions found via argument-dependent lookup.
12020   Expr *Args[2] = { First, Second };
12021   unsigned NumArgs = 1 + (Second != nullptr);
12022 
12023   // Create the overloaded operator invocation for unary operators.
12024   if (NumArgs == 1 || isPostIncDec) {
12025     UnaryOperatorKind Opc
12026       = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec);
12027     return SemaRef.CreateOverloadedUnaryOp(OpLoc, Opc, Functions, First);
12028   }
12029 
12030   if (Op == OO_Subscript) {
12031     SourceLocation LBrace;
12032     SourceLocation RBrace;
12033 
12034     if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Callee)) {
12035         DeclarationNameLoc NameLoc = DRE->getNameInfo().getInfo();
12036         LBrace = SourceLocation::getFromRawEncoding(
12037                     NameLoc.CXXOperatorName.BeginOpNameLoc);
12038         RBrace = SourceLocation::getFromRawEncoding(
12039                     NameLoc.CXXOperatorName.EndOpNameLoc);
12040     } else {
12041         LBrace = Callee->getLocStart();
12042         RBrace = OpLoc;
12043     }
12044 
12045     return SemaRef.CreateOverloadedArraySubscriptExpr(LBrace, RBrace,
12046                                                       First, Second);
12047   }
12048 
12049   // Create the overloaded operator invocation for binary operators.
12050   BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op);
12051   ExprResult Result
12052     = SemaRef.CreateOverloadedBinOp(OpLoc, Opc, Functions, Args[0], Args[1]);
12053   if (Result.isInvalid())
12054     return ExprError();
12055 
12056   return Result;
12057 }
12058 
12059 template<typename Derived>
12060 ExprResult
12061 TreeTransform<Derived>::RebuildCXXPseudoDestructorExpr(Expr *Base,
12062                                                      SourceLocation OperatorLoc,
12063                                                        bool isArrow,
12064                                                        CXXScopeSpec &SS,
12065                                                      TypeSourceInfo *ScopeType,
12066                                                        SourceLocation CCLoc,
12067                                                        SourceLocation TildeLoc,
12068                                         PseudoDestructorTypeStorage Destroyed) {
12069   QualType BaseType = Base->getType();
12070   if (Base->isTypeDependent() || Destroyed.getIdentifier() ||
12071       (!isArrow && !BaseType->getAs<RecordType>()) ||
12072       (isArrow && BaseType->getAs<PointerType>() &&
12073        !BaseType->getAs<PointerType>()->getPointeeType()
12074                                               ->template getAs<RecordType>())){
12075     // This pseudo-destructor expression is still a pseudo-destructor.
12076     return SemaRef.BuildPseudoDestructorExpr(
12077         Base, OperatorLoc, isArrow ? tok::arrow : tok::period, SS, ScopeType,
12078         CCLoc, TildeLoc, Destroyed);
12079   }
12080 
12081   TypeSourceInfo *DestroyedType = Destroyed.getTypeSourceInfo();
12082   DeclarationName Name(SemaRef.Context.DeclarationNames.getCXXDestructorName(
12083                  SemaRef.Context.getCanonicalType(DestroyedType->getType())));
12084   DeclarationNameInfo NameInfo(Name, Destroyed.getLocation());
12085   NameInfo.setNamedTypeInfo(DestroyedType);
12086 
12087   // The scope type is now known to be a valid nested name specifier
12088   // component. Tack it on to the end of the nested name specifier.
12089   if (ScopeType) {
12090     if (!ScopeType->getType()->getAs<TagType>()) {
12091       getSema().Diag(ScopeType->getTypeLoc().getBeginLoc(),
12092                      diag::err_expected_class_or_namespace)
12093           << ScopeType->getType() << getSema().getLangOpts().CPlusPlus;
12094       return ExprError();
12095     }
12096     SS.Extend(SemaRef.Context, SourceLocation(), ScopeType->getTypeLoc(),
12097               CCLoc);
12098   }
12099 
12100   SourceLocation TemplateKWLoc; // FIXME: retrieve it from caller.
12101   return getSema().BuildMemberReferenceExpr(Base, BaseType,
12102                                             OperatorLoc, isArrow,
12103                                             SS, TemplateKWLoc,
12104                                             /*FIXME: FirstQualifier*/ nullptr,
12105                                             NameInfo,
12106                                             /*TemplateArgs*/ nullptr,
12107                                             /*S*/nullptr);
12108 }
12109 
12110 template<typename Derived>
12111 StmtResult
12112 TreeTransform<Derived>::TransformCapturedStmt(CapturedStmt *S) {
12113   SourceLocation Loc = S->getLocStart();
12114   CapturedDecl *CD = S->getCapturedDecl();
12115   unsigned NumParams = CD->getNumParams();
12116   unsigned ContextParamPos = CD->getContextParamPosition();
12117   SmallVector<Sema::CapturedParamNameType, 4> Params;
12118   for (unsigned I = 0; I < NumParams; ++I) {
12119     if (I != ContextParamPos) {
12120       Params.push_back(
12121              std::make_pair(
12122                   CD->getParam(I)->getName(),
12123                   getDerived().TransformType(CD->getParam(I)->getType())));
12124     } else {
12125       Params.push_back(std::make_pair(StringRef(), QualType()));
12126     }
12127   }
12128   getSema().ActOnCapturedRegionStart(Loc, /*CurScope*/nullptr,
12129                                      S->getCapturedRegionKind(), Params);
12130   StmtResult Body;
12131   {
12132     Sema::CompoundScopeRAII CompoundScope(getSema());
12133     Body = getDerived().TransformStmt(S->getCapturedStmt());
12134   }
12135 
12136   if (Body.isInvalid()) {
12137     getSema().ActOnCapturedRegionError();
12138     return StmtError();
12139   }
12140 
12141   return getSema().ActOnCapturedRegionEnd(Body.get());
12142 }
12143 
12144 } // end namespace clang
12145 
12146 #endif // LLVM_CLANG_LIB_SEMA_TREETRANSFORM_H
12147