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