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