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