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