1 //===------- TreeTransform.h - Semantic Tree Transformation -----*- C++ -*-===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //===----------------------------------------------------------------------===//
7 //
8 //  This file implements a semantic tree transformation that takes a given
9 //  AST and rebuilds it, possibly transforming some nodes in the process.
10 //
11 //===----------------------------------------------------------------------===//
12 
13 #ifndef LLVM_CLANG_LIB_SEMA_TREETRANSFORM_H
14 #define LLVM_CLANG_LIB_SEMA_TREETRANSFORM_H
15 
16 #include "CoroutineStmtBuilder.h"
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 /// 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 /// overriding 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   /// 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   /// 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   /// Initializes a new tree transformer.
123   TreeTransform(Sema &SemaRef) : SemaRef(SemaRef) { }
124 
125   /// Retrieves a reference to the derived class.
126   Derived &getDerived() { return static_cast<Derived&>(*this); }
127 
128   /// 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   /// Retrieves a reference to the semantic analysis object used for
137   /// this tree transform.
138   Sema &getSema() const { return SemaRef; }
139 
140   /// 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   /// 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   /// 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   /// 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   /// 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   /// 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   /// 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   /// 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   /// "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   /// "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   /// Note to the derived class when a function parameter pack is
280   /// being expanded.
281   void ExpandingFunctionParameterPack(ParmVarDecl *Pack) { }
282 
283   /// 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   /// 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   /// 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   /// Transform a type that is permitted to produce a
311   /// DeducedTemplateSpecializationType.
312   ///
313   /// This is used in the (relatively rare) contexts where it is acceptable
314   /// for transformation to produce a class template type with deduced
315   /// template arguments.
316   /// @{
317   QualType TransformTypeWithDeducedTST(QualType T);
318   TypeSourceInfo *TransformTypeWithDeducedTST(TypeSourceInfo *DI);
319   /// @}
320 
321   /// The reason why the value of a statement is not discarded, if any.
322   enum StmtDiscardKind {
323     SDK_Discarded,
324     SDK_NotDiscarded,
325     SDK_StmtExprResult,
326   };
327 
328   /// Transform the given statement.
329   ///
330   /// By default, this routine transforms a statement by delegating to the
331   /// appropriate TransformXXXStmt function to transform a specific kind of
332   /// statement or the TransformExpr() function to transform an expression.
333   /// Subclasses may override this function to transform statements using some
334   /// other mechanism.
335   ///
336   /// \returns the transformed statement.
337   StmtResult TransformStmt(Stmt *S, StmtDiscardKind SDK = SDK_Discarded);
338 
339   /// Transform the given statement.
340   ///
341   /// By default, this routine transforms a statement by delegating to the
342   /// appropriate TransformOMPXXXClause function to transform a specific kind
343   /// of clause. Subclasses may override this function to transform statements
344   /// using some other mechanism.
345   ///
346   /// \returns the transformed OpenMP clause.
347   OMPClause *TransformOMPClause(OMPClause *S);
348 
349   /// Transform the given attribute.
350   ///
351   /// By default, this routine transforms a statement by delegating to the
352   /// appropriate TransformXXXAttr function to transform a specific kind
353   /// of attribute. Subclasses may override this function to transform
354   /// attributed statements using some other mechanism.
355   ///
356   /// \returns the transformed attribute
357   const Attr *TransformAttr(const Attr *S);
358 
359 /// Transform the specified attribute.
360 ///
361 /// Subclasses should override the transformation of attributes with a pragma
362 /// spelling to transform expressions stored within the attribute.
363 ///
364 /// \returns the transformed attribute.
365 #define ATTR(X)
366 #define PRAGMA_SPELLING_ATTR(X)                                                \
367   const X##Attr *Transform##X##Attr(const X##Attr *R) { return R; }
368 #include "clang/Basic/AttrList.inc"
369 
370   /// Transform the given expression.
371   ///
372   /// By default, this routine transforms an expression by delegating to the
373   /// appropriate TransformXXXExpr function to build a new expression.
374   /// Subclasses may override this function to transform expressions using some
375   /// other mechanism.
376   ///
377   /// \returns the transformed expression.
378   ExprResult TransformExpr(Expr *E);
379 
380   /// Transform the given initializer.
381   ///
382   /// By default, this routine transforms an initializer by stripping off the
383   /// semantic nodes added by initialization, then passing the result to
384   /// TransformExpr or TransformExprs.
385   ///
386   /// \returns the transformed initializer.
387   ExprResult TransformInitializer(Expr *Init, bool NotCopyInit);
388 
389   /// Transform the given list of expressions.
390   ///
391   /// This routine transforms a list of expressions by invoking
392   /// \c TransformExpr() for each subexpression. However, it also provides
393   /// support for variadic templates by expanding any pack expansions (if the
394   /// derived class permits such expansion) along the way. When pack expansions
395   /// are present, the number of outputs may not equal the number of inputs.
396   ///
397   /// \param Inputs The set of expressions to be transformed.
398   ///
399   /// \param NumInputs The number of expressions in \c Inputs.
400   ///
401   /// \param IsCall If \c true, then this transform is being performed on
402   /// function-call arguments, and any arguments that should be dropped, will
403   /// be.
404   ///
405   /// \param Outputs The transformed input expressions will be added to this
406   /// vector.
407   ///
408   /// \param ArgChanged If non-NULL, will be set \c true if any argument changed
409   /// due to transformation.
410   ///
411   /// \returns true if an error occurred, false otherwise.
412   bool TransformExprs(Expr *const *Inputs, unsigned NumInputs, bool IsCall,
413                       SmallVectorImpl<Expr *> &Outputs,
414                       bool *ArgChanged = nullptr);
415 
416   /// Transform the given declaration, which is referenced from a type
417   /// or expression.
418   ///
419   /// By default, acts as the identity function on declarations, unless the
420   /// transformer has had to transform the declaration itself. Subclasses
421   /// may override this function to provide alternate behavior.
422   Decl *TransformDecl(SourceLocation Loc, Decl *D) {
423     llvm::DenseMap<Decl *, Decl *>::iterator Known
424       = TransformedLocalDecls.find(D);
425     if (Known != TransformedLocalDecls.end())
426       return Known->second;
427 
428     return D;
429   }
430 
431   /// Transform the specified condition.
432   ///
433   /// By default, this transforms the variable and expression and rebuilds
434   /// the condition.
435   Sema::ConditionResult TransformCondition(SourceLocation Loc, VarDecl *Var,
436                                            Expr *Expr,
437                                            Sema::ConditionKind Kind);
438 
439   /// Transform the attributes associated with the given declaration and
440   /// place them on the new declaration.
441   ///
442   /// By default, this operation does nothing. Subclasses may override this
443   /// behavior to transform attributes.
444   void transformAttrs(Decl *Old, Decl *New) { }
445 
446   /// Note that a local declaration has been transformed by this
447   /// transformer.
448   ///
449   /// Local declarations are typically transformed via a call to
450   /// TransformDefinition. However, in some cases (e.g., lambda expressions),
451   /// the transformer itself has to transform the declarations. This routine
452   /// can be overridden by a subclass that keeps track of such mappings.
453   void transformedLocalDecl(Decl *Old, Decl *New) {
454     TransformedLocalDecls[Old] = New;
455   }
456 
457   /// Transform the definition of the given declaration.
458   ///
459   /// By default, invokes TransformDecl() to transform the declaration.
460   /// Subclasses may override this function to provide alternate behavior.
461   Decl *TransformDefinition(SourceLocation Loc, Decl *D) {
462     return getDerived().TransformDecl(Loc, D);
463   }
464 
465   /// Transform the given declaration, which was the first part of a
466   /// nested-name-specifier in a member access expression.
467   ///
468   /// This specific declaration transformation only applies to the first
469   /// identifier in a nested-name-specifier of a member access expression, e.g.,
470   /// the \c T in \c x->T::member
471   ///
472   /// By default, invokes TransformDecl() to transform the declaration.
473   /// Subclasses may override this function to provide alternate behavior.
474   NamedDecl *TransformFirstQualifierInScope(NamedDecl *D, SourceLocation Loc) {
475     return cast_or_null<NamedDecl>(getDerived().TransformDecl(Loc, D));
476   }
477 
478   /// Transform the set of declarations in an OverloadExpr.
479   bool TransformOverloadExprDecls(OverloadExpr *Old, bool RequiresADL,
480                                   LookupResult &R);
481 
482   /// Transform the given nested-name-specifier with source-location
483   /// information.
484   ///
485   /// By default, transforms all of the types and declarations within the
486   /// nested-name-specifier. Subclasses may override this function to provide
487   /// alternate behavior.
488   NestedNameSpecifierLoc
489   TransformNestedNameSpecifierLoc(NestedNameSpecifierLoc NNS,
490                                   QualType ObjectType = QualType(),
491                                   NamedDecl *FirstQualifierInScope = nullptr);
492 
493   /// Transform the given declaration name.
494   ///
495   /// By default, transforms the types of conversion function, constructor,
496   /// and destructor names and then (if needed) rebuilds the declaration name.
497   /// Identifiers and selectors are returned unmodified. Sublcasses may
498   /// override this function to provide alternate behavior.
499   DeclarationNameInfo
500   TransformDeclarationNameInfo(const DeclarationNameInfo &NameInfo);
501 
502   /// Transform the given template name.
503   ///
504   /// \param SS The nested-name-specifier that qualifies the template
505   /// name. This nested-name-specifier must already have been transformed.
506   ///
507   /// \param Name The template name to transform.
508   ///
509   /// \param NameLoc The source location of the template name.
510   ///
511   /// \param ObjectType If we're translating a template name within a member
512   /// access expression, this is the type of the object whose member template
513   /// is being referenced.
514   ///
515   /// \param FirstQualifierInScope If the first part of a nested-name-specifier
516   /// also refers to a name within the current (lexical) scope, this is the
517   /// declaration it refers to.
518   ///
519   /// By default, transforms the template name by transforming the declarations
520   /// and nested-name-specifiers that occur within the template name.
521   /// Subclasses may override this function to provide alternate behavior.
522   TemplateName
523   TransformTemplateName(CXXScopeSpec &SS, TemplateName Name,
524                         SourceLocation NameLoc,
525                         QualType ObjectType = QualType(),
526                         NamedDecl *FirstQualifierInScope = nullptr,
527                         bool AllowInjectedClassName = false);
528 
529   /// Transform the given template argument.
530   ///
531   /// By default, this operation transforms the type, expression, or
532   /// declaration stored within the template argument and constructs a
533   /// new template argument from the transformed result. Subclasses may
534   /// override this function to provide alternate behavior.
535   ///
536   /// Returns true if there was an error.
537   bool TransformTemplateArgument(const TemplateArgumentLoc &Input,
538                                  TemplateArgumentLoc &Output,
539                                  bool Uneval = false);
540 
541   /// Transform the given set of template arguments.
542   ///
543   /// By default, this operation transforms all of the template arguments
544   /// in the input set using \c TransformTemplateArgument(), and appends
545   /// the transformed arguments to the output list.
546   ///
547   /// Note that this overload of \c TransformTemplateArguments() is merely
548   /// a convenience function. Subclasses that wish to override this behavior
549   /// should override the iterator-based member template version.
550   ///
551   /// \param Inputs The set of template arguments to be transformed.
552   ///
553   /// \param NumInputs The number of template arguments in \p Inputs.
554   ///
555   /// \param Outputs The set of transformed template arguments output by this
556   /// routine.
557   ///
558   /// Returns true if an error occurred.
559   bool TransformTemplateArguments(const TemplateArgumentLoc *Inputs,
560                                   unsigned NumInputs,
561                                   TemplateArgumentListInfo &Outputs,
562                                   bool Uneval = false) {
563     return TransformTemplateArguments(Inputs, Inputs + NumInputs, Outputs,
564                                       Uneval);
565   }
566 
567   /// Transform the given set of template arguments.
568   ///
569   /// By default, this operation transforms all of the template arguments
570   /// in the input set using \c TransformTemplateArgument(), and appends
571   /// the transformed arguments to the output list.
572   ///
573   /// \param First An iterator to the first template argument.
574   ///
575   /// \param Last An iterator one step past the last template argument.
576   ///
577   /// \param Outputs The set of transformed template arguments output by this
578   /// routine.
579   ///
580   /// Returns true if an error occurred.
581   template<typename InputIterator>
582   bool TransformTemplateArguments(InputIterator First,
583                                   InputIterator Last,
584                                   TemplateArgumentListInfo &Outputs,
585                                   bool Uneval = false);
586 
587   /// Fakes up a TemplateArgumentLoc for a given TemplateArgument.
588   void InventTemplateArgumentLoc(const TemplateArgument &Arg,
589                                  TemplateArgumentLoc &ArgLoc);
590 
591   /// Fakes up a TypeSourceInfo for a type.
592   TypeSourceInfo *InventTypeSourceInfo(QualType T) {
593     return SemaRef.Context.getTrivialTypeSourceInfo(T,
594                        getDerived().getBaseLocation());
595   }
596 
597 #define ABSTRACT_TYPELOC(CLASS, PARENT)
598 #define TYPELOC(CLASS, PARENT)                                   \
599   QualType Transform##CLASS##Type(TypeLocBuilder &TLB, CLASS##TypeLoc T);
600 #include "clang/AST/TypeLocNodes.def"
601 
602   template<typename Fn>
603   QualType TransformFunctionProtoType(TypeLocBuilder &TLB,
604                                       FunctionProtoTypeLoc TL,
605                                       CXXRecordDecl *ThisContext,
606                                       Qualifiers ThisTypeQuals,
607                                       Fn TransformExceptionSpec);
608 
609   bool TransformExceptionSpec(SourceLocation Loc,
610                               FunctionProtoType::ExceptionSpecInfo &ESI,
611                               SmallVectorImpl<QualType> &Exceptions,
612                               bool &Changed);
613 
614   StmtResult TransformSEHHandler(Stmt *Handler);
615 
616   QualType
617   TransformTemplateSpecializationType(TypeLocBuilder &TLB,
618                                       TemplateSpecializationTypeLoc TL,
619                                       TemplateName Template);
620 
621   QualType
622   TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB,
623                                       DependentTemplateSpecializationTypeLoc TL,
624                                                TemplateName Template,
625                                                CXXScopeSpec &SS);
626 
627   QualType TransformDependentTemplateSpecializationType(
628       TypeLocBuilder &TLB, DependentTemplateSpecializationTypeLoc TL,
629       NestedNameSpecifierLoc QualifierLoc);
630 
631   /// Transforms the parameters of a function type into the
632   /// given vectors.
633   ///
634   /// The result vectors should be kept in sync; null entries in the
635   /// variables vector are acceptable.
636   ///
637   /// Return true on error.
638   bool TransformFunctionTypeParams(
639       SourceLocation Loc, ArrayRef<ParmVarDecl *> Params,
640       const QualType *ParamTypes,
641       const FunctionProtoType::ExtParameterInfo *ParamInfos,
642       SmallVectorImpl<QualType> &PTypes, SmallVectorImpl<ParmVarDecl *> *PVars,
643       Sema::ExtParameterInfoBuilder &PInfos);
644 
645   /// Transforms a single function-type parameter.  Return null
646   /// on error.
647   ///
648   /// \param indexAdjustment - A number to add to the parameter's
649   ///   scope index;  can be negative
650   ParmVarDecl *TransformFunctionTypeParam(ParmVarDecl *OldParm,
651                                           int indexAdjustment,
652                                           Optional<unsigned> NumExpansions,
653                                           bool ExpectParameterPack);
654 
655   QualType TransformReferenceType(TypeLocBuilder &TLB, ReferenceTypeLoc TL);
656 
657   StmtResult TransformCompoundStmt(CompoundStmt *S, bool IsStmtExpr);
658   ExprResult TransformCXXNamedCastExpr(CXXNamedCastExpr *E);
659 
660   TemplateParameterList *TransformTemplateParameterList(
661         TemplateParameterList *TPL) {
662     return TPL;
663   }
664 
665   ExprResult TransformAddressOfOperand(Expr *E);
666 
667   ExprResult TransformDependentScopeDeclRefExpr(DependentScopeDeclRefExpr *E,
668                                                 bool IsAddressOfOperand,
669                                                 TypeSourceInfo **RecoveryTSI);
670 
671   ExprResult TransformParenDependentScopeDeclRefExpr(
672       ParenExpr *PE, DependentScopeDeclRefExpr *DRE, bool IsAddressOfOperand,
673       TypeSourceInfo **RecoveryTSI);
674 
675   StmtResult TransformOMPExecutableDirective(OMPExecutableDirective *S);
676 
677 // FIXME: We use LLVM_ATTRIBUTE_NOINLINE because inlining causes a ridiculous
678 // amount of stack usage with clang.
679 #define STMT(Node, Parent)                        \
680   LLVM_ATTRIBUTE_NOINLINE \
681   StmtResult Transform##Node(Node *S);
682 #define VALUESTMT(Node, Parent)                   \
683   LLVM_ATTRIBUTE_NOINLINE \
684   StmtResult Transform##Node(Node *S, StmtDiscardKind SDK);
685 #define EXPR(Node, Parent)                        \
686   LLVM_ATTRIBUTE_NOINLINE \
687   ExprResult Transform##Node(Node *E);
688 #define ABSTRACT_STMT(Stmt)
689 #include "clang/AST/StmtNodes.inc"
690 
691 #define OPENMP_CLAUSE(Name, Class)                        \
692   LLVM_ATTRIBUTE_NOINLINE \
693   OMPClause *Transform ## Class(Class *S);
694 #include "clang/Basic/OpenMPKinds.def"
695 
696   /// Build a new qualified type given its unqualified type and type location.
697   ///
698   /// By default, this routine adds type qualifiers only to types that can
699   /// have qualifiers, and silently suppresses those qualifiers that are not
700   /// permitted. Subclasses may override this routine to provide different
701   /// behavior.
702   QualType RebuildQualifiedType(QualType T, QualifiedTypeLoc TL);
703 
704   /// Build a new pointer type given its pointee type.
705   ///
706   /// By default, performs semantic analysis when building the pointer type.
707   /// Subclasses may override this routine to provide different behavior.
708   QualType RebuildPointerType(QualType PointeeType, SourceLocation Sigil);
709 
710   /// Build a new block pointer type given its pointee type.
711   ///
712   /// By default, performs semantic analysis when building the block pointer
713   /// type. Subclasses may override this routine to provide different behavior.
714   QualType RebuildBlockPointerType(QualType PointeeType, SourceLocation Sigil);
715 
716   /// Build a new reference type given the type it references.
717   ///
718   /// By default, performs semantic analysis when building the
719   /// reference type. Subclasses may override this routine to provide
720   /// different behavior.
721   ///
722   /// \param LValue whether the type was written with an lvalue sigil
723   /// or an rvalue sigil.
724   QualType RebuildReferenceType(QualType ReferentType,
725                                 bool LValue,
726                                 SourceLocation Sigil);
727 
728   /// Build a new member pointer type given the pointee type and the
729   /// class type it refers into.
730   ///
731   /// By default, performs semantic analysis when building the member pointer
732   /// type. Subclasses may override this routine to provide different behavior.
733   QualType RebuildMemberPointerType(QualType PointeeType, QualType ClassType,
734                                     SourceLocation Sigil);
735 
736   QualType RebuildObjCTypeParamType(const ObjCTypeParamDecl *Decl,
737                                     SourceLocation ProtocolLAngleLoc,
738                                     ArrayRef<ObjCProtocolDecl *> Protocols,
739                                     ArrayRef<SourceLocation> ProtocolLocs,
740                                     SourceLocation ProtocolRAngleLoc);
741 
742   /// Build an Objective-C object type.
743   ///
744   /// By default, performs semantic analysis when building the object type.
745   /// Subclasses may override this routine to provide different behavior.
746   QualType RebuildObjCObjectType(QualType BaseType,
747                                  SourceLocation Loc,
748                                  SourceLocation TypeArgsLAngleLoc,
749                                  ArrayRef<TypeSourceInfo *> TypeArgs,
750                                  SourceLocation TypeArgsRAngleLoc,
751                                  SourceLocation ProtocolLAngleLoc,
752                                  ArrayRef<ObjCProtocolDecl *> Protocols,
753                                  ArrayRef<SourceLocation> ProtocolLocs,
754                                  SourceLocation ProtocolRAngleLoc);
755 
756   /// Build a new Objective-C object pointer type given the pointee type.
757   ///
758   /// By default, directly builds the pointer type, with no additional semantic
759   /// analysis.
760   QualType RebuildObjCObjectPointerType(QualType PointeeType,
761                                         SourceLocation Star);
762 
763   /// Build a new array type given the element type, size
764   /// modifier, size of the array (if known), size expression, and index type
765   /// qualifiers.
766   ///
767   /// By default, performs semantic analysis when building the array type.
768   /// Subclasses may override this routine to provide different behavior.
769   /// Also by default, all of the other Rebuild*Array
770   QualType RebuildArrayType(QualType ElementType,
771                             ArrayType::ArraySizeModifier SizeMod,
772                             const llvm::APInt *Size,
773                             Expr *SizeExpr,
774                             unsigned IndexTypeQuals,
775                             SourceRange BracketsRange);
776 
777   /// Build a new constant array type given the element type, size
778   /// modifier, (known) size of the array, and index type qualifiers.
779   ///
780   /// By default, performs semantic analysis when building the array type.
781   /// Subclasses may override this routine to provide different behavior.
782   QualType RebuildConstantArrayType(QualType ElementType,
783                                     ArrayType::ArraySizeModifier SizeMod,
784                                     const llvm::APInt &Size,
785                                     unsigned IndexTypeQuals,
786                                     SourceRange BracketsRange);
787 
788   /// Build a new incomplete array type given the element type, size
789   /// modifier, and index type qualifiers.
790   ///
791   /// By default, performs semantic analysis when building the array type.
792   /// Subclasses may override this routine to provide different behavior.
793   QualType RebuildIncompleteArrayType(QualType ElementType,
794                                       ArrayType::ArraySizeModifier SizeMod,
795                                       unsigned IndexTypeQuals,
796                                       SourceRange BracketsRange);
797 
798   /// Build a new variable-length array type given the element type,
799   /// size modifier, size expression, and index type qualifiers.
800   ///
801   /// By default, performs semantic analysis when building the array type.
802   /// Subclasses may override this routine to provide different behavior.
803   QualType RebuildVariableArrayType(QualType ElementType,
804                                     ArrayType::ArraySizeModifier SizeMod,
805                                     Expr *SizeExpr,
806                                     unsigned IndexTypeQuals,
807                                     SourceRange BracketsRange);
808 
809   /// Build a new dependent-sized array type given the element type,
810   /// size modifier, size expression, and index type qualifiers.
811   ///
812   /// By default, performs semantic analysis when building the array type.
813   /// Subclasses may override this routine to provide different behavior.
814   QualType RebuildDependentSizedArrayType(QualType ElementType,
815                                           ArrayType::ArraySizeModifier SizeMod,
816                                           Expr *SizeExpr,
817                                           unsigned IndexTypeQuals,
818                                           SourceRange BracketsRange);
819 
820   /// Build a new vector type given the element type and
821   /// number of elements.
822   ///
823   /// By default, performs semantic analysis when building the vector type.
824   /// Subclasses may override this routine to provide different behavior.
825   QualType RebuildVectorType(QualType ElementType, unsigned NumElements,
826                              VectorType::VectorKind VecKind);
827 
828   /// Build a new potentially dependently-sized extended vector type
829   /// given the element type and number of elements.
830   ///
831   /// By default, performs semantic analysis when building the vector type.
832   /// Subclasses may override this routine to provide different behavior.
833   QualType RebuildDependentVectorType(QualType ElementType, Expr *SizeExpr,
834                                            SourceLocation AttributeLoc,
835                                            VectorType::VectorKind);
836 
837   /// Build a new extended vector type given the element type and
838   /// number of elements.
839   ///
840   /// By default, performs semantic analysis when building the vector type.
841   /// Subclasses may override this routine to provide different behavior.
842   QualType RebuildExtVectorType(QualType ElementType, unsigned NumElements,
843                                 SourceLocation AttributeLoc);
844 
845   /// Build a new potentially dependently-sized extended vector type
846   /// given the element type and number of elements.
847   ///
848   /// By default, performs semantic analysis when building the vector type.
849   /// Subclasses may override this routine to provide different behavior.
850   QualType RebuildDependentSizedExtVectorType(QualType ElementType,
851                                               Expr *SizeExpr,
852                                               SourceLocation AttributeLoc);
853 
854   /// Build a new DependentAddressSpaceType or return the pointee
855   /// type variable with the correct address space (retrieved from
856   /// AddrSpaceExpr) applied to it. The former will be returned in cases
857   /// where the address space remains dependent.
858   ///
859   /// By default, performs semantic analysis when building the type with address
860   /// space applied. Subclasses may override this routine to provide different
861   /// behavior.
862   QualType RebuildDependentAddressSpaceType(QualType PointeeType,
863                                             Expr *AddrSpaceExpr,
864                                             SourceLocation AttributeLoc);
865 
866   /// Build a new function type.
867   ///
868   /// By default, performs semantic analysis when building the function type.
869   /// Subclasses may override this routine to provide different behavior.
870   QualType RebuildFunctionProtoType(QualType T,
871                                     MutableArrayRef<QualType> ParamTypes,
872                                     const FunctionProtoType::ExtProtoInfo &EPI);
873 
874   /// Build a new unprototyped function type.
875   QualType RebuildFunctionNoProtoType(QualType ResultType);
876 
877   /// Rebuild an unresolved typename type, given the decl that
878   /// the UnresolvedUsingTypenameDecl was transformed to.
879   QualType RebuildUnresolvedUsingType(SourceLocation NameLoc, Decl *D);
880 
881   /// Build a new typedef type.
882   QualType RebuildTypedefType(TypedefNameDecl *Typedef) {
883     return SemaRef.Context.getTypeDeclType(Typedef);
884   }
885 
886   /// Build a new class/struct/union type.
887   QualType RebuildRecordType(RecordDecl *Record) {
888     return SemaRef.Context.getTypeDeclType(Record);
889   }
890 
891   /// Build a new Enum type.
892   QualType RebuildEnumType(EnumDecl *Enum) {
893     return SemaRef.Context.getTypeDeclType(Enum);
894   }
895 
896   /// Build a new typeof(expr) type.
897   ///
898   /// By default, performs semantic analysis when building the typeof type.
899   /// Subclasses may override this routine to provide different behavior.
900   QualType RebuildTypeOfExprType(Expr *Underlying, SourceLocation Loc);
901 
902   /// Build a new typeof(type) type.
903   ///
904   /// By default, builds a new TypeOfType with the given underlying type.
905   QualType RebuildTypeOfType(QualType Underlying);
906 
907   /// Build a new unary transform type.
908   QualType RebuildUnaryTransformType(QualType BaseType,
909                                      UnaryTransformType::UTTKind UKind,
910                                      SourceLocation Loc);
911 
912   /// Build a new C++11 decltype type.
913   ///
914   /// By default, performs semantic analysis when building the decltype type.
915   /// Subclasses may override this routine to provide different behavior.
916   QualType RebuildDecltypeType(Expr *Underlying, SourceLocation Loc);
917 
918   /// Build a new C++11 auto type.
919   ///
920   /// By default, builds a new AutoType with the given deduced type.
921   QualType RebuildAutoType(QualType Deduced, AutoTypeKeyword Keyword) {
922     // Note, IsDependent is always false here: we implicitly convert an 'auto'
923     // which has been deduced to a dependent type into an undeduced 'auto', so
924     // that we'll retry deduction after the transformation.
925     return SemaRef.Context.getAutoType(Deduced, Keyword,
926                                        /*IsDependent*/ false);
927   }
928 
929   /// By default, builds a new DeducedTemplateSpecializationType with the given
930   /// deduced type.
931   QualType RebuildDeducedTemplateSpecializationType(TemplateName Template,
932       QualType Deduced) {
933     return SemaRef.Context.getDeducedTemplateSpecializationType(
934         Template, Deduced, /*IsDependent*/ false);
935   }
936 
937   /// Build a new template specialization type.
938   ///
939   /// By default, performs semantic analysis when building the template
940   /// specialization type. Subclasses may override this routine to provide
941   /// different behavior.
942   QualType RebuildTemplateSpecializationType(TemplateName Template,
943                                              SourceLocation TemplateLoc,
944                                              TemplateArgumentListInfo &Args);
945 
946   /// Build a new parenthesized type.
947   ///
948   /// By default, builds a new ParenType type from the inner type.
949   /// Subclasses may override this routine to provide different behavior.
950   QualType RebuildParenType(QualType InnerType) {
951     return SemaRef.BuildParenType(InnerType);
952   }
953 
954   /// Build a new qualified name type.
955   ///
956   /// By default, builds a new ElaboratedType type from the keyword,
957   /// the nested-name-specifier and the named type.
958   /// Subclasses may override this routine to provide different behavior.
959   QualType RebuildElaboratedType(SourceLocation KeywordLoc,
960                                  ElaboratedTypeKeyword Keyword,
961                                  NestedNameSpecifierLoc QualifierLoc,
962                                  QualType Named) {
963     return SemaRef.Context.getElaboratedType(Keyword,
964                                          QualifierLoc.getNestedNameSpecifier(),
965                                              Named);
966   }
967 
968   /// Build a new typename type that refers to a template-id.
969   ///
970   /// By default, builds a new DependentNameType type from the
971   /// nested-name-specifier and the given type. Subclasses may override
972   /// this routine to provide different behavior.
973   QualType RebuildDependentTemplateSpecializationType(
974                                           ElaboratedTypeKeyword Keyword,
975                                           NestedNameSpecifierLoc QualifierLoc,
976                                           SourceLocation TemplateKWLoc,
977                                           const IdentifierInfo *Name,
978                                           SourceLocation NameLoc,
979                                           TemplateArgumentListInfo &Args,
980                                           bool AllowInjectedClassName) {
981     // Rebuild the template name.
982     // TODO: avoid TemplateName abstraction
983     CXXScopeSpec SS;
984     SS.Adopt(QualifierLoc);
985     TemplateName InstName = getDerived().RebuildTemplateName(
986         SS, TemplateKWLoc, *Name, NameLoc, QualType(), nullptr,
987         AllowInjectedClassName);
988 
989     if (InstName.isNull())
990       return QualType();
991 
992     // If it's still dependent, make a dependent specialization.
993     if (InstName.getAsDependentTemplateName())
994       return SemaRef.Context.getDependentTemplateSpecializationType(Keyword,
995                                           QualifierLoc.getNestedNameSpecifier(),
996                                                                     Name,
997                                                                     Args);
998 
999     // Otherwise, make an elaborated type wrapping a non-dependent
1000     // specialization.
1001     QualType T =
1002     getDerived().RebuildTemplateSpecializationType(InstName, NameLoc, Args);
1003     if (T.isNull()) return QualType();
1004 
1005     if (Keyword == ETK_None && QualifierLoc.getNestedNameSpecifier() == nullptr)
1006       return T;
1007 
1008     return SemaRef.Context.getElaboratedType(Keyword,
1009                                        QualifierLoc.getNestedNameSpecifier(),
1010                                              T);
1011   }
1012 
1013   /// Build a new typename type that refers to an identifier.
1014   ///
1015   /// By default, performs semantic analysis when building the typename type
1016   /// (or elaborated type). Subclasses may override this routine to provide
1017   /// different behavior.
1018   QualType RebuildDependentNameType(ElaboratedTypeKeyword Keyword,
1019                                     SourceLocation KeywordLoc,
1020                                     NestedNameSpecifierLoc QualifierLoc,
1021                                     const IdentifierInfo *Id,
1022                                     SourceLocation IdLoc,
1023                                     bool DeducedTSTContext) {
1024     CXXScopeSpec SS;
1025     SS.Adopt(QualifierLoc);
1026 
1027     if (QualifierLoc.getNestedNameSpecifier()->isDependent()) {
1028       // If the name is still dependent, just build a new dependent name type.
1029       if (!SemaRef.computeDeclContext(SS))
1030         return SemaRef.Context.getDependentNameType(Keyword,
1031                                           QualifierLoc.getNestedNameSpecifier(),
1032                                                     Id);
1033     }
1034 
1035     if (Keyword == ETK_None || Keyword == ETK_Typename) {
1036       QualType T = SemaRef.CheckTypenameType(Keyword, KeywordLoc, QualifierLoc,
1037                                              *Id, IdLoc);
1038       // If a dependent name resolves to a deduced template specialization type,
1039       // check that we're in one of the syntactic contexts permitting it.
1040       if (!DeducedTSTContext) {
1041         if (auto *Deduced = dyn_cast_or_null<DeducedTemplateSpecializationType>(
1042                 T.isNull() ? nullptr : T->getContainedDeducedType())) {
1043           SemaRef.Diag(IdLoc, diag::err_dependent_deduced_tst)
1044             << (int)SemaRef.getTemplateNameKindForDiagnostics(
1045                    Deduced->getTemplateName())
1046             << QualType(QualifierLoc.getNestedNameSpecifier()->getAsType(), 0);
1047           if (auto *TD = Deduced->getTemplateName().getAsTemplateDecl())
1048             SemaRef.Diag(TD->getLocation(), diag::note_template_decl_here);
1049           return QualType();
1050         }
1051       }
1052       return T;
1053     }
1054 
1055     TagTypeKind Kind = TypeWithKeyword::getTagTypeKindForKeyword(Keyword);
1056 
1057     // We had a dependent elaborated-type-specifier that has been transformed
1058     // into a non-dependent elaborated-type-specifier. Find the tag we're
1059     // referring to.
1060     LookupResult Result(SemaRef, Id, IdLoc, Sema::LookupTagName);
1061     DeclContext *DC = SemaRef.computeDeclContext(SS, false);
1062     if (!DC)
1063       return QualType();
1064 
1065     if (SemaRef.RequireCompleteDeclContext(SS, DC))
1066       return QualType();
1067 
1068     TagDecl *Tag = nullptr;
1069     SemaRef.LookupQualifiedName(Result, DC);
1070     switch (Result.getResultKind()) {
1071       case LookupResult::NotFound:
1072       case LookupResult::NotFoundInCurrentInstantiation:
1073         break;
1074 
1075       case LookupResult::Found:
1076         Tag = Result.getAsSingle<TagDecl>();
1077         break;
1078 
1079       case LookupResult::FoundOverloaded:
1080       case LookupResult::FoundUnresolvedValue:
1081         llvm_unreachable("Tag lookup cannot find non-tags");
1082 
1083       case LookupResult::Ambiguous:
1084         // Let the LookupResult structure handle ambiguities.
1085         return QualType();
1086     }
1087 
1088     if (!Tag) {
1089       // Check where the name exists but isn't a tag type and use that to emit
1090       // better diagnostics.
1091       LookupResult Result(SemaRef, Id, IdLoc, Sema::LookupTagName);
1092       SemaRef.LookupQualifiedName(Result, DC);
1093       switch (Result.getResultKind()) {
1094         case LookupResult::Found:
1095         case LookupResult::FoundOverloaded:
1096         case LookupResult::FoundUnresolvedValue: {
1097           NamedDecl *SomeDecl = Result.getRepresentativeDecl();
1098           Sema::NonTagKind NTK = SemaRef.getNonTagTypeDeclKind(SomeDecl, Kind);
1099           SemaRef.Diag(IdLoc, diag::err_tag_reference_non_tag) << SomeDecl
1100                                                                << NTK << Kind;
1101           SemaRef.Diag(SomeDecl->getLocation(), diag::note_declared_at);
1102           break;
1103         }
1104         default:
1105           SemaRef.Diag(IdLoc, diag::err_not_tag_in_scope)
1106               << Kind << Id << DC << QualifierLoc.getSourceRange();
1107           break;
1108       }
1109       return QualType();
1110     }
1111 
1112     if (!SemaRef.isAcceptableTagRedeclaration(Tag, Kind, /*isDefinition*/false,
1113                                               IdLoc, Id)) {
1114       SemaRef.Diag(KeywordLoc, diag::err_use_with_wrong_tag) << Id;
1115       SemaRef.Diag(Tag->getLocation(), diag::note_previous_use);
1116       return QualType();
1117     }
1118 
1119     // Build the elaborated-type-specifier type.
1120     QualType T = SemaRef.Context.getTypeDeclType(Tag);
1121     return SemaRef.Context.getElaboratedType(Keyword,
1122                                          QualifierLoc.getNestedNameSpecifier(),
1123                                              T);
1124   }
1125 
1126   /// Build a new pack expansion type.
1127   ///
1128   /// By default, builds a new PackExpansionType type from the given pattern.
1129   /// Subclasses may override this routine to provide different behavior.
1130   QualType RebuildPackExpansionType(QualType Pattern,
1131                                     SourceRange PatternRange,
1132                                     SourceLocation EllipsisLoc,
1133                                     Optional<unsigned> NumExpansions) {
1134     return getSema().CheckPackExpansion(Pattern, PatternRange, EllipsisLoc,
1135                                         NumExpansions);
1136   }
1137 
1138   /// Build a new atomic type given its value type.
1139   ///
1140   /// By default, performs semantic analysis when building the atomic type.
1141   /// Subclasses may override this routine to provide different behavior.
1142   QualType RebuildAtomicType(QualType ValueType, SourceLocation KWLoc);
1143 
1144   /// Build a new pipe type given its value type.
1145   QualType RebuildPipeType(QualType ValueType, SourceLocation KWLoc,
1146                            bool isReadPipe);
1147 
1148   /// Build a new template name given a nested name specifier, a flag
1149   /// indicating whether the "template" keyword was provided, and the template
1150   /// that the template name refers to.
1151   ///
1152   /// By default, builds the new template name directly. Subclasses may override
1153   /// this routine to provide different behavior.
1154   TemplateName RebuildTemplateName(CXXScopeSpec &SS,
1155                                    bool TemplateKW,
1156                                    TemplateDecl *Template);
1157 
1158   /// Build a new template name given a nested name specifier and the
1159   /// name that is referred to as a template.
1160   ///
1161   /// By default, performs semantic analysis to determine whether the name can
1162   /// be resolved to a specific template, then builds the appropriate kind of
1163   /// template name. Subclasses may override this routine to provide different
1164   /// behavior.
1165   TemplateName RebuildTemplateName(CXXScopeSpec &SS,
1166                                    SourceLocation TemplateKWLoc,
1167                                    const IdentifierInfo &Name,
1168                                    SourceLocation NameLoc, QualType ObjectType,
1169                                    NamedDecl *FirstQualifierInScope,
1170                                    bool AllowInjectedClassName);
1171 
1172   /// Build a new template name given a nested name specifier and the
1173   /// overloaded operator name that is referred to as a template.
1174   ///
1175   /// By default, performs semantic analysis to determine whether the name can
1176   /// be resolved to a specific template, then builds the appropriate kind of
1177   /// template name. Subclasses may override this routine to provide different
1178   /// behavior.
1179   TemplateName RebuildTemplateName(CXXScopeSpec &SS,
1180                                    SourceLocation TemplateKWLoc,
1181                                    OverloadedOperatorKind Operator,
1182                                    SourceLocation NameLoc, QualType ObjectType,
1183                                    bool AllowInjectedClassName);
1184 
1185   /// Build a new template name given a template template parameter pack
1186   /// and the
1187   ///
1188   /// By default, performs semantic analysis to determine whether the name can
1189   /// be resolved to a specific template, then builds the appropriate kind of
1190   /// template name. Subclasses may override this routine to provide different
1191   /// behavior.
1192   TemplateName RebuildTemplateName(TemplateTemplateParmDecl *Param,
1193                                    const TemplateArgument &ArgPack) {
1194     return getSema().Context.getSubstTemplateTemplateParmPack(Param, ArgPack);
1195   }
1196 
1197   /// Build a new compound statement.
1198   ///
1199   /// By default, performs semantic analysis to build the new statement.
1200   /// Subclasses may override this routine to provide different behavior.
1201   StmtResult RebuildCompoundStmt(SourceLocation LBraceLoc,
1202                                        MultiStmtArg Statements,
1203                                        SourceLocation RBraceLoc,
1204                                        bool IsStmtExpr) {
1205     return getSema().ActOnCompoundStmt(LBraceLoc, RBraceLoc, Statements,
1206                                        IsStmtExpr);
1207   }
1208 
1209   /// Build a new case statement.
1210   ///
1211   /// By default, performs semantic analysis to build the new statement.
1212   /// Subclasses may override this routine to provide different behavior.
1213   StmtResult RebuildCaseStmt(SourceLocation CaseLoc,
1214                                    Expr *LHS,
1215                                    SourceLocation EllipsisLoc,
1216                                    Expr *RHS,
1217                                    SourceLocation ColonLoc) {
1218     return getSema().ActOnCaseStmt(CaseLoc, LHS, EllipsisLoc, RHS,
1219                                    ColonLoc);
1220   }
1221 
1222   /// Attach the body to a new case statement.
1223   ///
1224   /// By default, performs semantic analysis to build the new statement.
1225   /// Subclasses may override this routine to provide different behavior.
1226   StmtResult RebuildCaseStmtBody(Stmt *S, Stmt *Body) {
1227     getSema().ActOnCaseStmtBody(S, Body);
1228     return S;
1229   }
1230 
1231   /// Build a new default statement.
1232   ///
1233   /// By default, performs semantic analysis to build the new statement.
1234   /// Subclasses may override this routine to provide different behavior.
1235   StmtResult RebuildDefaultStmt(SourceLocation DefaultLoc,
1236                                       SourceLocation ColonLoc,
1237                                       Stmt *SubStmt) {
1238     return getSema().ActOnDefaultStmt(DefaultLoc, ColonLoc, SubStmt,
1239                                       /*CurScope=*/nullptr);
1240   }
1241 
1242   /// Build a new label statement.
1243   ///
1244   /// By default, performs semantic analysis to build the new statement.
1245   /// Subclasses may override this routine to provide different behavior.
1246   StmtResult RebuildLabelStmt(SourceLocation IdentLoc, LabelDecl *L,
1247                               SourceLocation ColonLoc, Stmt *SubStmt) {
1248     return SemaRef.ActOnLabelStmt(IdentLoc, L, ColonLoc, SubStmt);
1249   }
1250 
1251   /// Build a new label statement.
1252   ///
1253   /// By default, performs semantic analysis to build the new statement.
1254   /// Subclasses may override this routine to provide different behavior.
1255   StmtResult RebuildAttributedStmt(SourceLocation AttrLoc,
1256                                    ArrayRef<const Attr*> Attrs,
1257                                    Stmt *SubStmt) {
1258     return SemaRef.ActOnAttributedStmt(AttrLoc, Attrs, SubStmt);
1259   }
1260 
1261   /// Build a new "if" statement.
1262   ///
1263   /// By default, performs semantic analysis to build the new statement.
1264   /// Subclasses may override this routine to provide different behavior.
1265   StmtResult RebuildIfStmt(SourceLocation IfLoc, bool IsConstexpr,
1266                            Sema::ConditionResult Cond, Stmt *Init, Stmt *Then,
1267                            SourceLocation ElseLoc, Stmt *Else) {
1268     return getSema().ActOnIfStmt(IfLoc, IsConstexpr, Init, Cond, Then,
1269                                  ElseLoc, Else);
1270   }
1271 
1272   /// Start building a new switch statement.
1273   ///
1274   /// By default, performs semantic analysis to build the new statement.
1275   /// Subclasses may override this routine to provide different behavior.
1276   StmtResult RebuildSwitchStmtStart(SourceLocation SwitchLoc, Stmt *Init,
1277                                     Sema::ConditionResult Cond) {
1278     return getSema().ActOnStartOfSwitchStmt(SwitchLoc, Init, Cond);
1279   }
1280 
1281   /// Attach the body to the switch statement.
1282   ///
1283   /// By default, performs semantic analysis to build the new statement.
1284   /// Subclasses may override this routine to provide different behavior.
1285   StmtResult RebuildSwitchStmtBody(SourceLocation SwitchLoc,
1286                                    Stmt *Switch, Stmt *Body) {
1287     return getSema().ActOnFinishSwitchStmt(SwitchLoc, Switch, Body);
1288   }
1289 
1290   /// Build a new while statement.
1291   ///
1292   /// By default, performs semantic analysis to build the new statement.
1293   /// Subclasses may override this routine to provide different behavior.
1294   StmtResult RebuildWhileStmt(SourceLocation WhileLoc,
1295                               Sema::ConditionResult Cond, Stmt *Body) {
1296     return getSema().ActOnWhileStmt(WhileLoc, Cond, Body);
1297   }
1298 
1299   /// Build a new do-while statement.
1300   ///
1301   /// By default, performs semantic analysis to build the new statement.
1302   /// Subclasses may override this routine to provide different behavior.
1303   StmtResult RebuildDoStmt(SourceLocation DoLoc, Stmt *Body,
1304                            SourceLocation WhileLoc, SourceLocation LParenLoc,
1305                            Expr *Cond, SourceLocation RParenLoc) {
1306     return getSema().ActOnDoStmt(DoLoc, Body, WhileLoc, LParenLoc,
1307                                  Cond, RParenLoc);
1308   }
1309 
1310   /// Build a new for statement.
1311   ///
1312   /// By default, performs semantic analysis to build the new statement.
1313   /// Subclasses may override this routine to provide different behavior.
1314   StmtResult RebuildForStmt(SourceLocation ForLoc, SourceLocation LParenLoc,
1315                             Stmt *Init, Sema::ConditionResult Cond,
1316                             Sema::FullExprArg Inc, SourceLocation RParenLoc,
1317                             Stmt *Body) {
1318     return getSema().ActOnForStmt(ForLoc, LParenLoc, Init, Cond,
1319                                   Inc, RParenLoc, Body);
1320   }
1321 
1322   /// Build a new goto statement.
1323   ///
1324   /// By default, performs semantic analysis to build the new statement.
1325   /// Subclasses may override this routine to provide different behavior.
1326   StmtResult RebuildGotoStmt(SourceLocation GotoLoc, SourceLocation LabelLoc,
1327                              LabelDecl *Label) {
1328     return getSema().ActOnGotoStmt(GotoLoc, LabelLoc, Label);
1329   }
1330 
1331   /// Build a new indirect goto statement.
1332   ///
1333   /// By default, performs semantic analysis to build the new statement.
1334   /// Subclasses may override this routine to provide different behavior.
1335   StmtResult RebuildIndirectGotoStmt(SourceLocation GotoLoc,
1336                                      SourceLocation StarLoc,
1337                                      Expr *Target) {
1338     return getSema().ActOnIndirectGotoStmt(GotoLoc, StarLoc, Target);
1339   }
1340 
1341   /// Build a new return statement.
1342   ///
1343   /// By default, performs semantic analysis to build the new statement.
1344   /// Subclasses may override this routine to provide different behavior.
1345   StmtResult RebuildReturnStmt(SourceLocation ReturnLoc, Expr *Result) {
1346     return getSema().BuildReturnStmt(ReturnLoc, Result);
1347   }
1348 
1349   /// Build a new declaration statement.
1350   ///
1351   /// By default, performs semantic analysis to build the new statement.
1352   /// Subclasses may override this routine to provide different behavior.
1353   StmtResult RebuildDeclStmt(MutableArrayRef<Decl *> Decls,
1354                              SourceLocation StartLoc, SourceLocation EndLoc) {
1355     Sema::DeclGroupPtrTy DG = getSema().BuildDeclaratorGroup(Decls);
1356     return getSema().ActOnDeclStmt(DG, StartLoc, EndLoc);
1357   }
1358 
1359   /// Build a new inline asm statement.
1360   ///
1361   /// By default, performs semantic analysis to build the new statement.
1362   /// Subclasses may override this routine to provide different behavior.
1363   StmtResult RebuildGCCAsmStmt(SourceLocation AsmLoc, bool IsSimple,
1364                                bool IsVolatile, unsigned NumOutputs,
1365                                unsigned NumInputs, IdentifierInfo **Names,
1366                                MultiExprArg Constraints, MultiExprArg Exprs,
1367                                Expr *AsmString, MultiExprArg Clobbers,
1368                                SourceLocation RParenLoc) {
1369     return getSema().ActOnGCCAsmStmt(AsmLoc, IsSimple, IsVolatile, NumOutputs,
1370                                      NumInputs, Names, Constraints, Exprs,
1371                                      AsmString, Clobbers, RParenLoc);
1372   }
1373 
1374   /// Build a new MS style inline asm statement.
1375   ///
1376   /// By default, performs semantic analysis to build the new statement.
1377   /// Subclasses may override this routine to provide different behavior.
1378   StmtResult RebuildMSAsmStmt(SourceLocation AsmLoc, SourceLocation LBraceLoc,
1379                               ArrayRef<Token> AsmToks,
1380                               StringRef AsmString,
1381                               unsigned NumOutputs, unsigned NumInputs,
1382                               ArrayRef<StringRef> Constraints,
1383                               ArrayRef<StringRef> Clobbers,
1384                               ArrayRef<Expr*> Exprs,
1385                               SourceLocation EndLoc) {
1386     return getSema().ActOnMSAsmStmt(AsmLoc, LBraceLoc, AsmToks, AsmString,
1387                                     NumOutputs, NumInputs,
1388                                     Constraints, Clobbers, Exprs, EndLoc);
1389   }
1390 
1391   /// Build a new co_return statement.
1392   ///
1393   /// By default, performs semantic analysis to build the new statement.
1394   /// Subclasses may override this routine to provide different behavior.
1395   StmtResult RebuildCoreturnStmt(SourceLocation CoreturnLoc, Expr *Result,
1396                                  bool IsImplicit) {
1397     return getSema().BuildCoreturnStmt(CoreturnLoc, Result, IsImplicit);
1398   }
1399 
1400   /// Build a new co_await expression.
1401   ///
1402   /// By default, performs semantic analysis to build the new expression.
1403   /// Subclasses may override this routine to provide different behavior.
1404   ExprResult RebuildCoawaitExpr(SourceLocation CoawaitLoc, Expr *Result,
1405                                 bool IsImplicit) {
1406     return getSema().BuildResolvedCoawaitExpr(CoawaitLoc, Result, IsImplicit);
1407   }
1408 
1409   /// Build a new co_await expression.
1410   ///
1411   /// By default, performs semantic analysis to build the new expression.
1412   /// Subclasses may override this routine to provide different behavior.
1413   ExprResult RebuildDependentCoawaitExpr(SourceLocation CoawaitLoc,
1414                                          Expr *Result,
1415                                          UnresolvedLookupExpr *Lookup) {
1416     return getSema().BuildUnresolvedCoawaitExpr(CoawaitLoc, Result, Lookup);
1417   }
1418 
1419   /// Build a new co_yield expression.
1420   ///
1421   /// By default, performs semantic analysis to build the new expression.
1422   /// Subclasses may override this routine to provide different behavior.
1423   ExprResult RebuildCoyieldExpr(SourceLocation CoyieldLoc, Expr *Result) {
1424     return getSema().BuildCoyieldExpr(CoyieldLoc, Result);
1425   }
1426 
1427   StmtResult RebuildCoroutineBodyStmt(CoroutineBodyStmt::CtorArgs Args) {
1428     return getSema().BuildCoroutineBodyStmt(Args);
1429   }
1430 
1431   /// Build a new Objective-C \@try statement.
1432   ///
1433   /// By default, performs semantic analysis to build the new statement.
1434   /// Subclasses may override this routine to provide different behavior.
1435   StmtResult RebuildObjCAtTryStmt(SourceLocation AtLoc,
1436                                         Stmt *TryBody,
1437                                         MultiStmtArg CatchStmts,
1438                                         Stmt *Finally) {
1439     return getSema().ActOnObjCAtTryStmt(AtLoc, TryBody, CatchStmts,
1440                                         Finally);
1441   }
1442 
1443   /// Rebuild an Objective-C exception declaration.
1444   ///
1445   /// By default, performs semantic analysis to build the new declaration.
1446   /// Subclasses may override this routine to provide different behavior.
1447   VarDecl *RebuildObjCExceptionDecl(VarDecl *ExceptionDecl,
1448                                     TypeSourceInfo *TInfo, QualType T) {
1449     return getSema().BuildObjCExceptionDecl(TInfo, T,
1450                                             ExceptionDecl->getInnerLocStart(),
1451                                             ExceptionDecl->getLocation(),
1452                                             ExceptionDecl->getIdentifier());
1453   }
1454 
1455   /// Build a new Objective-C \@catch statement.
1456   ///
1457   /// By default, performs semantic analysis to build the new statement.
1458   /// Subclasses may override this routine to provide different behavior.
1459   StmtResult RebuildObjCAtCatchStmt(SourceLocation AtLoc,
1460                                           SourceLocation RParenLoc,
1461                                           VarDecl *Var,
1462                                           Stmt *Body) {
1463     return getSema().ActOnObjCAtCatchStmt(AtLoc, RParenLoc,
1464                                           Var, Body);
1465   }
1466 
1467   /// Build a new Objective-C \@finally statement.
1468   ///
1469   /// By default, performs semantic analysis to build the new statement.
1470   /// Subclasses may override this routine to provide different behavior.
1471   StmtResult RebuildObjCAtFinallyStmt(SourceLocation AtLoc,
1472                                             Stmt *Body) {
1473     return getSema().ActOnObjCAtFinallyStmt(AtLoc, Body);
1474   }
1475 
1476   /// Build a new Objective-C \@throw statement.
1477   ///
1478   /// By default, performs semantic analysis to build the new statement.
1479   /// Subclasses may override this routine to provide different behavior.
1480   StmtResult RebuildObjCAtThrowStmt(SourceLocation AtLoc,
1481                                           Expr *Operand) {
1482     return getSema().BuildObjCAtThrowStmt(AtLoc, Operand);
1483   }
1484 
1485   /// Build a new OpenMP executable directive.
1486   ///
1487   /// By default, performs semantic analysis to build the new statement.
1488   /// Subclasses may override this routine to provide different behavior.
1489   StmtResult RebuildOMPExecutableDirective(OpenMPDirectiveKind Kind,
1490                                            DeclarationNameInfo DirName,
1491                                            OpenMPDirectiveKind CancelRegion,
1492                                            ArrayRef<OMPClause *> Clauses,
1493                                            Stmt *AStmt, SourceLocation StartLoc,
1494                                            SourceLocation EndLoc) {
1495     return getSema().ActOnOpenMPExecutableDirective(
1496         Kind, DirName, CancelRegion, Clauses, AStmt, StartLoc, EndLoc);
1497   }
1498 
1499   /// Build a new OpenMP 'if' clause.
1500   ///
1501   /// By default, performs semantic analysis to build the new OpenMP clause.
1502   /// Subclasses may override this routine to provide different behavior.
1503   OMPClause *RebuildOMPIfClause(OpenMPDirectiveKind NameModifier,
1504                                 Expr *Condition, SourceLocation StartLoc,
1505                                 SourceLocation LParenLoc,
1506                                 SourceLocation NameModifierLoc,
1507                                 SourceLocation ColonLoc,
1508                                 SourceLocation EndLoc) {
1509     return getSema().ActOnOpenMPIfClause(NameModifier, Condition, StartLoc,
1510                                          LParenLoc, NameModifierLoc, ColonLoc,
1511                                          EndLoc);
1512   }
1513 
1514   /// Build a new OpenMP 'final' clause.
1515   ///
1516   /// By default, performs semantic analysis to build the new OpenMP clause.
1517   /// Subclasses may override this routine to provide different behavior.
1518   OMPClause *RebuildOMPFinalClause(Expr *Condition, SourceLocation StartLoc,
1519                                    SourceLocation LParenLoc,
1520                                    SourceLocation EndLoc) {
1521     return getSema().ActOnOpenMPFinalClause(Condition, StartLoc, LParenLoc,
1522                                             EndLoc);
1523   }
1524 
1525   /// Build a new OpenMP 'num_threads' clause.
1526   ///
1527   /// By default, performs semantic analysis to build the new OpenMP clause.
1528   /// Subclasses may override this routine to provide different behavior.
1529   OMPClause *RebuildOMPNumThreadsClause(Expr *NumThreads,
1530                                         SourceLocation StartLoc,
1531                                         SourceLocation LParenLoc,
1532                                         SourceLocation EndLoc) {
1533     return getSema().ActOnOpenMPNumThreadsClause(NumThreads, StartLoc,
1534                                                  LParenLoc, EndLoc);
1535   }
1536 
1537   /// Build a new OpenMP 'safelen' clause.
1538   ///
1539   /// By default, performs semantic analysis to build the new OpenMP clause.
1540   /// Subclasses may override this routine to provide different behavior.
1541   OMPClause *RebuildOMPSafelenClause(Expr *Len, SourceLocation StartLoc,
1542                                      SourceLocation LParenLoc,
1543                                      SourceLocation EndLoc) {
1544     return getSema().ActOnOpenMPSafelenClause(Len, StartLoc, LParenLoc, EndLoc);
1545   }
1546 
1547   /// Build a new OpenMP 'simdlen' clause.
1548   ///
1549   /// By default, performs semantic analysis to build the new OpenMP clause.
1550   /// Subclasses may override this routine to provide different behavior.
1551   OMPClause *RebuildOMPSimdlenClause(Expr *Len, SourceLocation StartLoc,
1552                                      SourceLocation LParenLoc,
1553                                      SourceLocation EndLoc) {
1554     return getSema().ActOnOpenMPSimdlenClause(Len, StartLoc, LParenLoc, EndLoc);
1555   }
1556 
1557   /// Build a new OpenMP 'collapse' clause.
1558   ///
1559   /// By default, performs semantic analysis to build the new OpenMP clause.
1560   /// Subclasses may override this routine to provide different behavior.
1561   OMPClause *RebuildOMPCollapseClause(Expr *Num, SourceLocation StartLoc,
1562                                       SourceLocation LParenLoc,
1563                                       SourceLocation EndLoc) {
1564     return getSema().ActOnOpenMPCollapseClause(Num, StartLoc, LParenLoc,
1565                                                EndLoc);
1566   }
1567 
1568   /// Build a new OpenMP 'default' clause.
1569   ///
1570   /// By default, performs semantic analysis to build the new OpenMP clause.
1571   /// Subclasses may override this routine to provide different behavior.
1572   OMPClause *RebuildOMPDefaultClause(OpenMPDefaultClauseKind Kind,
1573                                      SourceLocation KindKwLoc,
1574                                      SourceLocation StartLoc,
1575                                      SourceLocation LParenLoc,
1576                                      SourceLocation EndLoc) {
1577     return getSema().ActOnOpenMPDefaultClause(Kind, KindKwLoc,
1578                                               StartLoc, LParenLoc, EndLoc);
1579   }
1580 
1581   /// Build a new OpenMP 'proc_bind' clause.
1582   ///
1583   /// By default, performs semantic analysis to build the new OpenMP clause.
1584   /// Subclasses may override this routine to provide different behavior.
1585   OMPClause *RebuildOMPProcBindClause(OpenMPProcBindClauseKind Kind,
1586                                       SourceLocation KindKwLoc,
1587                                       SourceLocation StartLoc,
1588                                       SourceLocation LParenLoc,
1589                                       SourceLocation EndLoc) {
1590     return getSema().ActOnOpenMPProcBindClause(Kind, KindKwLoc,
1591                                                StartLoc, LParenLoc, EndLoc);
1592   }
1593 
1594   /// Build a new OpenMP 'schedule' clause.
1595   ///
1596   /// By default, performs semantic analysis to build the new OpenMP clause.
1597   /// Subclasses may override this routine to provide different behavior.
1598   OMPClause *RebuildOMPScheduleClause(
1599       OpenMPScheduleClauseModifier M1, OpenMPScheduleClauseModifier M2,
1600       OpenMPScheduleClauseKind Kind, Expr *ChunkSize, SourceLocation StartLoc,
1601       SourceLocation LParenLoc, SourceLocation M1Loc, SourceLocation M2Loc,
1602       SourceLocation KindLoc, SourceLocation CommaLoc, SourceLocation EndLoc) {
1603     return getSema().ActOnOpenMPScheduleClause(
1604         M1, M2, Kind, ChunkSize, StartLoc, LParenLoc, M1Loc, M2Loc, KindLoc,
1605         CommaLoc, EndLoc);
1606   }
1607 
1608   /// Build a new OpenMP 'ordered' clause.
1609   ///
1610   /// By default, performs semantic analysis to build the new OpenMP clause.
1611   /// Subclasses may override this routine to provide different behavior.
1612   OMPClause *RebuildOMPOrderedClause(SourceLocation StartLoc,
1613                                      SourceLocation EndLoc,
1614                                      SourceLocation LParenLoc, Expr *Num) {
1615     return getSema().ActOnOpenMPOrderedClause(StartLoc, EndLoc, LParenLoc, Num);
1616   }
1617 
1618   /// Build a new OpenMP 'private' clause.
1619   ///
1620   /// By default, performs semantic analysis to build the new OpenMP clause.
1621   /// Subclasses may override this routine to provide different behavior.
1622   OMPClause *RebuildOMPPrivateClause(ArrayRef<Expr *> VarList,
1623                                      SourceLocation StartLoc,
1624                                      SourceLocation LParenLoc,
1625                                      SourceLocation EndLoc) {
1626     return getSema().ActOnOpenMPPrivateClause(VarList, StartLoc, LParenLoc,
1627                                               EndLoc);
1628   }
1629 
1630   /// Build a new OpenMP 'firstprivate' clause.
1631   ///
1632   /// By default, performs semantic analysis to build the new OpenMP clause.
1633   /// Subclasses may override this routine to provide different behavior.
1634   OMPClause *RebuildOMPFirstprivateClause(ArrayRef<Expr *> VarList,
1635                                           SourceLocation StartLoc,
1636                                           SourceLocation LParenLoc,
1637                                           SourceLocation EndLoc) {
1638     return getSema().ActOnOpenMPFirstprivateClause(VarList, StartLoc, LParenLoc,
1639                                                    EndLoc);
1640   }
1641 
1642   /// Build a new OpenMP 'lastprivate' clause.
1643   ///
1644   /// By default, performs semantic analysis to build the new OpenMP clause.
1645   /// Subclasses may override this routine to provide different behavior.
1646   OMPClause *RebuildOMPLastprivateClause(ArrayRef<Expr *> VarList,
1647                                          SourceLocation StartLoc,
1648                                          SourceLocation LParenLoc,
1649                                          SourceLocation EndLoc) {
1650     return getSema().ActOnOpenMPLastprivateClause(VarList, StartLoc, LParenLoc,
1651                                                   EndLoc);
1652   }
1653 
1654   /// Build a new OpenMP 'shared' clause.
1655   ///
1656   /// By default, performs semantic analysis to build the new OpenMP clause.
1657   /// Subclasses may override this routine to provide different behavior.
1658   OMPClause *RebuildOMPSharedClause(ArrayRef<Expr *> VarList,
1659                                     SourceLocation StartLoc,
1660                                     SourceLocation LParenLoc,
1661                                     SourceLocation EndLoc) {
1662     return getSema().ActOnOpenMPSharedClause(VarList, StartLoc, LParenLoc,
1663                                              EndLoc);
1664   }
1665 
1666   /// Build a new OpenMP 'reduction' clause.
1667   ///
1668   /// By default, performs semantic analysis to build the new statement.
1669   /// Subclasses may override this routine to provide different behavior.
1670   OMPClause *RebuildOMPReductionClause(ArrayRef<Expr *> VarList,
1671                                        SourceLocation StartLoc,
1672                                        SourceLocation LParenLoc,
1673                                        SourceLocation ColonLoc,
1674                                        SourceLocation EndLoc,
1675                                        CXXScopeSpec &ReductionIdScopeSpec,
1676                                        const DeclarationNameInfo &ReductionId,
1677                                        ArrayRef<Expr *> UnresolvedReductions) {
1678     return getSema().ActOnOpenMPReductionClause(
1679         VarList, StartLoc, LParenLoc, ColonLoc, EndLoc, ReductionIdScopeSpec,
1680         ReductionId, UnresolvedReductions);
1681   }
1682 
1683   /// Build a new OpenMP 'task_reduction' clause.
1684   ///
1685   /// By default, performs semantic analysis to build the new statement.
1686   /// Subclasses may override this routine to provide different behavior.
1687   OMPClause *RebuildOMPTaskReductionClause(
1688       ArrayRef<Expr *> VarList, SourceLocation StartLoc,
1689       SourceLocation LParenLoc, SourceLocation ColonLoc, SourceLocation EndLoc,
1690       CXXScopeSpec &ReductionIdScopeSpec,
1691       const DeclarationNameInfo &ReductionId,
1692       ArrayRef<Expr *> UnresolvedReductions) {
1693     return getSema().ActOnOpenMPTaskReductionClause(
1694         VarList, StartLoc, LParenLoc, ColonLoc, EndLoc, ReductionIdScopeSpec,
1695         ReductionId, UnresolvedReductions);
1696   }
1697 
1698   /// Build a new OpenMP 'in_reduction' 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 *
1703   RebuildOMPInReductionClause(ArrayRef<Expr *> VarList, SourceLocation StartLoc,
1704                               SourceLocation LParenLoc, SourceLocation ColonLoc,
1705                               SourceLocation EndLoc,
1706                               CXXScopeSpec &ReductionIdScopeSpec,
1707                               const DeclarationNameInfo &ReductionId,
1708                               ArrayRef<Expr *> UnresolvedReductions) {
1709     return getSema().ActOnOpenMPInReductionClause(
1710         VarList, StartLoc, LParenLoc, ColonLoc, EndLoc, ReductionIdScopeSpec,
1711         ReductionId, UnresolvedReductions);
1712   }
1713 
1714   /// Build a new OpenMP 'linear' clause.
1715   ///
1716   /// By default, performs semantic analysis to build the new OpenMP clause.
1717   /// Subclasses may override this routine to provide different behavior.
1718   OMPClause *RebuildOMPLinearClause(ArrayRef<Expr *> VarList, Expr *Step,
1719                                     SourceLocation StartLoc,
1720                                     SourceLocation LParenLoc,
1721                                     OpenMPLinearClauseKind Modifier,
1722                                     SourceLocation ModifierLoc,
1723                                     SourceLocation ColonLoc,
1724                                     SourceLocation EndLoc) {
1725     return getSema().ActOnOpenMPLinearClause(VarList, Step, StartLoc, LParenLoc,
1726                                              Modifier, ModifierLoc, ColonLoc,
1727                                              EndLoc);
1728   }
1729 
1730   /// Build a new OpenMP 'aligned' clause.
1731   ///
1732   /// By default, performs semantic analysis to build the new OpenMP clause.
1733   /// Subclasses may override this routine to provide different behavior.
1734   OMPClause *RebuildOMPAlignedClause(ArrayRef<Expr *> VarList, Expr *Alignment,
1735                                      SourceLocation StartLoc,
1736                                      SourceLocation LParenLoc,
1737                                      SourceLocation ColonLoc,
1738                                      SourceLocation EndLoc) {
1739     return getSema().ActOnOpenMPAlignedClause(VarList, Alignment, StartLoc,
1740                                               LParenLoc, ColonLoc, EndLoc);
1741   }
1742 
1743   /// Build a new OpenMP 'copyin' clause.
1744   ///
1745   /// By default, performs semantic analysis to build the new OpenMP clause.
1746   /// Subclasses may override this routine to provide different behavior.
1747   OMPClause *RebuildOMPCopyinClause(ArrayRef<Expr *> VarList,
1748                                     SourceLocation StartLoc,
1749                                     SourceLocation LParenLoc,
1750                                     SourceLocation EndLoc) {
1751     return getSema().ActOnOpenMPCopyinClause(VarList, StartLoc, LParenLoc,
1752                                              EndLoc);
1753   }
1754 
1755   /// Build a new OpenMP 'copyprivate' clause.
1756   ///
1757   /// By default, performs semantic analysis to build the new OpenMP clause.
1758   /// Subclasses may override this routine to provide different behavior.
1759   OMPClause *RebuildOMPCopyprivateClause(ArrayRef<Expr *> VarList,
1760                                          SourceLocation StartLoc,
1761                                          SourceLocation LParenLoc,
1762                                          SourceLocation EndLoc) {
1763     return getSema().ActOnOpenMPCopyprivateClause(VarList, StartLoc, LParenLoc,
1764                                                   EndLoc);
1765   }
1766 
1767   /// Build a new OpenMP 'flush' pseudo clause.
1768   ///
1769   /// By default, performs semantic analysis to build the new OpenMP clause.
1770   /// Subclasses may override this routine to provide different behavior.
1771   OMPClause *RebuildOMPFlushClause(ArrayRef<Expr *> VarList,
1772                                    SourceLocation StartLoc,
1773                                    SourceLocation LParenLoc,
1774                                    SourceLocation EndLoc) {
1775     return getSema().ActOnOpenMPFlushClause(VarList, StartLoc, LParenLoc,
1776                                             EndLoc);
1777   }
1778 
1779   /// Build a new OpenMP 'depend' pseudo clause.
1780   ///
1781   /// By default, performs semantic analysis to build the new OpenMP clause.
1782   /// Subclasses may override this routine to provide different behavior.
1783   OMPClause *
1784   RebuildOMPDependClause(OpenMPDependClauseKind DepKind, SourceLocation DepLoc,
1785                          SourceLocation ColonLoc, ArrayRef<Expr *> VarList,
1786                          SourceLocation StartLoc, SourceLocation LParenLoc,
1787                          SourceLocation EndLoc) {
1788     return getSema().ActOnOpenMPDependClause(DepKind, DepLoc, ColonLoc, VarList,
1789                                              StartLoc, LParenLoc, EndLoc);
1790   }
1791 
1792   /// Build a new OpenMP 'device' clause.
1793   ///
1794   /// By default, performs semantic analysis to build the new statement.
1795   /// Subclasses may override this routine to provide different behavior.
1796   OMPClause *RebuildOMPDeviceClause(Expr *Device, SourceLocation StartLoc,
1797                                     SourceLocation LParenLoc,
1798                                     SourceLocation EndLoc) {
1799     return getSema().ActOnOpenMPDeviceClause(Device, StartLoc, LParenLoc,
1800                                              EndLoc);
1801   }
1802 
1803   /// Build a new OpenMP 'map' clause.
1804   ///
1805   /// By default, performs semantic analysis to build the new OpenMP clause.
1806   /// Subclasses may override this routine to provide different behavior.
1807   OMPClause *RebuildOMPMapClause(
1808       ArrayRef<OpenMPMapModifierKind> MapTypeModifiers,
1809       ArrayRef<SourceLocation> MapTypeModifiersLoc,
1810       CXXScopeSpec MapperIdScopeSpec, DeclarationNameInfo MapperId,
1811       OpenMPMapClauseKind MapType, bool IsMapTypeImplicit,
1812       SourceLocation MapLoc, SourceLocation ColonLoc, ArrayRef<Expr *> VarList,
1813       const OMPVarListLocTy &Locs, ArrayRef<Expr *> UnresolvedMappers) {
1814     return getSema().ActOnOpenMPMapClause(MapTypeModifiers, MapTypeModifiersLoc,
1815                                           MapperIdScopeSpec, MapperId, MapType,
1816                                           IsMapTypeImplicit, MapLoc, ColonLoc,
1817                                           VarList, Locs, UnresolvedMappers);
1818   }
1819 
1820   /// Build a new OpenMP 'num_teams' clause.
1821   ///
1822   /// By default, performs semantic analysis to build the new statement.
1823   /// Subclasses may override this routine to provide different behavior.
1824   OMPClause *RebuildOMPNumTeamsClause(Expr *NumTeams, SourceLocation StartLoc,
1825                                       SourceLocation LParenLoc,
1826                                       SourceLocation EndLoc) {
1827     return getSema().ActOnOpenMPNumTeamsClause(NumTeams, StartLoc, LParenLoc,
1828                                                EndLoc);
1829   }
1830 
1831   /// Build a new OpenMP 'thread_limit' clause.
1832   ///
1833   /// By default, performs semantic analysis to build the new statement.
1834   /// Subclasses may override this routine to provide different behavior.
1835   OMPClause *RebuildOMPThreadLimitClause(Expr *ThreadLimit,
1836                                          SourceLocation StartLoc,
1837                                          SourceLocation LParenLoc,
1838                                          SourceLocation EndLoc) {
1839     return getSema().ActOnOpenMPThreadLimitClause(ThreadLimit, StartLoc,
1840                                                   LParenLoc, EndLoc);
1841   }
1842 
1843   /// Build a new OpenMP 'priority' clause.
1844   ///
1845   /// By default, performs semantic analysis to build the new statement.
1846   /// Subclasses may override this routine to provide different behavior.
1847   OMPClause *RebuildOMPPriorityClause(Expr *Priority, SourceLocation StartLoc,
1848                                       SourceLocation LParenLoc,
1849                                       SourceLocation EndLoc) {
1850     return getSema().ActOnOpenMPPriorityClause(Priority, StartLoc, LParenLoc,
1851                                                EndLoc);
1852   }
1853 
1854   /// Build a new OpenMP 'grainsize' clause.
1855   ///
1856   /// By default, performs semantic analysis to build the new statement.
1857   /// Subclasses may override this routine to provide different behavior.
1858   OMPClause *RebuildOMPGrainsizeClause(Expr *Grainsize, SourceLocation StartLoc,
1859                                        SourceLocation LParenLoc,
1860                                        SourceLocation EndLoc) {
1861     return getSema().ActOnOpenMPGrainsizeClause(Grainsize, StartLoc, LParenLoc,
1862                                                 EndLoc);
1863   }
1864 
1865   /// Build a new OpenMP 'num_tasks' clause.
1866   ///
1867   /// By default, performs semantic analysis to build the new statement.
1868   /// Subclasses may override this routine to provide different behavior.
1869   OMPClause *RebuildOMPNumTasksClause(Expr *NumTasks, SourceLocation StartLoc,
1870                                       SourceLocation LParenLoc,
1871                                       SourceLocation EndLoc) {
1872     return getSema().ActOnOpenMPNumTasksClause(NumTasks, StartLoc, LParenLoc,
1873                                                EndLoc);
1874   }
1875 
1876   /// Build a new OpenMP 'hint' clause.
1877   ///
1878   /// By default, performs semantic analysis to build the new statement.
1879   /// Subclasses may override this routine to provide different behavior.
1880   OMPClause *RebuildOMPHintClause(Expr *Hint, SourceLocation StartLoc,
1881                                   SourceLocation LParenLoc,
1882                                   SourceLocation EndLoc) {
1883     return getSema().ActOnOpenMPHintClause(Hint, StartLoc, LParenLoc, EndLoc);
1884   }
1885 
1886   /// Build a new OpenMP 'dist_schedule' clause.
1887   ///
1888   /// By default, performs semantic analysis to build the new OpenMP clause.
1889   /// Subclasses may override this routine to provide different behavior.
1890   OMPClause *
1891   RebuildOMPDistScheduleClause(OpenMPDistScheduleClauseKind Kind,
1892                                Expr *ChunkSize, SourceLocation StartLoc,
1893                                SourceLocation LParenLoc, SourceLocation KindLoc,
1894                                SourceLocation CommaLoc, SourceLocation EndLoc) {
1895     return getSema().ActOnOpenMPDistScheduleClause(
1896         Kind, ChunkSize, StartLoc, LParenLoc, KindLoc, CommaLoc, EndLoc);
1897   }
1898 
1899   /// Build a new OpenMP 'to' clause.
1900   ///
1901   /// By default, performs semantic analysis to build the new statement.
1902   /// Subclasses may override this routine to provide different behavior.
1903   OMPClause *RebuildOMPToClause(ArrayRef<Expr *> VarList,
1904                                 CXXScopeSpec &MapperIdScopeSpec,
1905                                 DeclarationNameInfo &MapperId,
1906                                 const OMPVarListLocTy &Locs,
1907                                 ArrayRef<Expr *> UnresolvedMappers) {
1908     return getSema().ActOnOpenMPToClause(VarList, MapperIdScopeSpec, MapperId,
1909                                          Locs, UnresolvedMappers);
1910   }
1911 
1912   /// Build a new OpenMP 'from' clause.
1913   ///
1914   /// By default, performs semantic analysis to build the new statement.
1915   /// Subclasses may override this routine to provide different behavior.
1916   OMPClause *RebuildOMPFromClause(ArrayRef<Expr *> VarList,
1917                                   CXXScopeSpec &MapperIdScopeSpec,
1918                                   DeclarationNameInfo &MapperId,
1919                                   const OMPVarListLocTy &Locs,
1920                                   ArrayRef<Expr *> UnresolvedMappers) {
1921     return getSema().ActOnOpenMPFromClause(VarList, MapperIdScopeSpec, MapperId,
1922                                            Locs, UnresolvedMappers);
1923   }
1924 
1925   /// Build a new OpenMP 'use_device_ptr' clause.
1926   ///
1927   /// By default, performs semantic analysis to build the new OpenMP clause.
1928   /// Subclasses may override this routine to provide different behavior.
1929   OMPClause *RebuildOMPUseDevicePtrClause(ArrayRef<Expr *> VarList,
1930                                           const OMPVarListLocTy &Locs) {
1931     return getSema().ActOnOpenMPUseDevicePtrClause(VarList, Locs);
1932   }
1933 
1934   /// Build a new OpenMP 'is_device_ptr' clause.
1935   ///
1936   /// By default, performs semantic analysis to build the new OpenMP clause.
1937   /// Subclasses may override this routine to provide different behavior.
1938   OMPClause *RebuildOMPIsDevicePtrClause(ArrayRef<Expr *> VarList,
1939                                          const OMPVarListLocTy &Locs) {
1940     return getSema().ActOnOpenMPIsDevicePtrClause(VarList, Locs);
1941   }
1942 
1943   /// Rebuild the operand to an Objective-C \@synchronized statement.
1944   ///
1945   /// By default, performs semantic analysis to build the new statement.
1946   /// Subclasses may override this routine to provide different behavior.
1947   ExprResult RebuildObjCAtSynchronizedOperand(SourceLocation atLoc,
1948                                               Expr *object) {
1949     return getSema().ActOnObjCAtSynchronizedOperand(atLoc, object);
1950   }
1951 
1952   /// Build a new Objective-C \@synchronized statement.
1953   ///
1954   /// By default, performs semantic analysis to build the new statement.
1955   /// Subclasses may override this routine to provide different behavior.
1956   StmtResult RebuildObjCAtSynchronizedStmt(SourceLocation AtLoc,
1957                                            Expr *Object, Stmt *Body) {
1958     return getSema().ActOnObjCAtSynchronizedStmt(AtLoc, Object, Body);
1959   }
1960 
1961   /// Build a new Objective-C \@autoreleasepool statement.
1962   ///
1963   /// By default, performs semantic analysis to build the new statement.
1964   /// Subclasses may override this routine to provide different behavior.
1965   StmtResult RebuildObjCAutoreleasePoolStmt(SourceLocation AtLoc,
1966                                             Stmt *Body) {
1967     return getSema().ActOnObjCAutoreleasePoolStmt(AtLoc, Body);
1968   }
1969 
1970   /// Build a new Objective-C fast enumeration statement.
1971   ///
1972   /// By default, performs semantic analysis to build the new statement.
1973   /// Subclasses may override this routine to provide different behavior.
1974   StmtResult RebuildObjCForCollectionStmt(SourceLocation ForLoc,
1975                                           Stmt *Element,
1976                                           Expr *Collection,
1977                                           SourceLocation RParenLoc,
1978                                           Stmt *Body) {
1979     StmtResult ForEachStmt = getSema().ActOnObjCForCollectionStmt(ForLoc,
1980                                                 Element,
1981                                                 Collection,
1982                                                 RParenLoc);
1983     if (ForEachStmt.isInvalid())
1984       return StmtError();
1985 
1986     return getSema().FinishObjCForCollectionStmt(ForEachStmt.get(), Body);
1987   }
1988 
1989   /// Build a new C++ exception declaration.
1990   ///
1991   /// By default, performs semantic analysis to build the new decaration.
1992   /// Subclasses may override this routine to provide different behavior.
1993   VarDecl *RebuildExceptionDecl(VarDecl *ExceptionDecl,
1994                                 TypeSourceInfo *Declarator,
1995                                 SourceLocation StartLoc,
1996                                 SourceLocation IdLoc,
1997                                 IdentifierInfo *Id) {
1998     VarDecl *Var = getSema().BuildExceptionDeclaration(nullptr, Declarator,
1999                                                        StartLoc, IdLoc, Id);
2000     if (Var)
2001       getSema().CurContext->addDecl(Var);
2002     return Var;
2003   }
2004 
2005   /// Build a new C++ catch statement.
2006   ///
2007   /// By default, performs semantic analysis to build the new statement.
2008   /// Subclasses may override this routine to provide different behavior.
2009   StmtResult RebuildCXXCatchStmt(SourceLocation CatchLoc,
2010                                  VarDecl *ExceptionDecl,
2011                                  Stmt *Handler) {
2012     return Owned(new (getSema().Context) CXXCatchStmt(CatchLoc, ExceptionDecl,
2013                                                       Handler));
2014   }
2015 
2016   /// Build a new C++ try statement.
2017   ///
2018   /// By default, performs semantic analysis to build the new statement.
2019   /// Subclasses may override this routine to provide different behavior.
2020   StmtResult RebuildCXXTryStmt(SourceLocation TryLoc, Stmt *TryBlock,
2021                                ArrayRef<Stmt *> Handlers) {
2022     return getSema().ActOnCXXTryBlock(TryLoc, TryBlock, Handlers);
2023   }
2024 
2025   /// Build a new C++0x range-based for statement.
2026   ///
2027   /// By default, performs semantic analysis to build the new statement.
2028   /// Subclasses may override this routine to provide different behavior.
2029   StmtResult RebuildCXXForRangeStmt(SourceLocation ForLoc,
2030                                     SourceLocation CoawaitLoc, Stmt *Init,
2031                                     SourceLocation ColonLoc, Stmt *Range,
2032                                     Stmt *Begin, Stmt *End, Expr *Cond,
2033                                     Expr *Inc, Stmt *LoopVar,
2034                                     SourceLocation RParenLoc) {
2035     // If we've just learned that the range is actually an Objective-C
2036     // collection, treat this as an Objective-C fast enumeration loop.
2037     if (DeclStmt *RangeStmt = dyn_cast<DeclStmt>(Range)) {
2038       if (RangeStmt->isSingleDecl()) {
2039         if (VarDecl *RangeVar = dyn_cast<VarDecl>(RangeStmt->getSingleDecl())) {
2040           if (RangeVar->isInvalidDecl())
2041             return StmtError();
2042 
2043           Expr *RangeExpr = RangeVar->getInit();
2044           if (!RangeExpr->isTypeDependent() &&
2045               RangeExpr->getType()->isObjCObjectPointerType()) {
2046             // FIXME: Support init-statements in Objective-C++20 ranged for
2047             // statement.
2048             if (Init) {
2049               return SemaRef.Diag(Init->getBeginLoc(),
2050                                   diag::err_objc_for_range_init_stmt)
2051                          << Init->getSourceRange();
2052             }
2053             return getSema().ActOnObjCForCollectionStmt(ForLoc, LoopVar,
2054                                                         RangeExpr, RParenLoc);
2055           }
2056         }
2057       }
2058     }
2059 
2060     return getSema().BuildCXXForRangeStmt(ForLoc, CoawaitLoc, Init, ColonLoc,
2061                                           Range, Begin, End, Cond, Inc, LoopVar,
2062                                           RParenLoc, Sema::BFRK_Rebuild);
2063   }
2064 
2065   /// Build a new C++0x range-based for statement.
2066   ///
2067   /// By default, performs semantic analysis to build the new statement.
2068   /// Subclasses may override this routine to provide different behavior.
2069   StmtResult RebuildMSDependentExistsStmt(SourceLocation KeywordLoc,
2070                                           bool IsIfExists,
2071                                           NestedNameSpecifierLoc QualifierLoc,
2072                                           DeclarationNameInfo NameInfo,
2073                                           Stmt *Nested) {
2074     return getSema().BuildMSDependentExistsStmt(KeywordLoc, IsIfExists,
2075                                                 QualifierLoc, NameInfo, Nested);
2076   }
2077 
2078   /// Attach body to a C++0x range-based for statement.
2079   ///
2080   /// By default, performs semantic analysis to finish the new statement.
2081   /// Subclasses may override this routine to provide different behavior.
2082   StmtResult FinishCXXForRangeStmt(Stmt *ForRange, Stmt *Body) {
2083     return getSema().FinishCXXForRangeStmt(ForRange, Body);
2084   }
2085 
2086   StmtResult RebuildSEHTryStmt(bool IsCXXTry, SourceLocation TryLoc,
2087                                Stmt *TryBlock, Stmt *Handler) {
2088     return getSema().ActOnSEHTryBlock(IsCXXTry, TryLoc, TryBlock, Handler);
2089   }
2090 
2091   StmtResult RebuildSEHExceptStmt(SourceLocation Loc, Expr *FilterExpr,
2092                                   Stmt *Block) {
2093     return getSema().ActOnSEHExceptBlock(Loc, FilterExpr, Block);
2094   }
2095 
2096   StmtResult RebuildSEHFinallyStmt(SourceLocation Loc, Stmt *Block) {
2097     return SEHFinallyStmt::Create(getSema().getASTContext(), Loc, Block);
2098   }
2099 
2100   /// Build a new predefined expression.
2101   ///
2102   /// By default, performs semantic analysis to build the new expression.
2103   /// Subclasses may override this routine to provide different behavior.
2104   ExprResult RebuildPredefinedExpr(SourceLocation Loc,
2105                                    PredefinedExpr::IdentKind IK) {
2106     return getSema().BuildPredefinedExpr(Loc, IK);
2107   }
2108 
2109   /// Build a new expression that references a declaration.
2110   ///
2111   /// By default, performs semantic analysis to build the new expression.
2112   /// Subclasses may override this routine to provide different behavior.
2113   ExprResult RebuildDeclarationNameExpr(const CXXScopeSpec &SS,
2114                                         LookupResult &R,
2115                                         bool RequiresADL) {
2116     return getSema().BuildDeclarationNameExpr(SS, R, RequiresADL);
2117   }
2118 
2119 
2120   /// Build a new expression that references a declaration.
2121   ///
2122   /// By default, performs semantic analysis to build the new expression.
2123   /// Subclasses may override this routine to provide different behavior.
2124   ExprResult RebuildDeclRefExpr(NestedNameSpecifierLoc QualifierLoc,
2125                                 ValueDecl *VD,
2126                                 const DeclarationNameInfo &NameInfo,
2127                                 TemplateArgumentListInfo *TemplateArgs) {
2128     CXXScopeSpec SS;
2129     SS.Adopt(QualifierLoc);
2130 
2131     // FIXME: loses template args.
2132 
2133     return getSema().BuildDeclarationNameExpr(SS, NameInfo, VD);
2134   }
2135 
2136   /// Build a new expression in parentheses.
2137   ///
2138   /// By default, performs semantic analysis to build the new expression.
2139   /// Subclasses may override this routine to provide different behavior.
2140   ExprResult RebuildParenExpr(Expr *SubExpr, SourceLocation LParen,
2141                                     SourceLocation RParen) {
2142     return getSema().ActOnParenExpr(LParen, RParen, SubExpr);
2143   }
2144 
2145   /// Build a new pseudo-destructor expression.
2146   ///
2147   /// By default, performs semantic analysis to build the new expression.
2148   /// Subclasses may override this routine to provide different behavior.
2149   ExprResult RebuildCXXPseudoDestructorExpr(Expr *Base,
2150                                             SourceLocation OperatorLoc,
2151                                             bool isArrow,
2152                                             CXXScopeSpec &SS,
2153                                             TypeSourceInfo *ScopeType,
2154                                             SourceLocation CCLoc,
2155                                             SourceLocation TildeLoc,
2156                                         PseudoDestructorTypeStorage Destroyed);
2157 
2158   /// Build a new unary operator expression.
2159   ///
2160   /// By default, performs semantic analysis to build the new expression.
2161   /// Subclasses may override this routine to provide different behavior.
2162   ExprResult RebuildUnaryOperator(SourceLocation OpLoc,
2163                                         UnaryOperatorKind Opc,
2164                                         Expr *SubExpr) {
2165     return getSema().BuildUnaryOp(/*Scope=*/nullptr, OpLoc, Opc, SubExpr);
2166   }
2167 
2168   /// Build a new builtin offsetof expression.
2169   ///
2170   /// By default, performs semantic analysis to build the new expression.
2171   /// Subclasses may override this routine to provide different behavior.
2172   ExprResult RebuildOffsetOfExpr(SourceLocation OperatorLoc,
2173                                  TypeSourceInfo *Type,
2174                                  ArrayRef<Sema::OffsetOfComponent> Components,
2175                                  SourceLocation RParenLoc) {
2176     return getSema().BuildBuiltinOffsetOf(OperatorLoc, Type, Components,
2177                                           RParenLoc);
2178   }
2179 
2180   /// Build a new sizeof, alignof or vec_step expression with a
2181   /// type argument.
2182   ///
2183   /// By default, performs semantic analysis to build the new expression.
2184   /// Subclasses may override this routine to provide different behavior.
2185   ExprResult RebuildUnaryExprOrTypeTrait(TypeSourceInfo *TInfo,
2186                                          SourceLocation OpLoc,
2187                                          UnaryExprOrTypeTrait ExprKind,
2188                                          SourceRange R) {
2189     return getSema().CreateUnaryExprOrTypeTraitExpr(TInfo, OpLoc, ExprKind, R);
2190   }
2191 
2192   /// Build a new sizeof, alignof or vec step expression with an
2193   /// expression argument.
2194   ///
2195   /// By default, performs semantic analysis to build the new expression.
2196   /// Subclasses may override this routine to provide different behavior.
2197   ExprResult RebuildUnaryExprOrTypeTrait(Expr *SubExpr, SourceLocation OpLoc,
2198                                          UnaryExprOrTypeTrait ExprKind,
2199                                          SourceRange R) {
2200     ExprResult Result
2201       = getSema().CreateUnaryExprOrTypeTraitExpr(SubExpr, OpLoc, ExprKind);
2202     if (Result.isInvalid())
2203       return ExprError();
2204 
2205     return Result;
2206   }
2207 
2208   /// Build a new array subscript expression.
2209   ///
2210   /// By default, performs semantic analysis to build the new expression.
2211   /// Subclasses may override this routine to provide different behavior.
2212   ExprResult RebuildArraySubscriptExpr(Expr *LHS,
2213                                              SourceLocation LBracketLoc,
2214                                              Expr *RHS,
2215                                              SourceLocation RBracketLoc) {
2216     return getSema().ActOnArraySubscriptExpr(/*Scope=*/nullptr, LHS,
2217                                              LBracketLoc, RHS,
2218                                              RBracketLoc);
2219   }
2220 
2221   /// Build a new array section expression.
2222   ///
2223   /// By default, performs semantic analysis to build the new expression.
2224   /// Subclasses may override this routine to provide different behavior.
2225   ExprResult RebuildOMPArraySectionExpr(Expr *Base, SourceLocation LBracketLoc,
2226                                         Expr *LowerBound,
2227                                         SourceLocation ColonLoc, Expr *Length,
2228                                         SourceLocation RBracketLoc) {
2229     return getSema().ActOnOMPArraySectionExpr(Base, LBracketLoc, LowerBound,
2230                                               ColonLoc, Length, RBracketLoc);
2231   }
2232 
2233   /// Build a new call expression.
2234   ///
2235   /// By default, performs semantic analysis to build the new expression.
2236   /// Subclasses may override this routine to provide different behavior.
2237   ExprResult RebuildCallExpr(Expr *Callee, SourceLocation LParenLoc,
2238                                    MultiExprArg Args,
2239                                    SourceLocation RParenLoc,
2240                                    Expr *ExecConfig = nullptr) {
2241     return getSema().ActOnCallExpr(/*Scope=*/nullptr, Callee, LParenLoc,
2242                                    Args, RParenLoc, ExecConfig);
2243   }
2244 
2245   /// Build a new member access expression.
2246   ///
2247   /// By default, performs semantic analysis to build the new expression.
2248   /// Subclasses may override this routine to provide different behavior.
2249   ExprResult RebuildMemberExpr(Expr *Base, SourceLocation OpLoc,
2250                                bool isArrow,
2251                                NestedNameSpecifierLoc QualifierLoc,
2252                                SourceLocation TemplateKWLoc,
2253                                const DeclarationNameInfo &MemberNameInfo,
2254                                ValueDecl *Member,
2255                                NamedDecl *FoundDecl,
2256                         const TemplateArgumentListInfo *ExplicitTemplateArgs,
2257                                NamedDecl *FirstQualifierInScope) {
2258     ExprResult BaseResult = getSema().PerformMemberExprBaseConversion(Base,
2259                                                                       isArrow);
2260     if (!Member->getDeclName()) {
2261       // We have a reference to an unnamed field.  This is always the
2262       // base of an anonymous struct/union member access, i.e. the
2263       // field is always of record type.
2264       assert(Member->getType()->isRecordType() &&
2265              "unnamed member not of record type?");
2266 
2267       BaseResult =
2268         getSema().PerformObjectMemberConversion(BaseResult.get(),
2269                                                 QualifierLoc.getNestedNameSpecifier(),
2270                                                 FoundDecl, Member);
2271       if (BaseResult.isInvalid())
2272         return ExprError();
2273       Base = BaseResult.get();
2274 
2275       CXXScopeSpec EmptySS;
2276       return getSema().BuildFieldReferenceExpr(
2277           Base, isArrow, OpLoc, EmptySS, cast<FieldDecl>(Member),
2278           DeclAccessPair::make(FoundDecl, FoundDecl->getAccess()), MemberNameInfo);
2279     }
2280 
2281     CXXScopeSpec SS;
2282     SS.Adopt(QualifierLoc);
2283 
2284     Base = BaseResult.get();
2285     QualType BaseType = Base->getType();
2286 
2287     if (isArrow && !BaseType->isPointerType())
2288       return ExprError();
2289 
2290     // FIXME: this involves duplicating earlier analysis in a lot of
2291     // cases; we should avoid this when possible.
2292     LookupResult R(getSema(), MemberNameInfo, Sema::LookupMemberName);
2293     R.addDecl(FoundDecl);
2294     R.resolveKind();
2295 
2296     return getSema().BuildMemberReferenceExpr(Base, BaseType, OpLoc, isArrow,
2297                                               SS, TemplateKWLoc,
2298                                               FirstQualifierInScope,
2299                                               R, ExplicitTemplateArgs,
2300                                               /*S*/nullptr);
2301   }
2302 
2303   /// Build a new binary operator expression.
2304   ///
2305   /// By default, performs semantic analysis to build the new expression.
2306   /// Subclasses may override this routine to provide different behavior.
2307   ExprResult RebuildBinaryOperator(SourceLocation OpLoc,
2308                                          BinaryOperatorKind Opc,
2309                                          Expr *LHS, Expr *RHS) {
2310     return getSema().BuildBinOp(/*Scope=*/nullptr, OpLoc, Opc, LHS, RHS);
2311   }
2312 
2313   /// Build a new conditional operator expression.
2314   ///
2315   /// By default, performs semantic analysis to build the new expression.
2316   /// Subclasses may override this routine to provide different behavior.
2317   ExprResult RebuildConditionalOperator(Expr *Cond,
2318                                         SourceLocation QuestionLoc,
2319                                         Expr *LHS,
2320                                         SourceLocation ColonLoc,
2321                                         Expr *RHS) {
2322     return getSema().ActOnConditionalOp(QuestionLoc, ColonLoc, Cond,
2323                                         LHS, RHS);
2324   }
2325 
2326   /// Build a new C-style cast expression.
2327   ///
2328   /// By default, performs semantic analysis to build the new expression.
2329   /// Subclasses may override this routine to provide different behavior.
2330   ExprResult RebuildCStyleCastExpr(SourceLocation LParenLoc,
2331                                          TypeSourceInfo *TInfo,
2332                                          SourceLocation RParenLoc,
2333                                          Expr *SubExpr) {
2334     return getSema().BuildCStyleCastExpr(LParenLoc, TInfo, RParenLoc,
2335                                          SubExpr);
2336   }
2337 
2338   /// Build a new compound literal expression.
2339   ///
2340   /// By default, performs semantic analysis to build the new expression.
2341   /// Subclasses may override this routine to provide different behavior.
2342   ExprResult RebuildCompoundLiteralExpr(SourceLocation LParenLoc,
2343                                               TypeSourceInfo *TInfo,
2344                                               SourceLocation RParenLoc,
2345                                               Expr *Init) {
2346     return getSema().BuildCompoundLiteralExpr(LParenLoc, TInfo, RParenLoc,
2347                                               Init);
2348   }
2349 
2350   /// Build a new extended vector element access expression.
2351   ///
2352   /// By default, performs semantic analysis to build the new expression.
2353   /// Subclasses may override this routine to provide different behavior.
2354   ExprResult RebuildExtVectorElementExpr(Expr *Base,
2355                                                SourceLocation OpLoc,
2356                                                SourceLocation AccessorLoc,
2357                                                IdentifierInfo &Accessor) {
2358 
2359     CXXScopeSpec SS;
2360     DeclarationNameInfo NameInfo(&Accessor, AccessorLoc);
2361     return getSema().BuildMemberReferenceExpr(Base, Base->getType(),
2362                                               OpLoc, /*IsArrow*/ false,
2363                                               SS, SourceLocation(),
2364                                               /*FirstQualifierInScope*/ nullptr,
2365                                               NameInfo,
2366                                               /* TemplateArgs */ nullptr,
2367                                               /*S*/ nullptr);
2368   }
2369 
2370   /// Build a new initializer list expression.
2371   ///
2372   /// By default, performs semantic analysis to build the new expression.
2373   /// Subclasses may override this routine to provide different behavior.
2374   ExprResult RebuildInitList(SourceLocation LBraceLoc,
2375                              MultiExprArg Inits,
2376                              SourceLocation RBraceLoc) {
2377     return SemaRef.ActOnInitList(LBraceLoc, Inits, RBraceLoc);
2378   }
2379 
2380   /// Build a new designated initializer expression.
2381   ///
2382   /// By default, performs semantic analysis to build the new expression.
2383   /// Subclasses may override this routine to provide different behavior.
2384   ExprResult RebuildDesignatedInitExpr(Designation &Desig,
2385                                              MultiExprArg ArrayExprs,
2386                                              SourceLocation EqualOrColonLoc,
2387                                              bool GNUSyntax,
2388                                              Expr *Init) {
2389     ExprResult Result
2390       = SemaRef.ActOnDesignatedInitializer(Desig, EqualOrColonLoc, GNUSyntax,
2391                                            Init);
2392     if (Result.isInvalid())
2393       return ExprError();
2394 
2395     return Result;
2396   }
2397 
2398   /// Build a new value-initialized expression.
2399   ///
2400   /// By default, builds the implicit value initialization without performing
2401   /// any semantic analysis. Subclasses may override this routine to provide
2402   /// different behavior.
2403   ExprResult RebuildImplicitValueInitExpr(QualType T) {
2404     return new (SemaRef.Context) ImplicitValueInitExpr(T);
2405   }
2406 
2407   /// Build a new \c va_arg expression.
2408   ///
2409   /// By default, performs semantic analysis to build the new expression.
2410   /// Subclasses may override this routine to provide different behavior.
2411   ExprResult RebuildVAArgExpr(SourceLocation BuiltinLoc,
2412                                     Expr *SubExpr, TypeSourceInfo *TInfo,
2413                                     SourceLocation RParenLoc) {
2414     return getSema().BuildVAArgExpr(BuiltinLoc,
2415                                     SubExpr, TInfo,
2416                                     RParenLoc);
2417   }
2418 
2419   /// Build a new expression list in parentheses.
2420   ///
2421   /// By default, performs semantic analysis to build the new expression.
2422   /// Subclasses may override this routine to provide different behavior.
2423   ExprResult RebuildParenListExpr(SourceLocation LParenLoc,
2424                                   MultiExprArg SubExprs,
2425                                   SourceLocation RParenLoc) {
2426     return getSema().ActOnParenListExpr(LParenLoc, RParenLoc, SubExprs);
2427   }
2428 
2429   /// Build a new address-of-label expression.
2430   ///
2431   /// By default, performs semantic analysis, using the name of the label
2432   /// rather than attempting to map the label statement itself.
2433   /// Subclasses may override this routine to provide different behavior.
2434   ExprResult RebuildAddrLabelExpr(SourceLocation AmpAmpLoc,
2435                                   SourceLocation LabelLoc, LabelDecl *Label) {
2436     return getSema().ActOnAddrLabel(AmpAmpLoc, LabelLoc, Label);
2437   }
2438 
2439   /// Build a new GNU statement expression.
2440   ///
2441   /// By default, performs semantic analysis to build the new expression.
2442   /// Subclasses may override this routine to provide different behavior.
2443   ExprResult RebuildStmtExpr(SourceLocation LParenLoc,
2444                                    Stmt *SubStmt,
2445                                    SourceLocation RParenLoc) {
2446     return getSema().ActOnStmtExpr(LParenLoc, SubStmt, RParenLoc);
2447   }
2448 
2449   /// Build a new __builtin_choose_expr expression.
2450   ///
2451   /// By default, performs semantic analysis to build the new expression.
2452   /// Subclasses may override this routine to provide different behavior.
2453   ExprResult RebuildChooseExpr(SourceLocation BuiltinLoc,
2454                                      Expr *Cond, Expr *LHS, Expr *RHS,
2455                                      SourceLocation RParenLoc) {
2456     return SemaRef.ActOnChooseExpr(BuiltinLoc,
2457                                    Cond, LHS, RHS,
2458                                    RParenLoc);
2459   }
2460 
2461   /// Build a new generic selection expression.
2462   ///
2463   /// By default, performs semantic analysis to build the new expression.
2464   /// Subclasses may override this routine to provide different behavior.
2465   ExprResult RebuildGenericSelectionExpr(SourceLocation KeyLoc,
2466                                          SourceLocation DefaultLoc,
2467                                          SourceLocation RParenLoc,
2468                                          Expr *ControllingExpr,
2469                                          ArrayRef<TypeSourceInfo *> Types,
2470                                          ArrayRef<Expr *> Exprs) {
2471     return getSema().CreateGenericSelectionExpr(KeyLoc, DefaultLoc, RParenLoc,
2472                                                 ControllingExpr, Types, Exprs);
2473   }
2474 
2475   /// Build a new overloaded operator call expression.
2476   ///
2477   /// By default, performs semantic analysis to build the new expression.
2478   /// The semantic analysis provides the behavior of template instantiation,
2479   /// copying with transformations that turn what looks like an overloaded
2480   /// operator call into a use of a builtin operator, performing
2481   /// argument-dependent lookup, etc. Subclasses may override this routine to
2482   /// provide different behavior.
2483   ExprResult RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op,
2484                                               SourceLocation OpLoc,
2485                                               Expr *Callee,
2486                                               Expr *First,
2487                                               Expr *Second);
2488 
2489   /// Build a new C++ "named" cast expression, such as static_cast or
2490   /// reinterpret_cast.
2491   ///
2492   /// By default, this routine dispatches to one of the more-specific routines
2493   /// for a particular named case, e.g., RebuildCXXStaticCastExpr().
2494   /// Subclasses may override this routine to provide different behavior.
2495   ExprResult RebuildCXXNamedCastExpr(SourceLocation OpLoc,
2496                                            Stmt::StmtClass Class,
2497                                            SourceLocation LAngleLoc,
2498                                            TypeSourceInfo *TInfo,
2499                                            SourceLocation RAngleLoc,
2500                                            SourceLocation LParenLoc,
2501                                            Expr *SubExpr,
2502                                            SourceLocation RParenLoc) {
2503     switch (Class) {
2504     case Stmt::CXXStaticCastExprClass:
2505       return getDerived().RebuildCXXStaticCastExpr(OpLoc, LAngleLoc, TInfo,
2506                                                    RAngleLoc, LParenLoc,
2507                                                    SubExpr, RParenLoc);
2508 
2509     case Stmt::CXXDynamicCastExprClass:
2510       return getDerived().RebuildCXXDynamicCastExpr(OpLoc, LAngleLoc, TInfo,
2511                                                     RAngleLoc, LParenLoc,
2512                                                     SubExpr, RParenLoc);
2513 
2514     case Stmt::CXXReinterpretCastExprClass:
2515       return getDerived().RebuildCXXReinterpretCastExpr(OpLoc, LAngleLoc, TInfo,
2516                                                         RAngleLoc, LParenLoc,
2517                                                         SubExpr,
2518                                                         RParenLoc);
2519 
2520     case Stmt::CXXConstCastExprClass:
2521       return getDerived().RebuildCXXConstCastExpr(OpLoc, LAngleLoc, TInfo,
2522                                                    RAngleLoc, LParenLoc,
2523                                                    SubExpr, RParenLoc);
2524 
2525     default:
2526       llvm_unreachable("Invalid C++ named cast");
2527     }
2528   }
2529 
2530   /// Build a new C++ static_cast expression.
2531   ///
2532   /// By default, performs semantic analysis to build the new expression.
2533   /// Subclasses may override this routine to provide different behavior.
2534   ExprResult RebuildCXXStaticCastExpr(SourceLocation OpLoc,
2535                                             SourceLocation LAngleLoc,
2536                                             TypeSourceInfo *TInfo,
2537                                             SourceLocation RAngleLoc,
2538                                             SourceLocation LParenLoc,
2539                                             Expr *SubExpr,
2540                                             SourceLocation RParenLoc) {
2541     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_static_cast,
2542                                        TInfo, SubExpr,
2543                                        SourceRange(LAngleLoc, RAngleLoc),
2544                                        SourceRange(LParenLoc, RParenLoc));
2545   }
2546 
2547   /// Build a new C++ dynamic_cast expression.
2548   ///
2549   /// By default, performs semantic analysis to build the new expression.
2550   /// Subclasses may override this routine to provide different behavior.
2551   ExprResult RebuildCXXDynamicCastExpr(SourceLocation OpLoc,
2552                                              SourceLocation LAngleLoc,
2553                                              TypeSourceInfo *TInfo,
2554                                              SourceLocation RAngleLoc,
2555                                              SourceLocation LParenLoc,
2556                                              Expr *SubExpr,
2557                                              SourceLocation RParenLoc) {
2558     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_dynamic_cast,
2559                                        TInfo, SubExpr,
2560                                        SourceRange(LAngleLoc, RAngleLoc),
2561                                        SourceRange(LParenLoc, RParenLoc));
2562   }
2563 
2564   /// Build a new C++ reinterpret_cast expression.
2565   ///
2566   /// By default, performs semantic analysis to build the new expression.
2567   /// Subclasses may override this routine to provide different behavior.
2568   ExprResult RebuildCXXReinterpretCastExpr(SourceLocation OpLoc,
2569                                                  SourceLocation LAngleLoc,
2570                                                  TypeSourceInfo *TInfo,
2571                                                  SourceLocation RAngleLoc,
2572                                                  SourceLocation LParenLoc,
2573                                                  Expr *SubExpr,
2574                                                  SourceLocation RParenLoc) {
2575     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_reinterpret_cast,
2576                                        TInfo, SubExpr,
2577                                        SourceRange(LAngleLoc, RAngleLoc),
2578                                        SourceRange(LParenLoc, RParenLoc));
2579   }
2580 
2581   /// Build a new C++ const_cast expression.
2582   ///
2583   /// By default, performs semantic analysis to build the new expression.
2584   /// Subclasses may override this routine to provide different behavior.
2585   ExprResult RebuildCXXConstCastExpr(SourceLocation OpLoc,
2586                                            SourceLocation LAngleLoc,
2587                                            TypeSourceInfo *TInfo,
2588                                            SourceLocation RAngleLoc,
2589                                            SourceLocation LParenLoc,
2590                                            Expr *SubExpr,
2591                                            SourceLocation RParenLoc) {
2592     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_const_cast,
2593                                        TInfo, SubExpr,
2594                                        SourceRange(LAngleLoc, RAngleLoc),
2595                                        SourceRange(LParenLoc, RParenLoc));
2596   }
2597 
2598   /// Build a new C++ functional-style cast 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 RebuildCXXFunctionalCastExpr(TypeSourceInfo *TInfo,
2603                                           SourceLocation LParenLoc,
2604                                           Expr *Sub,
2605                                           SourceLocation RParenLoc,
2606                                           bool ListInitialization) {
2607     return getSema().BuildCXXTypeConstructExpr(TInfo, LParenLoc,
2608                                                MultiExprArg(&Sub, 1), RParenLoc,
2609                                                ListInitialization);
2610   }
2611 
2612   /// Build a new C++ typeid(type) expression.
2613   ///
2614   /// By default, performs semantic analysis to build the new expression.
2615   /// Subclasses may override this routine to provide different behavior.
2616   ExprResult RebuildCXXTypeidExpr(QualType TypeInfoType,
2617                                         SourceLocation TypeidLoc,
2618                                         TypeSourceInfo *Operand,
2619                                         SourceLocation RParenLoc) {
2620     return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand,
2621                                     RParenLoc);
2622   }
2623 
2624 
2625   /// Build a new C++ typeid(expr) expression.
2626   ///
2627   /// By default, performs semantic analysis to build the new expression.
2628   /// Subclasses may override this routine to provide different behavior.
2629   ExprResult RebuildCXXTypeidExpr(QualType TypeInfoType,
2630                                         SourceLocation TypeidLoc,
2631                                         Expr *Operand,
2632                                         SourceLocation RParenLoc) {
2633     return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand,
2634                                     RParenLoc);
2635   }
2636 
2637   /// Build a new C++ __uuidof(type) expression.
2638   ///
2639   /// By default, performs semantic analysis to build the new expression.
2640   /// Subclasses may override this routine to provide different behavior.
2641   ExprResult RebuildCXXUuidofExpr(QualType TypeInfoType,
2642                                         SourceLocation TypeidLoc,
2643                                         TypeSourceInfo *Operand,
2644                                         SourceLocation RParenLoc) {
2645     return getSema().BuildCXXUuidof(TypeInfoType, TypeidLoc, Operand,
2646                                     RParenLoc);
2647   }
2648 
2649   /// Build a new C++ __uuidof(expr) expression.
2650   ///
2651   /// By default, performs semantic analysis to build the new expression.
2652   /// Subclasses may override this routine to provide different behavior.
2653   ExprResult RebuildCXXUuidofExpr(QualType TypeInfoType,
2654                                         SourceLocation TypeidLoc,
2655                                         Expr *Operand,
2656                                         SourceLocation RParenLoc) {
2657     return getSema().BuildCXXUuidof(TypeInfoType, TypeidLoc, Operand,
2658                                     RParenLoc);
2659   }
2660 
2661   /// Build a new C++ "this" expression.
2662   ///
2663   /// By default, builds a new "this" expression without performing any
2664   /// semantic analysis. Subclasses may override this routine to provide
2665   /// different behavior.
2666   ExprResult RebuildCXXThisExpr(SourceLocation ThisLoc,
2667                                 QualType ThisType,
2668                                 bool isImplicit) {
2669     getSema().CheckCXXThisCapture(ThisLoc);
2670     return new (getSema().Context) CXXThisExpr(ThisLoc, ThisType, isImplicit);
2671   }
2672 
2673   /// Build a new C++ throw expression.
2674   ///
2675   /// By default, performs semantic analysis to build the new expression.
2676   /// Subclasses may override this routine to provide different behavior.
2677   ExprResult RebuildCXXThrowExpr(SourceLocation ThrowLoc, Expr *Sub,
2678                                  bool IsThrownVariableInScope) {
2679     return getSema().BuildCXXThrow(ThrowLoc, Sub, IsThrownVariableInScope);
2680   }
2681 
2682   /// Build a new C++ default-argument expression.
2683   ///
2684   /// By default, builds a new default-argument expression, which does not
2685   /// require any semantic analysis. Subclasses may override this routine to
2686   /// provide different behavior.
2687   ExprResult RebuildCXXDefaultArgExpr(SourceLocation Loc,
2688                                             ParmVarDecl *Param) {
2689     return CXXDefaultArgExpr::Create(getSema().Context, Loc, Param);
2690   }
2691 
2692   /// Build a new C++11 default-initialization expression.
2693   ///
2694   /// By default, builds a new default field initialization expression, which
2695   /// does not require any semantic analysis. Subclasses may override this
2696   /// routine to provide different behavior.
2697   ExprResult RebuildCXXDefaultInitExpr(SourceLocation Loc,
2698                                        FieldDecl *Field) {
2699     return CXXDefaultInitExpr::Create(getSema().Context, Loc, Field);
2700   }
2701 
2702   /// Build a new C++ zero-initialization expression.
2703   ///
2704   /// By default, performs semantic analysis to build the new expression.
2705   /// Subclasses may override this routine to provide different behavior.
2706   ExprResult RebuildCXXScalarValueInitExpr(TypeSourceInfo *TSInfo,
2707                                            SourceLocation LParenLoc,
2708                                            SourceLocation RParenLoc) {
2709     return getSema().BuildCXXTypeConstructExpr(
2710         TSInfo, LParenLoc, None, RParenLoc, /*ListInitialization=*/false);
2711   }
2712 
2713   /// Build a new C++ "new" expression.
2714   ///
2715   /// By default, performs semantic analysis to build the new expression.
2716   /// Subclasses may override this routine to provide different behavior.
2717   ExprResult RebuildCXXNewExpr(SourceLocation StartLoc,
2718                                bool UseGlobal,
2719                                SourceLocation PlacementLParen,
2720                                MultiExprArg PlacementArgs,
2721                                SourceLocation PlacementRParen,
2722                                SourceRange TypeIdParens,
2723                                QualType AllocatedType,
2724                                TypeSourceInfo *AllocatedTypeInfo,
2725                                Expr *ArraySize,
2726                                SourceRange DirectInitRange,
2727                                Expr *Initializer) {
2728     return getSema().BuildCXXNew(StartLoc, UseGlobal,
2729                                  PlacementLParen,
2730                                  PlacementArgs,
2731                                  PlacementRParen,
2732                                  TypeIdParens,
2733                                  AllocatedType,
2734                                  AllocatedTypeInfo,
2735                                  ArraySize,
2736                                  DirectInitRange,
2737                                  Initializer);
2738   }
2739 
2740   /// Build a new C++ "delete" expression.
2741   ///
2742   /// By default, performs semantic analysis to build the new expression.
2743   /// Subclasses may override this routine to provide different behavior.
2744   ExprResult RebuildCXXDeleteExpr(SourceLocation StartLoc,
2745                                         bool IsGlobalDelete,
2746                                         bool IsArrayForm,
2747                                         Expr *Operand) {
2748     return getSema().ActOnCXXDelete(StartLoc, IsGlobalDelete, IsArrayForm,
2749                                     Operand);
2750   }
2751 
2752   /// Build a new type trait expression.
2753   ///
2754   /// By default, performs semantic analysis to build the new expression.
2755   /// Subclasses may override this routine to provide different behavior.
2756   ExprResult RebuildTypeTrait(TypeTrait Trait,
2757                               SourceLocation StartLoc,
2758                               ArrayRef<TypeSourceInfo *> Args,
2759                               SourceLocation RParenLoc) {
2760     return getSema().BuildTypeTrait(Trait, StartLoc, Args, RParenLoc);
2761   }
2762 
2763   /// Build a new array type trait expression.
2764   ///
2765   /// By default, performs semantic analysis to build the new expression.
2766   /// Subclasses may override this routine to provide different behavior.
2767   ExprResult RebuildArrayTypeTrait(ArrayTypeTrait Trait,
2768                                    SourceLocation StartLoc,
2769                                    TypeSourceInfo *TSInfo,
2770                                    Expr *DimExpr,
2771                                    SourceLocation RParenLoc) {
2772     return getSema().BuildArrayTypeTrait(Trait, StartLoc, TSInfo, DimExpr, RParenLoc);
2773   }
2774 
2775   /// Build a new expression trait expression.
2776   ///
2777   /// By default, performs semantic analysis to build the new expression.
2778   /// Subclasses may override this routine to provide different behavior.
2779   ExprResult RebuildExpressionTrait(ExpressionTrait Trait,
2780                                    SourceLocation StartLoc,
2781                                    Expr *Queried,
2782                                    SourceLocation RParenLoc) {
2783     return getSema().BuildExpressionTrait(Trait, StartLoc, Queried, RParenLoc);
2784   }
2785 
2786   /// Build a new (previously unresolved) declaration reference
2787   /// expression.
2788   ///
2789   /// By default, performs semantic analysis to build the new expression.
2790   /// Subclasses may override this routine to provide different behavior.
2791   ExprResult RebuildDependentScopeDeclRefExpr(
2792                                           NestedNameSpecifierLoc QualifierLoc,
2793                                           SourceLocation TemplateKWLoc,
2794                                        const DeclarationNameInfo &NameInfo,
2795                               const TemplateArgumentListInfo *TemplateArgs,
2796                                           bool IsAddressOfOperand,
2797                                           TypeSourceInfo **RecoveryTSI) {
2798     CXXScopeSpec SS;
2799     SS.Adopt(QualifierLoc);
2800 
2801     if (TemplateArgs || TemplateKWLoc.isValid())
2802       return getSema().BuildQualifiedTemplateIdExpr(SS, TemplateKWLoc, NameInfo,
2803                                                     TemplateArgs);
2804 
2805     return getSema().BuildQualifiedDeclarationNameExpr(
2806         SS, NameInfo, IsAddressOfOperand, /*S*/nullptr, RecoveryTSI);
2807   }
2808 
2809   /// Build a new template-id expression.
2810   ///
2811   /// By default, performs semantic analysis to build the new expression.
2812   /// Subclasses may override this routine to provide different behavior.
2813   ExprResult RebuildTemplateIdExpr(const CXXScopeSpec &SS,
2814                                    SourceLocation TemplateKWLoc,
2815                                    LookupResult &R,
2816                                    bool RequiresADL,
2817                               const TemplateArgumentListInfo *TemplateArgs) {
2818     return getSema().BuildTemplateIdExpr(SS, TemplateKWLoc, R, RequiresADL,
2819                                          TemplateArgs);
2820   }
2821 
2822   /// Build a new object-construction expression.
2823   ///
2824   /// By default, performs semantic analysis to build the new expression.
2825   /// Subclasses may override this routine to provide different behavior.
2826   ExprResult RebuildCXXConstructExpr(QualType T,
2827                                      SourceLocation Loc,
2828                                      CXXConstructorDecl *Constructor,
2829                                      bool IsElidable,
2830                                      MultiExprArg Args,
2831                                      bool HadMultipleCandidates,
2832                                      bool ListInitialization,
2833                                      bool StdInitListInitialization,
2834                                      bool RequiresZeroInit,
2835                              CXXConstructExpr::ConstructionKind ConstructKind,
2836                                      SourceRange ParenRange) {
2837     SmallVector<Expr*, 8> ConvertedArgs;
2838     if (getSema().CompleteConstructorCall(Constructor, Args, Loc,
2839                                           ConvertedArgs))
2840       return ExprError();
2841 
2842     return getSema().BuildCXXConstructExpr(Loc, T, Constructor,
2843                                            IsElidable,
2844                                            ConvertedArgs,
2845                                            HadMultipleCandidates,
2846                                            ListInitialization,
2847                                            StdInitListInitialization,
2848                                            RequiresZeroInit, ConstructKind,
2849                                            ParenRange);
2850   }
2851 
2852   /// Build a new implicit construction via inherited constructor
2853   /// expression.
2854   ExprResult RebuildCXXInheritedCtorInitExpr(QualType T, SourceLocation Loc,
2855                                              CXXConstructorDecl *Constructor,
2856                                              bool ConstructsVBase,
2857                                              bool InheritedFromVBase) {
2858     return new (getSema().Context) CXXInheritedCtorInitExpr(
2859         Loc, T, Constructor, ConstructsVBase, InheritedFromVBase);
2860   }
2861 
2862   /// Build a new object-construction expression.
2863   ///
2864   /// By default, performs semantic analysis to build the new expression.
2865   /// Subclasses may override this routine to provide different behavior.
2866   ExprResult RebuildCXXTemporaryObjectExpr(TypeSourceInfo *TSInfo,
2867                                            SourceLocation LParenOrBraceLoc,
2868                                            MultiExprArg Args,
2869                                            SourceLocation RParenOrBraceLoc,
2870                                            bool ListInitialization) {
2871     return getSema().BuildCXXTypeConstructExpr(
2872         TSInfo, LParenOrBraceLoc, Args, RParenOrBraceLoc, ListInitialization);
2873   }
2874 
2875   /// Build a new object-construction expression.
2876   ///
2877   /// By default, performs semantic analysis to build the new expression.
2878   /// Subclasses may override this routine to provide different behavior.
2879   ExprResult RebuildCXXUnresolvedConstructExpr(TypeSourceInfo *TSInfo,
2880                                                SourceLocation LParenLoc,
2881                                                MultiExprArg Args,
2882                                                SourceLocation RParenLoc,
2883                                                bool ListInitialization) {
2884     return getSema().BuildCXXTypeConstructExpr(TSInfo, LParenLoc, Args,
2885                                                RParenLoc, ListInitialization);
2886   }
2887 
2888   /// Build a new member reference expression.
2889   ///
2890   /// By default, performs semantic analysis to build the new expression.
2891   /// Subclasses may override this routine to provide different behavior.
2892   ExprResult RebuildCXXDependentScopeMemberExpr(Expr *BaseE,
2893                                                 QualType BaseType,
2894                                                 bool IsArrow,
2895                                                 SourceLocation OperatorLoc,
2896                                           NestedNameSpecifierLoc QualifierLoc,
2897                                                 SourceLocation TemplateKWLoc,
2898                                             NamedDecl *FirstQualifierInScope,
2899                                    const DeclarationNameInfo &MemberNameInfo,
2900                               const TemplateArgumentListInfo *TemplateArgs) {
2901     CXXScopeSpec SS;
2902     SS.Adopt(QualifierLoc);
2903 
2904     return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType,
2905                                             OperatorLoc, IsArrow,
2906                                             SS, TemplateKWLoc,
2907                                             FirstQualifierInScope,
2908                                             MemberNameInfo,
2909                                             TemplateArgs, /*S*/nullptr);
2910   }
2911 
2912   /// Build a new member reference expression.
2913   ///
2914   /// By default, performs semantic analysis to build the new expression.
2915   /// Subclasses may override this routine to provide different behavior.
2916   ExprResult RebuildUnresolvedMemberExpr(Expr *BaseE, QualType BaseType,
2917                                          SourceLocation OperatorLoc,
2918                                          bool IsArrow,
2919                                          NestedNameSpecifierLoc QualifierLoc,
2920                                          SourceLocation TemplateKWLoc,
2921                                          NamedDecl *FirstQualifierInScope,
2922                                          LookupResult &R,
2923                                 const TemplateArgumentListInfo *TemplateArgs) {
2924     CXXScopeSpec SS;
2925     SS.Adopt(QualifierLoc);
2926 
2927     return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType,
2928                                             OperatorLoc, IsArrow,
2929                                             SS, TemplateKWLoc,
2930                                             FirstQualifierInScope,
2931                                             R, TemplateArgs, /*S*/nullptr);
2932   }
2933 
2934   /// Build a new noexcept expression.
2935   ///
2936   /// By default, performs semantic analysis to build the new expression.
2937   /// Subclasses may override this routine to provide different behavior.
2938   ExprResult RebuildCXXNoexceptExpr(SourceRange Range, Expr *Arg) {
2939     return SemaRef.BuildCXXNoexceptExpr(Range.getBegin(), Arg, Range.getEnd());
2940   }
2941 
2942   /// Build a new expression to compute the length of a parameter pack.
2943   ExprResult RebuildSizeOfPackExpr(SourceLocation OperatorLoc,
2944                                    NamedDecl *Pack,
2945                                    SourceLocation PackLoc,
2946                                    SourceLocation RParenLoc,
2947                                    Optional<unsigned> Length,
2948                                    ArrayRef<TemplateArgument> PartialArgs) {
2949     return SizeOfPackExpr::Create(SemaRef.Context, OperatorLoc, Pack, PackLoc,
2950                                   RParenLoc, Length, PartialArgs);
2951   }
2952 
2953   /// Build a new Objective-C boxed expression.
2954   ///
2955   /// By default, performs semantic analysis to build the new expression.
2956   /// Subclasses may override this routine to provide different behavior.
2957   ExprResult RebuildObjCBoxedExpr(SourceRange SR, Expr *ValueExpr) {
2958     return getSema().BuildObjCBoxedExpr(SR, ValueExpr);
2959   }
2960 
2961   /// Build a new Objective-C array literal.
2962   ///
2963   /// By default, performs semantic analysis to build the new expression.
2964   /// Subclasses may override this routine to provide different behavior.
2965   ExprResult RebuildObjCArrayLiteral(SourceRange Range,
2966                                      Expr **Elements, unsigned NumElements) {
2967     return getSema().BuildObjCArrayLiteral(Range,
2968                                            MultiExprArg(Elements, NumElements));
2969   }
2970 
2971   ExprResult RebuildObjCSubscriptRefExpr(SourceLocation RB,
2972                                          Expr *Base, Expr *Key,
2973                                          ObjCMethodDecl *getterMethod,
2974                                          ObjCMethodDecl *setterMethod) {
2975     return  getSema().BuildObjCSubscriptExpression(RB, Base, Key,
2976                                                    getterMethod, setterMethod);
2977   }
2978 
2979   /// Build a new Objective-C dictionary literal.
2980   ///
2981   /// By default, performs semantic analysis to build the new expression.
2982   /// Subclasses may override this routine to provide different behavior.
2983   ExprResult RebuildObjCDictionaryLiteral(SourceRange Range,
2984                               MutableArrayRef<ObjCDictionaryElement> Elements) {
2985     return getSema().BuildObjCDictionaryLiteral(Range, Elements);
2986   }
2987 
2988   /// Build a new Objective-C \@encode expression.
2989   ///
2990   /// By default, performs semantic analysis to build the new expression.
2991   /// Subclasses may override this routine to provide different behavior.
2992   ExprResult RebuildObjCEncodeExpr(SourceLocation AtLoc,
2993                                          TypeSourceInfo *EncodeTypeInfo,
2994                                          SourceLocation RParenLoc) {
2995     return SemaRef.BuildObjCEncodeExpression(AtLoc, EncodeTypeInfo, RParenLoc);
2996   }
2997 
2998   /// Build a new Objective-C class message.
2999   ExprResult RebuildObjCMessageExpr(TypeSourceInfo *ReceiverTypeInfo,
3000                                           Selector Sel,
3001                                           ArrayRef<SourceLocation> SelectorLocs,
3002                                           ObjCMethodDecl *Method,
3003                                           SourceLocation LBracLoc,
3004                                           MultiExprArg Args,
3005                                           SourceLocation RBracLoc) {
3006     return SemaRef.BuildClassMessage(ReceiverTypeInfo,
3007                                      ReceiverTypeInfo->getType(),
3008                                      /*SuperLoc=*/SourceLocation(),
3009                                      Sel, Method, LBracLoc, SelectorLocs,
3010                                      RBracLoc, Args);
3011   }
3012 
3013   /// Build a new Objective-C instance message.
3014   ExprResult RebuildObjCMessageExpr(Expr *Receiver,
3015                                           Selector Sel,
3016                                           ArrayRef<SourceLocation> SelectorLocs,
3017                                           ObjCMethodDecl *Method,
3018                                           SourceLocation LBracLoc,
3019                                           MultiExprArg Args,
3020                                           SourceLocation RBracLoc) {
3021     return SemaRef.BuildInstanceMessage(Receiver,
3022                                         Receiver->getType(),
3023                                         /*SuperLoc=*/SourceLocation(),
3024                                         Sel, Method, LBracLoc, SelectorLocs,
3025                                         RBracLoc, Args);
3026   }
3027 
3028   /// Build a new Objective-C instance/class message to 'super'.
3029   ExprResult RebuildObjCMessageExpr(SourceLocation SuperLoc,
3030                                     Selector Sel,
3031                                     ArrayRef<SourceLocation> SelectorLocs,
3032                                     QualType SuperType,
3033                                     ObjCMethodDecl *Method,
3034                                     SourceLocation LBracLoc,
3035                                     MultiExprArg Args,
3036                                     SourceLocation RBracLoc) {
3037     return Method->isInstanceMethod() ? SemaRef.BuildInstanceMessage(nullptr,
3038                                           SuperType,
3039                                           SuperLoc,
3040                                           Sel, Method, LBracLoc, SelectorLocs,
3041                                           RBracLoc, Args)
3042                                       : SemaRef.BuildClassMessage(nullptr,
3043                                           SuperType,
3044                                           SuperLoc,
3045                                           Sel, Method, LBracLoc, SelectorLocs,
3046                                           RBracLoc, Args);
3047 
3048 
3049   }
3050 
3051   /// Build a new Objective-C ivar reference expression.
3052   ///
3053   /// By default, performs semantic analysis to build the new expression.
3054   /// Subclasses may override this routine to provide different behavior.
3055   ExprResult RebuildObjCIvarRefExpr(Expr *BaseArg, ObjCIvarDecl *Ivar,
3056                                           SourceLocation IvarLoc,
3057                                           bool IsArrow, bool IsFreeIvar) {
3058     CXXScopeSpec SS;
3059     DeclarationNameInfo NameInfo(Ivar->getDeclName(), IvarLoc);
3060     ExprResult Result = getSema().BuildMemberReferenceExpr(
3061         BaseArg, BaseArg->getType(),
3062         /*FIXME:*/ IvarLoc, IsArrow, SS, SourceLocation(),
3063         /*FirstQualifierInScope=*/nullptr, NameInfo,
3064         /*TemplateArgs=*/nullptr,
3065         /*S=*/nullptr);
3066     if (IsFreeIvar && Result.isUsable())
3067       cast<ObjCIvarRefExpr>(Result.get())->setIsFreeIvar(IsFreeIvar);
3068     return Result;
3069   }
3070 
3071   /// Build a new Objective-C property reference expression.
3072   ///
3073   /// By default, performs semantic analysis to build the new expression.
3074   /// Subclasses may override this routine to provide different behavior.
3075   ExprResult RebuildObjCPropertyRefExpr(Expr *BaseArg,
3076                                         ObjCPropertyDecl *Property,
3077                                         SourceLocation PropertyLoc) {
3078     CXXScopeSpec SS;
3079     DeclarationNameInfo NameInfo(Property->getDeclName(), PropertyLoc);
3080     return getSema().BuildMemberReferenceExpr(BaseArg, BaseArg->getType(),
3081                                               /*FIXME:*/PropertyLoc,
3082                                               /*IsArrow=*/false,
3083                                               SS, SourceLocation(),
3084                                               /*FirstQualifierInScope=*/nullptr,
3085                                               NameInfo,
3086                                               /*TemplateArgs=*/nullptr,
3087                                               /*S=*/nullptr);
3088   }
3089 
3090   /// Build a new Objective-C property reference expression.
3091   ///
3092   /// By default, performs semantic analysis to build the new expression.
3093   /// Subclasses may override this routine to provide different behavior.
3094   ExprResult RebuildObjCPropertyRefExpr(Expr *Base, QualType T,
3095                                         ObjCMethodDecl *Getter,
3096                                         ObjCMethodDecl *Setter,
3097                                         SourceLocation PropertyLoc) {
3098     // Since these expressions can only be value-dependent, we do not
3099     // need to perform semantic analysis again.
3100     return Owned(
3101       new (getSema().Context) ObjCPropertyRefExpr(Getter, Setter, T,
3102                                                   VK_LValue, OK_ObjCProperty,
3103                                                   PropertyLoc, Base));
3104   }
3105 
3106   /// Build a new Objective-C "isa" expression.
3107   ///
3108   /// By default, performs semantic analysis to build the new expression.
3109   /// Subclasses may override this routine to provide different behavior.
3110   ExprResult RebuildObjCIsaExpr(Expr *BaseArg, SourceLocation IsaLoc,
3111                                 SourceLocation OpLoc, bool IsArrow) {
3112     CXXScopeSpec SS;
3113     DeclarationNameInfo NameInfo(&getSema().Context.Idents.get("isa"), IsaLoc);
3114     return getSema().BuildMemberReferenceExpr(BaseArg, BaseArg->getType(),
3115                                               OpLoc, IsArrow,
3116                                               SS, SourceLocation(),
3117                                               /*FirstQualifierInScope=*/nullptr,
3118                                               NameInfo,
3119                                               /*TemplateArgs=*/nullptr,
3120                                               /*S=*/nullptr);
3121   }
3122 
3123   /// Build a new shuffle vector expression.
3124   ///
3125   /// By default, performs semantic analysis to build the new expression.
3126   /// Subclasses may override this routine to provide different behavior.
3127   ExprResult RebuildShuffleVectorExpr(SourceLocation BuiltinLoc,
3128                                       MultiExprArg SubExprs,
3129                                       SourceLocation RParenLoc) {
3130     // Find the declaration for __builtin_shufflevector
3131     const IdentifierInfo &Name
3132       = SemaRef.Context.Idents.get("__builtin_shufflevector");
3133     TranslationUnitDecl *TUDecl = SemaRef.Context.getTranslationUnitDecl();
3134     DeclContext::lookup_result Lookup = TUDecl->lookup(DeclarationName(&Name));
3135     assert(!Lookup.empty() && "No __builtin_shufflevector?");
3136 
3137     // Build a reference to the __builtin_shufflevector builtin
3138     FunctionDecl *Builtin = cast<FunctionDecl>(Lookup.front());
3139     Expr *Callee = new (SemaRef.Context)
3140         DeclRefExpr(SemaRef.Context, Builtin, false,
3141                     SemaRef.Context.BuiltinFnTy, VK_RValue, BuiltinLoc);
3142     QualType CalleePtrTy = SemaRef.Context.getPointerType(Builtin->getType());
3143     Callee = SemaRef.ImpCastExprToType(Callee, CalleePtrTy,
3144                                        CK_BuiltinFnToFnPtr).get();
3145 
3146     // Build the CallExpr
3147     ExprResult TheCall = CallExpr::Create(
3148         SemaRef.Context, Callee, SubExprs, Builtin->getCallResultType(),
3149         Expr::getValueKindForType(Builtin->getReturnType()), RParenLoc);
3150 
3151     // Type-check the __builtin_shufflevector expression.
3152     return SemaRef.SemaBuiltinShuffleVector(cast<CallExpr>(TheCall.get()));
3153   }
3154 
3155   /// Build a new convert vector expression.
3156   ExprResult RebuildConvertVectorExpr(SourceLocation BuiltinLoc,
3157                                       Expr *SrcExpr, TypeSourceInfo *DstTInfo,
3158                                       SourceLocation RParenLoc) {
3159     return SemaRef.SemaConvertVectorExpr(SrcExpr, DstTInfo,
3160                                          BuiltinLoc, RParenLoc);
3161   }
3162 
3163   /// Build a new template argument pack expansion.
3164   ///
3165   /// By default, performs semantic analysis to build a new pack expansion
3166   /// for a template argument. Subclasses may override this routine to provide
3167   /// different behavior.
3168   TemplateArgumentLoc RebuildPackExpansion(TemplateArgumentLoc Pattern,
3169                                            SourceLocation EllipsisLoc,
3170                                            Optional<unsigned> NumExpansions) {
3171     switch (Pattern.getArgument().getKind()) {
3172     case TemplateArgument::Expression: {
3173       ExprResult Result
3174         = getSema().CheckPackExpansion(Pattern.getSourceExpression(),
3175                                        EllipsisLoc, NumExpansions);
3176       if (Result.isInvalid())
3177         return TemplateArgumentLoc();
3178 
3179       return TemplateArgumentLoc(Result.get(), Result.get());
3180     }
3181 
3182     case TemplateArgument::Template:
3183       return TemplateArgumentLoc(TemplateArgument(
3184                                           Pattern.getArgument().getAsTemplate(),
3185                                                   NumExpansions),
3186                                  Pattern.getTemplateQualifierLoc(),
3187                                  Pattern.getTemplateNameLoc(),
3188                                  EllipsisLoc);
3189 
3190     case TemplateArgument::Null:
3191     case TemplateArgument::Integral:
3192     case TemplateArgument::Declaration:
3193     case TemplateArgument::Pack:
3194     case TemplateArgument::TemplateExpansion:
3195     case TemplateArgument::NullPtr:
3196       llvm_unreachable("Pack expansion pattern has no parameter packs");
3197 
3198     case TemplateArgument::Type:
3199       if (TypeSourceInfo *Expansion
3200             = getSema().CheckPackExpansion(Pattern.getTypeSourceInfo(),
3201                                            EllipsisLoc,
3202                                            NumExpansions))
3203         return TemplateArgumentLoc(TemplateArgument(Expansion->getType()),
3204                                    Expansion);
3205       break;
3206     }
3207 
3208     return TemplateArgumentLoc();
3209   }
3210 
3211   /// Build a new expression pack expansion.
3212   ///
3213   /// By default, performs semantic analysis to build a new pack expansion
3214   /// for an expression. Subclasses may override this routine to provide
3215   /// different behavior.
3216   ExprResult RebuildPackExpansion(Expr *Pattern, SourceLocation EllipsisLoc,
3217                                   Optional<unsigned> NumExpansions) {
3218     return getSema().CheckPackExpansion(Pattern, EllipsisLoc, NumExpansions);
3219   }
3220 
3221   /// Build a new C++1z fold-expression.
3222   ///
3223   /// By default, performs semantic analysis in order to build a new fold
3224   /// expression.
3225   ExprResult RebuildCXXFoldExpr(SourceLocation LParenLoc, Expr *LHS,
3226                                 BinaryOperatorKind Operator,
3227                                 SourceLocation EllipsisLoc, Expr *RHS,
3228                                 SourceLocation RParenLoc) {
3229     return getSema().BuildCXXFoldExpr(LParenLoc, LHS, Operator, EllipsisLoc,
3230                                       RHS, RParenLoc);
3231   }
3232 
3233   /// Build an empty C++1z fold-expression with the given operator.
3234   ///
3235   /// By default, produces the fallback value for the fold-expression, or
3236   /// produce an error if there is no fallback value.
3237   ExprResult RebuildEmptyCXXFoldExpr(SourceLocation EllipsisLoc,
3238                                      BinaryOperatorKind Operator) {
3239     return getSema().BuildEmptyCXXFoldExpr(EllipsisLoc, Operator);
3240   }
3241 
3242   /// Build a new atomic operation expression.
3243   ///
3244   /// By default, performs semantic analysis to build the new expression.
3245   /// Subclasses may override this routine to provide different behavior.
3246   ExprResult RebuildAtomicExpr(SourceLocation BuiltinLoc,
3247                                MultiExprArg SubExprs,
3248                                QualType RetTy,
3249                                AtomicExpr::AtomicOp Op,
3250                                SourceLocation RParenLoc) {
3251     // Just create the expression; there is not any interesting semantic
3252     // analysis here because we can't actually build an AtomicExpr until
3253     // we are sure it is semantically sound.
3254     return new (SemaRef.Context) AtomicExpr(BuiltinLoc, SubExprs, RetTy, Op,
3255                                             RParenLoc);
3256   }
3257 
3258 private:
3259   TypeLoc TransformTypeInObjectScope(TypeLoc TL,
3260                                      QualType ObjectType,
3261                                      NamedDecl *FirstQualifierInScope,
3262                                      CXXScopeSpec &SS);
3263 
3264   TypeSourceInfo *TransformTypeInObjectScope(TypeSourceInfo *TSInfo,
3265                                              QualType ObjectType,
3266                                              NamedDecl *FirstQualifierInScope,
3267                                              CXXScopeSpec &SS);
3268 
3269   TypeSourceInfo *TransformTSIInObjectScope(TypeLoc TL, QualType ObjectType,
3270                                             NamedDecl *FirstQualifierInScope,
3271                                             CXXScopeSpec &SS);
3272 
3273   QualType TransformDependentNameType(TypeLocBuilder &TLB,
3274                                       DependentNameTypeLoc TL,
3275                                       bool DeducibleTSTContext);
3276 };
3277 
3278 template <typename Derived>
3279 StmtResult TreeTransform<Derived>::TransformStmt(Stmt *S, StmtDiscardKind SDK) {
3280   if (!S)
3281     return S;
3282 
3283   switch (S->getStmtClass()) {
3284   case Stmt::NoStmtClass: break;
3285 
3286   // Transform individual statement nodes
3287   // Pass SDK into statements that can produce a value
3288 #define STMT(Node, Parent)                                              \
3289   case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(S));
3290 #define VALUESTMT(Node, Parent)                                         \
3291   case Stmt::Node##Class:                                               \
3292     return getDerived().Transform##Node(cast<Node>(S), SDK);
3293 #define ABSTRACT_STMT(Node)
3294 #define EXPR(Node, Parent)
3295 #include "clang/AST/StmtNodes.inc"
3296 
3297   // Transform expressions by calling TransformExpr.
3298 #define STMT(Node, Parent)
3299 #define ABSTRACT_STMT(Stmt)
3300 #define EXPR(Node, Parent) case Stmt::Node##Class:
3301 #include "clang/AST/StmtNodes.inc"
3302     {
3303       ExprResult E = getDerived().TransformExpr(cast<Expr>(S));
3304 
3305       if (SDK == SDK_StmtExprResult)
3306         E = getSema().ActOnStmtExprResult(E);
3307       return getSema().ActOnExprStmt(E, SDK == SDK_Discarded);
3308     }
3309   }
3310 
3311   return S;
3312 }
3313 
3314 template<typename Derived>
3315 OMPClause *TreeTransform<Derived>::TransformOMPClause(OMPClause *S) {
3316   if (!S)
3317     return S;
3318 
3319   switch (S->getClauseKind()) {
3320   default: break;
3321   // Transform individual clause nodes
3322 #define OPENMP_CLAUSE(Name, Class)                                             \
3323   case OMPC_ ## Name :                                                         \
3324     return getDerived().Transform ## Class(cast<Class>(S));
3325 #include "clang/Basic/OpenMPKinds.def"
3326   }
3327 
3328   return S;
3329 }
3330 
3331 
3332 template<typename Derived>
3333 ExprResult TreeTransform<Derived>::TransformExpr(Expr *E) {
3334   if (!E)
3335     return E;
3336 
3337   switch (E->getStmtClass()) {
3338     case Stmt::NoStmtClass: break;
3339 #define STMT(Node, Parent) case Stmt::Node##Class: break;
3340 #define ABSTRACT_STMT(Stmt)
3341 #define EXPR(Node, Parent)                                              \
3342     case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(E));
3343 #include "clang/AST/StmtNodes.inc"
3344   }
3345 
3346   return E;
3347 }
3348 
3349 template<typename Derived>
3350 ExprResult TreeTransform<Derived>::TransformInitializer(Expr *Init,
3351                                                         bool NotCopyInit) {
3352   // Initializers are instantiated like expressions, except that various outer
3353   // layers are stripped.
3354   if (!Init)
3355     return Init;
3356 
3357   if (auto *FE = dyn_cast<FullExpr>(Init))
3358     Init = FE->getSubExpr();
3359 
3360   if (auto *AIL = dyn_cast<ArrayInitLoopExpr>(Init))
3361     Init = AIL->getCommonExpr();
3362 
3363   if (MaterializeTemporaryExpr *MTE = dyn_cast<MaterializeTemporaryExpr>(Init))
3364     Init = MTE->GetTemporaryExpr();
3365 
3366   while (CXXBindTemporaryExpr *Binder = dyn_cast<CXXBindTemporaryExpr>(Init))
3367     Init = Binder->getSubExpr();
3368 
3369   if (ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(Init))
3370     Init = ICE->getSubExprAsWritten();
3371 
3372   if (CXXStdInitializerListExpr *ILE =
3373           dyn_cast<CXXStdInitializerListExpr>(Init))
3374     return TransformInitializer(ILE->getSubExpr(), NotCopyInit);
3375 
3376   // If this is copy-initialization, we only need to reconstruct
3377   // InitListExprs. Other forms of copy-initialization will be a no-op if
3378   // the initializer is already the right type.
3379   CXXConstructExpr *Construct = dyn_cast<CXXConstructExpr>(Init);
3380   if (!NotCopyInit && !(Construct && Construct->isListInitialization()))
3381     return getDerived().TransformExpr(Init);
3382 
3383   // Revert value-initialization back to empty parens.
3384   if (CXXScalarValueInitExpr *VIE = dyn_cast<CXXScalarValueInitExpr>(Init)) {
3385     SourceRange Parens = VIE->getSourceRange();
3386     return getDerived().RebuildParenListExpr(Parens.getBegin(), None,
3387                                              Parens.getEnd());
3388   }
3389 
3390   // FIXME: We shouldn't build ImplicitValueInitExprs for direct-initialization.
3391   if (isa<ImplicitValueInitExpr>(Init))
3392     return getDerived().RebuildParenListExpr(SourceLocation(), None,
3393                                              SourceLocation());
3394 
3395   // Revert initialization by constructor back to a parenthesized or braced list
3396   // of expressions. Any other form of initializer can just be reused directly.
3397   if (!Construct || isa<CXXTemporaryObjectExpr>(Construct))
3398     return getDerived().TransformExpr(Init);
3399 
3400   // If the initialization implicitly converted an initializer list to a
3401   // std::initializer_list object, unwrap the std::initializer_list too.
3402   if (Construct && Construct->isStdInitListInitialization())
3403     return TransformInitializer(Construct->getArg(0), NotCopyInit);
3404 
3405   // Enter a list-init context if this was list initialization.
3406   EnterExpressionEvaluationContext Context(
3407       getSema(), EnterExpressionEvaluationContext::InitList,
3408       Construct->isListInitialization());
3409 
3410   SmallVector<Expr*, 8> NewArgs;
3411   bool ArgChanged = false;
3412   if (getDerived().TransformExprs(Construct->getArgs(), Construct->getNumArgs(),
3413                                   /*IsCall*/true, NewArgs, &ArgChanged))
3414     return ExprError();
3415 
3416   // If this was list initialization, revert to syntactic list form.
3417   if (Construct->isListInitialization())
3418     return getDerived().RebuildInitList(Construct->getBeginLoc(), NewArgs,
3419                                         Construct->getEndLoc());
3420 
3421   // Build a ParenListExpr to represent anything else.
3422   SourceRange Parens = Construct->getParenOrBraceRange();
3423   if (Parens.isInvalid()) {
3424     // This was a variable declaration's initialization for which no initializer
3425     // was specified.
3426     assert(NewArgs.empty() &&
3427            "no parens or braces but have direct init with arguments?");
3428     return ExprEmpty();
3429   }
3430   return getDerived().RebuildParenListExpr(Parens.getBegin(), NewArgs,
3431                                            Parens.getEnd());
3432 }
3433 
3434 template<typename Derived>
3435 bool TreeTransform<Derived>::TransformExprs(Expr *const *Inputs,
3436                                             unsigned NumInputs,
3437                                             bool IsCall,
3438                                       SmallVectorImpl<Expr *> &Outputs,
3439                                             bool *ArgChanged) {
3440   for (unsigned I = 0; I != NumInputs; ++I) {
3441     // If requested, drop call arguments that need to be dropped.
3442     if (IsCall && getDerived().DropCallArgument(Inputs[I])) {
3443       if (ArgChanged)
3444         *ArgChanged = true;
3445 
3446       break;
3447     }
3448 
3449     if (PackExpansionExpr *Expansion = dyn_cast<PackExpansionExpr>(Inputs[I])) {
3450       Expr *Pattern = Expansion->getPattern();
3451 
3452       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
3453       getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
3454       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
3455 
3456       // Determine whether the set of unexpanded parameter packs can and should
3457       // be expanded.
3458       bool Expand = true;
3459       bool RetainExpansion = false;
3460       Optional<unsigned> OrigNumExpansions = Expansion->getNumExpansions();
3461       Optional<unsigned> NumExpansions = OrigNumExpansions;
3462       if (getDerived().TryExpandParameterPacks(Expansion->getEllipsisLoc(),
3463                                                Pattern->getSourceRange(),
3464                                                Unexpanded,
3465                                                Expand, RetainExpansion,
3466                                                NumExpansions))
3467         return true;
3468 
3469       if (!Expand) {
3470         // The transform has determined that we should perform a simple
3471         // transformation on the pack expansion, producing another pack
3472         // expansion.
3473         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
3474         ExprResult OutPattern = getDerived().TransformExpr(Pattern);
3475         if (OutPattern.isInvalid())
3476           return true;
3477 
3478         ExprResult Out = getDerived().RebuildPackExpansion(OutPattern.get(),
3479                                                 Expansion->getEllipsisLoc(),
3480                                                            NumExpansions);
3481         if (Out.isInvalid())
3482           return true;
3483 
3484         if (ArgChanged)
3485           *ArgChanged = true;
3486         Outputs.push_back(Out.get());
3487         continue;
3488       }
3489 
3490       // Record right away that the argument was changed.  This needs
3491       // to happen even if the array expands to nothing.
3492       if (ArgChanged) *ArgChanged = true;
3493 
3494       // The transform has determined that we should perform an elementwise
3495       // expansion of the pattern. Do so.
3496       for (unsigned I = 0; I != *NumExpansions; ++I) {
3497         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
3498         ExprResult Out = getDerived().TransformExpr(Pattern);
3499         if (Out.isInvalid())
3500           return true;
3501 
3502         if (Out.get()->containsUnexpandedParameterPack()) {
3503           Out = getDerived().RebuildPackExpansion(
3504               Out.get(), Expansion->getEllipsisLoc(), OrigNumExpansions);
3505           if (Out.isInvalid())
3506             return true;
3507         }
3508 
3509         Outputs.push_back(Out.get());
3510       }
3511 
3512       // If we're supposed to retain a pack expansion, do so by temporarily
3513       // forgetting the partially-substituted parameter pack.
3514       if (RetainExpansion) {
3515         ForgetPartiallySubstitutedPackRAII Forget(getDerived());
3516 
3517         ExprResult Out = getDerived().TransformExpr(Pattern);
3518         if (Out.isInvalid())
3519           return true;
3520 
3521         Out = getDerived().RebuildPackExpansion(
3522             Out.get(), Expansion->getEllipsisLoc(), OrigNumExpansions);
3523         if (Out.isInvalid())
3524           return true;
3525 
3526         Outputs.push_back(Out.get());
3527       }
3528 
3529       continue;
3530     }
3531 
3532     ExprResult Result =
3533       IsCall ? getDerived().TransformInitializer(Inputs[I], /*DirectInit*/false)
3534              : getDerived().TransformExpr(Inputs[I]);
3535     if (Result.isInvalid())
3536       return true;
3537 
3538     if (Result.get() != Inputs[I] && ArgChanged)
3539       *ArgChanged = true;
3540 
3541     Outputs.push_back(Result.get());
3542   }
3543 
3544   return false;
3545 }
3546 
3547 template <typename Derived>
3548 Sema::ConditionResult TreeTransform<Derived>::TransformCondition(
3549     SourceLocation Loc, VarDecl *Var, Expr *Expr, Sema::ConditionKind Kind) {
3550   if (Var) {
3551     VarDecl *ConditionVar = cast_or_null<VarDecl>(
3552         getDerived().TransformDefinition(Var->getLocation(), Var));
3553 
3554     if (!ConditionVar)
3555       return Sema::ConditionError();
3556 
3557     return getSema().ActOnConditionVariable(ConditionVar, Loc, Kind);
3558   }
3559 
3560   if (Expr) {
3561     ExprResult CondExpr = getDerived().TransformExpr(Expr);
3562 
3563     if (CondExpr.isInvalid())
3564       return Sema::ConditionError();
3565 
3566     return getSema().ActOnCondition(nullptr, Loc, CondExpr.get(), Kind);
3567   }
3568 
3569   return Sema::ConditionResult();
3570 }
3571 
3572 template<typename Derived>
3573 NestedNameSpecifierLoc
3574 TreeTransform<Derived>::TransformNestedNameSpecifierLoc(
3575                                                     NestedNameSpecifierLoc NNS,
3576                                                      QualType ObjectType,
3577                                              NamedDecl *FirstQualifierInScope) {
3578   SmallVector<NestedNameSpecifierLoc, 4> Qualifiers;
3579   for (NestedNameSpecifierLoc Qualifier = NNS; Qualifier;
3580        Qualifier = Qualifier.getPrefix())
3581     Qualifiers.push_back(Qualifier);
3582 
3583   CXXScopeSpec SS;
3584   while (!Qualifiers.empty()) {
3585     NestedNameSpecifierLoc Q = Qualifiers.pop_back_val();
3586     NestedNameSpecifier *QNNS = Q.getNestedNameSpecifier();
3587 
3588     switch (QNNS->getKind()) {
3589     case NestedNameSpecifier::Identifier: {
3590       Sema::NestedNameSpecInfo IdInfo(QNNS->getAsIdentifier(),
3591                           Q.getLocalBeginLoc(), Q.getLocalEndLoc(), ObjectType);
3592       if (SemaRef.BuildCXXNestedNameSpecifier(/*Scope=*/nullptr, IdInfo, false,
3593                                               SS, FirstQualifierInScope, false))
3594         return NestedNameSpecifierLoc();
3595     }
3596       break;
3597 
3598     case NestedNameSpecifier::Namespace: {
3599       NamespaceDecl *NS
3600         = cast_or_null<NamespaceDecl>(
3601                                     getDerived().TransformDecl(
3602                                                           Q.getLocalBeginLoc(),
3603                                                        QNNS->getAsNamespace()));
3604       SS.Extend(SemaRef.Context, NS, Q.getLocalBeginLoc(), Q.getLocalEndLoc());
3605       break;
3606     }
3607 
3608     case NestedNameSpecifier::NamespaceAlias: {
3609       NamespaceAliasDecl *Alias
3610         = cast_or_null<NamespaceAliasDecl>(
3611                       getDerived().TransformDecl(Q.getLocalBeginLoc(),
3612                                                  QNNS->getAsNamespaceAlias()));
3613       SS.Extend(SemaRef.Context, Alias, Q.getLocalBeginLoc(),
3614                 Q.getLocalEndLoc());
3615       break;
3616     }
3617 
3618     case NestedNameSpecifier::Global:
3619       // There is no meaningful transformation that one could perform on the
3620       // global scope.
3621       SS.MakeGlobal(SemaRef.Context, Q.getBeginLoc());
3622       break;
3623 
3624     case NestedNameSpecifier::Super: {
3625       CXXRecordDecl *RD =
3626           cast_or_null<CXXRecordDecl>(getDerived().TransformDecl(
3627               SourceLocation(), QNNS->getAsRecordDecl()));
3628       SS.MakeSuper(SemaRef.Context, RD, Q.getBeginLoc(), Q.getEndLoc());
3629       break;
3630     }
3631 
3632     case NestedNameSpecifier::TypeSpecWithTemplate:
3633     case NestedNameSpecifier::TypeSpec: {
3634       TypeLoc TL = TransformTypeInObjectScope(Q.getTypeLoc(), ObjectType,
3635                                               FirstQualifierInScope, SS);
3636 
3637       if (!TL)
3638         return NestedNameSpecifierLoc();
3639 
3640       if (TL.getType()->isDependentType() || TL.getType()->isRecordType() ||
3641           (SemaRef.getLangOpts().CPlusPlus11 &&
3642            TL.getType()->isEnumeralType())) {
3643         assert(!TL.getType().hasLocalQualifiers() &&
3644                "Can't get cv-qualifiers here");
3645         if (TL.getType()->isEnumeralType())
3646           SemaRef.Diag(TL.getBeginLoc(),
3647                        diag::warn_cxx98_compat_enum_nested_name_spec);
3648         SS.Extend(SemaRef.Context, /*FIXME:*/SourceLocation(), TL,
3649                   Q.getLocalEndLoc());
3650         break;
3651       }
3652       // If the nested-name-specifier is an invalid type def, don't emit an
3653       // error because a previous error should have already been emitted.
3654       TypedefTypeLoc TTL = TL.getAs<TypedefTypeLoc>();
3655       if (!TTL || !TTL.getTypedefNameDecl()->isInvalidDecl()) {
3656         SemaRef.Diag(TL.getBeginLoc(), diag::err_nested_name_spec_non_tag)
3657           << TL.getType() << SS.getRange();
3658       }
3659       return NestedNameSpecifierLoc();
3660     }
3661     }
3662 
3663     // The qualifier-in-scope and object type only apply to the leftmost entity.
3664     FirstQualifierInScope = nullptr;
3665     ObjectType = QualType();
3666   }
3667 
3668   // Don't rebuild the nested-name-specifier if we don't have to.
3669   if (SS.getScopeRep() == NNS.getNestedNameSpecifier() &&
3670       !getDerived().AlwaysRebuild())
3671     return NNS;
3672 
3673   // If we can re-use the source-location data from the original
3674   // nested-name-specifier, do so.
3675   if (SS.location_size() == NNS.getDataLength() &&
3676       memcmp(SS.location_data(), NNS.getOpaqueData(), SS.location_size()) == 0)
3677     return NestedNameSpecifierLoc(SS.getScopeRep(), NNS.getOpaqueData());
3678 
3679   // Allocate new nested-name-specifier location information.
3680   return SS.getWithLocInContext(SemaRef.Context);
3681 }
3682 
3683 template<typename Derived>
3684 DeclarationNameInfo
3685 TreeTransform<Derived>
3686 ::TransformDeclarationNameInfo(const DeclarationNameInfo &NameInfo) {
3687   DeclarationName Name = NameInfo.getName();
3688   if (!Name)
3689     return DeclarationNameInfo();
3690 
3691   switch (Name.getNameKind()) {
3692   case DeclarationName::Identifier:
3693   case DeclarationName::ObjCZeroArgSelector:
3694   case DeclarationName::ObjCOneArgSelector:
3695   case DeclarationName::ObjCMultiArgSelector:
3696   case DeclarationName::CXXOperatorName:
3697   case DeclarationName::CXXLiteralOperatorName:
3698   case DeclarationName::CXXUsingDirective:
3699     return NameInfo;
3700 
3701   case DeclarationName::CXXDeductionGuideName: {
3702     TemplateDecl *OldTemplate = Name.getCXXDeductionGuideTemplate();
3703     TemplateDecl *NewTemplate = cast_or_null<TemplateDecl>(
3704         getDerived().TransformDecl(NameInfo.getLoc(), OldTemplate));
3705     if (!NewTemplate)
3706       return DeclarationNameInfo();
3707 
3708     DeclarationNameInfo NewNameInfo(NameInfo);
3709     NewNameInfo.setName(
3710         SemaRef.Context.DeclarationNames.getCXXDeductionGuideName(NewTemplate));
3711     return NewNameInfo;
3712   }
3713 
3714   case DeclarationName::CXXConstructorName:
3715   case DeclarationName::CXXDestructorName:
3716   case DeclarationName::CXXConversionFunctionName: {
3717     TypeSourceInfo *NewTInfo;
3718     CanQualType NewCanTy;
3719     if (TypeSourceInfo *OldTInfo = NameInfo.getNamedTypeInfo()) {
3720       NewTInfo = getDerived().TransformType(OldTInfo);
3721       if (!NewTInfo)
3722         return DeclarationNameInfo();
3723       NewCanTy = SemaRef.Context.getCanonicalType(NewTInfo->getType());
3724     }
3725     else {
3726       NewTInfo = nullptr;
3727       TemporaryBase Rebase(*this, NameInfo.getLoc(), Name);
3728       QualType NewT = getDerived().TransformType(Name.getCXXNameType());
3729       if (NewT.isNull())
3730         return DeclarationNameInfo();
3731       NewCanTy = SemaRef.Context.getCanonicalType(NewT);
3732     }
3733 
3734     DeclarationName NewName
3735       = SemaRef.Context.DeclarationNames.getCXXSpecialName(Name.getNameKind(),
3736                                                            NewCanTy);
3737     DeclarationNameInfo NewNameInfo(NameInfo);
3738     NewNameInfo.setName(NewName);
3739     NewNameInfo.setNamedTypeInfo(NewTInfo);
3740     return NewNameInfo;
3741   }
3742   }
3743 
3744   llvm_unreachable("Unknown name kind.");
3745 }
3746 
3747 template<typename Derived>
3748 TemplateName
3749 TreeTransform<Derived>::TransformTemplateName(CXXScopeSpec &SS,
3750                                               TemplateName Name,
3751                                               SourceLocation NameLoc,
3752                                               QualType ObjectType,
3753                                               NamedDecl *FirstQualifierInScope,
3754                                               bool AllowInjectedClassName) {
3755   if (QualifiedTemplateName *QTN = Name.getAsQualifiedTemplateName()) {
3756     TemplateDecl *Template = QTN->getTemplateDecl();
3757     assert(Template && "qualified template name must refer to a template");
3758 
3759     TemplateDecl *TransTemplate
3760       = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc,
3761                                                               Template));
3762     if (!TransTemplate)
3763       return TemplateName();
3764 
3765     if (!getDerived().AlwaysRebuild() &&
3766         SS.getScopeRep() == QTN->getQualifier() &&
3767         TransTemplate == Template)
3768       return Name;
3769 
3770     return getDerived().RebuildTemplateName(SS, QTN->hasTemplateKeyword(),
3771                                             TransTemplate);
3772   }
3773 
3774   if (DependentTemplateName *DTN = Name.getAsDependentTemplateName()) {
3775     if (SS.getScopeRep()) {
3776       // These apply to the scope specifier, not the template.
3777       ObjectType = QualType();
3778       FirstQualifierInScope = nullptr;
3779     }
3780 
3781     if (!getDerived().AlwaysRebuild() &&
3782         SS.getScopeRep() == DTN->getQualifier() &&
3783         ObjectType.isNull())
3784       return Name;
3785 
3786     // FIXME: Preserve the location of the "template" keyword.
3787     SourceLocation TemplateKWLoc = NameLoc;
3788 
3789     if (DTN->isIdentifier()) {
3790       return getDerived().RebuildTemplateName(SS,
3791                                               TemplateKWLoc,
3792                                               *DTN->getIdentifier(),
3793                                               NameLoc,
3794                                               ObjectType,
3795                                               FirstQualifierInScope,
3796                                               AllowInjectedClassName);
3797     }
3798 
3799     return getDerived().RebuildTemplateName(SS, TemplateKWLoc,
3800                                             DTN->getOperator(), NameLoc,
3801                                             ObjectType, AllowInjectedClassName);
3802   }
3803 
3804   if (TemplateDecl *Template = Name.getAsTemplateDecl()) {
3805     TemplateDecl *TransTemplate
3806       = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc,
3807                                                               Template));
3808     if (!TransTemplate)
3809       return TemplateName();
3810 
3811     if (!getDerived().AlwaysRebuild() &&
3812         TransTemplate == Template)
3813       return Name;
3814 
3815     return TemplateName(TransTemplate);
3816   }
3817 
3818   if (SubstTemplateTemplateParmPackStorage *SubstPack
3819       = Name.getAsSubstTemplateTemplateParmPack()) {
3820     TemplateTemplateParmDecl *TransParam
3821     = cast_or_null<TemplateTemplateParmDecl>(
3822             getDerived().TransformDecl(NameLoc, SubstPack->getParameterPack()));
3823     if (!TransParam)
3824       return TemplateName();
3825 
3826     if (!getDerived().AlwaysRebuild() &&
3827         TransParam == SubstPack->getParameterPack())
3828       return Name;
3829 
3830     return getDerived().RebuildTemplateName(TransParam,
3831                                             SubstPack->getArgumentPack());
3832   }
3833 
3834   // These should be getting filtered out before they reach the AST.
3835   llvm_unreachable("overloaded function decl survived to here");
3836 }
3837 
3838 template<typename Derived>
3839 void TreeTransform<Derived>::InventTemplateArgumentLoc(
3840                                          const TemplateArgument &Arg,
3841                                          TemplateArgumentLoc &Output) {
3842   SourceLocation Loc = getDerived().getBaseLocation();
3843   switch (Arg.getKind()) {
3844   case TemplateArgument::Null:
3845     llvm_unreachable("null template argument in TreeTransform");
3846     break;
3847 
3848   case TemplateArgument::Type:
3849     Output = TemplateArgumentLoc(Arg,
3850                SemaRef.Context.getTrivialTypeSourceInfo(Arg.getAsType(), Loc));
3851 
3852     break;
3853 
3854   case TemplateArgument::Template:
3855   case TemplateArgument::TemplateExpansion: {
3856     NestedNameSpecifierLocBuilder Builder;
3857     TemplateName Template = Arg.getAsTemplateOrTemplatePattern();
3858     if (DependentTemplateName *DTN = Template.getAsDependentTemplateName())
3859       Builder.MakeTrivial(SemaRef.Context, DTN->getQualifier(), Loc);
3860     else if (QualifiedTemplateName *QTN = Template.getAsQualifiedTemplateName())
3861       Builder.MakeTrivial(SemaRef.Context, QTN->getQualifier(), Loc);
3862 
3863     if (Arg.getKind() == TemplateArgument::Template)
3864       Output = TemplateArgumentLoc(Arg,
3865                                    Builder.getWithLocInContext(SemaRef.Context),
3866                                    Loc);
3867     else
3868       Output = TemplateArgumentLoc(Arg,
3869                                    Builder.getWithLocInContext(SemaRef.Context),
3870                                    Loc, Loc);
3871 
3872     break;
3873   }
3874 
3875   case TemplateArgument::Expression:
3876     Output = TemplateArgumentLoc(Arg, Arg.getAsExpr());
3877     break;
3878 
3879   case TemplateArgument::Declaration:
3880   case TemplateArgument::Integral:
3881   case TemplateArgument::Pack:
3882   case TemplateArgument::NullPtr:
3883     Output = TemplateArgumentLoc(Arg, TemplateArgumentLocInfo());
3884     break;
3885   }
3886 }
3887 
3888 template<typename Derived>
3889 bool TreeTransform<Derived>::TransformTemplateArgument(
3890                                          const TemplateArgumentLoc &Input,
3891                                          TemplateArgumentLoc &Output, bool Uneval) {
3892   EnterExpressionEvaluationContext EEEC(
3893       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated,
3894       /*LambdaContextDecl=*/nullptr, /*ExprContext=*/
3895       Sema::ExpressionEvaluationContextRecord::EK_TemplateArgument);
3896   const TemplateArgument &Arg = Input.getArgument();
3897   switch (Arg.getKind()) {
3898   case TemplateArgument::Null:
3899   case TemplateArgument::Integral:
3900   case TemplateArgument::Pack:
3901   case TemplateArgument::Declaration:
3902   case TemplateArgument::NullPtr:
3903     llvm_unreachable("Unexpected TemplateArgument");
3904 
3905   case TemplateArgument::Type: {
3906     TypeSourceInfo *DI = Input.getTypeSourceInfo();
3907     if (!DI)
3908       DI = InventTypeSourceInfo(Input.getArgument().getAsType());
3909 
3910     DI = getDerived().TransformType(DI);
3911     if (!DI) return true;
3912 
3913     Output = TemplateArgumentLoc(TemplateArgument(DI->getType()), DI);
3914     return false;
3915   }
3916 
3917   case TemplateArgument::Template: {
3918     NestedNameSpecifierLoc QualifierLoc = Input.getTemplateQualifierLoc();
3919     if (QualifierLoc) {
3920       QualifierLoc = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc);
3921       if (!QualifierLoc)
3922         return true;
3923     }
3924 
3925     CXXScopeSpec SS;
3926     SS.Adopt(QualifierLoc);
3927     TemplateName Template
3928       = getDerived().TransformTemplateName(SS, Arg.getAsTemplate(),
3929                                            Input.getTemplateNameLoc());
3930     if (Template.isNull())
3931       return true;
3932 
3933     Output = TemplateArgumentLoc(TemplateArgument(Template), QualifierLoc,
3934                                  Input.getTemplateNameLoc());
3935     return false;
3936   }
3937 
3938   case TemplateArgument::TemplateExpansion:
3939     llvm_unreachable("Caller should expand pack expansions");
3940 
3941   case TemplateArgument::Expression: {
3942     // Template argument expressions are constant expressions.
3943     EnterExpressionEvaluationContext Unevaluated(
3944         getSema(), Uneval
3945                        ? Sema::ExpressionEvaluationContext::Unevaluated
3946                        : Sema::ExpressionEvaluationContext::ConstantEvaluated);
3947 
3948     Expr *InputExpr = Input.getSourceExpression();
3949     if (!InputExpr) InputExpr = Input.getArgument().getAsExpr();
3950 
3951     ExprResult E = getDerived().TransformExpr(InputExpr);
3952     E = SemaRef.ActOnConstantExpression(E);
3953     if (E.isInvalid()) return true;
3954     Output = TemplateArgumentLoc(TemplateArgument(E.get()), E.get());
3955     return false;
3956   }
3957   }
3958 
3959   // Work around bogus GCC warning
3960   return true;
3961 }
3962 
3963 /// Iterator adaptor that invents template argument location information
3964 /// for each of the template arguments in its underlying iterator.
3965 template<typename Derived, typename InputIterator>
3966 class TemplateArgumentLocInventIterator {
3967   TreeTransform<Derived> &Self;
3968   InputIterator Iter;
3969 
3970 public:
3971   typedef TemplateArgumentLoc value_type;
3972   typedef TemplateArgumentLoc reference;
3973   typedef typename std::iterator_traits<InputIterator>::difference_type
3974     difference_type;
3975   typedef std::input_iterator_tag iterator_category;
3976 
3977   class pointer {
3978     TemplateArgumentLoc Arg;
3979 
3980   public:
3981     explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { }
3982 
3983     const TemplateArgumentLoc *operator->() const { return &Arg; }
3984   };
3985 
3986   TemplateArgumentLocInventIterator() { }
3987 
3988   explicit TemplateArgumentLocInventIterator(TreeTransform<Derived> &Self,
3989                                              InputIterator Iter)
3990     : Self(Self), Iter(Iter) { }
3991 
3992   TemplateArgumentLocInventIterator &operator++() {
3993     ++Iter;
3994     return *this;
3995   }
3996 
3997   TemplateArgumentLocInventIterator operator++(int) {
3998     TemplateArgumentLocInventIterator Old(*this);
3999     ++(*this);
4000     return Old;
4001   }
4002 
4003   reference operator*() const {
4004     TemplateArgumentLoc Result;
4005     Self.InventTemplateArgumentLoc(*Iter, Result);
4006     return Result;
4007   }
4008 
4009   pointer operator->() const { return pointer(**this); }
4010 
4011   friend bool operator==(const TemplateArgumentLocInventIterator &X,
4012                          const TemplateArgumentLocInventIterator &Y) {
4013     return X.Iter == Y.Iter;
4014   }
4015 
4016   friend bool operator!=(const TemplateArgumentLocInventIterator &X,
4017                          const TemplateArgumentLocInventIterator &Y) {
4018     return X.Iter != Y.Iter;
4019   }
4020 };
4021 
4022 template<typename Derived>
4023 template<typename InputIterator>
4024 bool TreeTransform<Derived>::TransformTemplateArguments(
4025     InputIterator First, InputIterator Last, TemplateArgumentListInfo &Outputs,
4026     bool Uneval) {
4027   for (; First != Last; ++First) {
4028     TemplateArgumentLoc Out;
4029     TemplateArgumentLoc In = *First;
4030 
4031     if (In.getArgument().getKind() == TemplateArgument::Pack) {
4032       // Unpack argument packs, which we translate them into separate
4033       // arguments.
4034       // FIXME: We could do much better if we could guarantee that the
4035       // TemplateArgumentLocInfo for the pack expansion would be usable for
4036       // all of the template arguments in the argument pack.
4037       typedef TemplateArgumentLocInventIterator<Derived,
4038                                                 TemplateArgument::pack_iterator>
4039         PackLocIterator;
4040       if (TransformTemplateArguments(PackLocIterator(*this,
4041                                                  In.getArgument().pack_begin()),
4042                                      PackLocIterator(*this,
4043                                                    In.getArgument().pack_end()),
4044                                      Outputs, Uneval))
4045         return true;
4046 
4047       continue;
4048     }
4049 
4050     if (In.getArgument().isPackExpansion()) {
4051       // We have a pack expansion, for which we will be substituting into
4052       // the pattern.
4053       SourceLocation Ellipsis;
4054       Optional<unsigned> OrigNumExpansions;
4055       TemplateArgumentLoc Pattern
4056         = getSema().getTemplateArgumentPackExpansionPattern(
4057               In, Ellipsis, OrigNumExpansions);
4058 
4059       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
4060       getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
4061       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
4062 
4063       // Determine whether the set of unexpanded parameter packs can and should
4064       // be expanded.
4065       bool Expand = true;
4066       bool RetainExpansion = false;
4067       Optional<unsigned> NumExpansions = OrigNumExpansions;
4068       if (getDerived().TryExpandParameterPacks(Ellipsis,
4069                                                Pattern.getSourceRange(),
4070                                                Unexpanded,
4071                                                Expand,
4072                                                RetainExpansion,
4073                                                NumExpansions))
4074         return true;
4075 
4076       if (!Expand) {
4077         // The transform has determined that we should perform a simple
4078         // transformation on the pack expansion, producing another pack
4079         // expansion.
4080         TemplateArgumentLoc OutPattern;
4081         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
4082         if (getDerived().TransformTemplateArgument(Pattern, OutPattern, Uneval))
4083           return true;
4084 
4085         Out = getDerived().RebuildPackExpansion(OutPattern, Ellipsis,
4086                                                 NumExpansions);
4087         if (Out.getArgument().isNull())
4088           return true;
4089 
4090         Outputs.addArgument(Out);
4091         continue;
4092       }
4093 
4094       // The transform has determined that we should perform an elementwise
4095       // expansion of the pattern. Do so.
4096       for (unsigned I = 0; I != *NumExpansions; ++I) {
4097         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
4098 
4099         if (getDerived().TransformTemplateArgument(Pattern, Out, Uneval))
4100           return true;
4101 
4102         if (Out.getArgument().containsUnexpandedParameterPack()) {
4103           Out = getDerived().RebuildPackExpansion(Out, Ellipsis,
4104                                                   OrigNumExpansions);
4105           if (Out.getArgument().isNull())
4106             return true;
4107         }
4108 
4109         Outputs.addArgument(Out);
4110       }
4111 
4112       // If we're supposed to retain a pack expansion, do so by temporarily
4113       // forgetting the partially-substituted parameter pack.
4114       if (RetainExpansion) {
4115         ForgetPartiallySubstitutedPackRAII Forget(getDerived());
4116 
4117         if (getDerived().TransformTemplateArgument(Pattern, Out, Uneval))
4118           return true;
4119 
4120         Out = getDerived().RebuildPackExpansion(Out, Ellipsis,
4121                                                 OrigNumExpansions);
4122         if (Out.getArgument().isNull())
4123           return true;
4124 
4125         Outputs.addArgument(Out);
4126       }
4127 
4128       continue;
4129     }
4130 
4131     // The simple case:
4132     if (getDerived().TransformTemplateArgument(In, Out, Uneval))
4133       return true;
4134 
4135     Outputs.addArgument(Out);
4136   }
4137 
4138   return false;
4139 
4140 }
4141 
4142 //===----------------------------------------------------------------------===//
4143 // Type transformation
4144 //===----------------------------------------------------------------------===//
4145 
4146 template<typename Derived>
4147 QualType TreeTransform<Derived>::TransformType(QualType T) {
4148   if (getDerived().AlreadyTransformed(T))
4149     return T;
4150 
4151   // Temporary workaround.  All of these transformations should
4152   // eventually turn into transformations on TypeLocs.
4153   TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(T,
4154                                                 getDerived().getBaseLocation());
4155 
4156   TypeSourceInfo *NewDI = getDerived().TransformType(DI);
4157 
4158   if (!NewDI)
4159     return QualType();
4160 
4161   return NewDI->getType();
4162 }
4163 
4164 template<typename Derived>
4165 TypeSourceInfo *TreeTransform<Derived>::TransformType(TypeSourceInfo *DI) {
4166   // Refine the base location to the type's location.
4167   TemporaryBase Rebase(*this, DI->getTypeLoc().getBeginLoc(),
4168                        getDerived().getBaseEntity());
4169   if (getDerived().AlreadyTransformed(DI->getType()))
4170     return DI;
4171 
4172   TypeLocBuilder TLB;
4173 
4174   TypeLoc TL = DI->getTypeLoc();
4175   TLB.reserve(TL.getFullDataSize());
4176 
4177   QualType Result = getDerived().TransformType(TLB, TL);
4178   if (Result.isNull())
4179     return nullptr;
4180 
4181   return TLB.getTypeSourceInfo(SemaRef.Context, Result);
4182 }
4183 
4184 template<typename Derived>
4185 QualType
4186 TreeTransform<Derived>::TransformType(TypeLocBuilder &TLB, TypeLoc T) {
4187   switch (T.getTypeLocClass()) {
4188 #define ABSTRACT_TYPELOC(CLASS, PARENT)
4189 #define TYPELOC(CLASS, PARENT)                                                 \
4190   case TypeLoc::CLASS:                                                         \
4191     return getDerived().Transform##CLASS##Type(TLB,                            \
4192                                                T.castAs<CLASS##TypeLoc>());
4193 #include "clang/AST/TypeLocNodes.def"
4194   }
4195 
4196   llvm_unreachable("unhandled type loc!");
4197 }
4198 
4199 template<typename Derived>
4200 QualType TreeTransform<Derived>::TransformTypeWithDeducedTST(QualType T) {
4201   if (!isa<DependentNameType>(T))
4202     return TransformType(T);
4203 
4204   if (getDerived().AlreadyTransformed(T))
4205     return T;
4206   TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(T,
4207                                                 getDerived().getBaseLocation());
4208   TypeSourceInfo *NewDI = getDerived().TransformTypeWithDeducedTST(DI);
4209   return NewDI ? NewDI->getType() : QualType();
4210 }
4211 
4212 template<typename Derived>
4213 TypeSourceInfo *
4214 TreeTransform<Derived>::TransformTypeWithDeducedTST(TypeSourceInfo *DI) {
4215   if (!isa<DependentNameType>(DI->getType()))
4216     return TransformType(DI);
4217 
4218   // Refine the base location to the type's location.
4219   TemporaryBase Rebase(*this, DI->getTypeLoc().getBeginLoc(),
4220                        getDerived().getBaseEntity());
4221   if (getDerived().AlreadyTransformed(DI->getType()))
4222     return DI;
4223 
4224   TypeLocBuilder TLB;
4225 
4226   TypeLoc TL = DI->getTypeLoc();
4227   TLB.reserve(TL.getFullDataSize());
4228 
4229   auto QTL = TL.getAs<QualifiedTypeLoc>();
4230   if (QTL)
4231     TL = QTL.getUnqualifiedLoc();
4232 
4233   auto DNTL = TL.castAs<DependentNameTypeLoc>();
4234 
4235   QualType Result = getDerived().TransformDependentNameType(
4236       TLB, DNTL, /*DeducedTSTContext*/true);
4237   if (Result.isNull())
4238     return nullptr;
4239 
4240   if (QTL) {
4241     Result = getDerived().RebuildQualifiedType(Result, QTL);
4242     if (Result.isNull())
4243       return nullptr;
4244     TLB.TypeWasModifiedSafely(Result);
4245   }
4246 
4247   return TLB.getTypeSourceInfo(SemaRef.Context, Result);
4248 }
4249 
4250 template<typename Derived>
4251 QualType
4252 TreeTransform<Derived>::TransformQualifiedType(TypeLocBuilder &TLB,
4253                                                QualifiedTypeLoc T) {
4254   QualType Result = getDerived().TransformType(TLB, T.getUnqualifiedLoc());
4255   if (Result.isNull())
4256     return QualType();
4257 
4258   Result = getDerived().RebuildQualifiedType(Result, T);
4259 
4260   if (Result.isNull())
4261     return QualType();
4262 
4263   // RebuildQualifiedType might have updated the type, but not in a way
4264   // that invalidates the TypeLoc. (There's no location information for
4265   // qualifiers.)
4266   TLB.TypeWasModifiedSafely(Result);
4267 
4268   return Result;
4269 }
4270 
4271 template <typename Derived>
4272 QualType TreeTransform<Derived>::RebuildQualifiedType(QualType T,
4273                                                       QualifiedTypeLoc TL) {
4274 
4275   SourceLocation Loc = TL.getBeginLoc();
4276   Qualifiers Quals = TL.getType().getLocalQualifiers();
4277 
4278   if (((T.getAddressSpace() != LangAS::Default &&
4279         Quals.getAddressSpace() != LangAS::Default)) &&
4280       T.getAddressSpace() != Quals.getAddressSpace()) {
4281     SemaRef.Diag(Loc, diag::err_address_space_mismatch_templ_inst)
4282         << TL.getType() << T;
4283     return QualType();
4284   }
4285 
4286   // C++ [dcl.fct]p7:
4287   //   [When] adding cv-qualifications on top of the function type [...] the
4288   //   cv-qualifiers are ignored.
4289   if (T->isFunctionType()) {
4290     T = SemaRef.getASTContext().getAddrSpaceQualType(T,
4291                                                      Quals.getAddressSpace());
4292     return T;
4293   }
4294 
4295   // C++ [dcl.ref]p1:
4296   //   when the cv-qualifiers are introduced through the use of a typedef-name
4297   //   or decltype-specifier [...] the cv-qualifiers are ignored.
4298   // Note that [dcl.ref]p1 lists all cases in which cv-qualifiers can be
4299   // applied to a reference type.
4300   if (T->isReferenceType()) {
4301     // The only qualifier that applies to a reference type is restrict.
4302     if (!Quals.hasRestrict())
4303       return T;
4304     Quals = Qualifiers::fromCVRMask(Qualifiers::Restrict);
4305   }
4306 
4307   // Suppress Objective-C lifetime qualifiers if they don't make sense for the
4308   // resulting type.
4309   if (Quals.hasObjCLifetime()) {
4310     if (!T->isObjCLifetimeType() && !T->isDependentType())
4311       Quals.removeObjCLifetime();
4312     else if (T.getObjCLifetime()) {
4313       // Objective-C ARC:
4314       //   A lifetime qualifier applied to a substituted template parameter
4315       //   overrides the lifetime qualifier from the template argument.
4316       const AutoType *AutoTy;
4317       if (const SubstTemplateTypeParmType *SubstTypeParam
4318                                 = dyn_cast<SubstTemplateTypeParmType>(T)) {
4319         QualType Replacement = SubstTypeParam->getReplacementType();
4320         Qualifiers Qs = Replacement.getQualifiers();
4321         Qs.removeObjCLifetime();
4322         Replacement = SemaRef.Context.getQualifiedType(
4323             Replacement.getUnqualifiedType(), Qs);
4324         T = SemaRef.Context.getSubstTemplateTypeParmType(
4325             SubstTypeParam->getReplacedParameter(), Replacement);
4326       } else if ((AutoTy = dyn_cast<AutoType>(T)) && AutoTy->isDeduced()) {
4327         // 'auto' types behave the same way as template parameters.
4328         QualType Deduced = AutoTy->getDeducedType();
4329         Qualifiers Qs = Deduced.getQualifiers();
4330         Qs.removeObjCLifetime();
4331         Deduced =
4332             SemaRef.Context.getQualifiedType(Deduced.getUnqualifiedType(), Qs);
4333         T = SemaRef.Context.getAutoType(Deduced, AutoTy->getKeyword(),
4334                                         AutoTy->isDependentType());
4335       } else {
4336         // Otherwise, complain about the addition of a qualifier to an
4337         // already-qualified type.
4338         // FIXME: Why is this check not in Sema::BuildQualifiedType?
4339         SemaRef.Diag(Loc, diag::err_attr_objc_ownership_redundant) << T;
4340         Quals.removeObjCLifetime();
4341       }
4342     }
4343   }
4344 
4345   return SemaRef.BuildQualifiedType(T, Loc, Quals);
4346 }
4347 
4348 template<typename Derived>
4349 TypeLoc
4350 TreeTransform<Derived>::TransformTypeInObjectScope(TypeLoc TL,
4351                                                    QualType ObjectType,
4352                                                    NamedDecl *UnqualLookup,
4353                                                    CXXScopeSpec &SS) {
4354   if (getDerived().AlreadyTransformed(TL.getType()))
4355     return TL;
4356 
4357   TypeSourceInfo *TSI =
4358       TransformTSIInObjectScope(TL, ObjectType, UnqualLookup, SS);
4359   if (TSI)
4360     return TSI->getTypeLoc();
4361   return TypeLoc();
4362 }
4363 
4364 template<typename Derived>
4365 TypeSourceInfo *
4366 TreeTransform<Derived>::TransformTypeInObjectScope(TypeSourceInfo *TSInfo,
4367                                                    QualType ObjectType,
4368                                                    NamedDecl *UnqualLookup,
4369                                                    CXXScopeSpec &SS) {
4370   if (getDerived().AlreadyTransformed(TSInfo->getType()))
4371     return TSInfo;
4372 
4373   return TransformTSIInObjectScope(TSInfo->getTypeLoc(), ObjectType,
4374                                    UnqualLookup, SS);
4375 }
4376 
4377 template <typename Derived>
4378 TypeSourceInfo *TreeTransform<Derived>::TransformTSIInObjectScope(
4379     TypeLoc TL, QualType ObjectType, NamedDecl *UnqualLookup,
4380     CXXScopeSpec &SS) {
4381   QualType T = TL.getType();
4382   assert(!getDerived().AlreadyTransformed(T));
4383 
4384   TypeLocBuilder TLB;
4385   QualType Result;
4386 
4387   if (isa<TemplateSpecializationType>(T)) {
4388     TemplateSpecializationTypeLoc SpecTL =
4389         TL.castAs<TemplateSpecializationTypeLoc>();
4390 
4391     TemplateName Template = getDerived().TransformTemplateName(
4392         SS, SpecTL.getTypePtr()->getTemplateName(), SpecTL.getTemplateNameLoc(),
4393         ObjectType, UnqualLookup, /*AllowInjectedClassName*/true);
4394     if (Template.isNull())
4395       return nullptr;
4396 
4397     Result = getDerived().TransformTemplateSpecializationType(TLB, SpecTL,
4398                                                               Template);
4399   } else if (isa<DependentTemplateSpecializationType>(T)) {
4400     DependentTemplateSpecializationTypeLoc SpecTL =
4401         TL.castAs<DependentTemplateSpecializationTypeLoc>();
4402 
4403     TemplateName Template
4404       = getDerived().RebuildTemplateName(SS,
4405                                          SpecTL.getTemplateKeywordLoc(),
4406                                          *SpecTL.getTypePtr()->getIdentifier(),
4407                                          SpecTL.getTemplateNameLoc(),
4408                                          ObjectType, UnqualLookup,
4409                                          /*AllowInjectedClassName*/true);
4410     if (Template.isNull())
4411       return nullptr;
4412 
4413     Result = getDerived().TransformDependentTemplateSpecializationType(TLB,
4414                                                                        SpecTL,
4415                                                                        Template,
4416                                                                        SS);
4417   } else {
4418     // Nothing special needs to be done for these.
4419     Result = getDerived().TransformType(TLB, TL);
4420   }
4421 
4422   if (Result.isNull())
4423     return nullptr;
4424 
4425   return TLB.getTypeSourceInfo(SemaRef.Context, Result);
4426 }
4427 
4428 template <class TyLoc> static inline
4429 QualType TransformTypeSpecType(TypeLocBuilder &TLB, TyLoc T) {
4430   TyLoc NewT = TLB.push<TyLoc>(T.getType());
4431   NewT.setNameLoc(T.getNameLoc());
4432   return T.getType();
4433 }
4434 
4435 template<typename Derived>
4436 QualType TreeTransform<Derived>::TransformBuiltinType(TypeLocBuilder &TLB,
4437                                                       BuiltinTypeLoc T) {
4438   BuiltinTypeLoc NewT = TLB.push<BuiltinTypeLoc>(T.getType());
4439   NewT.setBuiltinLoc(T.getBuiltinLoc());
4440   if (T.needsExtraLocalData())
4441     NewT.getWrittenBuiltinSpecs() = T.getWrittenBuiltinSpecs();
4442   return T.getType();
4443 }
4444 
4445 template<typename Derived>
4446 QualType TreeTransform<Derived>::TransformComplexType(TypeLocBuilder &TLB,
4447                                                       ComplexTypeLoc T) {
4448   // FIXME: recurse?
4449   return TransformTypeSpecType(TLB, T);
4450 }
4451 
4452 template <typename Derived>
4453 QualType TreeTransform<Derived>::TransformAdjustedType(TypeLocBuilder &TLB,
4454                                                        AdjustedTypeLoc TL) {
4455   // Adjustments applied during transformation are handled elsewhere.
4456   return getDerived().TransformType(TLB, TL.getOriginalLoc());
4457 }
4458 
4459 template<typename Derived>
4460 QualType TreeTransform<Derived>::TransformDecayedType(TypeLocBuilder &TLB,
4461                                                       DecayedTypeLoc TL) {
4462   QualType OriginalType = getDerived().TransformType(TLB, TL.getOriginalLoc());
4463   if (OriginalType.isNull())
4464     return QualType();
4465 
4466   QualType Result = TL.getType();
4467   if (getDerived().AlwaysRebuild() ||
4468       OriginalType != TL.getOriginalLoc().getType())
4469     Result = SemaRef.Context.getDecayedType(OriginalType);
4470   TLB.push<DecayedTypeLoc>(Result);
4471   // Nothing to set for DecayedTypeLoc.
4472   return Result;
4473 }
4474 
4475 template<typename Derived>
4476 QualType TreeTransform<Derived>::TransformPointerType(TypeLocBuilder &TLB,
4477                                                       PointerTypeLoc TL) {
4478   QualType PointeeType
4479     = getDerived().TransformType(TLB, TL.getPointeeLoc());
4480   if (PointeeType.isNull())
4481     return QualType();
4482 
4483   QualType Result = TL.getType();
4484   if (PointeeType->getAs<ObjCObjectType>()) {
4485     // A dependent pointer type 'T *' has is being transformed such
4486     // that an Objective-C class type is being replaced for 'T'. The
4487     // resulting pointer type is an ObjCObjectPointerType, not a
4488     // PointerType.
4489     Result = SemaRef.Context.getObjCObjectPointerType(PointeeType);
4490 
4491     ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result);
4492     NewT.setStarLoc(TL.getStarLoc());
4493     return Result;
4494   }
4495 
4496   if (getDerived().AlwaysRebuild() ||
4497       PointeeType != TL.getPointeeLoc().getType()) {
4498     Result = getDerived().RebuildPointerType(PointeeType, TL.getSigilLoc());
4499     if (Result.isNull())
4500       return QualType();
4501   }
4502 
4503   // Objective-C ARC can add lifetime qualifiers to the type that we're
4504   // pointing to.
4505   TLB.TypeWasModifiedSafely(Result->getPointeeType());
4506 
4507   PointerTypeLoc NewT = TLB.push<PointerTypeLoc>(Result);
4508   NewT.setSigilLoc(TL.getSigilLoc());
4509   return Result;
4510 }
4511 
4512 template<typename Derived>
4513 QualType
4514 TreeTransform<Derived>::TransformBlockPointerType(TypeLocBuilder &TLB,
4515                                                   BlockPointerTypeLoc TL) {
4516   QualType PointeeType
4517     = getDerived().TransformType(TLB, TL.getPointeeLoc());
4518   if (PointeeType.isNull())
4519     return QualType();
4520 
4521   QualType Result = TL.getType();
4522   if (getDerived().AlwaysRebuild() ||
4523       PointeeType != TL.getPointeeLoc().getType()) {
4524     Result = getDerived().RebuildBlockPointerType(PointeeType,
4525                                                   TL.getSigilLoc());
4526     if (Result.isNull())
4527       return QualType();
4528   }
4529 
4530   BlockPointerTypeLoc NewT = TLB.push<BlockPointerTypeLoc>(Result);
4531   NewT.setSigilLoc(TL.getSigilLoc());
4532   return Result;
4533 }
4534 
4535 /// Transforms a reference type.  Note that somewhat paradoxically we
4536 /// don't care whether the type itself is an l-value type or an r-value
4537 /// type;  we only care if the type was *written* as an l-value type
4538 /// or an r-value type.
4539 template<typename Derived>
4540 QualType
4541 TreeTransform<Derived>::TransformReferenceType(TypeLocBuilder &TLB,
4542                                                ReferenceTypeLoc TL) {
4543   const ReferenceType *T = TL.getTypePtr();
4544 
4545   // Note that this works with the pointee-as-written.
4546   QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
4547   if (PointeeType.isNull())
4548     return QualType();
4549 
4550   QualType Result = TL.getType();
4551   if (getDerived().AlwaysRebuild() ||
4552       PointeeType != T->getPointeeTypeAsWritten()) {
4553     Result = getDerived().RebuildReferenceType(PointeeType,
4554                                                T->isSpelledAsLValue(),
4555                                                TL.getSigilLoc());
4556     if (Result.isNull())
4557       return QualType();
4558   }
4559 
4560   // Objective-C ARC can add lifetime qualifiers to the type that we're
4561   // referring to.
4562   TLB.TypeWasModifiedSafely(
4563                      Result->getAs<ReferenceType>()->getPointeeTypeAsWritten());
4564 
4565   // r-value references can be rebuilt as l-value references.
4566   ReferenceTypeLoc NewTL;
4567   if (isa<LValueReferenceType>(Result))
4568     NewTL = TLB.push<LValueReferenceTypeLoc>(Result);
4569   else
4570     NewTL = TLB.push<RValueReferenceTypeLoc>(Result);
4571   NewTL.setSigilLoc(TL.getSigilLoc());
4572 
4573   return Result;
4574 }
4575 
4576 template<typename Derived>
4577 QualType
4578 TreeTransform<Derived>::TransformLValueReferenceType(TypeLocBuilder &TLB,
4579                                                  LValueReferenceTypeLoc TL) {
4580   return TransformReferenceType(TLB, TL);
4581 }
4582 
4583 template<typename Derived>
4584 QualType
4585 TreeTransform<Derived>::TransformRValueReferenceType(TypeLocBuilder &TLB,
4586                                                  RValueReferenceTypeLoc TL) {
4587   return TransformReferenceType(TLB, TL);
4588 }
4589 
4590 template<typename Derived>
4591 QualType
4592 TreeTransform<Derived>::TransformMemberPointerType(TypeLocBuilder &TLB,
4593                                                    MemberPointerTypeLoc TL) {
4594   QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
4595   if (PointeeType.isNull())
4596     return QualType();
4597 
4598   TypeSourceInfo* OldClsTInfo = TL.getClassTInfo();
4599   TypeSourceInfo *NewClsTInfo = nullptr;
4600   if (OldClsTInfo) {
4601     NewClsTInfo = getDerived().TransformType(OldClsTInfo);
4602     if (!NewClsTInfo)
4603       return QualType();
4604   }
4605 
4606   const MemberPointerType *T = TL.getTypePtr();
4607   QualType OldClsType = QualType(T->getClass(), 0);
4608   QualType NewClsType;
4609   if (NewClsTInfo)
4610     NewClsType = NewClsTInfo->getType();
4611   else {
4612     NewClsType = getDerived().TransformType(OldClsType);
4613     if (NewClsType.isNull())
4614       return QualType();
4615   }
4616 
4617   QualType Result = TL.getType();
4618   if (getDerived().AlwaysRebuild() ||
4619       PointeeType != T->getPointeeType() ||
4620       NewClsType != OldClsType) {
4621     Result = getDerived().RebuildMemberPointerType(PointeeType, NewClsType,
4622                                                    TL.getStarLoc());
4623     if (Result.isNull())
4624       return QualType();
4625   }
4626 
4627   // If we had to adjust the pointee type when building a member pointer, make
4628   // sure to push TypeLoc info for it.
4629   const MemberPointerType *MPT = Result->getAs<MemberPointerType>();
4630   if (MPT && PointeeType != MPT->getPointeeType()) {
4631     assert(isa<AdjustedType>(MPT->getPointeeType()));
4632     TLB.push<AdjustedTypeLoc>(MPT->getPointeeType());
4633   }
4634 
4635   MemberPointerTypeLoc NewTL = TLB.push<MemberPointerTypeLoc>(Result);
4636   NewTL.setSigilLoc(TL.getSigilLoc());
4637   NewTL.setClassTInfo(NewClsTInfo);
4638 
4639   return Result;
4640 }
4641 
4642 template<typename Derived>
4643 QualType
4644 TreeTransform<Derived>::TransformConstantArrayType(TypeLocBuilder &TLB,
4645                                                    ConstantArrayTypeLoc TL) {
4646   const ConstantArrayType *T = TL.getTypePtr();
4647   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
4648   if (ElementType.isNull())
4649     return QualType();
4650 
4651   QualType Result = TL.getType();
4652   if (getDerived().AlwaysRebuild() ||
4653       ElementType != T->getElementType()) {
4654     Result = getDerived().RebuildConstantArrayType(ElementType,
4655                                                    T->getSizeModifier(),
4656                                                    T->getSize(),
4657                                              T->getIndexTypeCVRQualifiers(),
4658                                                    TL.getBracketsRange());
4659     if (Result.isNull())
4660       return QualType();
4661   }
4662 
4663   // We might have either a ConstantArrayType or a VariableArrayType now:
4664   // a ConstantArrayType is allowed to have an element type which is a
4665   // VariableArrayType if the type is dependent.  Fortunately, all array
4666   // types have the same location layout.
4667   ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result);
4668   NewTL.setLBracketLoc(TL.getLBracketLoc());
4669   NewTL.setRBracketLoc(TL.getRBracketLoc());
4670 
4671   Expr *Size = TL.getSizeExpr();
4672   if (Size) {
4673     EnterExpressionEvaluationContext Unevaluated(
4674         SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
4675     Size = getDerived().TransformExpr(Size).template getAs<Expr>();
4676     Size = SemaRef.ActOnConstantExpression(Size).get();
4677   }
4678   NewTL.setSizeExpr(Size);
4679 
4680   return Result;
4681 }
4682 
4683 template<typename Derived>
4684 QualType TreeTransform<Derived>::TransformIncompleteArrayType(
4685                                               TypeLocBuilder &TLB,
4686                                               IncompleteArrayTypeLoc TL) {
4687   const IncompleteArrayType *T = TL.getTypePtr();
4688   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
4689   if (ElementType.isNull())
4690     return QualType();
4691 
4692   QualType Result = TL.getType();
4693   if (getDerived().AlwaysRebuild() ||
4694       ElementType != T->getElementType()) {
4695     Result = getDerived().RebuildIncompleteArrayType(ElementType,
4696                                                      T->getSizeModifier(),
4697                                            T->getIndexTypeCVRQualifiers(),
4698                                                      TL.getBracketsRange());
4699     if (Result.isNull())
4700       return QualType();
4701   }
4702 
4703   IncompleteArrayTypeLoc NewTL = TLB.push<IncompleteArrayTypeLoc>(Result);
4704   NewTL.setLBracketLoc(TL.getLBracketLoc());
4705   NewTL.setRBracketLoc(TL.getRBracketLoc());
4706   NewTL.setSizeExpr(nullptr);
4707 
4708   return Result;
4709 }
4710 
4711 template<typename Derived>
4712 QualType
4713 TreeTransform<Derived>::TransformVariableArrayType(TypeLocBuilder &TLB,
4714                                                    VariableArrayTypeLoc TL) {
4715   const VariableArrayType *T = TL.getTypePtr();
4716   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
4717   if (ElementType.isNull())
4718     return QualType();
4719 
4720   ExprResult SizeResult;
4721   {
4722     EnterExpressionEvaluationContext Context(
4723         SemaRef, Sema::ExpressionEvaluationContext::PotentiallyEvaluated);
4724     SizeResult = getDerived().TransformExpr(T->getSizeExpr());
4725   }
4726   if (SizeResult.isInvalid())
4727     return QualType();
4728   SizeResult =
4729       SemaRef.ActOnFinishFullExpr(SizeResult.get(), /*DiscardedValue*/ false);
4730   if (SizeResult.isInvalid())
4731     return QualType();
4732 
4733   Expr *Size = SizeResult.get();
4734 
4735   QualType Result = TL.getType();
4736   if (getDerived().AlwaysRebuild() ||
4737       ElementType != T->getElementType() ||
4738       Size != T->getSizeExpr()) {
4739     Result = getDerived().RebuildVariableArrayType(ElementType,
4740                                                    T->getSizeModifier(),
4741                                                    Size,
4742                                              T->getIndexTypeCVRQualifiers(),
4743                                                    TL.getBracketsRange());
4744     if (Result.isNull())
4745       return QualType();
4746   }
4747 
4748   // We might have constant size array now, but fortunately it has the same
4749   // location layout.
4750   ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result);
4751   NewTL.setLBracketLoc(TL.getLBracketLoc());
4752   NewTL.setRBracketLoc(TL.getRBracketLoc());
4753   NewTL.setSizeExpr(Size);
4754 
4755   return Result;
4756 }
4757 
4758 template<typename Derived>
4759 QualType
4760 TreeTransform<Derived>::TransformDependentSizedArrayType(TypeLocBuilder &TLB,
4761                                              DependentSizedArrayTypeLoc TL) {
4762   const DependentSizedArrayType *T = TL.getTypePtr();
4763   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
4764   if (ElementType.isNull())
4765     return QualType();
4766 
4767   // Array bounds are constant expressions.
4768   EnterExpressionEvaluationContext Unevaluated(
4769       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
4770 
4771   // Prefer the expression from the TypeLoc;  the other may have been uniqued.
4772   Expr *origSize = TL.getSizeExpr();
4773   if (!origSize) origSize = T->getSizeExpr();
4774 
4775   ExprResult sizeResult
4776     = getDerived().TransformExpr(origSize);
4777   sizeResult = SemaRef.ActOnConstantExpression(sizeResult);
4778   if (sizeResult.isInvalid())
4779     return QualType();
4780 
4781   Expr *size = sizeResult.get();
4782 
4783   QualType Result = TL.getType();
4784   if (getDerived().AlwaysRebuild() ||
4785       ElementType != T->getElementType() ||
4786       size != origSize) {
4787     Result = getDerived().RebuildDependentSizedArrayType(ElementType,
4788                                                          T->getSizeModifier(),
4789                                                          size,
4790                                                 T->getIndexTypeCVRQualifiers(),
4791                                                         TL.getBracketsRange());
4792     if (Result.isNull())
4793       return QualType();
4794   }
4795 
4796   // We might have any sort of array type now, but fortunately they
4797   // all have the same location layout.
4798   ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result);
4799   NewTL.setLBracketLoc(TL.getLBracketLoc());
4800   NewTL.setRBracketLoc(TL.getRBracketLoc());
4801   NewTL.setSizeExpr(size);
4802 
4803   return Result;
4804 }
4805 
4806 template <typename Derived>
4807 QualType TreeTransform<Derived>::TransformDependentVectorType(
4808     TypeLocBuilder &TLB, DependentVectorTypeLoc TL) {
4809   const DependentVectorType *T = TL.getTypePtr();
4810   QualType ElementType = getDerived().TransformType(T->getElementType());
4811   if (ElementType.isNull())
4812     return QualType();
4813 
4814   EnterExpressionEvaluationContext Unevaluated(
4815       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
4816 
4817   ExprResult Size = getDerived().TransformExpr(T->getSizeExpr());
4818   Size = SemaRef.ActOnConstantExpression(Size);
4819   if (Size.isInvalid())
4820     return QualType();
4821 
4822   QualType Result = TL.getType();
4823   if (getDerived().AlwaysRebuild() || ElementType != T->getElementType() ||
4824       Size.get() != T->getSizeExpr()) {
4825     Result = getDerived().RebuildDependentVectorType(
4826         ElementType, Size.get(), T->getAttributeLoc(), T->getVectorKind());
4827     if (Result.isNull())
4828       return QualType();
4829   }
4830 
4831   // Result might be dependent or not.
4832   if (isa<DependentVectorType>(Result)) {
4833     DependentVectorTypeLoc NewTL =
4834         TLB.push<DependentVectorTypeLoc>(Result);
4835     NewTL.setNameLoc(TL.getNameLoc());
4836   } else {
4837     VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result);
4838     NewTL.setNameLoc(TL.getNameLoc());
4839   }
4840 
4841   return Result;
4842 }
4843 
4844 template<typename Derived>
4845 QualType TreeTransform<Derived>::TransformDependentSizedExtVectorType(
4846                                       TypeLocBuilder &TLB,
4847                                       DependentSizedExtVectorTypeLoc TL) {
4848   const DependentSizedExtVectorType *T = TL.getTypePtr();
4849 
4850   // FIXME: ext vector locs should be nested
4851   QualType ElementType = getDerived().TransformType(T->getElementType());
4852   if (ElementType.isNull())
4853     return QualType();
4854 
4855   // Vector sizes are constant expressions.
4856   EnterExpressionEvaluationContext Unevaluated(
4857       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
4858 
4859   ExprResult Size = getDerived().TransformExpr(T->getSizeExpr());
4860   Size = SemaRef.ActOnConstantExpression(Size);
4861   if (Size.isInvalid())
4862     return QualType();
4863 
4864   QualType Result = TL.getType();
4865   if (getDerived().AlwaysRebuild() ||
4866       ElementType != T->getElementType() ||
4867       Size.get() != T->getSizeExpr()) {
4868     Result = getDerived().RebuildDependentSizedExtVectorType(ElementType,
4869                                                              Size.get(),
4870                                                          T->getAttributeLoc());
4871     if (Result.isNull())
4872       return QualType();
4873   }
4874 
4875   // Result might be dependent or not.
4876   if (isa<DependentSizedExtVectorType>(Result)) {
4877     DependentSizedExtVectorTypeLoc NewTL
4878       = TLB.push<DependentSizedExtVectorTypeLoc>(Result);
4879     NewTL.setNameLoc(TL.getNameLoc());
4880   } else {
4881     ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result);
4882     NewTL.setNameLoc(TL.getNameLoc());
4883   }
4884 
4885   return Result;
4886 }
4887 
4888 template <typename Derived>
4889 QualType TreeTransform<Derived>::TransformDependentAddressSpaceType(
4890     TypeLocBuilder &TLB, DependentAddressSpaceTypeLoc TL) {
4891   const DependentAddressSpaceType *T = TL.getTypePtr();
4892 
4893   QualType pointeeType = getDerived().TransformType(T->getPointeeType());
4894 
4895   if (pointeeType.isNull())
4896     return QualType();
4897 
4898   // Address spaces are constant expressions.
4899   EnterExpressionEvaluationContext Unevaluated(
4900       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
4901 
4902   ExprResult AddrSpace = getDerived().TransformExpr(T->getAddrSpaceExpr());
4903   AddrSpace = SemaRef.ActOnConstantExpression(AddrSpace);
4904   if (AddrSpace.isInvalid())
4905     return QualType();
4906 
4907   QualType Result = TL.getType();
4908   if (getDerived().AlwaysRebuild() || pointeeType != T->getPointeeType() ||
4909       AddrSpace.get() != T->getAddrSpaceExpr()) {
4910     Result = getDerived().RebuildDependentAddressSpaceType(
4911         pointeeType, AddrSpace.get(), T->getAttributeLoc());
4912     if (Result.isNull())
4913       return QualType();
4914   }
4915 
4916   // Result might be dependent or not.
4917   if (isa<DependentAddressSpaceType>(Result)) {
4918     DependentAddressSpaceTypeLoc NewTL =
4919         TLB.push<DependentAddressSpaceTypeLoc>(Result);
4920 
4921     NewTL.setAttrOperandParensRange(TL.getAttrOperandParensRange());
4922     NewTL.setAttrExprOperand(TL.getAttrExprOperand());
4923     NewTL.setAttrNameLoc(TL.getAttrNameLoc());
4924 
4925   } else {
4926     TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(
4927         Result, getDerived().getBaseLocation());
4928     TransformType(TLB, DI->getTypeLoc());
4929   }
4930 
4931   return Result;
4932 }
4933 
4934 template <typename Derived>
4935 QualType TreeTransform<Derived>::TransformVectorType(TypeLocBuilder &TLB,
4936                                                      VectorTypeLoc TL) {
4937   const VectorType *T = TL.getTypePtr();
4938   QualType ElementType = getDerived().TransformType(T->getElementType());
4939   if (ElementType.isNull())
4940     return QualType();
4941 
4942   QualType Result = TL.getType();
4943   if (getDerived().AlwaysRebuild() ||
4944       ElementType != T->getElementType()) {
4945     Result = getDerived().RebuildVectorType(ElementType, T->getNumElements(),
4946                                             T->getVectorKind());
4947     if (Result.isNull())
4948       return QualType();
4949   }
4950 
4951   VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result);
4952   NewTL.setNameLoc(TL.getNameLoc());
4953 
4954   return Result;
4955 }
4956 
4957 template<typename Derived>
4958 QualType TreeTransform<Derived>::TransformExtVectorType(TypeLocBuilder &TLB,
4959                                                         ExtVectorTypeLoc TL) {
4960   const VectorType *T = TL.getTypePtr();
4961   QualType ElementType = getDerived().TransformType(T->getElementType());
4962   if (ElementType.isNull())
4963     return QualType();
4964 
4965   QualType Result = TL.getType();
4966   if (getDerived().AlwaysRebuild() ||
4967       ElementType != T->getElementType()) {
4968     Result = getDerived().RebuildExtVectorType(ElementType,
4969                                                T->getNumElements(),
4970                                                /*FIXME*/ SourceLocation());
4971     if (Result.isNull())
4972       return QualType();
4973   }
4974 
4975   ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result);
4976   NewTL.setNameLoc(TL.getNameLoc());
4977 
4978   return Result;
4979 }
4980 
4981 template <typename Derived>
4982 ParmVarDecl *TreeTransform<Derived>::TransformFunctionTypeParam(
4983     ParmVarDecl *OldParm, int indexAdjustment, Optional<unsigned> NumExpansions,
4984     bool ExpectParameterPack) {
4985   TypeSourceInfo *OldDI = OldParm->getTypeSourceInfo();
4986   TypeSourceInfo *NewDI = nullptr;
4987 
4988   if (NumExpansions && isa<PackExpansionType>(OldDI->getType())) {
4989     // If we're substituting into a pack expansion type and we know the
4990     // length we want to expand to, just substitute for the pattern.
4991     TypeLoc OldTL = OldDI->getTypeLoc();
4992     PackExpansionTypeLoc OldExpansionTL = OldTL.castAs<PackExpansionTypeLoc>();
4993 
4994     TypeLocBuilder TLB;
4995     TypeLoc NewTL = OldDI->getTypeLoc();
4996     TLB.reserve(NewTL.getFullDataSize());
4997 
4998     QualType Result = getDerived().TransformType(TLB,
4999                                                OldExpansionTL.getPatternLoc());
5000     if (Result.isNull())
5001       return nullptr;
5002 
5003     Result = RebuildPackExpansionType(Result,
5004                                 OldExpansionTL.getPatternLoc().getSourceRange(),
5005                                       OldExpansionTL.getEllipsisLoc(),
5006                                       NumExpansions);
5007     if (Result.isNull())
5008       return nullptr;
5009 
5010     PackExpansionTypeLoc NewExpansionTL
5011       = TLB.push<PackExpansionTypeLoc>(Result);
5012     NewExpansionTL.setEllipsisLoc(OldExpansionTL.getEllipsisLoc());
5013     NewDI = TLB.getTypeSourceInfo(SemaRef.Context, Result);
5014   } else
5015     NewDI = getDerived().TransformType(OldDI);
5016   if (!NewDI)
5017     return nullptr;
5018 
5019   if (NewDI == OldDI && indexAdjustment == 0)
5020     return OldParm;
5021 
5022   ParmVarDecl *newParm = ParmVarDecl::Create(SemaRef.Context,
5023                                              OldParm->getDeclContext(),
5024                                              OldParm->getInnerLocStart(),
5025                                              OldParm->getLocation(),
5026                                              OldParm->getIdentifier(),
5027                                              NewDI->getType(),
5028                                              NewDI,
5029                                              OldParm->getStorageClass(),
5030                                              /* DefArg */ nullptr);
5031   newParm->setScopeInfo(OldParm->getFunctionScopeDepth(),
5032                         OldParm->getFunctionScopeIndex() + indexAdjustment);
5033   return newParm;
5034 }
5035 
5036 template <typename Derived>
5037 bool TreeTransform<Derived>::TransformFunctionTypeParams(
5038     SourceLocation Loc, ArrayRef<ParmVarDecl *> Params,
5039     const QualType *ParamTypes,
5040     const FunctionProtoType::ExtParameterInfo *ParamInfos,
5041     SmallVectorImpl<QualType> &OutParamTypes,
5042     SmallVectorImpl<ParmVarDecl *> *PVars,
5043     Sema::ExtParameterInfoBuilder &PInfos) {
5044   int indexAdjustment = 0;
5045 
5046   unsigned NumParams = Params.size();
5047   for (unsigned i = 0; i != NumParams; ++i) {
5048     if (ParmVarDecl *OldParm = Params[i]) {
5049       assert(OldParm->getFunctionScopeIndex() == i);
5050 
5051       Optional<unsigned> NumExpansions;
5052       ParmVarDecl *NewParm = nullptr;
5053       if (OldParm->isParameterPack()) {
5054         // We have a function parameter pack that may need to be expanded.
5055         SmallVector<UnexpandedParameterPack, 2> Unexpanded;
5056 
5057         // Find the parameter packs that could be expanded.
5058         TypeLoc TL = OldParm->getTypeSourceInfo()->getTypeLoc();
5059         PackExpansionTypeLoc ExpansionTL = TL.castAs<PackExpansionTypeLoc>();
5060         TypeLoc Pattern = ExpansionTL.getPatternLoc();
5061         SemaRef.collectUnexpandedParameterPacks(Pattern, Unexpanded);
5062         assert(Unexpanded.size() > 0 && "Could not find parameter packs!");
5063 
5064         // Determine whether we should expand the parameter packs.
5065         bool ShouldExpand = false;
5066         bool RetainExpansion = false;
5067         Optional<unsigned> OrigNumExpansions =
5068             ExpansionTL.getTypePtr()->getNumExpansions();
5069         NumExpansions = OrigNumExpansions;
5070         if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(),
5071                                                  Pattern.getSourceRange(),
5072                                                  Unexpanded,
5073                                                  ShouldExpand,
5074                                                  RetainExpansion,
5075                                                  NumExpansions)) {
5076           return true;
5077         }
5078 
5079         if (ShouldExpand) {
5080           // Expand the function parameter pack into multiple, separate
5081           // parameters.
5082           getDerived().ExpandingFunctionParameterPack(OldParm);
5083           for (unsigned I = 0; I != *NumExpansions; ++I) {
5084             Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
5085             ParmVarDecl *NewParm
5086               = getDerived().TransformFunctionTypeParam(OldParm,
5087                                                         indexAdjustment++,
5088                                                         OrigNumExpansions,
5089                                                 /*ExpectParameterPack=*/false);
5090             if (!NewParm)
5091               return true;
5092 
5093             if (ParamInfos)
5094               PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5095             OutParamTypes.push_back(NewParm->getType());
5096             if (PVars)
5097               PVars->push_back(NewParm);
5098           }
5099 
5100           // If we're supposed to retain a pack expansion, do so by temporarily
5101           // forgetting the partially-substituted parameter pack.
5102           if (RetainExpansion) {
5103             ForgetPartiallySubstitutedPackRAII Forget(getDerived());
5104             ParmVarDecl *NewParm
5105               = getDerived().TransformFunctionTypeParam(OldParm,
5106                                                         indexAdjustment++,
5107                                                         OrigNumExpansions,
5108                                                 /*ExpectParameterPack=*/false);
5109             if (!NewParm)
5110               return true;
5111 
5112             if (ParamInfos)
5113               PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5114             OutParamTypes.push_back(NewParm->getType());
5115             if (PVars)
5116               PVars->push_back(NewParm);
5117           }
5118 
5119           // The next parameter should have the same adjustment as the
5120           // last thing we pushed, but we post-incremented indexAdjustment
5121           // on every push.  Also, if we push nothing, the adjustment should
5122           // go down by one.
5123           indexAdjustment--;
5124 
5125           // We're done with the pack expansion.
5126           continue;
5127         }
5128 
5129         // We'll substitute the parameter now without expanding the pack
5130         // expansion.
5131         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
5132         NewParm = getDerived().TransformFunctionTypeParam(OldParm,
5133                                                           indexAdjustment,
5134                                                           NumExpansions,
5135                                                   /*ExpectParameterPack=*/true);
5136       } else {
5137         NewParm = getDerived().TransformFunctionTypeParam(
5138             OldParm, indexAdjustment, None, /*ExpectParameterPack=*/ false);
5139       }
5140 
5141       if (!NewParm)
5142         return true;
5143 
5144       if (ParamInfos)
5145         PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5146       OutParamTypes.push_back(NewParm->getType());
5147       if (PVars)
5148         PVars->push_back(NewParm);
5149       continue;
5150     }
5151 
5152     // Deal with the possibility that we don't have a parameter
5153     // declaration for this parameter.
5154     QualType OldType = ParamTypes[i];
5155     bool IsPackExpansion = false;
5156     Optional<unsigned> NumExpansions;
5157     QualType NewType;
5158     if (const PackExpansionType *Expansion
5159                                        = dyn_cast<PackExpansionType>(OldType)) {
5160       // We have a function parameter pack that may need to be expanded.
5161       QualType Pattern = Expansion->getPattern();
5162       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
5163       getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
5164 
5165       // Determine whether we should expand the parameter packs.
5166       bool ShouldExpand = false;
5167       bool RetainExpansion = false;
5168       if (getDerived().TryExpandParameterPacks(Loc, SourceRange(),
5169                                                Unexpanded,
5170                                                ShouldExpand,
5171                                                RetainExpansion,
5172                                                NumExpansions)) {
5173         return true;
5174       }
5175 
5176       if (ShouldExpand) {
5177         // Expand the function parameter pack into multiple, separate
5178         // parameters.
5179         for (unsigned I = 0; I != *NumExpansions; ++I) {
5180           Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
5181           QualType NewType = getDerived().TransformType(Pattern);
5182           if (NewType.isNull())
5183             return true;
5184 
5185           if (NewType->containsUnexpandedParameterPack()) {
5186             NewType =
5187                 getSema().getASTContext().getPackExpansionType(NewType, None);
5188 
5189             if (NewType.isNull())
5190               return true;
5191           }
5192 
5193           if (ParamInfos)
5194             PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5195           OutParamTypes.push_back(NewType);
5196           if (PVars)
5197             PVars->push_back(nullptr);
5198         }
5199 
5200         // We're done with the pack expansion.
5201         continue;
5202       }
5203 
5204       // If we're supposed to retain a pack expansion, do so by temporarily
5205       // forgetting the partially-substituted parameter pack.
5206       if (RetainExpansion) {
5207         ForgetPartiallySubstitutedPackRAII Forget(getDerived());
5208         QualType NewType = getDerived().TransformType(Pattern);
5209         if (NewType.isNull())
5210           return true;
5211 
5212         if (ParamInfos)
5213           PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5214         OutParamTypes.push_back(NewType);
5215         if (PVars)
5216           PVars->push_back(nullptr);
5217       }
5218 
5219       // We'll substitute the parameter now without expanding the pack
5220       // expansion.
5221       OldType = Expansion->getPattern();
5222       IsPackExpansion = true;
5223       Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
5224       NewType = getDerived().TransformType(OldType);
5225     } else {
5226       NewType = getDerived().TransformType(OldType);
5227     }
5228 
5229     if (NewType.isNull())
5230       return true;
5231 
5232     if (IsPackExpansion)
5233       NewType = getSema().Context.getPackExpansionType(NewType,
5234                                                        NumExpansions);
5235 
5236     if (ParamInfos)
5237       PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5238     OutParamTypes.push_back(NewType);
5239     if (PVars)
5240       PVars->push_back(nullptr);
5241   }
5242 
5243 #ifndef NDEBUG
5244   if (PVars) {
5245     for (unsigned i = 0, e = PVars->size(); i != e; ++i)
5246       if (ParmVarDecl *parm = (*PVars)[i])
5247         assert(parm->getFunctionScopeIndex() == i);
5248   }
5249 #endif
5250 
5251   return false;
5252 }
5253 
5254 template<typename Derived>
5255 QualType
5256 TreeTransform<Derived>::TransformFunctionProtoType(TypeLocBuilder &TLB,
5257                                                    FunctionProtoTypeLoc TL) {
5258   SmallVector<QualType, 4> ExceptionStorage;
5259   TreeTransform *This = this; // Work around gcc.gnu.org/PR56135.
5260   return getDerived().TransformFunctionProtoType(
5261       TLB, TL, nullptr, Qualifiers(),
5262       [&](FunctionProtoType::ExceptionSpecInfo &ESI, bool &Changed) {
5263         return This->TransformExceptionSpec(TL.getBeginLoc(), ESI,
5264                                             ExceptionStorage, Changed);
5265       });
5266 }
5267 
5268 template<typename Derived> template<typename Fn>
5269 QualType TreeTransform<Derived>::TransformFunctionProtoType(
5270     TypeLocBuilder &TLB, FunctionProtoTypeLoc TL, CXXRecordDecl *ThisContext,
5271     Qualifiers ThisTypeQuals, Fn TransformExceptionSpec) {
5272 
5273   // Transform the parameters and return type.
5274   //
5275   // We are required to instantiate the params and return type in source order.
5276   // When the function has a trailing return type, we instantiate the
5277   // parameters before the return type,  since the return type can then refer
5278   // to the parameters themselves (via decltype, sizeof, etc.).
5279   //
5280   SmallVector<QualType, 4> ParamTypes;
5281   SmallVector<ParmVarDecl*, 4> ParamDecls;
5282   Sema::ExtParameterInfoBuilder ExtParamInfos;
5283   const FunctionProtoType *T = TL.getTypePtr();
5284 
5285   QualType ResultType;
5286 
5287   if (T->hasTrailingReturn()) {
5288     if (getDerived().TransformFunctionTypeParams(
5289             TL.getBeginLoc(), TL.getParams(),
5290             TL.getTypePtr()->param_type_begin(),
5291             T->getExtParameterInfosOrNull(),
5292             ParamTypes, &ParamDecls, ExtParamInfos))
5293       return QualType();
5294 
5295     {
5296       // C++11 [expr.prim.general]p3:
5297       //   If a declaration declares a member function or member function
5298       //   template of a class X, the expression this is a prvalue of type
5299       //   "pointer to cv-qualifier-seq X" between the optional cv-qualifer-seq
5300       //   and the end of the function-definition, member-declarator, or
5301       //   declarator.
5302       Sema::CXXThisScopeRAII ThisScope(SemaRef, ThisContext, ThisTypeQuals);
5303 
5304       ResultType = getDerived().TransformType(TLB, TL.getReturnLoc());
5305       if (ResultType.isNull())
5306         return QualType();
5307     }
5308   }
5309   else {
5310     ResultType = getDerived().TransformType(TLB, TL.getReturnLoc());
5311     if (ResultType.isNull())
5312       return QualType();
5313 
5314     // Return type can not be qualified with an address space.
5315     if (ResultType.getAddressSpace() != LangAS::Default) {
5316       SemaRef.Diag(TL.getReturnLoc().getBeginLoc(),
5317                    diag::err_attribute_address_function_type);
5318       return QualType();
5319     }
5320 
5321     if (getDerived().TransformFunctionTypeParams(
5322             TL.getBeginLoc(), TL.getParams(),
5323             TL.getTypePtr()->param_type_begin(),
5324             T->getExtParameterInfosOrNull(),
5325             ParamTypes, &ParamDecls, ExtParamInfos))
5326       return QualType();
5327   }
5328 
5329   FunctionProtoType::ExtProtoInfo EPI = T->getExtProtoInfo();
5330 
5331   bool EPIChanged = false;
5332   if (TransformExceptionSpec(EPI.ExceptionSpec, EPIChanged))
5333     return QualType();
5334 
5335   // Handle extended parameter information.
5336   if (auto NewExtParamInfos =
5337         ExtParamInfos.getPointerOrNull(ParamTypes.size())) {
5338     if (!EPI.ExtParameterInfos ||
5339         llvm::makeArrayRef(EPI.ExtParameterInfos, TL.getNumParams())
5340           != llvm::makeArrayRef(NewExtParamInfos, ParamTypes.size())) {
5341       EPIChanged = true;
5342     }
5343     EPI.ExtParameterInfos = NewExtParamInfos;
5344   } else if (EPI.ExtParameterInfos) {
5345     EPIChanged = true;
5346     EPI.ExtParameterInfos = nullptr;
5347   }
5348 
5349   QualType Result = TL.getType();
5350   if (getDerived().AlwaysRebuild() || ResultType != T->getReturnType() ||
5351       T->getParamTypes() != llvm::makeArrayRef(ParamTypes) || EPIChanged) {
5352     Result = getDerived().RebuildFunctionProtoType(ResultType, ParamTypes, EPI);
5353     if (Result.isNull())
5354       return QualType();
5355   }
5356 
5357   FunctionProtoTypeLoc NewTL = TLB.push<FunctionProtoTypeLoc>(Result);
5358   NewTL.setLocalRangeBegin(TL.getLocalRangeBegin());
5359   NewTL.setLParenLoc(TL.getLParenLoc());
5360   NewTL.setRParenLoc(TL.getRParenLoc());
5361   NewTL.setExceptionSpecRange(TL.getExceptionSpecRange());
5362   NewTL.setLocalRangeEnd(TL.getLocalRangeEnd());
5363   for (unsigned i = 0, e = NewTL.getNumParams(); i != e; ++i)
5364     NewTL.setParam(i, ParamDecls[i]);
5365 
5366   return Result;
5367 }
5368 
5369 template<typename Derived>
5370 bool TreeTransform<Derived>::TransformExceptionSpec(
5371     SourceLocation Loc, FunctionProtoType::ExceptionSpecInfo &ESI,
5372     SmallVectorImpl<QualType> &Exceptions, bool &Changed) {
5373   assert(ESI.Type != EST_Uninstantiated && ESI.Type != EST_Unevaluated);
5374 
5375   // Instantiate a dynamic noexcept expression, if any.
5376   if (isComputedNoexcept(ESI.Type)) {
5377     EnterExpressionEvaluationContext Unevaluated(
5378         getSema(), Sema::ExpressionEvaluationContext::ConstantEvaluated);
5379     ExprResult NoexceptExpr = getDerived().TransformExpr(ESI.NoexceptExpr);
5380     if (NoexceptExpr.isInvalid())
5381       return true;
5382 
5383     ExceptionSpecificationType EST = ESI.Type;
5384     NoexceptExpr =
5385         getSema().ActOnNoexceptSpec(Loc, NoexceptExpr.get(), EST);
5386     if (NoexceptExpr.isInvalid())
5387       return true;
5388 
5389     if (ESI.NoexceptExpr != NoexceptExpr.get() || EST != ESI.Type)
5390       Changed = true;
5391     ESI.NoexceptExpr = NoexceptExpr.get();
5392     ESI.Type = EST;
5393   }
5394 
5395   if (ESI.Type != EST_Dynamic)
5396     return false;
5397 
5398   // Instantiate a dynamic exception specification's type.
5399   for (QualType T : ESI.Exceptions) {
5400     if (const PackExpansionType *PackExpansion =
5401             T->getAs<PackExpansionType>()) {
5402       Changed = true;
5403 
5404       // We have a pack expansion. Instantiate it.
5405       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
5406       SemaRef.collectUnexpandedParameterPacks(PackExpansion->getPattern(),
5407                                               Unexpanded);
5408       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
5409 
5410       // Determine whether the set of unexpanded parameter packs can and
5411       // should
5412       // be expanded.
5413       bool Expand = false;
5414       bool RetainExpansion = false;
5415       Optional<unsigned> NumExpansions = PackExpansion->getNumExpansions();
5416       // FIXME: Track the location of the ellipsis (and track source location
5417       // information for the types in the exception specification in general).
5418       if (getDerived().TryExpandParameterPacks(
5419               Loc, SourceRange(), Unexpanded, Expand,
5420               RetainExpansion, NumExpansions))
5421         return true;
5422 
5423       if (!Expand) {
5424         // We can't expand this pack expansion into separate arguments yet;
5425         // just substitute into the pattern and create a new pack expansion
5426         // type.
5427         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
5428         QualType U = getDerived().TransformType(PackExpansion->getPattern());
5429         if (U.isNull())
5430           return true;
5431 
5432         U = SemaRef.Context.getPackExpansionType(U, NumExpansions);
5433         Exceptions.push_back(U);
5434         continue;
5435       }
5436 
5437       // Substitute into the pack expansion pattern for each slice of the
5438       // pack.
5439       for (unsigned ArgIdx = 0; ArgIdx != *NumExpansions; ++ArgIdx) {
5440         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), ArgIdx);
5441 
5442         QualType U = getDerived().TransformType(PackExpansion->getPattern());
5443         if (U.isNull() || SemaRef.CheckSpecifiedExceptionType(U, Loc))
5444           return true;
5445 
5446         Exceptions.push_back(U);
5447       }
5448     } else {
5449       QualType U = getDerived().TransformType(T);
5450       if (U.isNull() || SemaRef.CheckSpecifiedExceptionType(U, Loc))
5451         return true;
5452       if (T != U)
5453         Changed = true;
5454 
5455       Exceptions.push_back(U);
5456     }
5457   }
5458 
5459   ESI.Exceptions = Exceptions;
5460   if (ESI.Exceptions.empty())
5461     ESI.Type = EST_DynamicNone;
5462   return false;
5463 }
5464 
5465 template<typename Derived>
5466 QualType TreeTransform<Derived>::TransformFunctionNoProtoType(
5467                                                  TypeLocBuilder &TLB,
5468                                                  FunctionNoProtoTypeLoc TL) {
5469   const FunctionNoProtoType *T = TL.getTypePtr();
5470   QualType ResultType = getDerived().TransformType(TLB, TL.getReturnLoc());
5471   if (ResultType.isNull())
5472     return QualType();
5473 
5474   QualType Result = TL.getType();
5475   if (getDerived().AlwaysRebuild() || ResultType != T->getReturnType())
5476     Result = getDerived().RebuildFunctionNoProtoType(ResultType);
5477 
5478   FunctionNoProtoTypeLoc NewTL = TLB.push<FunctionNoProtoTypeLoc>(Result);
5479   NewTL.setLocalRangeBegin(TL.getLocalRangeBegin());
5480   NewTL.setLParenLoc(TL.getLParenLoc());
5481   NewTL.setRParenLoc(TL.getRParenLoc());
5482   NewTL.setLocalRangeEnd(TL.getLocalRangeEnd());
5483 
5484   return Result;
5485 }
5486 
5487 template<typename Derived> QualType
5488 TreeTransform<Derived>::TransformUnresolvedUsingType(TypeLocBuilder &TLB,
5489                                                  UnresolvedUsingTypeLoc TL) {
5490   const UnresolvedUsingType *T = TL.getTypePtr();
5491   Decl *D = getDerived().TransformDecl(TL.getNameLoc(), T->getDecl());
5492   if (!D)
5493     return QualType();
5494 
5495   QualType Result = TL.getType();
5496   if (getDerived().AlwaysRebuild() || D != T->getDecl()) {
5497     Result = getDerived().RebuildUnresolvedUsingType(TL.getNameLoc(), D);
5498     if (Result.isNull())
5499       return QualType();
5500   }
5501 
5502   // We might get an arbitrary type spec type back.  We should at
5503   // least always get a type spec type, though.
5504   TypeSpecTypeLoc NewTL = TLB.pushTypeSpec(Result);
5505   NewTL.setNameLoc(TL.getNameLoc());
5506 
5507   return Result;
5508 }
5509 
5510 template<typename Derived>
5511 QualType TreeTransform<Derived>::TransformTypedefType(TypeLocBuilder &TLB,
5512                                                       TypedefTypeLoc TL) {
5513   const TypedefType *T = TL.getTypePtr();
5514   TypedefNameDecl *Typedef
5515     = cast_or_null<TypedefNameDecl>(getDerived().TransformDecl(TL.getNameLoc(),
5516                                                                T->getDecl()));
5517   if (!Typedef)
5518     return QualType();
5519 
5520   QualType Result = TL.getType();
5521   if (getDerived().AlwaysRebuild() ||
5522       Typedef != T->getDecl()) {
5523     Result = getDerived().RebuildTypedefType(Typedef);
5524     if (Result.isNull())
5525       return QualType();
5526   }
5527 
5528   TypedefTypeLoc NewTL = TLB.push<TypedefTypeLoc>(Result);
5529   NewTL.setNameLoc(TL.getNameLoc());
5530 
5531   return Result;
5532 }
5533 
5534 template<typename Derived>
5535 QualType TreeTransform<Derived>::TransformTypeOfExprType(TypeLocBuilder &TLB,
5536                                                       TypeOfExprTypeLoc TL) {
5537   // typeof expressions are not potentially evaluated contexts
5538   EnterExpressionEvaluationContext Unevaluated(
5539       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated,
5540       Sema::ReuseLambdaContextDecl);
5541 
5542   ExprResult E = getDerived().TransformExpr(TL.getUnderlyingExpr());
5543   if (E.isInvalid())
5544     return QualType();
5545 
5546   E = SemaRef.HandleExprEvaluationContextForTypeof(E.get());
5547   if (E.isInvalid())
5548     return QualType();
5549 
5550   QualType Result = TL.getType();
5551   if (getDerived().AlwaysRebuild() ||
5552       E.get() != TL.getUnderlyingExpr()) {
5553     Result = getDerived().RebuildTypeOfExprType(E.get(), TL.getTypeofLoc());
5554     if (Result.isNull())
5555       return QualType();
5556   }
5557   else E.get();
5558 
5559   TypeOfExprTypeLoc NewTL = TLB.push<TypeOfExprTypeLoc>(Result);
5560   NewTL.setTypeofLoc(TL.getTypeofLoc());
5561   NewTL.setLParenLoc(TL.getLParenLoc());
5562   NewTL.setRParenLoc(TL.getRParenLoc());
5563 
5564   return Result;
5565 }
5566 
5567 template<typename Derived>
5568 QualType TreeTransform<Derived>::TransformTypeOfType(TypeLocBuilder &TLB,
5569                                                      TypeOfTypeLoc TL) {
5570   TypeSourceInfo* Old_Under_TI = TL.getUnderlyingTInfo();
5571   TypeSourceInfo* New_Under_TI = getDerived().TransformType(Old_Under_TI);
5572   if (!New_Under_TI)
5573     return QualType();
5574 
5575   QualType Result = TL.getType();
5576   if (getDerived().AlwaysRebuild() || New_Under_TI != Old_Under_TI) {
5577     Result = getDerived().RebuildTypeOfType(New_Under_TI->getType());
5578     if (Result.isNull())
5579       return QualType();
5580   }
5581 
5582   TypeOfTypeLoc NewTL = TLB.push<TypeOfTypeLoc>(Result);
5583   NewTL.setTypeofLoc(TL.getTypeofLoc());
5584   NewTL.setLParenLoc(TL.getLParenLoc());
5585   NewTL.setRParenLoc(TL.getRParenLoc());
5586   NewTL.setUnderlyingTInfo(New_Under_TI);
5587 
5588   return Result;
5589 }
5590 
5591 template<typename Derived>
5592 QualType TreeTransform<Derived>::TransformDecltypeType(TypeLocBuilder &TLB,
5593                                                        DecltypeTypeLoc TL) {
5594   const DecltypeType *T = TL.getTypePtr();
5595 
5596   // decltype expressions are not potentially evaluated contexts
5597   EnterExpressionEvaluationContext Unevaluated(
5598       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, nullptr,
5599       Sema::ExpressionEvaluationContextRecord::EK_Decltype);
5600 
5601   ExprResult E = getDerived().TransformExpr(T->getUnderlyingExpr());
5602   if (E.isInvalid())
5603     return QualType();
5604 
5605   E = getSema().ActOnDecltypeExpression(E.get());
5606   if (E.isInvalid())
5607     return QualType();
5608 
5609   QualType Result = TL.getType();
5610   if (getDerived().AlwaysRebuild() ||
5611       E.get() != T->getUnderlyingExpr()) {
5612     Result = getDerived().RebuildDecltypeType(E.get(), TL.getNameLoc());
5613     if (Result.isNull())
5614       return QualType();
5615   }
5616   else E.get();
5617 
5618   DecltypeTypeLoc NewTL = TLB.push<DecltypeTypeLoc>(Result);
5619   NewTL.setNameLoc(TL.getNameLoc());
5620 
5621   return Result;
5622 }
5623 
5624 template<typename Derived>
5625 QualType TreeTransform<Derived>::TransformUnaryTransformType(
5626                                                             TypeLocBuilder &TLB,
5627                                                      UnaryTransformTypeLoc TL) {
5628   QualType Result = TL.getType();
5629   if (Result->isDependentType()) {
5630     const UnaryTransformType *T = TL.getTypePtr();
5631     QualType NewBase =
5632       getDerived().TransformType(TL.getUnderlyingTInfo())->getType();
5633     Result = getDerived().RebuildUnaryTransformType(NewBase,
5634                                                     T->getUTTKind(),
5635                                                     TL.getKWLoc());
5636     if (Result.isNull())
5637       return QualType();
5638   }
5639 
5640   UnaryTransformTypeLoc NewTL = TLB.push<UnaryTransformTypeLoc>(Result);
5641   NewTL.setKWLoc(TL.getKWLoc());
5642   NewTL.setParensRange(TL.getParensRange());
5643   NewTL.setUnderlyingTInfo(TL.getUnderlyingTInfo());
5644   return Result;
5645 }
5646 
5647 template<typename Derived>
5648 QualType TreeTransform<Derived>::TransformAutoType(TypeLocBuilder &TLB,
5649                                                    AutoTypeLoc TL) {
5650   const AutoType *T = TL.getTypePtr();
5651   QualType OldDeduced = T->getDeducedType();
5652   QualType NewDeduced;
5653   if (!OldDeduced.isNull()) {
5654     NewDeduced = getDerived().TransformType(OldDeduced);
5655     if (NewDeduced.isNull())
5656       return QualType();
5657   }
5658 
5659   QualType Result = TL.getType();
5660   if (getDerived().AlwaysRebuild() || NewDeduced != OldDeduced ||
5661       T->isDependentType()) {
5662     Result = getDerived().RebuildAutoType(NewDeduced, T->getKeyword());
5663     if (Result.isNull())
5664       return QualType();
5665   }
5666 
5667   AutoTypeLoc NewTL = TLB.push<AutoTypeLoc>(Result);
5668   NewTL.setNameLoc(TL.getNameLoc());
5669 
5670   return Result;
5671 }
5672 
5673 template<typename Derived>
5674 QualType TreeTransform<Derived>::TransformDeducedTemplateSpecializationType(
5675     TypeLocBuilder &TLB, DeducedTemplateSpecializationTypeLoc TL) {
5676   const DeducedTemplateSpecializationType *T = TL.getTypePtr();
5677 
5678   CXXScopeSpec SS;
5679   TemplateName TemplateName = getDerived().TransformTemplateName(
5680       SS, T->getTemplateName(), TL.getTemplateNameLoc());
5681   if (TemplateName.isNull())
5682     return QualType();
5683 
5684   QualType OldDeduced = T->getDeducedType();
5685   QualType NewDeduced;
5686   if (!OldDeduced.isNull()) {
5687     NewDeduced = getDerived().TransformType(OldDeduced);
5688     if (NewDeduced.isNull())
5689       return QualType();
5690   }
5691 
5692   QualType Result = getDerived().RebuildDeducedTemplateSpecializationType(
5693       TemplateName, NewDeduced);
5694   if (Result.isNull())
5695     return QualType();
5696 
5697   DeducedTemplateSpecializationTypeLoc NewTL =
5698       TLB.push<DeducedTemplateSpecializationTypeLoc>(Result);
5699   NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
5700 
5701   return Result;
5702 }
5703 
5704 template<typename Derived>
5705 QualType TreeTransform<Derived>::TransformRecordType(TypeLocBuilder &TLB,
5706                                                      RecordTypeLoc TL) {
5707   const RecordType *T = TL.getTypePtr();
5708   RecordDecl *Record
5709     = cast_or_null<RecordDecl>(getDerived().TransformDecl(TL.getNameLoc(),
5710                                                           T->getDecl()));
5711   if (!Record)
5712     return QualType();
5713 
5714   QualType Result = TL.getType();
5715   if (getDerived().AlwaysRebuild() ||
5716       Record != T->getDecl()) {
5717     Result = getDerived().RebuildRecordType(Record);
5718     if (Result.isNull())
5719       return QualType();
5720   }
5721 
5722   RecordTypeLoc NewTL = TLB.push<RecordTypeLoc>(Result);
5723   NewTL.setNameLoc(TL.getNameLoc());
5724 
5725   return Result;
5726 }
5727 
5728 template<typename Derived>
5729 QualType TreeTransform<Derived>::TransformEnumType(TypeLocBuilder &TLB,
5730                                                    EnumTypeLoc TL) {
5731   const EnumType *T = TL.getTypePtr();
5732   EnumDecl *Enum
5733     = cast_or_null<EnumDecl>(getDerived().TransformDecl(TL.getNameLoc(),
5734                                                         T->getDecl()));
5735   if (!Enum)
5736     return QualType();
5737 
5738   QualType Result = TL.getType();
5739   if (getDerived().AlwaysRebuild() ||
5740       Enum != T->getDecl()) {
5741     Result = getDerived().RebuildEnumType(Enum);
5742     if (Result.isNull())
5743       return QualType();
5744   }
5745 
5746   EnumTypeLoc NewTL = TLB.push<EnumTypeLoc>(Result);
5747   NewTL.setNameLoc(TL.getNameLoc());
5748 
5749   return Result;
5750 }
5751 
5752 template<typename Derived>
5753 QualType TreeTransform<Derived>::TransformInjectedClassNameType(
5754                                          TypeLocBuilder &TLB,
5755                                          InjectedClassNameTypeLoc TL) {
5756   Decl *D = getDerived().TransformDecl(TL.getNameLoc(),
5757                                        TL.getTypePtr()->getDecl());
5758   if (!D) return QualType();
5759 
5760   QualType T = SemaRef.Context.getTypeDeclType(cast<TypeDecl>(D));
5761   TLB.pushTypeSpec(T).setNameLoc(TL.getNameLoc());
5762   return T;
5763 }
5764 
5765 template<typename Derived>
5766 QualType TreeTransform<Derived>::TransformTemplateTypeParmType(
5767                                                 TypeLocBuilder &TLB,
5768                                                 TemplateTypeParmTypeLoc TL) {
5769   return TransformTypeSpecType(TLB, TL);
5770 }
5771 
5772 template<typename Derived>
5773 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmType(
5774                                          TypeLocBuilder &TLB,
5775                                          SubstTemplateTypeParmTypeLoc TL) {
5776   const SubstTemplateTypeParmType *T = TL.getTypePtr();
5777 
5778   // Substitute into the replacement type, which itself might involve something
5779   // that needs to be transformed. This only tends to occur with default
5780   // template arguments of template template parameters.
5781   TemporaryBase Rebase(*this, TL.getNameLoc(), DeclarationName());
5782   QualType Replacement = getDerived().TransformType(T->getReplacementType());
5783   if (Replacement.isNull())
5784     return QualType();
5785 
5786   // Always canonicalize the replacement type.
5787   Replacement = SemaRef.Context.getCanonicalType(Replacement);
5788   QualType Result
5789     = SemaRef.Context.getSubstTemplateTypeParmType(T->getReplacedParameter(),
5790                                                    Replacement);
5791 
5792   // Propagate type-source information.
5793   SubstTemplateTypeParmTypeLoc NewTL
5794     = TLB.push<SubstTemplateTypeParmTypeLoc>(Result);
5795   NewTL.setNameLoc(TL.getNameLoc());
5796   return Result;
5797 
5798 }
5799 
5800 template<typename Derived>
5801 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmPackType(
5802                                           TypeLocBuilder &TLB,
5803                                           SubstTemplateTypeParmPackTypeLoc TL) {
5804   return TransformTypeSpecType(TLB, TL);
5805 }
5806 
5807 template<typename Derived>
5808 QualType TreeTransform<Derived>::TransformTemplateSpecializationType(
5809                                                         TypeLocBuilder &TLB,
5810                                            TemplateSpecializationTypeLoc TL) {
5811   const TemplateSpecializationType *T = TL.getTypePtr();
5812 
5813   // The nested-name-specifier never matters in a TemplateSpecializationType,
5814   // because we can't have a dependent nested-name-specifier anyway.
5815   CXXScopeSpec SS;
5816   TemplateName Template
5817     = getDerived().TransformTemplateName(SS, T->getTemplateName(),
5818                                          TL.getTemplateNameLoc());
5819   if (Template.isNull())
5820     return QualType();
5821 
5822   return getDerived().TransformTemplateSpecializationType(TLB, TL, Template);
5823 }
5824 
5825 template<typename Derived>
5826 QualType TreeTransform<Derived>::TransformAtomicType(TypeLocBuilder &TLB,
5827                                                      AtomicTypeLoc TL) {
5828   QualType ValueType = getDerived().TransformType(TLB, TL.getValueLoc());
5829   if (ValueType.isNull())
5830     return QualType();
5831 
5832   QualType Result = TL.getType();
5833   if (getDerived().AlwaysRebuild() ||
5834       ValueType != TL.getValueLoc().getType()) {
5835     Result = getDerived().RebuildAtomicType(ValueType, TL.getKWLoc());
5836     if (Result.isNull())
5837       return QualType();
5838   }
5839 
5840   AtomicTypeLoc NewTL = TLB.push<AtomicTypeLoc>(Result);
5841   NewTL.setKWLoc(TL.getKWLoc());
5842   NewTL.setLParenLoc(TL.getLParenLoc());
5843   NewTL.setRParenLoc(TL.getRParenLoc());
5844 
5845   return Result;
5846 }
5847 
5848 template <typename Derived>
5849 QualType TreeTransform<Derived>::TransformPipeType(TypeLocBuilder &TLB,
5850                                                    PipeTypeLoc TL) {
5851   QualType ValueType = getDerived().TransformType(TLB, TL.getValueLoc());
5852   if (ValueType.isNull())
5853     return QualType();
5854 
5855   QualType Result = TL.getType();
5856   if (getDerived().AlwaysRebuild() || ValueType != TL.getValueLoc().getType()) {
5857     const PipeType *PT = Result->getAs<PipeType>();
5858     bool isReadPipe = PT->isReadOnly();
5859     Result = getDerived().RebuildPipeType(ValueType, TL.getKWLoc(), isReadPipe);
5860     if (Result.isNull())
5861       return QualType();
5862   }
5863 
5864   PipeTypeLoc NewTL = TLB.push<PipeTypeLoc>(Result);
5865   NewTL.setKWLoc(TL.getKWLoc());
5866 
5867   return Result;
5868 }
5869 
5870   /// Simple iterator that traverses the template arguments in a
5871   /// container that provides a \c getArgLoc() member function.
5872   ///
5873   /// This iterator is intended to be used with the iterator form of
5874   /// \c TreeTransform<Derived>::TransformTemplateArguments().
5875   template<typename ArgLocContainer>
5876   class TemplateArgumentLocContainerIterator {
5877     ArgLocContainer *Container;
5878     unsigned Index;
5879 
5880   public:
5881     typedef TemplateArgumentLoc value_type;
5882     typedef TemplateArgumentLoc reference;
5883     typedef int difference_type;
5884     typedef std::input_iterator_tag iterator_category;
5885 
5886     class pointer {
5887       TemplateArgumentLoc Arg;
5888 
5889     public:
5890       explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { }
5891 
5892       const TemplateArgumentLoc *operator->() const {
5893         return &Arg;
5894       }
5895     };
5896 
5897 
5898     TemplateArgumentLocContainerIterator() {}
5899 
5900     TemplateArgumentLocContainerIterator(ArgLocContainer &Container,
5901                                  unsigned Index)
5902       : Container(&Container), Index(Index) { }
5903 
5904     TemplateArgumentLocContainerIterator &operator++() {
5905       ++Index;
5906       return *this;
5907     }
5908 
5909     TemplateArgumentLocContainerIterator operator++(int) {
5910       TemplateArgumentLocContainerIterator Old(*this);
5911       ++(*this);
5912       return Old;
5913     }
5914 
5915     TemplateArgumentLoc operator*() const {
5916       return Container->getArgLoc(Index);
5917     }
5918 
5919     pointer operator->() const {
5920       return pointer(Container->getArgLoc(Index));
5921     }
5922 
5923     friend bool operator==(const TemplateArgumentLocContainerIterator &X,
5924                            const TemplateArgumentLocContainerIterator &Y) {
5925       return X.Container == Y.Container && X.Index == Y.Index;
5926     }
5927 
5928     friend bool operator!=(const TemplateArgumentLocContainerIterator &X,
5929                            const TemplateArgumentLocContainerIterator &Y) {
5930       return !(X == Y);
5931     }
5932   };
5933 
5934 
5935 template <typename Derived>
5936 QualType TreeTransform<Derived>::TransformTemplateSpecializationType(
5937                                                         TypeLocBuilder &TLB,
5938                                            TemplateSpecializationTypeLoc TL,
5939                                                       TemplateName Template) {
5940   TemplateArgumentListInfo NewTemplateArgs;
5941   NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
5942   NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
5943   typedef TemplateArgumentLocContainerIterator<TemplateSpecializationTypeLoc>
5944     ArgIterator;
5945   if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
5946                                               ArgIterator(TL, TL.getNumArgs()),
5947                                               NewTemplateArgs))
5948     return QualType();
5949 
5950   // FIXME: maybe don't rebuild if all the template arguments are the same.
5951 
5952   QualType Result =
5953     getDerived().RebuildTemplateSpecializationType(Template,
5954                                                    TL.getTemplateNameLoc(),
5955                                                    NewTemplateArgs);
5956 
5957   if (!Result.isNull()) {
5958     // Specializations of template template parameters are represented as
5959     // TemplateSpecializationTypes, and substitution of type alias templates
5960     // within a dependent context can transform them into
5961     // DependentTemplateSpecializationTypes.
5962     if (isa<DependentTemplateSpecializationType>(Result)) {
5963       DependentTemplateSpecializationTypeLoc NewTL
5964         = TLB.push<DependentTemplateSpecializationTypeLoc>(Result);
5965       NewTL.setElaboratedKeywordLoc(SourceLocation());
5966       NewTL.setQualifierLoc(NestedNameSpecifierLoc());
5967       NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
5968       NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
5969       NewTL.setLAngleLoc(TL.getLAngleLoc());
5970       NewTL.setRAngleLoc(TL.getRAngleLoc());
5971       for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
5972         NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
5973       return Result;
5974     }
5975 
5976     TemplateSpecializationTypeLoc NewTL
5977       = TLB.push<TemplateSpecializationTypeLoc>(Result);
5978     NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
5979     NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
5980     NewTL.setLAngleLoc(TL.getLAngleLoc());
5981     NewTL.setRAngleLoc(TL.getRAngleLoc());
5982     for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
5983       NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
5984   }
5985 
5986   return Result;
5987 }
5988 
5989 template <typename Derived>
5990 QualType TreeTransform<Derived>::TransformDependentTemplateSpecializationType(
5991                                      TypeLocBuilder &TLB,
5992                                      DependentTemplateSpecializationTypeLoc TL,
5993                                      TemplateName Template,
5994                                      CXXScopeSpec &SS) {
5995   TemplateArgumentListInfo NewTemplateArgs;
5996   NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
5997   NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
5998   typedef TemplateArgumentLocContainerIterator<
5999             DependentTemplateSpecializationTypeLoc> ArgIterator;
6000   if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
6001                                               ArgIterator(TL, TL.getNumArgs()),
6002                                               NewTemplateArgs))
6003     return QualType();
6004 
6005   // FIXME: maybe don't rebuild if all the template arguments are the same.
6006 
6007   if (DependentTemplateName *DTN = Template.getAsDependentTemplateName()) {
6008     QualType Result
6009       = getSema().Context.getDependentTemplateSpecializationType(
6010                                                 TL.getTypePtr()->getKeyword(),
6011                                                          DTN->getQualifier(),
6012                                                          DTN->getIdentifier(),
6013                                                                NewTemplateArgs);
6014 
6015     DependentTemplateSpecializationTypeLoc NewTL
6016       = TLB.push<DependentTemplateSpecializationTypeLoc>(Result);
6017     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6018     NewTL.setQualifierLoc(SS.getWithLocInContext(SemaRef.Context));
6019     NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6020     NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6021     NewTL.setLAngleLoc(TL.getLAngleLoc());
6022     NewTL.setRAngleLoc(TL.getRAngleLoc());
6023     for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
6024       NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
6025     return Result;
6026   }
6027 
6028   QualType Result
6029     = getDerived().RebuildTemplateSpecializationType(Template,
6030                                                      TL.getTemplateNameLoc(),
6031                                                      NewTemplateArgs);
6032 
6033   if (!Result.isNull()) {
6034     /// FIXME: Wrap this in an elaborated-type-specifier?
6035     TemplateSpecializationTypeLoc NewTL
6036       = TLB.push<TemplateSpecializationTypeLoc>(Result);
6037     NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6038     NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6039     NewTL.setLAngleLoc(TL.getLAngleLoc());
6040     NewTL.setRAngleLoc(TL.getRAngleLoc());
6041     for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
6042       NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
6043   }
6044 
6045   return Result;
6046 }
6047 
6048 template<typename Derived>
6049 QualType
6050 TreeTransform<Derived>::TransformElaboratedType(TypeLocBuilder &TLB,
6051                                                 ElaboratedTypeLoc TL) {
6052   const ElaboratedType *T = TL.getTypePtr();
6053 
6054   NestedNameSpecifierLoc QualifierLoc;
6055   // NOTE: the qualifier in an ElaboratedType is optional.
6056   if (TL.getQualifierLoc()) {
6057     QualifierLoc
6058       = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc());
6059     if (!QualifierLoc)
6060       return QualType();
6061   }
6062 
6063   QualType NamedT = getDerived().TransformType(TLB, TL.getNamedTypeLoc());
6064   if (NamedT.isNull())
6065     return QualType();
6066 
6067   // C++0x [dcl.type.elab]p2:
6068   //   If the identifier resolves to a typedef-name or the simple-template-id
6069   //   resolves to an alias template specialization, the
6070   //   elaborated-type-specifier is ill-formed.
6071   if (T->getKeyword() != ETK_None && T->getKeyword() != ETK_Typename) {
6072     if (const TemplateSpecializationType *TST =
6073           NamedT->getAs<TemplateSpecializationType>()) {
6074       TemplateName Template = TST->getTemplateName();
6075       if (TypeAliasTemplateDecl *TAT = dyn_cast_or_null<TypeAliasTemplateDecl>(
6076               Template.getAsTemplateDecl())) {
6077         SemaRef.Diag(TL.getNamedTypeLoc().getBeginLoc(),
6078                      diag::err_tag_reference_non_tag)
6079             << TAT << Sema::NTK_TypeAliasTemplate
6080             << ElaboratedType::getTagTypeKindForKeyword(T->getKeyword());
6081         SemaRef.Diag(TAT->getLocation(), diag::note_declared_at);
6082       }
6083     }
6084   }
6085 
6086   QualType Result = TL.getType();
6087   if (getDerived().AlwaysRebuild() ||
6088       QualifierLoc != TL.getQualifierLoc() ||
6089       NamedT != T->getNamedType()) {
6090     Result = getDerived().RebuildElaboratedType(TL.getElaboratedKeywordLoc(),
6091                                                 T->getKeyword(),
6092                                                 QualifierLoc, NamedT);
6093     if (Result.isNull())
6094       return QualType();
6095   }
6096 
6097   ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
6098   NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6099   NewTL.setQualifierLoc(QualifierLoc);
6100   return Result;
6101 }
6102 
6103 template<typename Derived>
6104 QualType TreeTransform<Derived>::TransformAttributedType(
6105                                                 TypeLocBuilder &TLB,
6106                                                 AttributedTypeLoc TL) {
6107   const AttributedType *oldType = TL.getTypePtr();
6108   QualType modifiedType = getDerived().TransformType(TLB, TL.getModifiedLoc());
6109   if (modifiedType.isNull())
6110     return QualType();
6111 
6112   // oldAttr can be null if we started with a QualType rather than a TypeLoc.
6113   const Attr *oldAttr = TL.getAttr();
6114   const Attr *newAttr = oldAttr ? getDerived().TransformAttr(oldAttr) : nullptr;
6115   if (oldAttr && !newAttr)
6116     return QualType();
6117 
6118   QualType result = TL.getType();
6119 
6120   // FIXME: dependent operand expressions?
6121   if (getDerived().AlwaysRebuild() ||
6122       modifiedType != oldType->getModifiedType()) {
6123     // TODO: this is really lame; we should really be rebuilding the
6124     // equivalent type from first principles.
6125     QualType equivalentType
6126       = getDerived().TransformType(oldType->getEquivalentType());
6127     if (equivalentType.isNull())
6128       return QualType();
6129 
6130     // Check whether we can add nullability; it is only represented as
6131     // type sugar, and therefore cannot be diagnosed in any other way.
6132     if (auto nullability = oldType->getImmediateNullability()) {
6133       if (!modifiedType->canHaveNullability()) {
6134         SemaRef.Diag(TL.getAttr()->getLocation(),
6135                      diag::err_nullability_nonpointer)
6136             << DiagNullabilityKind(*nullability, false) << modifiedType;
6137         return QualType();
6138       }
6139     }
6140 
6141     result = SemaRef.Context.getAttributedType(TL.getAttrKind(),
6142                                                modifiedType,
6143                                                equivalentType);
6144   }
6145 
6146   AttributedTypeLoc newTL = TLB.push<AttributedTypeLoc>(result);
6147   newTL.setAttr(newAttr);
6148   return result;
6149 }
6150 
6151 template<typename Derived>
6152 QualType
6153 TreeTransform<Derived>::TransformParenType(TypeLocBuilder &TLB,
6154                                            ParenTypeLoc TL) {
6155   QualType Inner = getDerived().TransformType(TLB, TL.getInnerLoc());
6156   if (Inner.isNull())
6157     return QualType();
6158 
6159   QualType Result = TL.getType();
6160   if (getDerived().AlwaysRebuild() ||
6161       Inner != TL.getInnerLoc().getType()) {
6162     Result = getDerived().RebuildParenType(Inner);
6163     if (Result.isNull())
6164       return QualType();
6165   }
6166 
6167   ParenTypeLoc NewTL = TLB.push<ParenTypeLoc>(Result);
6168   NewTL.setLParenLoc(TL.getLParenLoc());
6169   NewTL.setRParenLoc(TL.getRParenLoc());
6170   return Result;
6171 }
6172 
6173 template<typename Derived>
6174 QualType TreeTransform<Derived>::TransformDependentNameType(
6175     TypeLocBuilder &TLB, DependentNameTypeLoc TL) {
6176   return TransformDependentNameType(TLB, TL, false);
6177 }
6178 
6179 template<typename Derived>
6180 QualType TreeTransform<Derived>::TransformDependentNameType(
6181     TypeLocBuilder &TLB, DependentNameTypeLoc TL, bool DeducedTSTContext) {
6182   const DependentNameType *T = TL.getTypePtr();
6183 
6184   NestedNameSpecifierLoc QualifierLoc
6185     = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc());
6186   if (!QualifierLoc)
6187     return QualType();
6188 
6189   QualType Result
6190     = getDerived().RebuildDependentNameType(T->getKeyword(),
6191                                             TL.getElaboratedKeywordLoc(),
6192                                             QualifierLoc,
6193                                             T->getIdentifier(),
6194                                             TL.getNameLoc(),
6195                                             DeducedTSTContext);
6196   if (Result.isNull())
6197     return QualType();
6198 
6199   if (const ElaboratedType* ElabT = Result->getAs<ElaboratedType>()) {
6200     QualType NamedT = ElabT->getNamedType();
6201     TLB.pushTypeSpec(NamedT).setNameLoc(TL.getNameLoc());
6202 
6203     ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
6204     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6205     NewTL.setQualifierLoc(QualifierLoc);
6206   } else {
6207     DependentNameTypeLoc NewTL = TLB.push<DependentNameTypeLoc>(Result);
6208     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6209     NewTL.setQualifierLoc(QualifierLoc);
6210     NewTL.setNameLoc(TL.getNameLoc());
6211   }
6212   return Result;
6213 }
6214 
6215 template<typename Derived>
6216 QualType TreeTransform<Derived>::
6217           TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB,
6218                                  DependentTemplateSpecializationTypeLoc TL) {
6219   NestedNameSpecifierLoc QualifierLoc;
6220   if (TL.getQualifierLoc()) {
6221     QualifierLoc
6222       = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc());
6223     if (!QualifierLoc)
6224       return QualType();
6225   }
6226 
6227   return getDerived()
6228            .TransformDependentTemplateSpecializationType(TLB, TL, QualifierLoc);
6229 }
6230 
6231 template<typename Derived>
6232 QualType TreeTransform<Derived>::
6233 TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB,
6234                                    DependentTemplateSpecializationTypeLoc TL,
6235                                        NestedNameSpecifierLoc QualifierLoc) {
6236   const DependentTemplateSpecializationType *T = TL.getTypePtr();
6237 
6238   TemplateArgumentListInfo NewTemplateArgs;
6239   NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
6240   NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
6241 
6242   typedef TemplateArgumentLocContainerIterator<
6243   DependentTemplateSpecializationTypeLoc> ArgIterator;
6244   if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
6245                                               ArgIterator(TL, TL.getNumArgs()),
6246                                               NewTemplateArgs))
6247     return QualType();
6248 
6249   QualType Result = getDerived().RebuildDependentTemplateSpecializationType(
6250       T->getKeyword(), QualifierLoc, TL.getTemplateKeywordLoc(),
6251       T->getIdentifier(), TL.getTemplateNameLoc(), NewTemplateArgs,
6252       /*AllowInjectedClassName*/ false);
6253   if (Result.isNull())
6254     return QualType();
6255 
6256   if (const ElaboratedType *ElabT = dyn_cast<ElaboratedType>(Result)) {
6257     QualType NamedT = ElabT->getNamedType();
6258 
6259     // Copy information relevant to the template specialization.
6260     TemplateSpecializationTypeLoc NamedTL
6261       = TLB.push<TemplateSpecializationTypeLoc>(NamedT);
6262     NamedTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6263     NamedTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6264     NamedTL.setLAngleLoc(TL.getLAngleLoc());
6265     NamedTL.setRAngleLoc(TL.getRAngleLoc());
6266     for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I)
6267       NamedTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo());
6268 
6269     // Copy information relevant to the elaborated type.
6270     ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
6271     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6272     NewTL.setQualifierLoc(QualifierLoc);
6273   } else if (isa<DependentTemplateSpecializationType>(Result)) {
6274     DependentTemplateSpecializationTypeLoc SpecTL
6275       = TLB.push<DependentTemplateSpecializationTypeLoc>(Result);
6276     SpecTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6277     SpecTL.setQualifierLoc(QualifierLoc);
6278     SpecTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6279     SpecTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6280     SpecTL.setLAngleLoc(TL.getLAngleLoc());
6281     SpecTL.setRAngleLoc(TL.getRAngleLoc());
6282     for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I)
6283       SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo());
6284   } else {
6285     TemplateSpecializationTypeLoc SpecTL
6286       = TLB.push<TemplateSpecializationTypeLoc>(Result);
6287     SpecTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6288     SpecTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6289     SpecTL.setLAngleLoc(TL.getLAngleLoc());
6290     SpecTL.setRAngleLoc(TL.getRAngleLoc());
6291     for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I)
6292       SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo());
6293   }
6294   return Result;
6295 }
6296 
6297 template<typename Derived>
6298 QualType TreeTransform<Derived>::TransformPackExpansionType(TypeLocBuilder &TLB,
6299                                                       PackExpansionTypeLoc TL) {
6300   QualType Pattern
6301     = getDerived().TransformType(TLB, TL.getPatternLoc());
6302   if (Pattern.isNull())
6303     return QualType();
6304 
6305   QualType Result = TL.getType();
6306   if (getDerived().AlwaysRebuild() ||
6307       Pattern != TL.getPatternLoc().getType()) {
6308     Result = getDerived().RebuildPackExpansionType(Pattern,
6309                                            TL.getPatternLoc().getSourceRange(),
6310                                                    TL.getEllipsisLoc(),
6311                                            TL.getTypePtr()->getNumExpansions());
6312     if (Result.isNull())
6313       return QualType();
6314   }
6315 
6316   PackExpansionTypeLoc NewT = TLB.push<PackExpansionTypeLoc>(Result);
6317   NewT.setEllipsisLoc(TL.getEllipsisLoc());
6318   return Result;
6319 }
6320 
6321 template<typename Derived>
6322 QualType
6323 TreeTransform<Derived>::TransformObjCInterfaceType(TypeLocBuilder &TLB,
6324                                                    ObjCInterfaceTypeLoc TL) {
6325   // ObjCInterfaceType is never dependent.
6326   TLB.pushFullCopy(TL);
6327   return TL.getType();
6328 }
6329 
6330 template<typename Derived>
6331 QualType
6332 TreeTransform<Derived>::TransformObjCTypeParamType(TypeLocBuilder &TLB,
6333                                                    ObjCTypeParamTypeLoc TL) {
6334   const ObjCTypeParamType *T = TL.getTypePtr();
6335   ObjCTypeParamDecl *OTP = cast_or_null<ObjCTypeParamDecl>(
6336       getDerived().TransformDecl(T->getDecl()->getLocation(), T->getDecl()));
6337   if (!OTP)
6338     return QualType();
6339 
6340   QualType Result = TL.getType();
6341   if (getDerived().AlwaysRebuild() ||
6342       OTP != T->getDecl()) {
6343     Result = getDerived().RebuildObjCTypeParamType(OTP,
6344                  TL.getProtocolLAngleLoc(),
6345                  llvm::makeArrayRef(TL.getTypePtr()->qual_begin(),
6346                                     TL.getNumProtocols()),
6347                  TL.getProtocolLocs(),
6348                  TL.getProtocolRAngleLoc());
6349     if (Result.isNull())
6350       return QualType();
6351   }
6352 
6353   ObjCTypeParamTypeLoc NewTL = TLB.push<ObjCTypeParamTypeLoc>(Result);
6354   if (TL.getNumProtocols()) {
6355     NewTL.setProtocolLAngleLoc(TL.getProtocolLAngleLoc());
6356     for (unsigned i = 0, n = TL.getNumProtocols(); i != n; ++i)
6357       NewTL.setProtocolLoc(i, TL.getProtocolLoc(i));
6358     NewTL.setProtocolRAngleLoc(TL.getProtocolRAngleLoc());
6359   }
6360   return Result;
6361 }
6362 
6363 template<typename Derived>
6364 QualType
6365 TreeTransform<Derived>::TransformObjCObjectType(TypeLocBuilder &TLB,
6366                                                 ObjCObjectTypeLoc TL) {
6367   // Transform base type.
6368   QualType BaseType = getDerived().TransformType(TLB, TL.getBaseLoc());
6369   if (BaseType.isNull())
6370     return QualType();
6371 
6372   bool AnyChanged = BaseType != TL.getBaseLoc().getType();
6373 
6374   // Transform type arguments.
6375   SmallVector<TypeSourceInfo *, 4> NewTypeArgInfos;
6376   for (unsigned i = 0, n = TL.getNumTypeArgs(); i != n; ++i) {
6377     TypeSourceInfo *TypeArgInfo = TL.getTypeArgTInfo(i);
6378     TypeLoc TypeArgLoc = TypeArgInfo->getTypeLoc();
6379     QualType TypeArg = TypeArgInfo->getType();
6380     if (auto PackExpansionLoc = TypeArgLoc.getAs<PackExpansionTypeLoc>()) {
6381       AnyChanged = true;
6382 
6383       // We have a pack expansion. Instantiate it.
6384       const auto *PackExpansion = PackExpansionLoc.getType()
6385                                     ->castAs<PackExpansionType>();
6386       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
6387       SemaRef.collectUnexpandedParameterPacks(PackExpansion->getPattern(),
6388                                               Unexpanded);
6389       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
6390 
6391       // Determine whether the set of unexpanded parameter packs can
6392       // and should be expanded.
6393       TypeLoc PatternLoc = PackExpansionLoc.getPatternLoc();
6394       bool Expand = false;
6395       bool RetainExpansion = false;
6396       Optional<unsigned> NumExpansions = PackExpansion->getNumExpansions();
6397       if (getDerived().TryExpandParameterPacks(
6398             PackExpansionLoc.getEllipsisLoc(), PatternLoc.getSourceRange(),
6399             Unexpanded, Expand, RetainExpansion, NumExpansions))
6400         return QualType();
6401 
6402       if (!Expand) {
6403         // We can't expand this pack expansion into separate arguments yet;
6404         // just substitute into the pattern and create a new pack expansion
6405         // type.
6406         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
6407 
6408         TypeLocBuilder TypeArgBuilder;
6409         TypeArgBuilder.reserve(PatternLoc.getFullDataSize());
6410         QualType NewPatternType = getDerived().TransformType(TypeArgBuilder,
6411                                                              PatternLoc);
6412         if (NewPatternType.isNull())
6413           return QualType();
6414 
6415         QualType NewExpansionType = SemaRef.Context.getPackExpansionType(
6416                                       NewPatternType, NumExpansions);
6417         auto NewExpansionLoc = TLB.push<PackExpansionTypeLoc>(NewExpansionType);
6418         NewExpansionLoc.setEllipsisLoc(PackExpansionLoc.getEllipsisLoc());
6419         NewTypeArgInfos.push_back(
6420           TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewExpansionType));
6421         continue;
6422       }
6423 
6424       // Substitute into the pack expansion pattern for each slice of the
6425       // pack.
6426       for (unsigned ArgIdx = 0; ArgIdx != *NumExpansions; ++ArgIdx) {
6427         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), ArgIdx);
6428 
6429         TypeLocBuilder TypeArgBuilder;
6430         TypeArgBuilder.reserve(PatternLoc.getFullDataSize());
6431 
6432         QualType NewTypeArg = getDerived().TransformType(TypeArgBuilder,
6433                                                          PatternLoc);
6434         if (NewTypeArg.isNull())
6435           return QualType();
6436 
6437         NewTypeArgInfos.push_back(
6438           TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewTypeArg));
6439       }
6440 
6441       continue;
6442     }
6443 
6444     TypeLocBuilder TypeArgBuilder;
6445     TypeArgBuilder.reserve(TypeArgLoc.getFullDataSize());
6446     QualType NewTypeArg = getDerived().TransformType(TypeArgBuilder, TypeArgLoc);
6447     if (NewTypeArg.isNull())
6448       return QualType();
6449 
6450     // If nothing changed, just keep the old TypeSourceInfo.
6451     if (NewTypeArg == TypeArg) {
6452       NewTypeArgInfos.push_back(TypeArgInfo);
6453       continue;
6454     }
6455 
6456     NewTypeArgInfos.push_back(
6457       TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewTypeArg));
6458     AnyChanged = true;
6459   }
6460 
6461   QualType Result = TL.getType();
6462   if (getDerived().AlwaysRebuild() || AnyChanged) {
6463     // Rebuild the type.
6464     Result = getDerived().RebuildObjCObjectType(
6465         BaseType, TL.getBeginLoc(), TL.getTypeArgsLAngleLoc(), NewTypeArgInfos,
6466         TL.getTypeArgsRAngleLoc(), TL.getProtocolLAngleLoc(),
6467         llvm::makeArrayRef(TL.getTypePtr()->qual_begin(), TL.getNumProtocols()),
6468         TL.getProtocolLocs(), TL.getProtocolRAngleLoc());
6469 
6470     if (Result.isNull())
6471       return QualType();
6472   }
6473 
6474   ObjCObjectTypeLoc NewT = TLB.push<ObjCObjectTypeLoc>(Result);
6475   NewT.setHasBaseTypeAsWritten(true);
6476   NewT.setTypeArgsLAngleLoc(TL.getTypeArgsLAngleLoc());
6477   for (unsigned i = 0, n = TL.getNumTypeArgs(); i != n; ++i)
6478     NewT.setTypeArgTInfo(i, NewTypeArgInfos[i]);
6479   NewT.setTypeArgsRAngleLoc(TL.getTypeArgsRAngleLoc());
6480   NewT.setProtocolLAngleLoc(TL.getProtocolLAngleLoc());
6481   for (unsigned i = 0, n = TL.getNumProtocols(); i != n; ++i)
6482     NewT.setProtocolLoc(i, TL.getProtocolLoc(i));
6483   NewT.setProtocolRAngleLoc(TL.getProtocolRAngleLoc());
6484   return Result;
6485 }
6486 
6487 template<typename Derived>
6488 QualType
6489 TreeTransform<Derived>::TransformObjCObjectPointerType(TypeLocBuilder &TLB,
6490                                                ObjCObjectPointerTypeLoc TL) {
6491   QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
6492   if (PointeeType.isNull())
6493     return QualType();
6494 
6495   QualType Result = TL.getType();
6496   if (getDerived().AlwaysRebuild() ||
6497       PointeeType != TL.getPointeeLoc().getType()) {
6498     Result = getDerived().RebuildObjCObjectPointerType(PointeeType,
6499                                                        TL.getStarLoc());
6500     if (Result.isNull())
6501       return QualType();
6502   }
6503 
6504   ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result);
6505   NewT.setStarLoc(TL.getStarLoc());
6506   return Result;
6507 }
6508 
6509 //===----------------------------------------------------------------------===//
6510 // Statement transformation
6511 //===----------------------------------------------------------------------===//
6512 template<typename Derived>
6513 StmtResult
6514 TreeTransform<Derived>::TransformNullStmt(NullStmt *S) {
6515   return S;
6516 }
6517 
6518 template<typename Derived>
6519 StmtResult
6520 TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S) {
6521   return getDerived().TransformCompoundStmt(S, false);
6522 }
6523 
6524 template<typename Derived>
6525 StmtResult
6526 TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S,
6527                                               bool IsStmtExpr) {
6528   Sema::CompoundScopeRAII CompoundScope(getSema());
6529 
6530   bool SubStmtInvalid = false;
6531   bool SubStmtChanged = false;
6532   SmallVector<Stmt*, 8> Statements;
6533   for (auto *B : S->body()) {
6534     StmtResult Result = getDerived().TransformStmt(
6535         B,
6536         IsStmtExpr && B == S->body_back() ? SDK_StmtExprResult : SDK_Discarded);
6537 
6538     if (Result.isInvalid()) {
6539       // Immediately fail if this was a DeclStmt, since it's very
6540       // likely that this will cause problems for future statements.
6541       if (isa<DeclStmt>(B))
6542         return StmtError();
6543 
6544       // Otherwise, just keep processing substatements and fail later.
6545       SubStmtInvalid = true;
6546       continue;
6547     }
6548 
6549     SubStmtChanged = SubStmtChanged || Result.get() != B;
6550     Statements.push_back(Result.getAs<Stmt>());
6551   }
6552 
6553   if (SubStmtInvalid)
6554     return StmtError();
6555 
6556   if (!getDerived().AlwaysRebuild() &&
6557       !SubStmtChanged)
6558     return S;
6559 
6560   return getDerived().RebuildCompoundStmt(S->getLBracLoc(),
6561                                           Statements,
6562                                           S->getRBracLoc(),
6563                                           IsStmtExpr);
6564 }
6565 
6566 template<typename Derived>
6567 StmtResult
6568 TreeTransform<Derived>::TransformCaseStmt(CaseStmt *S) {
6569   ExprResult LHS, RHS;
6570   {
6571     EnterExpressionEvaluationContext Unevaluated(
6572         SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
6573 
6574     // Transform the left-hand case value.
6575     LHS = getDerived().TransformExpr(S->getLHS());
6576     LHS = SemaRef.ActOnCaseExpr(S->getCaseLoc(), LHS);
6577     if (LHS.isInvalid())
6578       return StmtError();
6579 
6580     // Transform the right-hand case value (for the GNU case-range extension).
6581     RHS = getDerived().TransformExpr(S->getRHS());
6582     RHS = SemaRef.ActOnCaseExpr(S->getCaseLoc(), RHS);
6583     if (RHS.isInvalid())
6584       return StmtError();
6585   }
6586 
6587   // Build the case statement.
6588   // Case statements are always rebuilt so that they will attached to their
6589   // transformed switch statement.
6590   StmtResult Case = getDerived().RebuildCaseStmt(S->getCaseLoc(),
6591                                                        LHS.get(),
6592                                                        S->getEllipsisLoc(),
6593                                                        RHS.get(),
6594                                                        S->getColonLoc());
6595   if (Case.isInvalid())
6596     return StmtError();
6597 
6598   // Transform the statement following the case
6599   StmtResult SubStmt =
6600       getDerived().TransformStmt(S->getSubStmt());
6601   if (SubStmt.isInvalid())
6602     return StmtError();
6603 
6604   // Attach the body to the case statement
6605   return getDerived().RebuildCaseStmtBody(Case.get(), SubStmt.get());
6606 }
6607 
6608 template <typename Derived>
6609 StmtResult TreeTransform<Derived>::TransformDefaultStmt(DefaultStmt *S) {
6610   // Transform the statement following the default case
6611   StmtResult SubStmt =
6612       getDerived().TransformStmt(S->getSubStmt());
6613   if (SubStmt.isInvalid())
6614     return StmtError();
6615 
6616   // Default statements are always rebuilt
6617   return getDerived().RebuildDefaultStmt(S->getDefaultLoc(), S->getColonLoc(),
6618                                          SubStmt.get());
6619 }
6620 
6621 template<typename Derived>
6622 StmtResult
6623 TreeTransform<Derived>::TransformLabelStmt(LabelStmt *S, StmtDiscardKind SDK) {
6624   StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt(), SDK);
6625   if (SubStmt.isInvalid())
6626     return StmtError();
6627 
6628   Decl *LD = getDerived().TransformDecl(S->getDecl()->getLocation(),
6629                                         S->getDecl());
6630   if (!LD)
6631     return StmtError();
6632 
6633   // If we're transforming "in-place" (we're not creating new local
6634   // declarations), assume we're replacing the old label statement
6635   // and clear out the reference to it.
6636   if (LD == S->getDecl())
6637     S->getDecl()->setStmt(nullptr);
6638 
6639   // FIXME: Pass the real colon location in.
6640   return getDerived().RebuildLabelStmt(S->getIdentLoc(),
6641                                        cast<LabelDecl>(LD), SourceLocation(),
6642                                        SubStmt.get());
6643 }
6644 
6645 template <typename Derived>
6646 const Attr *TreeTransform<Derived>::TransformAttr(const Attr *R) {
6647   if (!R)
6648     return R;
6649 
6650   switch (R->getKind()) {
6651 // Transform attributes with a pragma spelling by calling TransformXXXAttr.
6652 #define ATTR(X)
6653 #define PRAGMA_SPELLING_ATTR(X)                                                \
6654   case attr::X:                                                                \
6655     return getDerived().Transform##X##Attr(cast<X##Attr>(R));
6656 #include "clang/Basic/AttrList.inc"
6657   default:
6658     return R;
6659   }
6660 }
6661 
6662 template <typename Derived>
6663 StmtResult
6664 TreeTransform<Derived>::TransformAttributedStmt(AttributedStmt *S,
6665                                                 StmtDiscardKind SDK) {
6666   bool AttrsChanged = false;
6667   SmallVector<const Attr *, 1> Attrs;
6668 
6669   // Visit attributes and keep track if any are transformed.
6670   for (const auto *I : S->getAttrs()) {
6671     const Attr *R = getDerived().TransformAttr(I);
6672     AttrsChanged |= (I != R);
6673     Attrs.push_back(R);
6674   }
6675 
6676   StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt(), SDK);
6677   if (SubStmt.isInvalid())
6678     return StmtError();
6679 
6680   if (SubStmt.get() == S->getSubStmt() && !AttrsChanged)
6681     return S;
6682 
6683   return getDerived().RebuildAttributedStmt(S->getAttrLoc(), Attrs,
6684                                             SubStmt.get());
6685 }
6686 
6687 template<typename Derived>
6688 StmtResult
6689 TreeTransform<Derived>::TransformIfStmt(IfStmt *S) {
6690   // Transform the initialization statement
6691   StmtResult Init = getDerived().TransformStmt(S->getInit());
6692   if (Init.isInvalid())
6693     return StmtError();
6694 
6695   // Transform the condition
6696   Sema::ConditionResult Cond = getDerived().TransformCondition(
6697       S->getIfLoc(), S->getConditionVariable(), S->getCond(),
6698       S->isConstexpr() ? Sema::ConditionKind::ConstexprIf
6699                        : Sema::ConditionKind::Boolean);
6700   if (Cond.isInvalid())
6701     return StmtError();
6702 
6703   // If this is a constexpr if, determine which arm we should instantiate.
6704   llvm::Optional<bool> ConstexprConditionValue;
6705   if (S->isConstexpr())
6706     ConstexprConditionValue = Cond.getKnownValue();
6707 
6708   // Transform the "then" branch.
6709   StmtResult Then;
6710   if (!ConstexprConditionValue || *ConstexprConditionValue) {
6711     Then = getDerived().TransformStmt(S->getThen());
6712     if (Then.isInvalid())
6713       return StmtError();
6714   } else {
6715     Then = new (getSema().Context) NullStmt(S->getThen()->getBeginLoc());
6716   }
6717 
6718   // Transform the "else" branch.
6719   StmtResult Else;
6720   if (!ConstexprConditionValue || !*ConstexprConditionValue) {
6721     Else = getDerived().TransformStmt(S->getElse());
6722     if (Else.isInvalid())
6723       return StmtError();
6724   }
6725 
6726   if (!getDerived().AlwaysRebuild() &&
6727       Init.get() == S->getInit() &&
6728       Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) &&
6729       Then.get() == S->getThen() &&
6730       Else.get() == S->getElse())
6731     return S;
6732 
6733   return getDerived().RebuildIfStmt(S->getIfLoc(), S->isConstexpr(), Cond,
6734                                     Init.get(), Then.get(), S->getElseLoc(),
6735                                     Else.get());
6736 }
6737 
6738 template<typename Derived>
6739 StmtResult
6740 TreeTransform<Derived>::TransformSwitchStmt(SwitchStmt *S) {
6741   // Transform the initialization statement
6742   StmtResult Init = getDerived().TransformStmt(S->getInit());
6743   if (Init.isInvalid())
6744     return StmtError();
6745 
6746   // Transform the condition.
6747   Sema::ConditionResult Cond = getDerived().TransformCondition(
6748       S->getSwitchLoc(), S->getConditionVariable(), S->getCond(),
6749       Sema::ConditionKind::Switch);
6750   if (Cond.isInvalid())
6751     return StmtError();
6752 
6753   // Rebuild the switch statement.
6754   StmtResult Switch
6755     = getDerived().RebuildSwitchStmtStart(S->getSwitchLoc(), Init.get(), Cond);
6756   if (Switch.isInvalid())
6757     return StmtError();
6758 
6759   // Transform the body of the switch statement.
6760   StmtResult Body = getDerived().TransformStmt(S->getBody());
6761   if (Body.isInvalid())
6762     return StmtError();
6763 
6764   // Complete the switch statement.
6765   return getDerived().RebuildSwitchStmtBody(S->getSwitchLoc(), Switch.get(),
6766                                             Body.get());
6767 }
6768 
6769 template<typename Derived>
6770 StmtResult
6771 TreeTransform<Derived>::TransformWhileStmt(WhileStmt *S) {
6772   // Transform the condition
6773   Sema::ConditionResult Cond = getDerived().TransformCondition(
6774       S->getWhileLoc(), S->getConditionVariable(), S->getCond(),
6775       Sema::ConditionKind::Boolean);
6776   if (Cond.isInvalid())
6777     return StmtError();
6778 
6779   // Transform the body
6780   StmtResult Body = getDerived().TransformStmt(S->getBody());
6781   if (Body.isInvalid())
6782     return StmtError();
6783 
6784   if (!getDerived().AlwaysRebuild() &&
6785       Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) &&
6786       Body.get() == S->getBody())
6787     return Owned(S);
6788 
6789   return getDerived().RebuildWhileStmt(S->getWhileLoc(), Cond, Body.get());
6790 }
6791 
6792 template<typename Derived>
6793 StmtResult
6794 TreeTransform<Derived>::TransformDoStmt(DoStmt *S) {
6795   // Transform the body
6796   StmtResult Body = getDerived().TransformStmt(S->getBody());
6797   if (Body.isInvalid())
6798     return StmtError();
6799 
6800   // Transform the condition
6801   ExprResult Cond = getDerived().TransformExpr(S->getCond());
6802   if (Cond.isInvalid())
6803     return StmtError();
6804 
6805   if (!getDerived().AlwaysRebuild() &&
6806       Cond.get() == S->getCond() &&
6807       Body.get() == S->getBody())
6808     return S;
6809 
6810   return getDerived().RebuildDoStmt(S->getDoLoc(), Body.get(), S->getWhileLoc(),
6811                                     /*FIXME:*/S->getWhileLoc(), Cond.get(),
6812                                     S->getRParenLoc());
6813 }
6814 
6815 template<typename Derived>
6816 StmtResult
6817 TreeTransform<Derived>::TransformForStmt(ForStmt *S) {
6818   if (getSema().getLangOpts().OpenMP)
6819     getSema().startOpenMPLoop();
6820 
6821   // Transform the initialization statement
6822   StmtResult Init = getDerived().TransformStmt(S->getInit());
6823   if (Init.isInvalid())
6824     return StmtError();
6825 
6826   // In OpenMP loop region loop control variable must be captured and be
6827   // private. Perform analysis of first part (if any).
6828   if (getSema().getLangOpts().OpenMP && Init.isUsable())
6829     getSema().ActOnOpenMPLoopInitialization(S->getForLoc(), Init.get());
6830 
6831   // Transform the condition
6832   Sema::ConditionResult Cond = getDerived().TransformCondition(
6833       S->getForLoc(), S->getConditionVariable(), S->getCond(),
6834       Sema::ConditionKind::Boolean);
6835   if (Cond.isInvalid())
6836     return StmtError();
6837 
6838   // Transform the increment
6839   ExprResult Inc = getDerived().TransformExpr(S->getInc());
6840   if (Inc.isInvalid())
6841     return StmtError();
6842 
6843   Sema::FullExprArg FullInc(getSema().MakeFullDiscardedValueExpr(Inc.get()));
6844   if (S->getInc() && !FullInc.get())
6845     return StmtError();
6846 
6847   // Transform the body
6848   StmtResult Body = getDerived().TransformStmt(S->getBody());
6849   if (Body.isInvalid())
6850     return StmtError();
6851 
6852   if (!getDerived().AlwaysRebuild() &&
6853       Init.get() == S->getInit() &&
6854       Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) &&
6855       Inc.get() == S->getInc() &&
6856       Body.get() == S->getBody())
6857     return S;
6858 
6859   return getDerived().RebuildForStmt(S->getForLoc(), S->getLParenLoc(),
6860                                      Init.get(), Cond, FullInc,
6861                                      S->getRParenLoc(), Body.get());
6862 }
6863 
6864 template<typename Derived>
6865 StmtResult
6866 TreeTransform<Derived>::TransformGotoStmt(GotoStmt *S) {
6867   Decl *LD = getDerived().TransformDecl(S->getLabel()->getLocation(),
6868                                         S->getLabel());
6869   if (!LD)
6870     return StmtError();
6871 
6872   // Goto statements must always be rebuilt, to resolve the label.
6873   return getDerived().RebuildGotoStmt(S->getGotoLoc(), S->getLabelLoc(),
6874                                       cast<LabelDecl>(LD));
6875 }
6876 
6877 template<typename Derived>
6878 StmtResult
6879 TreeTransform<Derived>::TransformIndirectGotoStmt(IndirectGotoStmt *S) {
6880   ExprResult Target = getDerived().TransformExpr(S->getTarget());
6881   if (Target.isInvalid())
6882     return StmtError();
6883   Target = SemaRef.MaybeCreateExprWithCleanups(Target.get());
6884 
6885   if (!getDerived().AlwaysRebuild() &&
6886       Target.get() == S->getTarget())
6887     return S;
6888 
6889   return getDerived().RebuildIndirectGotoStmt(S->getGotoLoc(), S->getStarLoc(),
6890                                               Target.get());
6891 }
6892 
6893 template<typename Derived>
6894 StmtResult
6895 TreeTransform<Derived>::TransformContinueStmt(ContinueStmt *S) {
6896   return S;
6897 }
6898 
6899 template<typename Derived>
6900 StmtResult
6901 TreeTransform<Derived>::TransformBreakStmt(BreakStmt *S) {
6902   return S;
6903 }
6904 
6905 template<typename Derived>
6906 StmtResult
6907 TreeTransform<Derived>::TransformReturnStmt(ReturnStmt *S) {
6908   ExprResult Result = getDerived().TransformInitializer(S->getRetValue(),
6909                                                         /*NotCopyInit*/false);
6910   if (Result.isInvalid())
6911     return StmtError();
6912 
6913   // FIXME: We always rebuild the return statement because there is no way
6914   // to tell whether the return type of the function has changed.
6915   return getDerived().RebuildReturnStmt(S->getReturnLoc(), Result.get());
6916 }
6917 
6918 template<typename Derived>
6919 StmtResult
6920 TreeTransform<Derived>::TransformDeclStmt(DeclStmt *S) {
6921   bool DeclChanged = false;
6922   SmallVector<Decl *, 4> Decls;
6923   for (auto *D : S->decls()) {
6924     Decl *Transformed = getDerived().TransformDefinition(D->getLocation(), D);
6925     if (!Transformed)
6926       return StmtError();
6927 
6928     if (Transformed != D)
6929       DeclChanged = true;
6930 
6931     Decls.push_back(Transformed);
6932   }
6933 
6934   if (!getDerived().AlwaysRebuild() && !DeclChanged)
6935     return S;
6936 
6937   return getDerived().RebuildDeclStmt(Decls, S->getBeginLoc(), S->getEndLoc());
6938 }
6939 
6940 template<typename Derived>
6941 StmtResult
6942 TreeTransform<Derived>::TransformGCCAsmStmt(GCCAsmStmt *S) {
6943 
6944   SmallVector<Expr*, 8> Constraints;
6945   SmallVector<Expr*, 8> Exprs;
6946   SmallVector<IdentifierInfo *, 4> Names;
6947 
6948   ExprResult AsmString;
6949   SmallVector<Expr*, 8> Clobbers;
6950 
6951   bool ExprsChanged = false;
6952 
6953   // Go through the outputs.
6954   for (unsigned I = 0, E = S->getNumOutputs(); I != E; ++I) {
6955     Names.push_back(S->getOutputIdentifier(I));
6956 
6957     // No need to transform the constraint literal.
6958     Constraints.push_back(S->getOutputConstraintLiteral(I));
6959 
6960     // Transform the output expr.
6961     Expr *OutputExpr = S->getOutputExpr(I);
6962     ExprResult Result = getDerived().TransformExpr(OutputExpr);
6963     if (Result.isInvalid())
6964       return StmtError();
6965 
6966     ExprsChanged |= Result.get() != OutputExpr;
6967 
6968     Exprs.push_back(Result.get());
6969   }
6970 
6971   // Go through the inputs.
6972   for (unsigned I = 0, E = S->getNumInputs(); I != E; ++I) {
6973     Names.push_back(S->getInputIdentifier(I));
6974 
6975     // No need to transform the constraint literal.
6976     Constraints.push_back(S->getInputConstraintLiteral(I));
6977 
6978     // Transform the input expr.
6979     Expr *InputExpr = S->getInputExpr(I);
6980     ExprResult Result = getDerived().TransformExpr(InputExpr);
6981     if (Result.isInvalid())
6982       return StmtError();
6983 
6984     ExprsChanged |= Result.get() != InputExpr;
6985 
6986     Exprs.push_back(Result.get());
6987   }
6988 
6989   if (!getDerived().AlwaysRebuild() && !ExprsChanged)
6990     return S;
6991 
6992   // Go through the clobbers.
6993   for (unsigned I = 0, E = S->getNumClobbers(); I != E; ++I)
6994     Clobbers.push_back(S->getClobberStringLiteral(I));
6995 
6996   // No need to transform the asm string literal.
6997   AsmString = S->getAsmString();
6998   return getDerived().RebuildGCCAsmStmt(S->getAsmLoc(), S->isSimple(),
6999                                         S->isVolatile(), S->getNumOutputs(),
7000                                         S->getNumInputs(), Names.data(),
7001                                         Constraints, Exprs, AsmString.get(),
7002                                         Clobbers, S->getRParenLoc());
7003 }
7004 
7005 template<typename Derived>
7006 StmtResult
7007 TreeTransform<Derived>::TransformMSAsmStmt(MSAsmStmt *S) {
7008   ArrayRef<Token> AsmToks =
7009     llvm::makeArrayRef(S->getAsmToks(), S->getNumAsmToks());
7010 
7011   bool HadError = false, HadChange = false;
7012 
7013   ArrayRef<Expr*> SrcExprs = S->getAllExprs();
7014   SmallVector<Expr*, 8> TransformedExprs;
7015   TransformedExprs.reserve(SrcExprs.size());
7016   for (unsigned i = 0, e = SrcExprs.size(); i != e; ++i) {
7017     ExprResult Result = getDerived().TransformExpr(SrcExprs[i]);
7018     if (!Result.isUsable()) {
7019       HadError = true;
7020     } else {
7021       HadChange |= (Result.get() != SrcExprs[i]);
7022       TransformedExprs.push_back(Result.get());
7023     }
7024   }
7025 
7026   if (HadError) return StmtError();
7027   if (!HadChange && !getDerived().AlwaysRebuild())
7028     return Owned(S);
7029 
7030   return getDerived().RebuildMSAsmStmt(S->getAsmLoc(), S->getLBraceLoc(),
7031                                        AsmToks, S->getAsmString(),
7032                                        S->getNumOutputs(), S->getNumInputs(),
7033                                        S->getAllConstraints(), S->getClobbers(),
7034                                        TransformedExprs, S->getEndLoc());
7035 }
7036 
7037 // C++ Coroutines TS
7038 
7039 template<typename Derived>
7040 StmtResult
7041 TreeTransform<Derived>::TransformCoroutineBodyStmt(CoroutineBodyStmt *S) {
7042   auto *ScopeInfo = SemaRef.getCurFunction();
7043   auto *FD = cast<FunctionDecl>(SemaRef.CurContext);
7044   assert(FD && ScopeInfo && !ScopeInfo->CoroutinePromise &&
7045          ScopeInfo->NeedsCoroutineSuspends &&
7046          ScopeInfo->CoroutineSuspends.first == nullptr &&
7047          ScopeInfo->CoroutineSuspends.second == nullptr &&
7048          "expected clean scope info");
7049 
7050   // Set that we have (possibly-invalid) suspend points before we do anything
7051   // that may fail.
7052   ScopeInfo->setNeedsCoroutineSuspends(false);
7053 
7054   // The new CoroutinePromise object needs to be built and put into the current
7055   // FunctionScopeInfo before any transformations or rebuilding occurs.
7056   if (!SemaRef.buildCoroutineParameterMoves(FD->getLocation()))
7057     return StmtError();
7058   auto *Promise = SemaRef.buildCoroutinePromise(FD->getLocation());
7059   if (!Promise)
7060     return StmtError();
7061   getDerived().transformedLocalDecl(S->getPromiseDecl(), Promise);
7062   ScopeInfo->CoroutinePromise = Promise;
7063 
7064   // Transform the implicit coroutine statements we built during the initial
7065   // parse.
7066   StmtResult InitSuspend = getDerived().TransformStmt(S->getInitSuspendStmt());
7067   if (InitSuspend.isInvalid())
7068     return StmtError();
7069   StmtResult FinalSuspend =
7070       getDerived().TransformStmt(S->getFinalSuspendStmt());
7071   if (FinalSuspend.isInvalid())
7072     return StmtError();
7073   ScopeInfo->setCoroutineSuspends(InitSuspend.get(), FinalSuspend.get());
7074   assert(isa<Expr>(InitSuspend.get()) && isa<Expr>(FinalSuspend.get()));
7075 
7076   StmtResult BodyRes = getDerived().TransformStmt(S->getBody());
7077   if (BodyRes.isInvalid())
7078     return StmtError();
7079 
7080   CoroutineStmtBuilder Builder(SemaRef, *FD, *ScopeInfo, BodyRes.get());
7081   if (Builder.isInvalid())
7082     return StmtError();
7083 
7084   Expr *ReturnObject = S->getReturnValueInit();
7085   assert(ReturnObject && "the return object is expected to be valid");
7086   ExprResult Res = getDerived().TransformInitializer(ReturnObject,
7087                                                      /*NoCopyInit*/ false);
7088   if (Res.isInvalid())
7089     return StmtError();
7090   Builder.ReturnValue = Res.get();
7091 
7092   if (S->hasDependentPromiseType()) {
7093     assert(!Promise->getType()->isDependentType() &&
7094            "the promise type must no longer be dependent");
7095     assert(!S->getFallthroughHandler() && !S->getExceptionHandler() &&
7096            !S->getReturnStmtOnAllocFailure() && !S->getDeallocate() &&
7097            "these nodes should not have been built yet");
7098     if (!Builder.buildDependentStatements())
7099       return StmtError();
7100   } else {
7101     if (auto *OnFallthrough = S->getFallthroughHandler()) {
7102       StmtResult Res = getDerived().TransformStmt(OnFallthrough);
7103       if (Res.isInvalid())
7104         return StmtError();
7105       Builder.OnFallthrough = Res.get();
7106     }
7107 
7108     if (auto *OnException = S->getExceptionHandler()) {
7109       StmtResult Res = getDerived().TransformStmt(OnException);
7110       if (Res.isInvalid())
7111         return StmtError();
7112       Builder.OnException = Res.get();
7113     }
7114 
7115     if (auto *OnAllocFailure = S->getReturnStmtOnAllocFailure()) {
7116       StmtResult Res = getDerived().TransformStmt(OnAllocFailure);
7117       if (Res.isInvalid())
7118         return StmtError();
7119       Builder.ReturnStmtOnAllocFailure = Res.get();
7120     }
7121 
7122     // Transform any additional statements we may have already built
7123     assert(S->getAllocate() && S->getDeallocate() &&
7124            "allocation and deallocation calls must already be built");
7125     ExprResult AllocRes = getDerived().TransformExpr(S->getAllocate());
7126     if (AllocRes.isInvalid())
7127       return StmtError();
7128     Builder.Allocate = AllocRes.get();
7129 
7130     ExprResult DeallocRes = getDerived().TransformExpr(S->getDeallocate());
7131     if (DeallocRes.isInvalid())
7132       return StmtError();
7133     Builder.Deallocate = DeallocRes.get();
7134 
7135     assert(S->getResultDecl() && "ResultDecl must already be built");
7136     StmtResult ResultDecl = getDerived().TransformStmt(S->getResultDecl());
7137     if (ResultDecl.isInvalid())
7138       return StmtError();
7139     Builder.ResultDecl = ResultDecl.get();
7140 
7141     if (auto *ReturnStmt = S->getReturnStmt()) {
7142       StmtResult Res = getDerived().TransformStmt(ReturnStmt);
7143       if (Res.isInvalid())
7144         return StmtError();
7145       Builder.ReturnStmt = Res.get();
7146     }
7147   }
7148 
7149   return getDerived().RebuildCoroutineBodyStmt(Builder);
7150 }
7151 
7152 template<typename Derived>
7153 StmtResult
7154 TreeTransform<Derived>::TransformCoreturnStmt(CoreturnStmt *S) {
7155   ExprResult Result = getDerived().TransformInitializer(S->getOperand(),
7156                                                         /*NotCopyInit*/false);
7157   if (Result.isInvalid())
7158     return StmtError();
7159 
7160   // Always rebuild; we don't know if this needs to be injected into a new
7161   // context or if the promise type has changed.
7162   return getDerived().RebuildCoreturnStmt(S->getKeywordLoc(), Result.get(),
7163                                           S->isImplicit());
7164 }
7165 
7166 template<typename Derived>
7167 ExprResult
7168 TreeTransform<Derived>::TransformCoawaitExpr(CoawaitExpr *E) {
7169   ExprResult Result = getDerived().TransformInitializer(E->getOperand(),
7170                                                         /*NotCopyInit*/false);
7171   if (Result.isInvalid())
7172     return ExprError();
7173 
7174   // Always rebuild; we don't know if this needs to be injected into a new
7175   // context or if the promise type has changed.
7176   return getDerived().RebuildCoawaitExpr(E->getKeywordLoc(), Result.get(),
7177                                          E->isImplicit());
7178 }
7179 
7180 template <typename Derived>
7181 ExprResult
7182 TreeTransform<Derived>::TransformDependentCoawaitExpr(DependentCoawaitExpr *E) {
7183   ExprResult OperandResult = getDerived().TransformInitializer(E->getOperand(),
7184                                                         /*NotCopyInit*/ false);
7185   if (OperandResult.isInvalid())
7186     return ExprError();
7187 
7188   ExprResult LookupResult = getDerived().TransformUnresolvedLookupExpr(
7189           E->getOperatorCoawaitLookup());
7190 
7191   if (LookupResult.isInvalid())
7192     return ExprError();
7193 
7194   // Always rebuild; we don't know if this needs to be injected into a new
7195   // context or if the promise type has changed.
7196   return getDerived().RebuildDependentCoawaitExpr(
7197       E->getKeywordLoc(), OperandResult.get(),
7198       cast<UnresolvedLookupExpr>(LookupResult.get()));
7199 }
7200 
7201 template<typename Derived>
7202 ExprResult
7203 TreeTransform<Derived>::TransformCoyieldExpr(CoyieldExpr *E) {
7204   ExprResult Result = getDerived().TransformInitializer(E->getOperand(),
7205                                                         /*NotCopyInit*/false);
7206   if (Result.isInvalid())
7207     return ExprError();
7208 
7209   // Always rebuild; we don't know if this needs to be injected into a new
7210   // context or if the promise type has changed.
7211   return getDerived().RebuildCoyieldExpr(E->getKeywordLoc(), Result.get());
7212 }
7213 
7214 // Objective-C Statements.
7215 
7216 template<typename Derived>
7217 StmtResult
7218 TreeTransform<Derived>::TransformObjCAtTryStmt(ObjCAtTryStmt *S) {
7219   // Transform the body of the @try.
7220   StmtResult TryBody = getDerived().TransformStmt(S->getTryBody());
7221   if (TryBody.isInvalid())
7222     return StmtError();
7223 
7224   // Transform the @catch statements (if present).
7225   bool AnyCatchChanged = false;
7226   SmallVector<Stmt*, 8> CatchStmts;
7227   for (unsigned I = 0, N = S->getNumCatchStmts(); I != N; ++I) {
7228     StmtResult Catch = getDerived().TransformStmt(S->getCatchStmt(I));
7229     if (Catch.isInvalid())
7230       return StmtError();
7231     if (Catch.get() != S->getCatchStmt(I))
7232       AnyCatchChanged = true;
7233     CatchStmts.push_back(Catch.get());
7234   }
7235 
7236   // Transform the @finally statement (if present).
7237   StmtResult Finally;
7238   if (S->getFinallyStmt()) {
7239     Finally = getDerived().TransformStmt(S->getFinallyStmt());
7240     if (Finally.isInvalid())
7241       return StmtError();
7242   }
7243 
7244   // If nothing changed, just retain this statement.
7245   if (!getDerived().AlwaysRebuild() &&
7246       TryBody.get() == S->getTryBody() &&
7247       !AnyCatchChanged &&
7248       Finally.get() == S->getFinallyStmt())
7249     return S;
7250 
7251   // Build a new statement.
7252   return getDerived().RebuildObjCAtTryStmt(S->getAtTryLoc(), TryBody.get(),
7253                                            CatchStmts, Finally.get());
7254 }
7255 
7256 template<typename Derived>
7257 StmtResult
7258 TreeTransform<Derived>::TransformObjCAtCatchStmt(ObjCAtCatchStmt *S) {
7259   // Transform the @catch parameter, if there is one.
7260   VarDecl *Var = nullptr;
7261   if (VarDecl *FromVar = S->getCatchParamDecl()) {
7262     TypeSourceInfo *TSInfo = nullptr;
7263     if (FromVar->getTypeSourceInfo()) {
7264       TSInfo = getDerived().TransformType(FromVar->getTypeSourceInfo());
7265       if (!TSInfo)
7266         return StmtError();
7267     }
7268 
7269     QualType T;
7270     if (TSInfo)
7271       T = TSInfo->getType();
7272     else {
7273       T = getDerived().TransformType(FromVar->getType());
7274       if (T.isNull())
7275         return StmtError();
7276     }
7277 
7278     Var = getDerived().RebuildObjCExceptionDecl(FromVar, TSInfo, T);
7279     if (!Var)
7280       return StmtError();
7281   }
7282 
7283   StmtResult Body = getDerived().TransformStmt(S->getCatchBody());
7284   if (Body.isInvalid())
7285     return StmtError();
7286 
7287   return getDerived().RebuildObjCAtCatchStmt(S->getAtCatchLoc(),
7288                                              S->getRParenLoc(),
7289                                              Var, Body.get());
7290 }
7291 
7292 template<typename Derived>
7293 StmtResult
7294 TreeTransform<Derived>::TransformObjCAtFinallyStmt(ObjCAtFinallyStmt *S) {
7295   // Transform the body.
7296   StmtResult Body = getDerived().TransformStmt(S->getFinallyBody());
7297   if (Body.isInvalid())
7298     return StmtError();
7299 
7300   // If nothing changed, just retain this statement.
7301   if (!getDerived().AlwaysRebuild() &&
7302       Body.get() == S->getFinallyBody())
7303     return S;
7304 
7305   // Build a new statement.
7306   return getDerived().RebuildObjCAtFinallyStmt(S->getAtFinallyLoc(),
7307                                                Body.get());
7308 }
7309 
7310 template<typename Derived>
7311 StmtResult
7312 TreeTransform<Derived>::TransformObjCAtThrowStmt(ObjCAtThrowStmt *S) {
7313   ExprResult Operand;
7314   if (S->getThrowExpr()) {
7315     Operand = getDerived().TransformExpr(S->getThrowExpr());
7316     if (Operand.isInvalid())
7317       return StmtError();
7318   }
7319 
7320   if (!getDerived().AlwaysRebuild() &&
7321       Operand.get() == S->getThrowExpr())
7322     return S;
7323 
7324   return getDerived().RebuildObjCAtThrowStmt(S->getThrowLoc(), Operand.get());
7325 }
7326 
7327 template<typename Derived>
7328 StmtResult
7329 TreeTransform<Derived>::TransformObjCAtSynchronizedStmt(
7330                                                   ObjCAtSynchronizedStmt *S) {
7331   // Transform the object we are locking.
7332   ExprResult Object = getDerived().TransformExpr(S->getSynchExpr());
7333   if (Object.isInvalid())
7334     return StmtError();
7335   Object =
7336     getDerived().RebuildObjCAtSynchronizedOperand(S->getAtSynchronizedLoc(),
7337                                                   Object.get());
7338   if (Object.isInvalid())
7339     return StmtError();
7340 
7341   // Transform the body.
7342   StmtResult Body = getDerived().TransformStmt(S->getSynchBody());
7343   if (Body.isInvalid())
7344     return StmtError();
7345 
7346   // If nothing change, just retain the current statement.
7347   if (!getDerived().AlwaysRebuild() &&
7348       Object.get() == S->getSynchExpr() &&
7349       Body.get() == S->getSynchBody())
7350     return S;
7351 
7352   // Build a new statement.
7353   return getDerived().RebuildObjCAtSynchronizedStmt(S->getAtSynchronizedLoc(),
7354                                                     Object.get(), Body.get());
7355 }
7356 
7357 template<typename Derived>
7358 StmtResult
7359 TreeTransform<Derived>::TransformObjCAutoreleasePoolStmt(
7360                                               ObjCAutoreleasePoolStmt *S) {
7361   // Transform the body.
7362   StmtResult Body = getDerived().TransformStmt(S->getSubStmt());
7363   if (Body.isInvalid())
7364     return StmtError();
7365 
7366   // If nothing changed, just retain this statement.
7367   if (!getDerived().AlwaysRebuild() &&
7368       Body.get() == S->getSubStmt())
7369     return S;
7370 
7371   // Build a new statement.
7372   return getDerived().RebuildObjCAutoreleasePoolStmt(
7373                         S->getAtLoc(), Body.get());
7374 }
7375 
7376 template<typename Derived>
7377 StmtResult
7378 TreeTransform<Derived>::TransformObjCForCollectionStmt(
7379                                                   ObjCForCollectionStmt *S) {
7380   // Transform the element statement.
7381   StmtResult Element =
7382       getDerived().TransformStmt(S->getElement(), SDK_NotDiscarded);
7383   if (Element.isInvalid())
7384     return StmtError();
7385 
7386   // Transform the collection expression.
7387   ExprResult Collection = getDerived().TransformExpr(S->getCollection());
7388   if (Collection.isInvalid())
7389     return StmtError();
7390 
7391   // Transform the body.
7392   StmtResult Body = getDerived().TransformStmt(S->getBody());
7393   if (Body.isInvalid())
7394     return StmtError();
7395 
7396   // If nothing changed, just retain this statement.
7397   if (!getDerived().AlwaysRebuild() &&
7398       Element.get() == S->getElement() &&
7399       Collection.get() == S->getCollection() &&
7400       Body.get() == S->getBody())
7401     return S;
7402 
7403   // Build a new statement.
7404   return getDerived().RebuildObjCForCollectionStmt(S->getForLoc(),
7405                                                    Element.get(),
7406                                                    Collection.get(),
7407                                                    S->getRParenLoc(),
7408                                                    Body.get());
7409 }
7410 
7411 template <typename Derived>
7412 StmtResult TreeTransform<Derived>::TransformCXXCatchStmt(CXXCatchStmt *S) {
7413   // Transform the exception declaration, if any.
7414   VarDecl *Var = nullptr;
7415   if (VarDecl *ExceptionDecl = S->getExceptionDecl()) {
7416     TypeSourceInfo *T =
7417         getDerived().TransformType(ExceptionDecl->getTypeSourceInfo());
7418     if (!T)
7419       return StmtError();
7420 
7421     Var = getDerived().RebuildExceptionDecl(
7422         ExceptionDecl, T, ExceptionDecl->getInnerLocStart(),
7423         ExceptionDecl->getLocation(), ExceptionDecl->getIdentifier());
7424     if (!Var || Var->isInvalidDecl())
7425       return StmtError();
7426   }
7427 
7428   // Transform the actual exception handler.
7429   StmtResult Handler = getDerived().TransformStmt(S->getHandlerBlock());
7430   if (Handler.isInvalid())
7431     return StmtError();
7432 
7433   if (!getDerived().AlwaysRebuild() && !Var &&
7434       Handler.get() == S->getHandlerBlock())
7435     return S;
7436 
7437   return getDerived().RebuildCXXCatchStmt(S->getCatchLoc(), Var, Handler.get());
7438 }
7439 
7440 template <typename Derived>
7441 StmtResult TreeTransform<Derived>::TransformCXXTryStmt(CXXTryStmt *S) {
7442   // Transform the try block itself.
7443   StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock());
7444   if (TryBlock.isInvalid())
7445     return StmtError();
7446 
7447   // Transform the handlers.
7448   bool HandlerChanged = false;
7449   SmallVector<Stmt *, 8> Handlers;
7450   for (unsigned I = 0, N = S->getNumHandlers(); I != N; ++I) {
7451     StmtResult Handler = getDerived().TransformCXXCatchStmt(S->getHandler(I));
7452     if (Handler.isInvalid())
7453       return StmtError();
7454 
7455     HandlerChanged = HandlerChanged || Handler.get() != S->getHandler(I);
7456     Handlers.push_back(Handler.getAs<Stmt>());
7457   }
7458 
7459   if (!getDerived().AlwaysRebuild() && TryBlock.get() == S->getTryBlock() &&
7460       !HandlerChanged)
7461     return S;
7462 
7463   return getDerived().RebuildCXXTryStmt(S->getTryLoc(), TryBlock.get(),
7464                                         Handlers);
7465 }
7466 
7467 template<typename Derived>
7468 StmtResult
7469 TreeTransform<Derived>::TransformCXXForRangeStmt(CXXForRangeStmt *S) {
7470   StmtResult Init =
7471       S->getInit() ? getDerived().TransformStmt(S->getInit()) : StmtResult();
7472   if (Init.isInvalid())
7473     return StmtError();
7474 
7475   StmtResult Range = getDerived().TransformStmt(S->getRangeStmt());
7476   if (Range.isInvalid())
7477     return StmtError();
7478 
7479   StmtResult Begin = getDerived().TransformStmt(S->getBeginStmt());
7480   if (Begin.isInvalid())
7481     return StmtError();
7482   StmtResult End = getDerived().TransformStmt(S->getEndStmt());
7483   if (End.isInvalid())
7484     return StmtError();
7485 
7486   ExprResult Cond = getDerived().TransformExpr(S->getCond());
7487   if (Cond.isInvalid())
7488     return StmtError();
7489   if (Cond.get())
7490     Cond = SemaRef.CheckBooleanCondition(S->getColonLoc(), Cond.get());
7491   if (Cond.isInvalid())
7492     return StmtError();
7493   if (Cond.get())
7494     Cond = SemaRef.MaybeCreateExprWithCleanups(Cond.get());
7495 
7496   ExprResult Inc = getDerived().TransformExpr(S->getInc());
7497   if (Inc.isInvalid())
7498     return StmtError();
7499   if (Inc.get())
7500     Inc = SemaRef.MaybeCreateExprWithCleanups(Inc.get());
7501 
7502   StmtResult LoopVar = getDerived().TransformStmt(S->getLoopVarStmt());
7503   if (LoopVar.isInvalid())
7504     return StmtError();
7505 
7506   StmtResult NewStmt = S;
7507   if (getDerived().AlwaysRebuild() ||
7508       Init.get() != S->getInit() ||
7509       Range.get() != S->getRangeStmt() ||
7510       Begin.get() != S->getBeginStmt() ||
7511       End.get() != S->getEndStmt() ||
7512       Cond.get() != S->getCond() ||
7513       Inc.get() != S->getInc() ||
7514       LoopVar.get() != S->getLoopVarStmt()) {
7515     NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(),
7516                                                   S->getCoawaitLoc(), Init.get(),
7517                                                   S->getColonLoc(), Range.get(),
7518                                                   Begin.get(), End.get(),
7519                                                   Cond.get(),
7520                                                   Inc.get(), LoopVar.get(),
7521                                                   S->getRParenLoc());
7522     if (NewStmt.isInvalid())
7523       return StmtError();
7524   }
7525 
7526   StmtResult Body = getDerived().TransformStmt(S->getBody());
7527   if (Body.isInvalid())
7528     return StmtError();
7529 
7530   // Body has changed but we didn't rebuild the for-range statement. Rebuild
7531   // it now so we have a new statement to attach the body to.
7532   if (Body.get() != S->getBody() && NewStmt.get() == S) {
7533     NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(),
7534                                                   S->getCoawaitLoc(), Init.get(),
7535                                                   S->getColonLoc(), Range.get(),
7536                                                   Begin.get(), End.get(),
7537                                                   Cond.get(),
7538                                                   Inc.get(), LoopVar.get(),
7539                                                   S->getRParenLoc());
7540     if (NewStmt.isInvalid())
7541       return StmtError();
7542   }
7543 
7544   if (NewStmt.get() == S)
7545     return S;
7546 
7547   return FinishCXXForRangeStmt(NewStmt.get(), Body.get());
7548 }
7549 
7550 template<typename Derived>
7551 StmtResult
7552 TreeTransform<Derived>::TransformMSDependentExistsStmt(
7553                                                     MSDependentExistsStmt *S) {
7554   // Transform the nested-name-specifier, if any.
7555   NestedNameSpecifierLoc QualifierLoc;
7556   if (S->getQualifierLoc()) {
7557     QualifierLoc
7558       = getDerived().TransformNestedNameSpecifierLoc(S->getQualifierLoc());
7559     if (!QualifierLoc)
7560       return StmtError();
7561   }
7562 
7563   // Transform the declaration name.
7564   DeclarationNameInfo NameInfo = S->getNameInfo();
7565   if (NameInfo.getName()) {
7566     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
7567     if (!NameInfo.getName())
7568       return StmtError();
7569   }
7570 
7571   // Check whether anything changed.
7572   if (!getDerived().AlwaysRebuild() &&
7573       QualifierLoc == S->getQualifierLoc() &&
7574       NameInfo.getName() == S->getNameInfo().getName())
7575     return S;
7576 
7577   // Determine whether this name exists, if we can.
7578   CXXScopeSpec SS;
7579   SS.Adopt(QualifierLoc);
7580   bool Dependent = false;
7581   switch (getSema().CheckMicrosoftIfExistsSymbol(/*S=*/nullptr, SS, NameInfo)) {
7582   case Sema::IER_Exists:
7583     if (S->isIfExists())
7584       break;
7585 
7586     return new (getSema().Context) NullStmt(S->getKeywordLoc());
7587 
7588   case Sema::IER_DoesNotExist:
7589     if (S->isIfNotExists())
7590       break;
7591 
7592     return new (getSema().Context) NullStmt(S->getKeywordLoc());
7593 
7594   case Sema::IER_Dependent:
7595     Dependent = true;
7596     break;
7597 
7598   case Sema::IER_Error:
7599     return StmtError();
7600   }
7601 
7602   // We need to continue with the instantiation, so do so now.
7603   StmtResult SubStmt = getDerived().TransformCompoundStmt(S->getSubStmt());
7604   if (SubStmt.isInvalid())
7605     return StmtError();
7606 
7607   // If we have resolved the name, just transform to the substatement.
7608   if (!Dependent)
7609     return SubStmt;
7610 
7611   // The name is still dependent, so build a dependent expression again.
7612   return getDerived().RebuildMSDependentExistsStmt(S->getKeywordLoc(),
7613                                                    S->isIfExists(),
7614                                                    QualifierLoc,
7615                                                    NameInfo,
7616                                                    SubStmt.get());
7617 }
7618 
7619 template<typename Derived>
7620 ExprResult
7621 TreeTransform<Derived>::TransformMSPropertyRefExpr(MSPropertyRefExpr *E) {
7622   NestedNameSpecifierLoc QualifierLoc;
7623   if (E->getQualifierLoc()) {
7624     QualifierLoc
7625     = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
7626     if (!QualifierLoc)
7627       return ExprError();
7628   }
7629 
7630   MSPropertyDecl *PD = cast_or_null<MSPropertyDecl>(
7631     getDerived().TransformDecl(E->getMemberLoc(), E->getPropertyDecl()));
7632   if (!PD)
7633     return ExprError();
7634 
7635   ExprResult Base = getDerived().TransformExpr(E->getBaseExpr());
7636   if (Base.isInvalid())
7637     return ExprError();
7638 
7639   return new (SemaRef.getASTContext())
7640       MSPropertyRefExpr(Base.get(), PD, E->isArrow(),
7641                         SemaRef.getASTContext().PseudoObjectTy, VK_LValue,
7642                         QualifierLoc, E->getMemberLoc());
7643 }
7644 
7645 template <typename Derived>
7646 ExprResult TreeTransform<Derived>::TransformMSPropertySubscriptExpr(
7647     MSPropertySubscriptExpr *E) {
7648   auto BaseRes = getDerived().TransformExpr(E->getBase());
7649   if (BaseRes.isInvalid())
7650     return ExprError();
7651   auto IdxRes = getDerived().TransformExpr(E->getIdx());
7652   if (IdxRes.isInvalid())
7653     return ExprError();
7654 
7655   if (!getDerived().AlwaysRebuild() &&
7656       BaseRes.get() == E->getBase() &&
7657       IdxRes.get() == E->getIdx())
7658     return E;
7659 
7660   return getDerived().RebuildArraySubscriptExpr(
7661       BaseRes.get(), SourceLocation(), IdxRes.get(), E->getRBracketLoc());
7662 }
7663 
7664 template <typename Derived>
7665 StmtResult TreeTransform<Derived>::TransformSEHTryStmt(SEHTryStmt *S) {
7666   StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock());
7667   if (TryBlock.isInvalid())
7668     return StmtError();
7669 
7670   StmtResult Handler = getDerived().TransformSEHHandler(S->getHandler());
7671   if (Handler.isInvalid())
7672     return StmtError();
7673 
7674   if (!getDerived().AlwaysRebuild() && TryBlock.get() == S->getTryBlock() &&
7675       Handler.get() == S->getHandler())
7676     return S;
7677 
7678   return getDerived().RebuildSEHTryStmt(S->getIsCXXTry(), S->getTryLoc(),
7679                                         TryBlock.get(), Handler.get());
7680 }
7681 
7682 template <typename Derived>
7683 StmtResult TreeTransform<Derived>::TransformSEHFinallyStmt(SEHFinallyStmt *S) {
7684   StmtResult Block = getDerived().TransformCompoundStmt(S->getBlock());
7685   if (Block.isInvalid())
7686     return StmtError();
7687 
7688   return getDerived().RebuildSEHFinallyStmt(S->getFinallyLoc(), Block.get());
7689 }
7690 
7691 template <typename Derived>
7692 StmtResult TreeTransform<Derived>::TransformSEHExceptStmt(SEHExceptStmt *S) {
7693   ExprResult FilterExpr = getDerived().TransformExpr(S->getFilterExpr());
7694   if (FilterExpr.isInvalid())
7695     return StmtError();
7696 
7697   StmtResult Block = getDerived().TransformCompoundStmt(S->getBlock());
7698   if (Block.isInvalid())
7699     return StmtError();
7700 
7701   return getDerived().RebuildSEHExceptStmt(S->getExceptLoc(), FilterExpr.get(),
7702                                            Block.get());
7703 }
7704 
7705 template <typename Derived>
7706 StmtResult TreeTransform<Derived>::TransformSEHHandler(Stmt *Handler) {
7707   if (isa<SEHFinallyStmt>(Handler))
7708     return getDerived().TransformSEHFinallyStmt(cast<SEHFinallyStmt>(Handler));
7709   else
7710     return getDerived().TransformSEHExceptStmt(cast<SEHExceptStmt>(Handler));
7711 }
7712 
7713 template<typename Derived>
7714 StmtResult
7715 TreeTransform<Derived>::TransformSEHLeaveStmt(SEHLeaveStmt *S) {
7716   return S;
7717 }
7718 
7719 //===----------------------------------------------------------------------===//
7720 // OpenMP directive transformation
7721 //===----------------------------------------------------------------------===//
7722 template <typename Derived>
7723 StmtResult TreeTransform<Derived>::TransformOMPExecutableDirective(
7724     OMPExecutableDirective *D) {
7725 
7726   // Transform the clauses
7727   llvm::SmallVector<OMPClause *, 16> TClauses;
7728   ArrayRef<OMPClause *> Clauses = D->clauses();
7729   TClauses.reserve(Clauses.size());
7730   for (ArrayRef<OMPClause *>::iterator I = Clauses.begin(), E = Clauses.end();
7731        I != E; ++I) {
7732     if (*I) {
7733       getDerived().getSema().StartOpenMPClause((*I)->getClauseKind());
7734       OMPClause *Clause = getDerived().TransformOMPClause(*I);
7735       getDerived().getSema().EndOpenMPClause();
7736       if (Clause)
7737         TClauses.push_back(Clause);
7738     } else {
7739       TClauses.push_back(nullptr);
7740     }
7741   }
7742   StmtResult AssociatedStmt;
7743   if (D->hasAssociatedStmt() && D->getAssociatedStmt()) {
7744     getDerived().getSema().ActOnOpenMPRegionStart(D->getDirectiveKind(),
7745                                                   /*CurScope=*/nullptr);
7746     StmtResult Body;
7747     {
7748       Sema::CompoundScopeRAII CompoundScope(getSema());
7749       Stmt *CS = D->getInnermostCapturedStmt()->getCapturedStmt();
7750       Body = getDerived().TransformStmt(CS);
7751     }
7752     AssociatedStmt =
7753         getDerived().getSema().ActOnOpenMPRegionEnd(Body, TClauses);
7754     if (AssociatedStmt.isInvalid()) {
7755       return StmtError();
7756     }
7757   }
7758   if (TClauses.size() != Clauses.size()) {
7759     return StmtError();
7760   }
7761 
7762   // Transform directive name for 'omp critical' directive.
7763   DeclarationNameInfo DirName;
7764   if (D->getDirectiveKind() == OMPD_critical) {
7765     DirName = cast<OMPCriticalDirective>(D)->getDirectiveName();
7766     DirName = getDerived().TransformDeclarationNameInfo(DirName);
7767   }
7768   OpenMPDirectiveKind CancelRegion = OMPD_unknown;
7769   if (D->getDirectiveKind() == OMPD_cancellation_point) {
7770     CancelRegion = cast<OMPCancellationPointDirective>(D)->getCancelRegion();
7771   } else if (D->getDirectiveKind() == OMPD_cancel) {
7772     CancelRegion = cast<OMPCancelDirective>(D)->getCancelRegion();
7773   }
7774 
7775   return getDerived().RebuildOMPExecutableDirective(
7776       D->getDirectiveKind(), DirName, CancelRegion, TClauses,
7777       AssociatedStmt.get(), D->getBeginLoc(), D->getEndLoc());
7778 }
7779 
7780 template <typename Derived>
7781 StmtResult
7782 TreeTransform<Derived>::TransformOMPParallelDirective(OMPParallelDirective *D) {
7783   DeclarationNameInfo DirName;
7784   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel, DirName, nullptr,
7785                                              D->getBeginLoc());
7786   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7787   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7788   return Res;
7789 }
7790 
7791 template <typename Derived>
7792 StmtResult
7793 TreeTransform<Derived>::TransformOMPSimdDirective(OMPSimdDirective *D) {
7794   DeclarationNameInfo DirName;
7795   getDerived().getSema().StartOpenMPDSABlock(OMPD_simd, DirName, nullptr,
7796                                              D->getBeginLoc());
7797   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7798   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7799   return Res;
7800 }
7801 
7802 template <typename Derived>
7803 StmtResult
7804 TreeTransform<Derived>::TransformOMPForDirective(OMPForDirective *D) {
7805   DeclarationNameInfo DirName;
7806   getDerived().getSema().StartOpenMPDSABlock(OMPD_for, DirName, nullptr,
7807                                              D->getBeginLoc());
7808   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7809   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7810   return Res;
7811 }
7812 
7813 template <typename Derived>
7814 StmtResult
7815 TreeTransform<Derived>::TransformOMPForSimdDirective(OMPForSimdDirective *D) {
7816   DeclarationNameInfo DirName;
7817   getDerived().getSema().StartOpenMPDSABlock(OMPD_for_simd, DirName, nullptr,
7818                                              D->getBeginLoc());
7819   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7820   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7821   return Res;
7822 }
7823 
7824 template <typename Derived>
7825 StmtResult
7826 TreeTransform<Derived>::TransformOMPSectionsDirective(OMPSectionsDirective *D) {
7827   DeclarationNameInfo DirName;
7828   getDerived().getSema().StartOpenMPDSABlock(OMPD_sections, DirName, nullptr,
7829                                              D->getBeginLoc());
7830   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7831   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7832   return Res;
7833 }
7834 
7835 template <typename Derived>
7836 StmtResult
7837 TreeTransform<Derived>::TransformOMPSectionDirective(OMPSectionDirective *D) {
7838   DeclarationNameInfo DirName;
7839   getDerived().getSema().StartOpenMPDSABlock(OMPD_section, DirName, nullptr,
7840                                              D->getBeginLoc());
7841   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7842   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7843   return Res;
7844 }
7845 
7846 template <typename Derived>
7847 StmtResult
7848 TreeTransform<Derived>::TransformOMPSingleDirective(OMPSingleDirective *D) {
7849   DeclarationNameInfo DirName;
7850   getDerived().getSema().StartOpenMPDSABlock(OMPD_single, DirName, nullptr,
7851                                              D->getBeginLoc());
7852   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7853   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7854   return Res;
7855 }
7856 
7857 template <typename Derived>
7858 StmtResult
7859 TreeTransform<Derived>::TransformOMPMasterDirective(OMPMasterDirective *D) {
7860   DeclarationNameInfo DirName;
7861   getDerived().getSema().StartOpenMPDSABlock(OMPD_master, DirName, nullptr,
7862                                              D->getBeginLoc());
7863   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7864   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7865   return Res;
7866 }
7867 
7868 template <typename Derived>
7869 StmtResult
7870 TreeTransform<Derived>::TransformOMPCriticalDirective(OMPCriticalDirective *D) {
7871   getDerived().getSema().StartOpenMPDSABlock(
7872       OMPD_critical, D->getDirectiveName(), nullptr, D->getBeginLoc());
7873   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7874   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7875   return Res;
7876 }
7877 
7878 template <typename Derived>
7879 StmtResult TreeTransform<Derived>::TransformOMPParallelForDirective(
7880     OMPParallelForDirective *D) {
7881   DeclarationNameInfo DirName;
7882   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_for, DirName,
7883                                              nullptr, D->getBeginLoc());
7884   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7885   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7886   return Res;
7887 }
7888 
7889 template <typename Derived>
7890 StmtResult TreeTransform<Derived>::TransformOMPParallelForSimdDirective(
7891     OMPParallelForSimdDirective *D) {
7892   DeclarationNameInfo DirName;
7893   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_for_simd, DirName,
7894                                              nullptr, D->getBeginLoc());
7895   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7896   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7897   return Res;
7898 }
7899 
7900 template <typename Derived>
7901 StmtResult TreeTransform<Derived>::TransformOMPParallelSectionsDirective(
7902     OMPParallelSectionsDirective *D) {
7903   DeclarationNameInfo DirName;
7904   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_sections, DirName,
7905                                              nullptr, D->getBeginLoc());
7906   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7907   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7908   return Res;
7909 }
7910 
7911 template <typename Derived>
7912 StmtResult
7913 TreeTransform<Derived>::TransformOMPTaskDirective(OMPTaskDirective *D) {
7914   DeclarationNameInfo DirName;
7915   getDerived().getSema().StartOpenMPDSABlock(OMPD_task, DirName, nullptr,
7916                                              D->getBeginLoc());
7917   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7918   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7919   return Res;
7920 }
7921 
7922 template <typename Derived>
7923 StmtResult TreeTransform<Derived>::TransformOMPTaskyieldDirective(
7924     OMPTaskyieldDirective *D) {
7925   DeclarationNameInfo DirName;
7926   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskyield, DirName, nullptr,
7927                                              D->getBeginLoc());
7928   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7929   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7930   return Res;
7931 }
7932 
7933 template <typename Derived>
7934 StmtResult
7935 TreeTransform<Derived>::TransformOMPBarrierDirective(OMPBarrierDirective *D) {
7936   DeclarationNameInfo DirName;
7937   getDerived().getSema().StartOpenMPDSABlock(OMPD_barrier, DirName, nullptr,
7938                                              D->getBeginLoc());
7939   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7940   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7941   return Res;
7942 }
7943 
7944 template <typename Derived>
7945 StmtResult
7946 TreeTransform<Derived>::TransformOMPTaskwaitDirective(OMPTaskwaitDirective *D) {
7947   DeclarationNameInfo DirName;
7948   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskwait, DirName, nullptr,
7949                                              D->getBeginLoc());
7950   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7951   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7952   return Res;
7953 }
7954 
7955 template <typename Derived>
7956 StmtResult TreeTransform<Derived>::TransformOMPTaskgroupDirective(
7957     OMPTaskgroupDirective *D) {
7958   DeclarationNameInfo DirName;
7959   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskgroup, DirName, nullptr,
7960                                              D->getBeginLoc());
7961   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7962   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7963   return Res;
7964 }
7965 
7966 template <typename Derived>
7967 StmtResult
7968 TreeTransform<Derived>::TransformOMPFlushDirective(OMPFlushDirective *D) {
7969   DeclarationNameInfo DirName;
7970   getDerived().getSema().StartOpenMPDSABlock(OMPD_flush, DirName, nullptr,
7971                                              D->getBeginLoc());
7972   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7973   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7974   return Res;
7975 }
7976 
7977 template <typename Derived>
7978 StmtResult
7979 TreeTransform<Derived>::TransformOMPOrderedDirective(OMPOrderedDirective *D) {
7980   DeclarationNameInfo DirName;
7981   getDerived().getSema().StartOpenMPDSABlock(OMPD_ordered, DirName, nullptr,
7982                                              D->getBeginLoc());
7983   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7984   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7985   return Res;
7986 }
7987 
7988 template <typename Derived>
7989 StmtResult
7990 TreeTransform<Derived>::TransformOMPAtomicDirective(OMPAtomicDirective *D) {
7991   DeclarationNameInfo DirName;
7992   getDerived().getSema().StartOpenMPDSABlock(OMPD_atomic, DirName, nullptr,
7993                                              D->getBeginLoc());
7994   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7995   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7996   return Res;
7997 }
7998 
7999 template <typename Derived>
8000 StmtResult
8001 TreeTransform<Derived>::TransformOMPTargetDirective(OMPTargetDirective *D) {
8002   DeclarationNameInfo DirName;
8003   getDerived().getSema().StartOpenMPDSABlock(OMPD_target, DirName, nullptr,
8004                                              D->getBeginLoc());
8005   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8006   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8007   return Res;
8008 }
8009 
8010 template <typename Derived>
8011 StmtResult TreeTransform<Derived>::TransformOMPTargetDataDirective(
8012     OMPTargetDataDirective *D) {
8013   DeclarationNameInfo DirName;
8014   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_data, DirName, nullptr,
8015                                              D->getBeginLoc());
8016   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8017   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8018   return Res;
8019 }
8020 
8021 template <typename Derived>
8022 StmtResult TreeTransform<Derived>::TransformOMPTargetEnterDataDirective(
8023     OMPTargetEnterDataDirective *D) {
8024   DeclarationNameInfo DirName;
8025   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_enter_data, DirName,
8026                                              nullptr, D->getBeginLoc());
8027   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8028   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8029   return Res;
8030 }
8031 
8032 template <typename Derived>
8033 StmtResult TreeTransform<Derived>::TransformOMPTargetExitDataDirective(
8034     OMPTargetExitDataDirective *D) {
8035   DeclarationNameInfo DirName;
8036   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_exit_data, DirName,
8037                                              nullptr, D->getBeginLoc());
8038   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8039   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8040   return Res;
8041 }
8042 
8043 template <typename Derived>
8044 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelDirective(
8045     OMPTargetParallelDirective *D) {
8046   DeclarationNameInfo DirName;
8047   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel, DirName,
8048                                              nullptr, D->getBeginLoc());
8049   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8050   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8051   return Res;
8052 }
8053 
8054 template <typename Derived>
8055 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelForDirective(
8056     OMPTargetParallelForDirective *D) {
8057   DeclarationNameInfo DirName;
8058   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel_for, DirName,
8059                                              nullptr, D->getBeginLoc());
8060   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8061   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8062   return Res;
8063 }
8064 
8065 template <typename Derived>
8066 StmtResult TreeTransform<Derived>::TransformOMPTargetUpdateDirective(
8067     OMPTargetUpdateDirective *D) {
8068   DeclarationNameInfo DirName;
8069   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_update, DirName,
8070                                              nullptr, D->getBeginLoc());
8071   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8072   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8073   return Res;
8074 }
8075 
8076 template <typename Derived>
8077 StmtResult
8078 TreeTransform<Derived>::TransformOMPTeamsDirective(OMPTeamsDirective *D) {
8079   DeclarationNameInfo DirName;
8080   getDerived().getSema().StartOpenMPDSABlock(OMPD_teams, DirName, nullptr,
8081                                              D->getBeginLoc());
8082   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8083   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8084   return Res;
8085 }
8086 
8087 template <typename Derived>
8088 StmtResult TreeTransform<Derived>::TransformOMPCancellationPointDirective(
8089     OMPCancellationPointDirective *D) {
8090   DeclarationNameInfo DirName;
8091   getDerived().getSema().StartOpenMPDSABlock(OMPD_cancellation_point, DirName,
8092                                              nullptr, D->getBeginLoc());
8093   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8094   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8095   return Res;
8096 }
8097 
8098 template <typename Derived>
8099 StmtResult
8100 TreeTransform<Derived>::TransformOMPCancelDirective(OMPCancelDirective *D) {
8101   DeclarationNameInfo DirName;
8102   getDerived().getSema().StartOpenMPDSABlock(OMPD_cancel, DirName, nullptr,
8103                                              D->getBeginLoc());
8104   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8105   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8106   return Res;
8107 }
8108 
8109 template <typename Derived>
8110 StmtResult
8111 TreeTransform<Derived>::TransformOMPTaskLoopDirective(OMPTaskLoopDirective *D) {
8112   DeclarationNameInfo DirName;
8113   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskloop, DirName, nullptr,
8114                                              D->getBeginLoc());
8115   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8116   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8117   return Res;
8118 }
8119 
8120 template <typename Derived>
8121 StmtResult TreeTransform<Derived>::TransformOMPTaskLoopSimdDirective(
8122     OMPTaskLoopSimdDirective *D) {
8123   DeclarationNameInfo DirName;
8124   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskloop_simd, DirName,
8125                                              nullptr, D->getBeginLoc());
8126   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8127   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8128   return Res;
8129 }
8130 
8131 template <typename Derived>
8132 StmtResult TreeTransform<Derived>::TransformOMPDistributeDirective(
8133     OMPDistributeDirective *D) {
8134   DeclarationNameInfo DirName;
8135   getDerived().getSema().StartOpenMPDSABlock(OMPD_distribute, DirName, nullptr,
8136                                              D->getBeginLoc());
8137   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8138   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8139   return Res;
8140 }
8141 
8142 template <typename Derived>
8143 StmtResult TreeTransform<Derived>::TransformOMPDistributeParallelForDirective(
8144     OMPDistributeParallelForDirective *D) {
8145   DeclarationNameInfo DirName;
8146   getDerived().getSema().StartOpenMPDSABlock(
8147       OMPD_distribute_parallel_for, DirName, nullptr, D->getBeginLoc());
8148   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8149   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8150   return Res;
8151 }
8152 
8153 template <typename Derived>
8154 StmtResult
8155 TreeTransform<Derived>::TransformOMPDistributeParallelForSimdDirective(
8156     OMPDistributeParallelForSimdDirective *D) {
8157   DeclarationNameInfo DirName;
8158   getDerived().getSema().StartOpenMPDSABlock(
8159       OMPD_distribute_parallel_for_simd, DirName, nullptr, D->getBeginLoc());
8160   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8161   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8162   return Res;
8163 }
8164 
8165 template <typename Derived>
8166 StmtResult TreeTransform<Derived>::TransformOMPDistributeSimdDirective(
8167     OMPDistributeSimdDirective *D) {
8168   DeclarationNameInfo DirName;
8169   getDerived().getSema().StartOpenMPDSABlock(OMPD_distribute_simd, DirName,
8170                                              nullptr, D->getBeginLoc());
8171   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8172   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8173   return Res;
8174 }
8175 
8176 template <typename Derived>
8177 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelForSimdDirective(
8178     OMPTargetParallelForSimdDirective *D) {
8179   DeclarationNameInfo DirName;
8180   getDerived().getSema().StartOpenMPDSABlock(
8181       OMPD_target_parallel_for_simd, DirName, nullptr, D->getBeginLoc());
8182   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8183   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8184   return Res;
8185 }
8186 
8187 template <typename Derived>
8188 StmtResult TreeTransform<Derived>::TransformOMPTargetSimdDirective(
8189     OMPTargetSimdDirective *D) {
8190   DeclarationNameInfo DirName;
8191   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_simd, DirName, nullptr,
8192                                              D->getBeginLoc());
8193   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8194   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8195   return Res;
8196 }
8197 
8198 template <typename Derived>
8199 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeDirective(
8200     OMPTeamsDistributeDirective *D) {
8201   DeclarationNameInfo DirName;
8202   getDerived().getSema().StartOpenMPDSABlock(OMPD_teams_distribute, DirName,
8203                                              nullptr, D->getBeginLoc());
8204   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8205   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8206   return Res;
8207 }
8208 
8209 template <typename Derived>
8210 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeSimdDirective(
8211     OMPTeamsDistributeSimdDirective *D) {
8212   DeclarationNameInfo DirName;
8213   getDerived().getSema().StartOpenMPDSABlock(
8214       OMPD_teams_distribute_simd, DirName, nullptr, D->getBeginLoc());
8215   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8216   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8217   return Res;
8218 }
8219 
8220 template <typename Derived>
8221 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeParallelForSimdDirective(
8222     OMPTeamsDistributeParallelForSimdDirective *D) {
8223   DeclarationNameInfo DirName;
8224   getDerived().getSema().StartOpenMPDSABlock(
8225       OMPD_teams_distribute_parallel_for_simd, DirName, nullptr,
8226       D->getBeginLoc());
8227   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8228   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8229   return Res;
8230 }
8231 
8232 template <typename Derived>
8233 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeParallelForDirective(
8234     OMPTeamsDistributeParallelForDirective *D) {
8235   DeclarationNameInfo DirName;
8236   getDerived().getSema().StartOpenMPDSABlock(
8237       OMPD_teams_distribute_parallel_for, DirName, nullptr, D->getBeginLoc());
8238   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8239   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8240   return Res;
8241 }
8242 
8243 template <typename Derived>
8244 StmtResult TreeTransform<Derived>::TransformOMPTargetTeamsDirective(
8245     OMPTargetTeamsDirective *D) {
8246   DeclarationNameInfo DirName;
8247   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_teams, DirName,
8248                                              nullptr, D->getBeginLoc());
8249   auto Res = getDerived().TransformOMPExecutableDirective(D);
8250   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8251   return Res;
8252 }
8253 
8254 template <typename Derived>
8255 StmtResult TreeTransform<Derived>::TransformOMPTargetTeamsDistributeDirective(
8256     OMPTargetTeamsDistributeDirective *D) {
8257   DeclarationNameInfo DirName;
8258   getDerived().getSema().StartOpenMPDSABlock(
8259       OMPD_target_teams_distribute, DirName, nullptr, D->getBeginLoc());
8260   auto Res = getDerived().TransformOMPExecutableDirective(D);
8261   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8262   return Res;
8263 }
8264 
8265 template <typename Derived>
8266 StmtResult
8267 TreeTransform<Derived>::TransformOMPTargetTeamsDistributeParallelForDirective(
8268     OMPTargetTeamsDistributeParallelForDirective *D) {
8269   DeclarationNameInfo DirName;
8270   getDerived().getSema().StartOpenMPDSABlock(
8271       OMPD_target_teams_distribute_parallel_for, DirName, nullptr,
8272       D->getBeginLoc());
8273   auto Res = getDerived().TransformOMPExecutableDirective(D);
8274   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8275   return Res;
8276 }
8277 
8278 template <typename Derived>
8279 StmtResult TreeTransform<Derived>::
8280     TransformOMPTargetTeamsDistributeParallelForSimdDirective(
8281         OMPTargetTeamsDistributeParallelForSimdDirective *D) {
8282   DeclarationNameInfo DirName;
8283   getDerived().getSema().StartOpenMPDSABlock(
8284       OMPD_target_teams_distribute_parallel_for_simd, DirName, nullptr,
8285       D->getBeginLoc());
8286   auto Res = getDerived().TransformOMPExecutableDirective(D);
8287   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8288   return Res;
8289 }
8290 
8291 template <typename Derived>
8292 StmtResult
8293 TreeTransform<Derived>::TransformOMPTargetTeamsDistributeSimdDirective(
8294     OMPTargetTeamsDistributeSimdDirective *D) {
8295   DeclarationNameInfo DirName;
8296   getDerived().getSema().StartOpenMPDSABlock(
8297       OMPD_target_teams_distribute_simd, DirName, nullptr, D->getBeginLoc());
8298   auto Res = getDerived().TransformOMPExecutableDirective(D);
8299   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8300   return Res;
8301 }
8302 
8303 
8304 //===----------------------------------------------------------------------===//
8305 // OpenMP clause transformation
8306 //===----------------------------------------------------------------------===//
8307 template <typename Derived>
8308 OMPClause *TreeTransform<Derived>::TransformOMPIfClause(OMPIfClause *C) {
8309   ExprResult Cond = getDerived().TransformExpr(C->getCondition());
8310   if (Cond.isInvalid())
8311     return nullptr;
8312   return getDerived().RebuildOMPIfClause(
8313       C->getNameModifier(), Cond.get(), C->getBeginLoc(), C->getLParenLoc(),
8314       C->getNameModifierLoc(), C->getColonLoc(), C->getEndLoc());
8315 }
8316 
8317 template <typename Derived>
8318 OMPClause *TreeTransform<Derived>::TransformOMPFinalClause(OMPFinalClause *C) {
8319   ExprResult Cond = getDerived().TransformExpr(C->getCondition());
8320   if (Cond.isInvalid())
8321     return nullptr;
8322   return getDerived().RebuildOMPFinalClause(Cond.get(), C->getBeginLoc(),
8323                                             C->getLParenLoc(), C->getEndLoc());
8324 }
8325 
8326 template <typename Derived>
8327 OMPClause *
8328 TreeTransform<Derived>::TransformOMPNumThreadsClause(OMPNumThreadsClause *C) {
8329   ExprResult NumThreads = getDerived().TransformExpr(C->getNumThreads());
8330   if (NumThreads.isInvalid())
8331     return nullptr;
8332   return getDerived().RebuildOMPNumThreadsClause(
8333       NumThreads.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
8334 }
8335 
8336 template <typename Derived>
8337 OMPClause *
8338 TreeTransform<Derived>::TransformOMPSafelenClause(OMPSafelenClause *C) {
8339   ExprResult E = getDerived().TransformExpr(C->getSafelen());
8340   if (E.isInvalid())
8341     return nullptr;
8342   return getDerived().RebuildOMPSafelenClause(
8343       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
8344 }
8345 
8346 template <typename Derived>
8347 OMPClause *
8348 TreeTransform<Derived>::TransformOMPSimdlenClause(OMPSimdlenClause *C) {
8349   ExprResult E = getDerived().TransformExpr(C->getSimdlen());
8350   if (E.isInvalid())
8351     return nullptr;
8352   return getDerived().RebuildOMPSimdlenClause(
8353       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
8354 }
8355 
8356 template <typename Derived>
8357 OMPClause *
8358 TreeTransform<Derived>::TransformOMPCollapseClause(OMPCollapseClause *C) {
8359   ExprResult E = getDerived().TransformExpr(C->getNumForLoops());
8360   if (E.isInvalid())
8361     return nullptr;
8362   return getDerived().RebuildOMPCollapseClause(
8363       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
8364 }
8365 
8366 template <typename Derived>
8367 OMPClause *
8368 TreeTransform<Derived>::TransformOMPDefaultClause(OMPDefaultClause *C) {
8369   return getDerived().RebuildOMPDefaultClause(
8370       C->getDefaultKind(), C->getDefaultKindKwLoc(), C->getBeginLoc(),
8371       C->getLParenLoc(), C->getEndLoc());
8372 }
8373 
8374 template <typename Derived>
8375 OMPClause *
8376 TreeTransform<Derived>::TransformOMPProcBindClause(OMPProcBindClause *C) {
8377   return getDerived().RebuildOMPProcBindClause(
8378       C->getProcBindKind(), C->getProcBindKindKwLoc(), C->getBeginLoc(),
8379       C->getLParenLoc(), C->getEndLoc());
8380 }
8381 
8382 template <typename Derived>
8383 OMPClause *
8384 TreeTransform<Derived>::TransformOMPScheduleClause(OMPScheduleClause *C) {
8385   ExprResult E = getDerived().TransformExpr(C->getChunkSize());
8386   if (E.isInvalid())
8387     return nullptr;
8388   return getDerived().RebuildOMPScheduleClause(
8389       C->getFirstScheduleModifier(), C->getSecondScheduleModifier(),
8390       C->getScheduleKind(), E.get(), C->getBeginLoc(), C->getLParenLoc(),
8391       C->getFirstScheduleModifierLoc(), C->getSecondScheduleModifierLoc(),
8392       C->getScheduleKindLoc(), C->getCommaLoc(), C->getEndLoc());
8393 }
8394 
8395 template <typename Derived>
8396 OMPClause *
8397 TreeTransform<Derived>::TransformOMPOrderedClause(OMPOrderedClause *C) {
8398   ExprResult E;
8399   if (auto *Num = C->getNumForLoops()) {
8400     E = getDerived().TransformExpr(Num);
8401     if (E.isInvalid())
8402       return nullptr;
8403   }
8404   return getDerived().RebuildOMPOrderedClause(C->getBeginLoc(), C->getEndLoc(),
8405                                               C->getLParenLoc(), E.get());
8406 }
8407 
8408 template <typename Derived>
8409 OMPClause *
8410 TreeTransform<Derived>::TransformOMPNowaitClause(OMPNowaitClause *C) {
8411   // No need to rebuild this clause, no template-dependent parameters.
8412   return C;
8413 }
8414 
8415 template <typename Derived>
8416 OMPClause *
8417 TreeTransform<Derived>::TransformOMPUntiedClause(OMPUntiedClause *C) {
8418   // No need to rebuild this clause, no template-dependent parameters.
8419   return C;
8420 }
8421 
8422 template <typename Derived>
8423 OMPClause *
8424 TreeTransform<Derived>::TransformOMPMergeableClause(OMPMergeableClause *C) {
8425   // No need to rebuild this clause, no template-dependent parameters.
8426   return C;
8427 }
8428 
8429 template <typename Derived>
8430 OMPClause *TreeTransform<Derived>::TransformOMPReadClause(OMPReadClause *C) {
8431   // No need to rebuild this clause, no template-dependent parameters.
8432   return C;
8433 }
8434 
8435 template <typename Derived>
8436 OMPClause *TreeTransform<Derived>::TransformOMPWriteClause(OMPWriteClause *C) {
8437   // No need to rebuild this clause, no template-dependent parameters.
8438   return C;
8439 }
8440 
8441 template <typename Derived>
8442 OMPClause *
8443 TreeTransform<Derived>::TransformOMPUpdateClause(OMPUpdateClause *C) {
8444   // No need to rebuild this clause, no template-dependent parameters.
8445   return C;
8446 }
8447 
8448 template <typename Derived>
8449 OMPClause *
8450 TreeTransform<Derived>::TransformOMPCaptureClause(OMPCaptureClause *C) {
8451   // No need to rebuild this clause, no template-dependent parameters.
8452   return C;
8453 }
8454 
8455 template <typename Derived>
8456 OMPClause *
8457 TreeTransform<Derived>::TransformOMPSeqCstClause(OMPSeqCstClause *C) {
8458   // No need to rebuild this clause, no template-dependent parameters.
8459   return C;
8460 }
8461 
8462 template <typename Derived>
8463 OMPClause *
8464 TreeTransform<Derived>::TransformOMPThreadsClause(OMPThreadsClause *C) {
8465   // No need to rebuild this clause, no template-dependent parameters.
8466   return C;
8467 }
8468 
8469 template <typename Derived>
8470 OMPClause *TreeTransform<Derived>::TransformOMPSIMDClause(OMPSIMDClause *C) {
8471   // No need to rebuild this clause, no template-dependent parameters.
8472   return C;
8473 }
8474 
8475 template <typename Derived>
8476 OMPClause *
8477 TreeTransform<Derived>::TransformOMPNogroupClause(OMPNogroupClause *C) {
8478   // No need to rebuild this clause, no template-dependent parameters.
8479   return C;
8480 }
8481 
8482 template <typename Derived>
8483 OMPClause *TreeTransform<Derived>::TransformOMPUnifiedAddressClause(
8484     OMPUnifiedAddressClause *C) {
8485   llvm_unreachable("unified_address clause cannot appear in dependent context");
8486 }
8487 
8488 template <typename Derived>
8489 OMPClause *TreeTransform<Derived>::TransformOMPUnifiedSharedMemoryClause(
8490     OMPUnifiedSharedMemoryClause *C) {
8491   llvm_unreachable(
8492       "unified_shared_memory clause cannot appear in dependent context");
8493 }
8494 
8495 template <typename Derived>
8496 OMPClause *TreeTransform<Derived>::TransformOMPReverseOffloadClause(
8497     OMPReverseOffloadClause *C) {
8498   llvm_unreachable("reverse_offload clause cannot appear in dependent context");
8499 }
8500 
8501 template <typename Derived>
8502 OMPClause *TreeTransform<Derived>::TransformOMPDynamicAllocatorsClause(
8503     OMPDynamicAllocatorsClause *C) {
8504   llvm_unreachable(
8505       "dynamic_allocators clause cannot appear in dependent context");
8506 }
8507 
8508 template <typename Derived>
8509 OMPClause *TreeTransform<Derived>::TransformOMPAtomicDefaultMemOrderClause(
8510     OMPAtomicDefaultMemOrderClause *C) {
8511   llvm_unreachable(
8512       "atomic_default_mem_order clause cannot appear in dependent context");
8513 }
8514 
8515 template <typename Derived>
8516 OMPClause *
8517 TreeTransform<Derived>::TransformOMPPrivateClause(OMPPrivateClause *C) {
8518   llvm::SmallVector<Expr *, 16> Vars;
8519   Vars.reserve(C->varlist_size());
8520   for (auto *VE : C->varlists()) {
8521     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8522     if (EVar.isInvalid())
8523       return nullptr;
8524     Vars.push_back(EVar.get());
8525   }
8526   return getDerived().RebuildOMPPrivateClause(
8527       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
8528 }
8529 
8530 template <typename Derived>
8531 OMPClause *TreeTransform<Derived>::TransformOMPFirstprivateClause(
8532     OMPFirstprivateClause *C) {
8533   llvm::SmallVector<Expr *, 16> Vars;
8534   Vars.reserve(C->varlist_size());
8535   for (auto *VE : C->varlists()) {
8536     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8537     if (EVar.isInvalid())
8538       return nullptr;
8539     Vars.push_back(EVar.get());
8540   }
8541   return getDerived().RebuildOMPFirstprivateClause(
8542       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
8543 }
8544 
8545 template <typename Derived>
8546 OMPClause *
8547 TreeTransform<Derived>::TransformOMPLastprivateClause(OMPLastprivateClause *C) {
8548   llvm::SmallVector<Expr *, 16> Vars;
8549   Vars.reserve(C->varlist_size());
8550   for (auto *VE : C->varlists()) {
8551     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8552     if (EVar.isInvalid())
8553       return nullptr;
8554     Vars.push_back(EVar.get());
8555   }
8556   return getDerived().RebuildOMPLastprivateClause(
8557       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
8558 }
8559 
8560 template <typename Derived>
8561 OMPClause *
8562 TreeTransform<Derived>::TransformOMPSharedClause(OMPSharedClause *C) {
8563   llvm::SmallVector<Expr *, 16> Vars;
8564   Vars.reserve(C->varlist_size());
8565   for (auto *VE : C->varlists()) {
8566     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8567     if (EVar.isInvalid())
8568       return nullptr;
8569     Vars.push_back(EVar.get());
8570   }
8571   return getDerived().RebuildOMPSharedClause(Vars, C->getBeginLoc(),
8572                                              C->getLParenLoc(), C->getEndLoc());
8573 }
8574 
8575 template <typename Derived>
8576 OMPClause *
8577 TreeTransform<Derived>::TransformOMPReductionClause(OMPReductionClause *C) {
8578   llvm::SmallVector<Expr *, 16> Vars;
8579   Vars.reserve(C->varlist_size());
8580   for (auto *VE : C->varlists()) {
8581     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8582     if (EVar.isInvalid())
8583       return nullptr;
8584     Vars.push_back(EVar.get());
8585   }
8586   CXXScopeSpec ReductionIdScopeSpec;
8587   ReductionIdScopeSpec.Adopt(C->getQualifierLoc());
8588 
8589   DeclarationNameInfo NameInfo = C->getNameInfo();
8590   if (NameInfo.getName()) {
8591     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
8592     if (!NameInfo.getName())
8593       return nullptr;
8594   }
8595   // Build a list of all UDR decls with the same names ranged by the Scopes.
8596   // The Scope boundary is a duplication of the previous decl.
8597   llvm::SmallVector<Expr *, 16> UnresolvedReductions;
8598   for (auto *E : C->reduction_ops()) {
8599     // Transform all the decls.
8600     if (E) {
8601       auto *ULE = cast<UnresolvedLookupExpr>(E);
8602       UnresolvedSet<8> Decls;
8603       for (auto *D : ULE->decls()) {
8604         NamedDecl *InstD =
8605             cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D));
8606         Decls.addDecl(InstD, InstD->getAccess());
8607       }
8608       UnresolvedReductions.push_back(
8609        UnresolvedLookupExpr::Create(
8610           SemaRef.Context, /*NamingClass=*/nullptr,
8611           ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context),
8612           NameInfo, /*ADL=*/true, ULE->isOverloaded(),
8613           Decls.begin(), Decls.end()));
8614     } else
8615       UnresolvedReductions.push_back(nullptr);
8616   }
8617   return getDerived().RebuildOMPReductionClause(
8618       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(),
8619       C->getEndLoc(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions);
8620 }
8621 
8622 template <typename Derived>
8623 OMPClause *TreeTransform<Derived>::TransformOMPTaskReductionClause(
8624     OMPTaskReductionClause *C) {
8625   llvm::SmallVector<Expr *, 16> Vars;
8626   Vars.reserve(C->varlist_size());
8627   for (auto *VE : C->varlists()) {
8628     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8629     if (EVar.isInvalid())
8630       return nullptr;
8631     Vars.push_back(EVar.get());
8632   }
8633   CXXScopeSpec ReductionIdScopeSpec;
8634   ReductionIdScopeSpec.Adopt(C->getQualifierLoc());
8635 
8636   DeclarationNameInfo NameInfo = C->getNameInfo();
8637   if (NameInfo.getName()) {
8638     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
8639     if (!NameInfo.getName())
8640       return nullptr;
8641   }
8642   // Build a list of all UDR decls with the same names ranged by the Scopes.
8643   // The Scope boundary is a duplication of the previous decl.
8644   llvm::SmallVector<Expr *, 16> UnresolvedReductions;
8645   for (auto *E : C->reduction_ops()) {
8646     // Transform all the decls.
8647     if (E) {
8648       auto *ULE = cast<UnresolvedLookupExpr>(E);
8649       UnresolvedSet<8> Decls;
8650       for (auto *D : ULE->decls()) {
8651         NamedDecl *InstD =
8652             cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D));
8653         Decls.addDecl(InstD, InstD->getAccess());
8654       }
8655       UnresolvedReductions.push_back(UnresolvedLookupExpr::Create(
8656           SemaRef.Context, /*NamingClass=*/nullptr,
8657           ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), NameInfo,
8658           /*ADL=*/true, ULE->isOverloaded(), Decls.begin(), Decls.end()));
8659     } else
8660       UnresolvedReductions.push_back(nullptr);
8661   }
8662   return getDerived().RebuildOMPTaskReductionClause(
8663       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(),
8664       C->getEndLoc(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions);
8665 }
8666 
8667 template <typename Derived>
8668 OMPClause *
8669 TreeTransform<Derived>::TransformOMPInReductionClause(OMPInReductionClause *C) {
8670   llvm::SmallVector<Expr *, 16> Vars;
8671   Vars.reserve(C->varlist_size());
8672   for (auto *VE : C->varlists()) {
8673     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8674     if (EVar.isInvalid())
8675       return nullptr;
8676     Vars.push_back(EVar.get());
8677   }
8678   CXXScopeSpec ReductionIdScopeSpec;
8679   ReductionIdScopeSpec.Adopt(C->getQualifierLoc());
8680 
8681   DeclarationNameInfo NameInfo = C->getNameInfo();
8682   if (NameInfo.getName()) {
8683     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
8684     if (!NameInfo.getName())
8685       return nullptr;
8686   }
8687   // Build a list of all UDR decls with the same names ranged by the Scopes.
8688   // The Scope boundary is a duplication of the previous decl.
8689   llvm::SmallVector<Expr *, 16> UnresolvedReductions;
8690   for (auto *E : C->reduction_ops()) {
8691     // Transform all the decls.
8692     if (E) {
8693       auto *ULE = cast<UnresolvedLookupExpr>(E);
8694       UnresolvedSet<8> Decls;
8695       for (auto *D : ULE->decls()) {
8696         NamedDecl *InstD =
8697             cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D));
8698         Decls.addDecl(InstD, InstD->getAccess());
8699       }
8700       UnresolvedReductions.push_back(UnresolvedLookupExpr::Create(
8701           SemaRef.Context, /*NamingClass=*/nullptr,
8702           ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), NameInfo,
8703           /*ADL=*/true, ULE->isOverloaded(), Decls.begin(), Decls.end()));
8704     } else
8705       UnresolvedReductions.push_back(nullptr);
8706   }
8707   return getDerived().RebuildOMPInReductionClause(
8708       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(),
8709       C->getEndLoc(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions);
8710 }
8711 
8712 template <typename Derived>
8713 OMPClause *
8714 TreeTransform<Derived>::TransformOMPLinearClause(OMPLinearClause *C) {
8715   llvm::SmallVector<Expr *, 16> Vars;
8716   Vars.reserve(C->varlist_size());
8717   for (auto *VE : C->varlists()) {
8718     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8719     if (EVar.isInvalid())
8720       return nullptr;
8721     Vars.push_back(EVar.get());
8722   }
8723   ExprResult Step = getDerived().TransformExpr(C->getStep());
8724   if (Step.isInvalid())
8725     return nullptr;
8726   return getDerived().RebuildOMPLinearClause(
8727       Vars, Step.get(), C->getBeginLoc(), C->getLParenLoc(), C->getModifier(),
8728       C->getModifierLoc(), C->getColonLoc(), C->getEndLoc());
8729 }
8730 
8731 template <typename Derived>
8732 OMPClause *
8733 TreeTransform<Derived>::TransformOMPAlignedClause(OMPAlignedClause *C) {
8734   llvm::SmallVector<Expr *, 16> Vars;
8735   Vars.reserve(C->varlist_size());
8736   for (auto *VE : C->varlists()) {
8737     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8738     if (EVar.isInvalid())
8739       return nullptr;
8740     Vars.push_back(EVar.get());
8741   }
8742   ExprResult Alignment = getDerived().TransformExpr(C->getAlignment());
8743   if (Alignment.isInvalid())
8744     return nullptr;
8745   return getDerived().RebuildOMPAlignedClause(
8746       Vars, Alignment.get(), C->getBeginLoc(), C->getLParenLoc(),
8747       C->getColonLoc(), C->getEndLoc());
8748 }
8749 
8750 template <typename Derived>
8751 OMPClause *
8752 TreeTransform<Derived>::TransformOMPCopyinClause(OMPCopyinClause *C) {
8753   llvm::SmallVector<Expr *, 16> Vars;
8754   Vars.reserve(C->varlist_size());
8755   for (auto *VE : C->varlists()) {
8756     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8757     if (EVar.isInvalid())
8758       return nullptr;
8759     Vars.push_back(EVar.get());
8760   }
8761   return getDerived().RebuildOMPCopyinClause(Vars, C->getBeginLoc(),
8762                                              C->getLParenLoc(), C->getEndLoc());
8763 }
8764 
8765 template <typename Derived>
8766 OMPClause *
8767 TreeTransform<Derived>::TransformOMPCopyprivateClause(OMPCopyprivateClause *C) {
8768   llvm::SmallVector<Expr *, 16> Vars;
8769   Vars.reserve(C->varlist_size());
8770   for (auto *VE : C->varlists()) {
8771     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8772     if (EVar.isInvalid())
8773       return nullptr;
8774     Vars.push_back(EVar.get());
8775   }
8776   return getDerived().RebuildOMPCopyprivateClause(
8777       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
8778 }
8779 
8780 template <typename Derived>
8781 OMPClause *TreeTransform<Derived>::TransformOMPFlushClause(OMPFlushClause *C) {
8782   llvm::SmallVector<Expr *, 16> Vars;
8783   Vars.reserve(C->varlist_size());
8784   for (auto *VE : C->varlists()) {
8785     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8786     if (EVar.isInvalid())
8787       return nullptr;
8788     Vars.push_back(EVar.get());
8789   }
8790   return getDerived().RebuildOMPFlushClause(Vars, C->getBeginLoc(),
8791                                             C->getLParenLoc(), C->getEndLoc());
8792 }
8793 
8794 template <typename Derived>
8795 OMPClause *
8796 TreeTransform<Derived>::TransformOMPDependClause(OMPDependClause *C) {
8797   llvm::SmallVector<Expr *, 16> Vars;
8798   Vars.reserve(C->varlist_size());
8799   for (auto *VE : C->varlists()) {
8800     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8801     if (EVar.isInvalid())
8802       return nullptr;
8803     Vars.push_back(EVar.get());
8804   }
8805   return getDerived().RebuildOMPDependClause(
8806       C->getDependencyKind(), C->getDependencyLoc(), C->getColonLoc(), Vars,
8807       C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
8808 }
8809 
8810 template <typename Derived>
8811 OMPClause *
8812 TreeTransform<Derived>::TransformOMPDeviceClause(OMPDeviceClause *C) {
8813   ExprResult E = getDerived().TransformExpr(C->getDevice());
8814   if (E.isInvalid())
8815     return nullptr;
8816   return getDerived().RebuildOMPDeviceClause(E.get(), C->getBeginLoc(),
8817                                              C->getLParenLoc(), C->getEndLoc());
8818 }
8819 
8820 template <typename Derived, class T>
8821 bool transformOMPMappableExprListClause(
8822     TreeTransform<Derived> &TT, OMPMappableExprListClause<T> *C,
8823     llvm::SmallVectorImpl<Expr *> &Vars, CXXScopeSpec &MapperIdScopeSpec,
8824     DeclarationNameInfo &MapperIdInfo,
8825     llvm::SmallVectorImpl<Expr *> &UnresolvedMappers) {
8826   // Transform expressions in the list.
8827   Vars.reserve(C->varlist_size());
8828   for (auto *VE : C->varlists()) {
8829     ExprResult EVar = TT.getDerived().TransformExpr(cast<Expr>(VE));
8830     if (EVar.isInvalid())
8831       return true;
8832     Vars.push_back(EVar.get());
8833   }
8834   // Transform mapper scope specifier and identifier.
8835   NestedNameSpecifierLoc QualifierLoc;
8836   if (C->getMapperQualifierLoc()) {
8837     QualifierLoc = TT.getDerived().TransformNestedNameSpecifierLoc(
8838         C->getMapperQualifierLoc());
8839     if (!QualifierLoc)
8840       return true;
8841   }
8842   MapperIdScopeSpec.Adopt(QualifierLoc);
8843   MapperIdInfo = C->getMapperIdInfo();
8844   if (MapperIdInfo.getName()) {
8845     MapperIdInfo = TT.getDerived().TransformDeclarationNameInfo(MapperIdInfo);
8846     if (!MapperIdInfo.getName())
8847       return true;
8848   }
8849   // Build a list of all candidate OMPDeclareMapperDecls, which is provided by
8850   // the previous user-defined mapper lookup in dependent environment.
8851   for (auto *E : C->mapperlists()) {
8852     // Transform all the decls.
8853     if (E) {
8854       auto *ULE = cast<UnresolvedLookupExpr>(E);
8855       UnresolvedSet<8> Decls;
8856       for (auto *D : ULE->decls()) {
8857         NamedDecl *InstD =
8858             cast<NamedDecl>(TT.getDerived().TransformDecl(E->getExprLoc(), D));
8859         Decls.addDecl(InstD, InstD->getAccess());
8860       }
8861       UnresolvedMappers.push_back(UnresolvedLookupExpr::Create(
8862           TT.getSema().Context, /*NamingClass=*/nullptr,
8863           MapperIdScopeSpec.getWithLocInContext(TT.getSema().Context),
8864           MapperIdInfo, /*ADL=*/true, ULE->isOverloaded(), Decls.begin(),
8865           Decls.end()));
8866     } else {
8867       UnresolvedMappers.push_back(nullptr);
8868     }
8869   }
8870   return false;
8871 }
8872 
8873 template <typename Derived>
8874 OMPClause *TreeTransform<Derived>::TransformOMPMapClause(OMPMapClause *C) {
8875   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
8876   llvm::SmallVector<Expr *, 16> Vars;
8877   CXXScopeSpec MapperIdScopeSpec;
8878   DeclarationNameInfo MapperIdInfo;
8879   llvm::SmallVector<Expr *, 16> UnresolvedMappers;
8880   if (transformOMPMappableExprListClause<Derived, OMPMapClause>(
8881           *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers))
8882     return nullptr;
8883   return getDerived().RebuildOMPMapClause(
8884       C->getMapTypeModifiers(), C->getMapTypeModifiersLoc(), MapperIdScopeSpec,
8885       MapperIdInfo, C->getMapType(), C->isImplicitMapType(), C->getMapLoc(),
8886       C->getColonLoc(), Vars, Locs, UnresolvedMappers);
8887 }
8888 
8889 template <typename Derived>
8890 OMPClause *
8891 TreeTransform<Derived>::TransformOMPNumTeamsClause(OMPNumTeamsClause *C) {
8892   ExprResult E = getDerived().TransformExpr(C->getNumTeams());
8893   if (E.isInvalid())
8894     return nullptr;
8895   return getDerived().RebuildOMPNumTeamsClause(
8896       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
8897 }
8898 
8899 template <typename Derived>
8900 OMPClause *
8901 TreeTransform<Derived>::TransformOMPThreadLimitClause(OMPThreadLimitClause *C) {
8902   ExprResult E = getDerived().TransformExpr(C->getThreadLimit());
8903   if (E.isInvalid())
8904     return nullptr;
8905   return getDerived().RebuildOMPThreadLimitClause(
8906       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
8907 }
8908 
8909 template <typename Derived>
8910 OMPClause *
8911 TreeTransform<Derived>::TransformOMPPriorityClause(OMPPriorityClause *C) {
8912   ExprResult E = getDerived().TransformExpr(C->getPriority());
8913   if (E.isInvalid())
8914     return nullptr;
8915   return getDerived().RebuildOMPPriorityClause(
8916       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
8917 }
8918 
8919 template <typename Derived>
8920 OMPClause *
8921 TreeTransform<Derived>::TransformOMPGrainsizeClause(OMPGrainsizeClause *C) {
8922   ExprResult E = getDerived().TransformExpr(C->getGrainsize());
8923   if (E.isInvalid())
8924     return nullptr;
8925   return getDerived().RebuildOMPGrainsizeClause(
8926       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
8927 }
8928 
8929 template <typename Derived>
8930 OMPClause *
8931 TreeTransform<Derived>::TransformOMPNumTasksClause(OMPNumTasksClause *C) {
8932   ExprResult E = getDerived().TransformExpr(C->getNumTasks());
8933   if (E.isInvalid())
8934     return nullptr;
8935   return getDerived().RebuildOMPNumTasksClause(
8936       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
8937 }
8938 
8939 template <typename Derived>
8940 OMPClause *TreeTransform<Derived>::TransformOMPHintClause(OMPHintClause *C) {
8941   ExprResult E = getDerived().TransformExpr(C->getHint());
8942   if (E.isInvalid())
8943     return nullptr;
8944   return getDerived().RebuildOMPHintClause(E.get(), C->getBeginLoc(),
8945                                            C->getLParenLoc(), C->getEndLoc());
8946 }
8947 
8948 template <typename Derived>
8949 OMPClause *TreeTransform<Derived>::TransformOMPDistScheduleClause(
8950     OMPDistScheduleClause *C) {
8951   ExprResult E = getDerived().TransformExpr(C->getChunkSize());
8952   if (E.isInvalid())
8953     return nullptr;
8954   return getDerived().RebuildOMPDistScheduleClause(
8955       C->getDistScheduleKind(), E.get(), C->getBeginLoc(), C->getLParenLoc(),
8956       C->getDistScheduleKindLoc(), C->getCommaLoc(), C->getEndLoc());
8957 }
8958 
8959 template <typename Derived>
8960 OMPClause *
8961 TreeTransform<Derived>::TransformOMPDefaultmapClause(OMPDefaultmapClause *C) {
8962   return C;
8963 }
8964 
8965 template <typename Derived>
8966 OMPClause *TreeTransform<Derived>::TransformOMPToClause(OMPToClause *C) {
8967   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
8968   llvm::SmallVector<Expr *, 16> Vars;
8969   CXXScopeSpec MapperIdScopeSpec;
8970   DeclarationNameInfo MapperIdInfo;
8971   llvm::SmallVector<Expr *, 16> UnresolvedMappers;
8972   if (transformOMPMappableExprListClause<Derived, OMPToClause>(
8973           *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers))
8974     return nullptr;
8975   return getDerived().RebuildOMPToClause(Vars, MapperIdScopeSpec, MapperIdInfo,
8976                                          Locs, UnresolvedMappers);
8977 }
8978 
8979 template <typename Derived>
8980 OMPClause *TreeTransform<Derived>::TransformOMPFromClause(OMPFromClause *C) {
8981   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
8982   llvm::SmallVector<Expr *, 16> Vars;
8983   CXXScopeSpec MapperIdScopeSpec;
8984   DeclarationNameInfo MapperIdInfo;
8985   llvm::SmallVector<Expr *, 16> UnresolvedMappers;
8986   if (transformOMPMappableExprListClause<Derived, OMPFromClause>(
8987           *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers))
8988     return nullptr;
8989   return getDerived().RebuildOMPFromClause(
8990       Vars, MapperIdScopeSpec, MapperIdInfo, Locs, UnresolvedMappers);
8991 }
8992 
8993 template <typename Derived>
8994 OMPClause *TreeTransform<Derived>::TransformOMPUseDevicePtrClause(
8995     OMPUseDevicePtrClause *C) {
8996   llvm::SmallVector<Expr *, 16> Vars;
8997   Vars.reserve(C->varlist_size());
8998   for (auto *VE : C->varlists()) {
8999     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9000     if (EVar.isInvalid())
9001       return nullptr;
9002     Vars.push_back(EVar.get());
9003   }
9004   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9005   return getDerived().RebuildOMPUseDevicePtrClause(Vars, Locs);
9006 }
9007 
9008 template <typename Derived>
9009 OMPClause *
9010 TreeTransform<Derived>::TransformOMPIsDevicePtrClause(OMPIsDevicePtrClause *C) {
9011   llvm::SmallVector<Expr *, 16> Vars;
9012   Vars.reserve(C->varlist_size());
9013   for (auto *VE : C->varlists()) {
9014     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9015     if (EVar.isInvalid())
9016       return nullptr;
9017     Vars.push_back(EVar.get());
9018   }
9019   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9020   return getDerived().RebuildOMPIsDevicePtrClause(Vars, Locs);
9021 }
9022 
9023 //===----------------------------------------------------------------------===//
9024 // Expression transformation
9025 //===----------------------------------------------------------------------===//
9026 template<typename Derived>
9027 ExprResult
9028 TreeTransform<Derived>::TransformConstantExpr(ConstantExpr *E) {
9029   return TransformExpr(E->getSubExpr());
9030 }
9031 
9032 template<typename Derived>
9033 ExprResult
9034 TreeTransform<Derived>::TransformPredefinedExpr(PredefinedExpr *E) {
9035   if (!E->isTypeDependent())
9036     return E;
9037 
9038   return getDerived().RebuildPredefinedExpr(E->getLocation(),
9039                                             E->getIdentKind());
9040 }
9041 
9042 template<typename Derived>
9043 ExprResult
9044 TreeTransform<Derived>::TransformDeclRefExpr(DeclRefExpr *E) {
9045   NestedNameSpecifierLoc QualifierLoc;
9046   if (E->getQualifierLoc()) {
9047     QualifierLoc
9048       = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
9049     if (!QualifierLoc)
9050       return ExprError();
9051   }
9052 
9053   ValueDecl *ND
9054     = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getLocation(),
9055                                                          E->getDecl()));
9056   if (!ND)
9057     return ExprError();
9058 
9059   DeclarationNameInfo NameInfo = E->getNameInfo();
9060   if (NameInfo.getName()) {
9061     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
9062     if (!NameInfo.getName())
9063       return ExprError();
9064   }
9065 
9066   if (!getDerived().AlwaysRebuild() &&
9067       QualifierLoc == E->getQualifierLoc() &&
9068       ND == E->getDecl() &&
9069       NameInfo.getName() == E->getDecl()->getDeclName() &&
9070       !E->hasExplicitTemplateArgs()) {
9071 
9072     // Mark it referenced in the new context regardless.
9073     // FIXME: this is a bit instantiation-specific.
9074     SemaRef.MarkDeclRefReferenced(E);
9075 
9076     return E;
9077   }
9078 
9079   TemplateArgumentListInfo TransArgs, *TemplateArgs = nullptr;
9080   if (E->hasExplicitTemplateArgs()) {
9081     TemplateArgs = &TransArgs;
9082     TransArgs.setLAngleLoc(E->getLAngleLoc());
9083     TransArgs.setRAngleLoc(E->getRAngleLoc());
9084     if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
9085                                                 E->getNumTemplateArgs(),
9086                                                 TransArgs))
9087       return ExprError();
9088   }
9089 
9090   return getDerived().RebuildDeclRefExpr(QualifierLoc, ND, NameInfo,
9091                                          TemplateArgs);
9092 }
9093 
9094 template<typename Derived>
9095 ExprResult
9096 TreeTransform<Derived>::TransformIntegerLiteral(IntegerLiteral *E) {
9097   return E;
9098 }
9099 
9100 template <typename Derived>
9101 ExprResult TreeTransform<Derived>::TransformFixedPointLiteral(
9102     FixedPointLiteral *E) {
9103   return E;
9104 }
9105 
9106 template<typename Derived>
9107 ExprResult
9108 TreeTransform<Derived>::TransformFloatingLiteral(FloatingLiteral *E) {
9109   return E;
9110 }
9111 
9112 template<typename Derived>
9113 ExprResult
9114 TreeTransform<Derived>::TransformImaginaryLiteral(ImaginaryLiteral *E) {
9115   return E;
9116 }
9117 
9118 template<typename Derived>
9119 ExprResult
9120 TreeTransform<Derived>::TransformStringLiteral(StringLiteral *E) {
9121   return E;
9122 }
9123 
9124 template<typename Derived>
9125 ExprResult
9126 TreeTransform<Derived>::TransformCharacterLiteral(CharacterLiteral *E) {
9127   return E;
9128 }
9129 
9130 template<typename Derived>
9131 ExprResult
9132 TreeTransform<Derived>::TransformUserDefinedLiteral(UserDefinedLiteral *E) {
9133   if (FunctionDecl *FD = E->getDirectCallee())
9134     SemaRef.MarkFunctionReferenced(E->getBeginLoc(), FD);
9135   return SemaRef.MaybeBindToTemporary(E);
9136 }
9137 
9138 template<typename Derived>
9139 ExprResult
9140 TreeTransform<Derived>::TransformGenericSelectionExpr(GenericSelectionExpr *E) {
9141   ExprResult ControllingExpr =
9142     getDerived().TransformExpr(E->getControllingExpr());
9143   if (ControllingExpr.isInvalid())
9144     return ExprError();
9145 
9146   SmallVector<Expr *, 4> AssocExprs;
9147   SmallVector<TypeSourceInfo *, 4> AssocTypes;
9148   for (const GenericSelectionExpr::Association &Assoc : E->associations()) {
9149     TypeSourceInfo *TSI = Assoc.getTypeSourceInfo();
9150     if (TSI) {
9151       TypeSourceInfo *AssocType = getDerived().TransformType(TSI);
9152       if (!AssocType)
9153         return ExprError();
9154       AssocTypes.push_back(AssocType);
9155     } else {
9156       AssocTypes.push_back(nullptr);
9157     }
9158 
9159     ExprResult AssocExpr =
9160         getDerived().TransformExpr(Assoc.getAssociationExpr());
9161     if (AssocExpr.isInvalid())
9162       return ExprError();
9163     AssocExprs.push_back(AssocExpr.get());
9164   }
9165 
9166   return getDerived().RebuildGenericSelectionExpr(E->getGenericLoc(),
9167                                                   E->getDefaultLoc(),
9168                                                   E->getRParenLoc(),
9169                                                   ControllingExpr.get(),
9170                                                   AssocTypes,
9171                                                   AssocExprs);
9172 }
9173 
9174 template<typename Derived>
9175 ExprResult
9176 TreeTransform<Derived>::TransformParenExpr(ParenExpr *E) {
9177   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
9178   if (SubExpr.isInvalid())
9179     return ExprError();
9180 
9181   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr())
9182     return E;
9183 
9184   return getDerived().RebuildParenExpr(SubExpr.get(), E->getLParen(),
9185                                        E->getRParen());
9186 }
9187 
9188 /// The operand of a unary address-of operator has special rules: it's
9189 /// allowed to refer to a non-static member of a class even if there's no 'this'
9190 /// object available.
9191 template<typename Derived>
9192 ExprResult
9193 TreeTransform<Derived>::TransformAddressOfOperand(Expr *E) {
9194   if (DependentScopeDeclRefExpr *DRE = dyn_cast<DependentScopeDeclRefExpr>(E))
9195     return getDerived().TransformDependentScopeDeclRefExpr(DRE, true, nullptr);
9196   else
9197     return getDerived().TransformExpr(E);
9198 }
9199 
9200 template<typename Derived>
9201 ExprResult
9202 TreeTransform<Derived>::TransformUnaryOperator(UnaryOperator *E) {
9203   ExprResult SubExpr;
9204   if (E->getOpcode() == UO_AddrOf)
9205     SubExpr = TransformAddressOfOperand(E->getSubExpr());
9206   else
9207     SubExpr = TransformExpr(E->getSubExpr());
9208   if (SubExpr.isInvalid())
9209     return ExprError();
9210 
9211   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr())
9212     return E;
9213 
9214   return getDerived().RebuildUnaryOperator(E->getOperatorLoc(),
9215                                            E->getOpcode(),
9216                                            SubExpr.get());
9217 }
9218 
9219 template<typename Derived>
9220 ExprResult
9221 TreeTransform<Derived>::TransformOffsetOfExpr(OffsetOfExpr *E) {
9222   // Transform the type.
9223   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo());
9224   if (!Type)
9225     return ExprError();
9226 
9227   // Transform all of the components into components similar to what the
9228   // parser uses.
9229   // FIXME: It would be slightly more efficient in the non-dependent case to
9230   // just map FieldDecls, rather than requiring the rebuilder to look for
9231   // the fields again. However, __builtin_offsetof is rare enough in
9232   // template code that we don't care.
9233   bool ExprChanged = false;
9234   typedef Sema::OffsetOfComponent Component;
9235   SmallVector<Component, 4> Components;
9236   for (unsigned I = 0, N = E->getNumComponents(); I != N; ++I) {
9237     const OffsetOfNode &ON = E->getComponent(I);
9238     Component Comp;
9239     Comp.isBrackets = true;
9240     Comp.LocStart = ON.getSourceRange().getBegin();
9241     Comp.LocEnd = ON.getSourceRange().getEnd();
9242     switch (ON.getKind()) {
9243     case OffsetOfNode::Array: {
9244       Expr *FromIndex = E->getIndexExpr(ON.getArrayExprIndex());
9245       ExprResult Index = getDerived().TransformExpr(FromIndex);
9246       if (Index.isInvalid())
9247         return ExprError();
9248 
9249       ExprChanged = ExprChanged || Index.get() != FromIndex;
9250       Comp.isBrackets = true;
9251       Comp.U.E = Index.get();
9252       break;
9253     }
9254 
9255     case OffsetOfNode::Field:
9256     case OffsetOfNode::Identifier:
9257       Comp.isBrackets = false;
9258       Comp.U.IdentInfo = ON.getFieldName();
9259       if (!Comp.U.IdentInfo)
9260         continue;
9261 
9262       break;
9263 
9264     case OffsetOfNode::Base:
9265       // Will be recomputed during the rebuild.
9266       continue;
9267     }
9268 
9269     Components.push_back(Comp);
9270   }
9271 
9272   // If nothing changed, retain the existing expression.
9273   if (!getDerived().AlwaysRebuild() &&
9274       Type == E->getTypeSourceInfo() &&
9275       !ExprChanged)
9276     return E;
9277 
9278   // Build a new offsetof expression.
9279   return getDerived().RebuildOffsetOfExpr(E->getOperatorLoc(), Type,
9280                                           Components, E->getRParenLoc());
9281 }
9282 
9283 template<typename Derived>
9284 ExprResult
9285 TreeTransform<Derived>::TransformOpaqueValueExpr(OpaqueValueExpr *E) {
9286   assert((!E->getSourceExpr() || getDerived().AlreadyTransformed(E->getType())) &&
9287          "opaque value expression requires transformation");
9288   return E;
9289 }
9290 
9291 template<typename Derived>
9292 ExprResult
9293 TreeTransform<Derived>::TransformTypoExpr(TypoExpr *E) {
9294   return E;
9295 }
9296 
9297 template<typename Derived>
9298 ExprResult
9299 TreeTransform<Derived>::TransformPseudoObjectExpr(PseudoObjectExpr *E) {
9300   // Rebuild the syntactic form.  The original syntactic form has
9301   // opaque-value expressions in it, so strip those away and rebuild
9302   // the result.  This is a really awful way of doing this, but the
9303   // better solution (rebuilding the semantic expressions and
9304   // rebinding OVEs as necessary) doesn't work; we'd need
9305   // TreeTransform to not strip away implicit conversions.
9306   Expr *newSyntacticForm = SemaRef.recreateSyntacticForm(E);
9307   ExprResult result = getDerived().TransformExpr(newSyntacticForm);
9308   if (result.isInvalid()) return ExprError();
9309 
9310   // If that gives us a pseudo-object result back, the pseudo-object
9311   // expression must have been an lvalue-to-rvalue conversion which we
9312   // should reapply.
9313   if (result.get()->hasPlaceholderType(BuiltinType::PseudoObject))
9314     result = SemaRef.checkPseudoObjectRValue(result.get());
9315 
9316   return result;
9317 }
9318 
9319 template<typename Derived>
9320 ExprResult
9321 TreeTransform<Derived>::TransformUnaryExprOrTypeTraitExpr(
9322                                                 UnaryExprOrTypeTraitExpr *E) {
9323   if (E->isArgumentType()) {
9324     TypeSourceInfo *OldT = E->getArgumentTypeInfo();
9325 
9326     TypeSourceInfo *NewT = getDerived().TransformType(OldT);
9327     if (!NewT)
9328       return ExprError();
9329 
9330     if (!getDerived().AlwaysRebuild() && OldT == NewT)
9331       return E;
9332 
9333     return getDerived().RebuildUnaryExprOrTypeTrait(NewT, E->getOperatorLoc(),
9334                                                     E->getKind(),
9335                                                     E->getSourceRange());
9336   }
9337 
9338   // C++0x [expr.sizeof]p1:
9339   //   The operand is either an expression, which is an unevaluated operand
9340   //   [...]
9341   EnterExpressionEvaluationContext Unevaluated(
9342       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated,
9343       Sema::ReuseLambdaContextDecl);
9344 
9345   // Try to recover if we have something like sizeof(T::X) where X is a type.
9346   // Notably, there must be *exactly* one set of parens if X is a type.
9347   TypeSourceInfo *RecoveryTSI = nullptr;
9348   ExprResult SubExpr;
9349   auto *PE = dyn_cast<ParenExpr>(E->getArgumentExpr());
9350   if (auto *DRE =
9351           PE ? dyn_cast<DependentScopeDeclRefExpr>(PE->getSubExpr()) : nullptr)
9352     SubExpr = getDerived().TransformParenDependentScopeDeclRefExpr(
9353         PE, DRE, false, &RecoveryTSI);
9354   else
9355     SubExpr = getDerived().TransformExpr(E->getArgumentExpr());
9356 
9357   if (RecoveryTSI) {
9358     return getDerived().RebuildUnaryExprOrTypeTrait(
9359         RecoveryTSI, E->getOperatorLoc(), E->getKind(), E->getSourceRange());
9360   } else if (SubExpr.isInvalid())
9361     return ExprError();
9362 
9363   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getArgumentExpr())
9364     return E;
9365 
9366   return getDerived().RebuildUnaryExprOrTypeTrait(SubExpr.get(),
9367                                                   E->getOperatorLoc(),
9368                                                   E->getKind(),
9369                                                   E->getSourceRange());
9370 }
9371 
9372 template<typename Derived>
9373 ExprResult
9374 TreeTransform<Derived>::TransformArraySubscriptExpr(ArraySubscriptExpr *E) {
9375   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
9376   if (LHS.isInvalid())
9377     return ExprError();
9378 
9379   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
9380   if (RHS.isInvalid())
9381     return ExprError();
9382 
9383 
9384   if (!getDerived().AlwaysRebuild() &&
9385       LHS.get() == E->getLHS() &&
9386       RHS.get() == E->getRHS())
9387     return E;
9388 
9389   return getDerived().RebuildArraySubscriptExpr(
9390       LHS.get(),
9391       /*FIXME:*/ E->getLHS()->getBeginLoc(), RHS.get(), E->getRBracketLoc());
9392 }
9393 
9394 template <typename Derived>
9395 ExprResult
9396 TreeTransform<Derived>::TransformOMPArraySectionExpr(OMPArraySectionExpr *E) {
9397   ExprResult Base = getDerived().TransformExpr(E->getBase());
9398   if (Base.isInvalid())
9399     return ExprError();
9400 
9401   ExprResult LowerBound;
9402   if (E->getLowerBound()) {
9403     LowerBound = getDerived().TransformExpr(E->getLowerBound());
9404     if (LowerBound.isInvalid())
9405       return ExprError();
9406   }
9407 
9408   ExprResult Length;
9409   if (E->getLength()) {
9410     Length = getDerived().TransformExpr(E->getLength());
9411     if (Length.isInvalid())
9412       return ExprError();
9413   }
9414 
9415   if (!getDerived().AlwaysRebuild() && Base.get() == E->getBase() &&
9416       LowerBound.get() == E->getLowerBound() && Length.get() == E->getLength())
9417     return E;
9418 
9419   return getDerived().RebuildOMPArraySectionExpr(
9420       Base.get(), E->getBase()->getEndLoc(), LowerBound.get(), E->getColonLoc(),
9421       Length.get(), E->getRBracketLoc());
9422 }
9423 
9424 template<typename Derived>
9425 ExprResult
9426 TreeTransform<Derived>::TransformCallExpr(CallExpr *E) {
9427   // Transform the callee.
9428   ExprResult Callee = getDerived().TransformExpr(E->getCallee());
9429   if (Callee.isInvalid())
9430     return ExprError();
9431 
9432   // Transform arguments.
9433   bool ArgChanged = false;
9434   SmallVector<Expr*, 8> Args;
9435   if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
9436                                   &ArgChanged))
9437     return ExprError();
9438 
9439   if (!getDerived().AlwaysRebuild() &&
9440       Callee.get() == E->getCallee() &&
9441       !ArgChanged)
9442     return SemaRef.MaybeBindToTemporary(E);
9443 
9444   // FIXME: Wrong source location information for the '('.
9445   SourceLocation FakeLParenLoc
9446     = ((Expr *)Callee.get())->getSourceRange().getBegin();
9447   return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc,
9448                                       Args,
9449                                       E->getRParenLoc());
9450 }
9451 
9452 template<typename Derived>
9453 ExprResult
9454 TreeTransform<Derived>::TransformMemberExpr(MemberExpr *E) {
9455   ExprResult Base = getDerived().TransformExpr(E->getBase());
9456   if (Base.isInvalid())
9457     return ExprError();
9458 
9459   NestedNameSpecifierLoc QualifierLoc;
9460   if (E->hasQualifier()) {
9461     QualifierLoc
9462       = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
9463 
9464     if (!QualifierLoc)
9465       return ExprError();
9466   }
9467   SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc();
9468 
9469   ValueDecl *Member
9470     = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getMemberLoc(),
9471                                                          E->getMemberDecl()));
9472   if (!Member)
9473     return ExprError();
9474 
9475   NamedDecl *FoundDecl = E->getFoundDecl();
9476   if (FoundDecl == E->getMemberDecl()) {
9477     FoundDecl = Member;
9478   } else {
9479     FoundDecl = cast_or_null<NamedDecl>(
9480                    getDerived().TransformDecl(E->getMemberLoc(), FoundDecl));
9481     if (!FoundDecl)
9482       return ExprError();
9483   }
9484 
9485   if (!getDerived().AlwaysRebuild() &&
9486       Base.get() == E->getBase() &&
9487       QualifierLoc == E->getQualifierLoc() &&
9488       Member == E->getMemberDecl() &&
9489       FoundDecl == E->getFoundDecl() &&
9490       !E->hasExplicitTemplateArgs()) {
9491 
9492     // Mark it referenced in the new context regardless.
9493     // FIXME: this is a bit instantiation-specific.
9494     SemaRef.MarkMemberReferenced(E);
9495 
9496     return E;
9497   }
9498 
9499   TemplateArgumentListInfo TransArgs;
9500   if (E->hasExplicitTemplateArgs()) {
9501     TransArgs.setLAngleLoc(E->getLAngleLoc());
9502     TransArgs.setRAngleLoc(E->getRAngleLoc());
9503     if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
9504                                                 E->getNumTemplateArgs(),
9505                                                 TransArgs))
9506       return ExprError();
9507   }
9508 
9509   // FIXME: Bogus source location for the operator
9510   SourceLocation FakeOperatorLoc =
9511       SemaRef.getLocForEndOfToken(E->getBase()->getSourceRange().getEnd());
9512 
9513   // FIXME: to do this check properly, we will need to preserve the
9514   // first-qualifier-in-scope here, just in case we had a dependent
9515   // base (and therefore couldn't do the check) and a
9516   // nested-name-qualifier (and therefore could do the lookup).
9517   NamedDecl *FirstQualifierInScope = nullptr;
9518   DeclarationNameInfo MemberNameInfo = E->getMemberNameInfo();
9519   if (MemberNameInfo.getName()) {
9520     MemberNameInfo = getDerived().TransformDeclarationNameInfo(MemberNameInfo);
9521     if (!MemberNameInfo.getName())
9522       return ExprError();
9523   }
9524 
9525   return getDerived().RebuildMemberExpr(Base.get(), FakeOperatorLoc,
9526                                         E->isArrow(),
9527                                         QualifierLoc,
9528                                         TemplateKWLoc,
9529                                         MemberNameInfo,
9530                                         Member,
9531                                         FoundDecl,
9532                                         (E->hasExplicitTemplateArgs()
9533                                            ? &TransArgs : nullptr),
9534                                         FirstQualifierInScope);
9535 }
9536 
9537 template<typename Derived>
9538 ExprResult
9539 TreeTransform<Derived>::TransformBinaryOperator(BinaryOperator *E) {
9540   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
9541   if (LHS.isInvalid())
9542     return ExprError();
9543 
9544   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
9545   if (RHS.isInvalid())
9546     return ExprError();
9547 
9548   if (!getDerived().AlwaysRebuild() &&
9549       LHS.get() == E->getLHS() &&
9550       RHS.get() == E->getRHS())
9551     return E;
9552 
9553   Sema::FPContractStateRAII FPContractState(getSema());
9554   getSema().FPFeatures = E->getFPFeatures();
9555 
9556   return getDerived().RebuildBinaryOperator(E->getOperatorLoc(), E->getOpcode(),
9557                                             LHS.get(), RHS.get());
9558 }
9559 
9560 template<typename Derived>
9561 ExprResult
9562 TreeTransform<Derived>::TransformCompoundAssignOperator(
9563                                                       CompoundAssignOperator *E) {
9564   return getDerived().TransformBinaryOperator(E);
9565 }
9566 
9567 template<typename Derived>
9568 ExprResult TreeTransform<Derived>::
9569 TransformBinaryConditionalOperator(BinaryConditionalOperator *e) {
9570   // Just rebuild the common and RHS expressions and see whether we
9571   // get any changes.
9572 
9573   ExprResult commonExpr = getDerived().TransformExpr(e->getCommon());
9574   if (commonExpr.isInvalid())
9575     return ExprError();
9576 
9577   ExprResult rhs = getDerived().TransformExpr(e->getFalseExpr());
9578   if (rhs.isInvalid())
9579     return ExprError();
9580 
9581   if (!getDerived().AlwaysRebuild() &&
9582       commonExpr.get() == e->getCommon() &&
9583       rhs.get() == e->getFalseExpr())
9584     return e;
9585 
9586   return getDerived().RebuildConditionalOperator(commonExpr.get(),
9587                                                  e->getQuestionLoc(),
9588                                                  nullptr,
9589                                                  e->getColonLoc(),
9590                                                  rhs.get());
9591 }
9592 
9593 template<typename Derived>
9594 ExprResult
9595 TreeTransform<Derived>::TransformConditionalOperator(ConditionalOperator *E) {
9596   ExprResult Cond = getDerived().TransformExpr(E->getCond());
9597   if (Cond.isInvalid())
9598     return ExprError();
9599 
9600   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
9601   if (LHS.isInvalid())
9602     return ExprError();
9603 
9604   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
9605   if (RHS.isInvalid())
9606     return ExprError();
9607 
9608   if (!getDerived().AlwaysRebuild() &&
9609       Cond.get() == E->getCond() &&
9610       LHS.get() == E->getLHS() &&
9611       RHS.get() == E->getRHS())
9612     return E;
9613 
9614   return getDerived().RebuildConditionalOperator(Cond.get(),
9615                                                  E->getQuestionLoc(),
9616                                                  LHS.get(),
9617                                                  E->getColonLoc(),
9618                                                  RHS.get());
9619 }
9620 
9621 template<typename Derived>
9622 ExprResult
9623 TreeTransform<Derived>::TransformImplicitCastExpr(ImplicitCastExpr *E) {
9624   // Implicit casts are eliminated during transformation, since they
9625   // will be recomputed by semantic analysis after transformation.
9626   return getDerived().TransformExpr(E->getSubExprAsWritten());
9627 }
9628 
9629 template<typename Derived>
9630 ExprResult
9631 TreeTransform<Derived>::TransformCStyleCastExpr(CStyleCastExpr *E) {
9632   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten());
9633   if (!Type)
9634     return ExprError();
9635 
9636   ExprResult SubExpr
9637     = getDerived().TransformExpr(E->getSubExprAsWritten());
9638   if (SubExpr.isInvalid())
9639     return ExprError();
9640 
9641   if (!getDerived().AlwaysRebuild() &&
9642       Type == E->getTypeInfoAsWritten() &&
9643       SubExpr.get() == E->getSubExpr())
9644     return E;
9645 
9646   return getDerived().RebuildCStyleCastExpr(E->getLParenLoc(),
9647                                             Type,
9648                                             E->getRParenLoc(),
9649                                             SubExpr.get());
9650 }
9651 
9652 template<typename Derived>
9653 ExprResult
9654 TreeTransform<Derived>::TransformCompoundLiteralExpr(CompoundLiteralExpr *E) {
9655   TypeSourceInfo *OldT = E->getTypeSourceInfo();
9656   TypeSourceInfo *NewT = getDerived().TransformType(OldT);
9657   if (!NewT)
9658     return ExprError();
9659 
9660   ExprResult Init = getDerived().TransformExpr(E->getInitializer());
9661   if (Init.isInvalid())
9662     return ExprError();
9663 
9664   if (!getDerived().AlwaysRebuild() &&
9665       OldT == NewT &&
9666       Init.get() == E->getInitializer())
9667     return SemaRef.MaybeBindToTemporary(E);
9668 
9669   // Note: the expression type doesn't necessarily match the
9670   // type-as-written, but that's okay, because it should always be
9671   // derivable from the initializer.
9672 
9673   return getDerived().RebuildCompoundLiteralExpr(
9674       E->getLParenLoc(), NewT,
9675       /*FIXME:*/ E->getInitializer()->getEndLoc(), Init.get());
9676 }
9677 
9678 template<typename Derived>
9679 ExprResult
9680 TreeTransform<Derived>::TransformExtVectorElementExpr(ExtVectorElementExpr *E) {
9681   ExprResult Base = getDerived().TransformExpr(E->getBase());
9682   if (Base.isInvalid())
9683     return ExprError();
9684 
9685   if (!getDerived().AlwaysRebuild() &&
9686       Base.get() == E->getBase())
9687     return E;
9688 
9689   // FIXME: Bad source location
9690   SourceLocation FakeOperatorLoc =
9691       SemaRef.getLocForEndOfToken(E->getBase()->getEndLoc());
9692   return getDerived().RebuildExtVectorElementExpr(Base.get(), FakeOperatorLoc,
9693                                                   E->getAccessorLoc(),
9694                                                   E->getAccessor());
9695 }
9696 
9697 template<typename Derived>
9698 ExprResult
9699 TreeTransform<Derived>::TransformInitListExpr(InitListExpr *E) {
9700   if (InitListExpr *Syntactic = E->getSyntacticForm())
9701     E = Syntactic;
9702 
9703   bool InitChanged = false;
9704 
9705   EnterExpressionEvaluationContext Context(
9706       getSema(), EnterExpressionEvaluationContext::InitList);
9707 
9708   SmallVector<Expr*, 4> Inits;
9709   if (getDerived().TransformExprs(E->getInits(), E->getNumInits(), false,
9710                                   Inits, &InitChanged))
9711     return ExprError();
9712 
9713   if (!getDerived().AlwaysRebuild() && !InitChanged) {
9714     // FIXME: Attempt to reuse the existing syntactic form of the InitListExpr
9715     // in some cases. We can't reuse it in general, because the syntactic and
9716     // semantic forms are linked, and we can't know that semantic form will
9717     // match even if the syntactic form does.
9718   }
9719 
9720   return getDerived().RebuildInitList(E->getLBraceLoc(), Inits,
9721                                       E->getRBraceLoc());
9722 }
9723 
9724 template<typename Derived>
9725 ExprResult
9726 TreeTransform<Derived>::TransformDesignatedInitExpr(DesignatedInitExpr *E) {
9727   Designation Desig;
9728 
9729   // transform the initializer value
9730   ExprResult Init = getDerived().TransformExpr(E->getInit());
9731   if (Init.isInvalid())
9732     return ExprError();
9733 
9734   // transform the designators.
9735   SmallVector<Expr*, 4> ArrayExprs;
9736   bool ExprChanged = false;
9737   for (const DesignatedInitExpr::Designator &D : E->designators()) {
9738     if (D.isFieldDesignator()) {
9739       Desig.AddDesignator(Designator::getField(D.getFieldName(),
9740                                                D.getDotLoc(),
9741                                                D.getFieldLoc()));
9742       if (D.getField()) {
9743         FieldDecl *Field = cast_or_null<FieldDecl>(
9744             getDerived().TransformDecl(D.getFieldLoc(), D.getField()));
9745         if (Field != D.getField())
9746           // Rebuild the expression when the transformed FieldDecl is
9747           // different to the already assigned FieldDecl.
9748           ExprChanged = true;
9749       } else {
9750         // Ensure that the designator expression is rebuilt when there isn't
9751         // a resolved FieldDecl in the designator as we don't want to assign
9752         // a FieldDecl to a pattern designator that will be instantiated again.
9753         ExprChanged = true;
9754       }
9755       continue;
9756     }
9757 
9758     if (D.isArrayDesignator()) {
9759       ExprResult Index = getDerived().TransformExpr(E->getArrayIndex(D));
9760       if (Index.isInvalid())
9761         return ExprError();
9762 
9763       Desig.AddDesignator(
9764           Designator::getArray(Index.get(), D.getLBracketLoc()));
9765 
9766       ExprChanged = ExprChanged || Init.get() != E->getArrayIndex(D);
9767       ArrayExprs.push_back(Index.get());
9768       continue;
9769     }
9770 
9771     assert(D.isArrayRangeDesignator() && "New kind of designator?");
9772     ExprResult Start
9773       = getDerived().TransformExpr(E->getArrayRangeStart(D));
9774     if (Start.isInvalid())
9775       return ExprError();
9776 
9777     ExprResult End = getDerived().TransformExpr(E->getArrayRangeEnd(D));
9778     if (End.isInvalid())
9779       return ExprError();
9780 
9781     Desig.AddDesignator(Designator::getArrayRange(Start.get(),
9782                                                   End.get(),
9783                                                   D.getLBracketLoc(),
9784                                                   D.getEllipsisLoc()));
9785 
9786     ExprChanged = ExprChanged || Start.get() != E->getArrayRangeStart(D) ||
9787                   End.get() != E->getArrayRangeEnd(D);
9788 
9789     ArrayExprs.push_back(Start.get());
9790     ArrayExprs.push_back(End.get());
9791   }
9792 
9793   if (!getDerived().AlwaysRebuild() &&
9794       Init.get() == E->getInit() &&
9795       !ExprChanged)
9796     return E;
9797 
9798   return getDerived().RebuildDesignatedInitExpr(Desig, ArrayExprs,
9799                                                 E->getEqualOrColonLoc(),
9800                                                 E->usesGNUSyntax(), Init.get());
9801 }
9802 
9803 // Seems that if TransformInitListExpr() only works on the syntactic form of an
9804 // InitListExpr, then a DesignatedInitUpdateExpr is not encountered.
9805 template<typename Derived>
9806 ExprResult
9807 TreeTransform<Derived>::TransformDesignatedInitUpdateExpr(
9808     DesignatedInitUpdateExpr *E) {
9809   llvm_unreachable("Unexpected DesignatedInitUpdateExpr in syntactic form of "
9810                    "initializer");
9811   return ExprError();
9812 }
9813 
9814 template<typename Derived>
9815 ExprResult
9816 TreeTransform<Derived>::TransformNoInitExpr(
9817     NoInitExpr *E) {
9818   llvm_unreachable("Unexpected NoInitExpr in syntactic form of initializer");
9819   return ExprError();
9820 }
9821 
9822 template<typename Derived>
9823 ExprResult
9824 TreeTransform<Derived>::TransformArrayInitLoopExpr(ArrayInitLoopExpr *E) {
9825   llvm_unreachable("Unexpected ArrayInitLoopExpr outside of initializer");
9826   return ExprError();
9827 }
9828 
9829 template<typename Derived>
9830 ExprResult
9831 TreeTransform<Derived>::TransformArrayInitIndexExpr(ArrayInitIndexExpr *E) {
9832   llvm_unreachable("Unexpected ArrayInitIndexExpr outside of initializer");
9833   return ExprError();
9834 }
9835 
9836 template<typename Derived>
9837 ExprResult
9838 TreeTransform<Derived>::TransformImplicitValueInitExpr(
9839                                                      ImplicitValueInitExpr *E) {
9840   TemporaryBase Rebase(*this, E->getBeginLoc(), DeclarationName());
9841 
9842   // FIXME: Will we ever have proper type location here? Will we actually
9843   // need to transform the type?
9844   QualType T = getDerived().TransformType(E->getType());
9845   if (T.isNull())
9846     return ExprError();
9847 
9848   if (!getDerived().AlwaysRebuild() &&
9849       T == E->getType())
9850     return E;
9851 
9852   return getDerived().RebuildImplicitValueInitExpr(T);
9853 }
9854 
9855 template<typename Derived>
9856 ExprResult
9857 TreeTransform<Derived>::TransformVAArgExpr(VAArgExpr *E) {
9858   TypeSourceInfo *TInfo = getDerived().TransformType(E->getWrittenTypeInfo());
9859   if (!TInfo)
9860     return ExprError();
9861 
9862   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
9863   if (SubExpr.isInvalid())
9864     return ExprError();
9865 
9866   if (!getDerived().AlwaysRebuild() &&
9867       TInfo == E->getWrittenTypeInfo() &&
9868       SubExpr.get() == E->getSubExpr())
9869     return E;
9870 
9871   return getDerived().RebuildVAArgExpr(E->getBuiltinLoc(), SubExpr.get(),
9872                                        TInfo, E->getRParenLoc());
9873 }
9874 
9875 template<typename Derived>
9876 ExprResult
9877 TreeTransform<Derived>::TransformParenListExpr(ParenListExpr *E) {
9878   bool ArgumentChanged = false;
9879   SmallVector<Expr*, 4> Inits;
9880   if (TransformExprs(E->getExprs(), E->getNumExprs(), true, Inits,
9881                      &ArgumentChanged))
9882     return ExprError();
9883 
9884   return getDerived().RebuildParenListExpr(E->getLParenLoc(),
9885                                            Inits,
9886                                            E->getRParenLoc());
9887 }
9888 
9889 /// Transform an address-of-label expression.
9890 ///
9891 /// By default, the transformation of an address-of-label expression always
9892 /// rebuilds the expression, so that the label identifier can be resolved to
9893 /// the corresponding label statement by semantic analysis.
9894 template<typename Derived>
9895 ExprResult
9896 TreeTransform<Derived>::TransformAddrLabelExpr(AddrLabelExpr *E) {
9897   Decl *LD = getDerived().TransformDecl(E->getLabel()->getLocation(),
9898                                         E->getLabel());
9899   if (!LD)
9900     return ExprError();
9901 
9902   return getDerived().RebuildAddrLabelExpr(E->getAmpAmpLoc(), E->getLabelLoc(),
9903                                            cast<LabelDecl>(LD));
9904 }
9905 
9906 template<typename Derived>
9907 ExprResult
9908 TreeTransform<Derived>::TransformStmtExpr(StmtExpr *E) {
9909   SemaRef.ActOnStartStmtExpr();
9910   StmtResult SubStmt
9911     = getDerived().TransformCompoundStmt(E->getSubStmt(), true);
9912   if (SubStmt.isInvalid()) {
9913     SemaRef.ActOnStmtExprError();
9914     return ExprError();
9915   }
9916 
9917   if (!getDerived().AlwaysRebuild() &&
9918       SubStmt.get() == E->getSubStmt()) {
9919     // Calling this an 'error' is unintuitive, but it does the right thing.
9920     SemaRef.ActOnStmtExprError();
9921     return SemaRef.MaybeBindToTemporary(E);
9922   }
9923 
9924   return getDerived().RebuildStmtExpr(E->getLParenLoc(),
9925                                       SubStmt.get(),
9926                                       E->getRParenLoc());
9927 }
9928 
9929 template<typename Derived>
9930 ExprResult
9931 TreeTransform<Derived>::TransformChooseExpr(ChooseExpr *E) {
9932   ExprResult Cond = getDerived().TransformExpr(E->getCond());
9933   if (Cond.isInvalid())
9934     return ExprError();
9935 
9936   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
9937   if (LHS.isInvalid())
9938     return ExprError();
9939 
9940   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
9941   if (RHS.isInvalid())
9942     return ExprError();
9943 
9944   if (!getDerived().AlwaysRebuild() &&
9945       Cond.get() == E->getCond() &&
9946       LHS.get() == E->getLHS() &&
9947       RHS.get() == E->getRHS())
9948     return E;
9949 
9950   return getDerived().RebuildChooseExpr(E->getBuiltinLoc(),
9951                                         Cond.get(), LHS.get(), RHS.get(),
9952                                         E->getRParenLoc());
9953 }
9954 
9955 template<typename Derived>
9956 ExprResult
9957 TreeTransform<Derived>::TransformGNUNullExpr(GNUNullExpr *E) {
9958   return E;
9959 }
9960 
9961 template<typename Derived>
9962 ExprResult
9963 TreeTransform<Derived>::TransformCXXOperatorCallExpr(CXXOperatorCallExpr *E) {
9964   switch (E->getOperator()) {
9965   case OO_New:
9966   case OO_Delete:
9967   case OO_Array_New:
9968   case OO_Array_Delete:
9969     llvm_unreachable("new and delete operators cannot use CXXOperatorCallExpr");
9970 
9971   case OO_Call: {
9972     // This is a call to an object's operator().
9973     assert(E->getNumArgs() >= 1 && "Object call is missing arguments");
9974 
9975     // Transform the object itself.
9976     ExprResult Object = getDerived().TransformExpr(E->getArg(0));
9977     if (Object.isInvalid())
9978       return ExprError();
9979 
9980     // FIXME: Poor location information
9981     SourceLocation FakeLParenLoc = SemaRef.getLocForEndOfToken(
9982         static_cast<Expr *>(Object.get())->getEndLoc());
9983 
9984     // Transform the call arguments.
9985     SmallVector<Expr*, 8> Args;
9986     if (getDerived().TransformExprs(E->getArgs() + 1, E->getNumArgs() - 1, true,
9987                                     Args))
9988       return ExprError();
9989 
9990     return getDerived().RebuildCallExpr(Object.get(), FakeLParenLoc, Args,
9991                                         E->getEndLoc());
9992   }
9993 
9994 #define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly) \
9995   case OO_##Name:
9996 #define OVERLOADED_OPERATOR_MULTI(Name,Spelling,Unary,Binary,MemberOnly)
9997 #include "clang/Basic/OperatorKinds.def"
9998   case OO_Subscript:
9999     // Handled below.
10000     break;
10001 
10002   case OO_Conditional:
10003     llvm_unreachable("conditional operator is not actually overloadable");
10004 
10005   case OO_None:
10006   case NUM_OVERLOADED_OPERATORS:
10007     llvm_unreachable("not an overloaded operator?");
10008   }
10009 
10010   ExprResult Callee = getDerived().TransformExpr(E->getCallee());
10011   if (Callee.isInvalid())
10012     return ExprError();
10013 
10014   ExprResult First;
10015   if (E->getOperator() == OO_Amp)
10016     First = getDerived().TransformAddressOfOperand(E->getArg(0));
10017   else
10018     First = getDerived().TransformExpr(E->getArg(0));
10019   if (First.isInvalid())
10020     return ExprError();
10021 
10022   ExprResult Second;
10023   if (E->getNumArgs() == 2) {
10024     Second = getDerived().TransformExpr(E->getArg(1));
10025     if (Second.isInvalid())
10026       return ExprError();
10027   }
10028 
10029   if (!getDerived().AlwaysRebuild() &&
10030       Callee.get() == E->getCallee() &&
10031       First.get() == E->getArg(0) &&
10032       (E->getNumArgs() != 2 || Second.get() == E->getArg(1)))
10033     return SemaRef.MaybeBindToTemporary(E);
10034 
10035   Sema::FPContractStateRAII FPContractState(getSema());
10036   getSema().FPFeatures = E->getFPFeatures();
10037 
10038   return getDerived().RebuildCXXOperatorCallExpr(E->getOperator(),
10039                                                  E->getOperatorLoc(),
10040                                                  Callee.get(),
10041                                                  First.get(),
10042                                                  Second.get());
10043 }
10044 
10045 template<typename Derived>
10046 ExprResult
10047 TreeTransform<Derived>::TransformCXXMemberCallExpr(CXXMemberCallExpr *E) {
10048   return getDerived().TransformCallExpr(E);
10049 }
10050 
10051 template<typename Derived>
10052 ExprResult
10053 TreeTransform<Derived>::TransformCUDAKernelCallExpr(CUDAKernelCallExpr *E) {
10054   // Transform the callee.
10055   ExprResult Callee = getDerived().TransformExpr(E->getCallee());
10056   if (Callee.isInvalid())
10057     return ExprError();
10058 
10059   // Transform exec config.
10060   ExprResult EC = getDerived().TransformCallExpr(E->getConfig());
10061   if (EC.isInvalid())
10062     return ExprError();
10063 
10064   // Transform arguments.
10065   bool ArgChanged = false;
10066   SmallVector<Expr*, 8> Args;
10067   if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
10068                                   &ArgChanged))
10069     return ExprError();
10070 
10071   if (!getDerived().AlwaysRebuild() &&
10072       Callee.get() == E->getCallee() &&
10073       !ArgChanged)
10074     return SemaRef.MaybeBindToTemporary(E);
10075 
10076   // FIXME: Wrong source location information for the '('.
10077   SourceLocation FakeLParenLoc
10078     = ((Expr *)Callee.get())->getSourceRange().getBegin();
10079   return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc,
10080                                       Args,
10081                                       E->getRParenLoc(), EC.get());
10082 }
10083 
10084 template<typename Derived>
10085 ExprResult
10086 TreeTransform<Derived>::TransformCXXNamedCastExpr(CXXNamedCastExpr *E) {
10087   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten());
10088   if (!Type)
10089     return ExprError();
10090 
10091   ExprResult SubExpr
10092     = getDerived().TransformExpr(E->getSubExprAsWritten());
10093   if (SubExpr.isInvalid())
10094     return ExprError();
10095 
10096   if (!getDerived().AlwaysRebuild() &&
10097       Type == E->getTypeInfoAsWritten() &&
10098       SubExpr.get() == E->getSubExpr())
10099     return E;
10100   return getDerived().RebuildCXXNamedCastExpr(
10101       E->getOperatorLoc(), E->getStmtClass(), E->getAngleBrackets().getBegin(),
10102       Type, E->getAngleBrackets().getEnd(),
10103       // FIXME. this should be '(' location
10104       E->getAngleBrackets().getEnd(), SubExpr.get(), E->getRParenLoc());
10105 }
10106 
10107 template<typename Derived>
10108 ExprResult
10109 TreeTransform<Derived>::TransformCXXStaticCastExpr(CXXStaticCastExpr *E) {
10110   return getDerived().TransformCXXNamedCastExpr(E);
10111 }
10112 
10113 template<typename Derived>
10114 ExprResult
10115 TreeTransform<Derived>::TransformCXXDynamicCastExpr(CXXDynamicCastExpr *E) {
10116   return getDerived().TransformCXXNamedCastExpr(E);
10117 }
10118 
10119 template<typename Derived>
10120 ExprResult
10121 TreeTransform<Derived>::TransformCXXReinterpretCastExpr(
10122                                                       CXXReinterpretCastExpr *E) {
10123   return getDerived().TransformCXXNamedCastExpr(E);
10124 }
10125 
10126 template<typename Derived>
10127 ExprResult
10128 TreeTransform<Derived>::TransformCXXConstCastExpr(CXXConstCastExpr *E) {
10129   return getDerived().TransformCXXNamedCastExpr(E);
10130 }
10131 
10132 template<typename Derived>
10133 ExprResult
10134 TreeTransform<Derived>::TransformCXXFunctionalCastExpr(
10135                                                      CXXFunctionalCastExpr *E) {
10136   TypeSourceInfo *Type =
10137       getDerived().TransformTypeWithDeducedTST(E->getTypeInfoAsWritten());
10138   if (!Type)
10139     return ExprError();
10140 
10141   ExprResult SubExpr
10142     = getDerived().TransformExpr(E->getSubExprAsWritten());
10143   if (SubExpr.isInvalid())
10144     return ExprError();
10145 
10146   if (!getDerived().AlwaysRebuild() &&
10147       Type == E->getTypeInfoAsWritten() &&
10148       SubExpr.get() == E->getSubExpr())
10149     return E;
10150 
10151   return getDerived().RebuildCXXFunctionalCastExpr(Type,
10152                                                    E->getLParenLoc(),
10153                                                    SubExpr.get(),
10154                                                    E->getRParenLoc(),
10155                                                    E->isListInitialization());
10156 }
10157 
10158 template<typename Derived>
10159 ExprResult
10160 TreeTransform<Derived>::TransformCXXTypeidExpr(CXXTypeidExpr *E) {
10161   if (E->isTypeOperand()) {
10162     TypeSourceInfo *TInfo
10163       = getDerived().TransformType(E->getTypeOperandSourceInfo());
10164     if (!TInfo)
10165       return ExprError();
10166 
10167     if (!getDerived().AlwaysRebuild() &&
10168         TInfo == E->getTypeOperandSourceInfo())
10169       return E;
10170 
10171     return getDerived().RebuildCXXTypeidExpr(E->getType(), E->getBeginLoc(),
10172                                              TInfo, E->getEndLoc());
10173   }
10174 
10175   // We don't know whether the subexpression is potentially evaluated until
10176   // after we perform semantic analysis.  We speculatively assume it is
10177   // unevaluated; it will get fixed later if the subexpression is in fact
10178   // potentially evaluated.
10179   EnterExpressionEvaluationContext Unevaluated(
10180       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated,
10181       Sema::ReuseLambdaContextDecl);
10182 
10183   ExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand());
10184   if (SubExpr.isInvalid())
10185     return ExprError();
10186 
10187   if (!getDerived().AlwaysRebuild() &&
10188       SubExpr.get() == E->getExprOperand())
10189     return E;
10190 
10191   return getDerived().RebuildCXXTypeidExpr(E->getType(), E->getBeginLoc(),
10192                                            SubExpr.get(), E->getEndLoc());
10193 }
10194 
10195 template<typename Derived>
10196 ExprResult
10197 TreeTransform<Derived>::TransformCXXUuidofExpr(CXXUuidofExpr *E) {
10198   if (E->isTypeOperand()) {
10199     TypeSourceInfo *TInfo
10200       = getDerived().TransformType(E->getTypeOperandSourceInfo());
10201     if (!TInfo)
10202       return ExprError();
10203 
10204     if (!getDerived().AlwaysRebuild() &&
10205         TInfo == E->getTypeOperandSourceInfo())
10206       return E;
10207 
10208     return getDerived().RebuildCXXUuidofExpr(E->getType(), E->getBeginLoc(),
10209                                              TInfo, E->getEndLoc());
10210   }
10211 
10212   EnterExpressionEvaluationContext Unevaluated(
10213       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
10214 
10215   ExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand());
10216   if (SubExpr.isInvalid())
10217     return ExprError();
10218 
10219   if (!getDerived().AlwaysRebuild() &&
10220       SubExpr.get() == E->getExprOperand())
10221     return E;
10222 
10223   return getDerived().RebuildCXXUuidofExpr(E->getType(), E->getBeginLoc(),
10224                                            SubExpr.get(), E->getEndLoc());
10225 }
10226 
10227 template<typename Derived>
10228 ExprResult
10229 TreeTransform<Derived>::TransformCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) {
10230   return E;
10231 }
10232 
10233 template<typename Derived>
10234 ExprResult
10235 TreeTransform<Derived>::TransformCXXNullPtrLiteralExpr(
10236                                                      CXXNullPtrLiteralExpr *E) {
10237   return E;
10238 }
10239 
10240 template<typename Derived>
10241 ExprResult
10242 TreeTransform<Derived>::TransformCXXThisExpr(CXXThisExpr *E) {
10243   QualType T = getSema().getCurrentThisType();
10244 
10245   if (!getDerived().AlwaysRebuild() && T == E->getType()) {
10246     // Make sure that we capture 'this'.
10247     getSema().CheckCXXThisCapture(E->getBeginLoc());
10248     return E;
10249   }
10250 
10251   return getDerived().RebuildCXXThisExpr(E->getBeginLoc(), T, E->isImplicit());
10252 }
10253 
10254 template<typename Derived>
10255 ExprResult
10256 TreeTransform<Derived>::TransformCXXThrowExpr(CXXThrowExpr *E) {
10257   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
10258   if (SubExpr.isInvalid())
10259     return ExprError();
10260 
10261   if (!getDerived().AlwaysRebuild() &&
10262       SubExpr.get() == E->getSubExpr())
10263     return E;
10264 
10265   return getDerived().RebuildCXXThrowExpr(E->getThrowLoc(), SubExpr.get(),
10266                                           E->isThrownVariableInScope());
10267 }
10268 
10269 template<typename Derived>
10270 ExprResult
10271 TreeTransform<Derived>::TransformCXXDefaultArgExpr(CXXDefaultArgExpr *E) {
10272   ParmVarDecl *Param = cast_or_null<ParmVarDecl>(
10273       getDerived().TransformDecl(E->getBeginLoc(), E->getParam()));
10274   if (!Param)
10275     return ExprError();
10276 
10277   if (!getDerived().AlwaysRebuild() &&
10278       Param == E->getParam())
10279     return E;
10280 
10281   return getDerived().RebuildCXXDefaultArgExpr(E->getUsedLocation(), Param);
10282 }
10283 
10284 template<typename Derived>
10285 ExprResult
10286 TreeTransform<Derived>::TransformCXXDefaultInitExpr(CXXDefaultInitExpr *E) {
10287   FieldDecl *Field = cast_or_null<FieldDecl>(
10288       getDerived().TransformDecl(E->getBeginLoc(), E->getField()));
10289   if (!Field)
10290     return ExprError();
10291 
10292   if (!getDerived().AlwaysRebuild() && Field == E->getField())
10293     return E;
10294 
10295   return getDerived().RebuildCXXDefaultInitExpr(E->getExprLoc(), Field);
10296 }
10297 
10298 template<typename Derived>
10299 ExprResult
10300 TreeTransform<Derived>::TransformCXXScalarValueInitExpr(
10301                                                     CXXScalarValueInitExpr *E) {
10302   TypeSourceInfo *T = getDerived().TransformType(E->getTypeSourceInfo());
10303   if (!T)
10304     return ExprError();
10305 
10306   if (!getDerived().AlwaysRebuild() &&
10307       T == E->getTypeSourceInfo())
10308     return E;
10309 
10310   return getDerived().RebuildCXXScalarValueInitExpr(T,
10311                                           /*FIXME:*/T->getTypeLoc().getEndLoc(),
10312                                                     E->getRParenLoc());
10313 }
10314 
10315 template<typename Derived>
10316 ExprResult
10317 TreeTransform<Derived>::TransformCXXNewExpr(CXXNewExpr *E) {
10318   // Transform the type that we're allocating
10319   TypeSourceInfo *AllocTypeInfo =
10320       getDerived().TransformTypeWithDeducedTST(E->getAllocatedTypeSourceInfo());
10321   if (!AllocTypeInfo)
10322     return ExprError();
10323 
10324   // Transform the size of the array we're allocating (if any).
10325   ExprResult ArraySize = getDerived().TransformExpr(E->getArraySize());
10326   if (ArraySize.isInvalid())
10327     return ExprError();
10328 
10329   // Transform the placement arguments (if any).
10330   bool ArgumentChanged = false;
10331   SmallVector<Expr*, 8> PlacementArgs;
10332   if (getDerived().TransformExprs(E->getPlacementArgs(),
10333                                   E->getNumPlacementArgs(), true,
10334                                   PlacementArgs, &ArgumentChanged))
10335     return ExprError();
10336 
10337   // Transform the initializer (if any).
10338   Expr *OldInit = E->getInitializer();
10339   ExprResult NewInit;
10340   if (OldInit)
10341     NewInit = getDerived().TransformInitializer(OldInit, true);
10342   if (NewInit.isInvalid())
10343     return ExprError();
10344 
10345   // Transform new operator and delete operator.
10346   FunctionDecl *OperatorNew = nullptr;
10347   if (E->getOperatorNew()) {
10348     OperatorNew = cast_or_null<FunctionDecl>(
10349         getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorNew()));
10350     if (!OperatorNew)
10351       return ExprError();
10352   }
10353 
10354   FunctionDecl *OperatorDelete = nullptr;
10355   if (E->getOperatorDelete()) {
10356     OperatorDelete = cast_or_null<FunctionDecl>(
10357         getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorDelete()));
10358     if (!OperatorDelete)
10359       return ExprError();
10360   }
10361 
10362   if (!getDerived().AlwaysRebuild() &&
10363       AllocTypeInfo == E->getAllocatedTypeSourceInfo() &&
10364       ArraySize.get() == E->getArraySize() &&
10365       NewInit.get() == OldInit &&
10366       OperatorNew == E->getOperatorNew() &&
10367       OperatorDelete == E->getOperatorDelete() &&
10368       !ArgumentChanged) {
10369     // Mark any declarations we need as referenced.
10370     // FIXME: instantiation-specific.
10371     if (OperatorNew)
10372       SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorNew);
10373     if (OperatorDelete)
10374       SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorDelete);
10375 
10376     if (E->isArray() && !E->getAllocatedType()->isDependentType()) {
10377       QualType ElementType
10378         = SemaRef.Context.getBaseElementType(E->getAllocatedType());
10379       if (const RecordType *RecordT = ElementType->getAs<RecordType>()) {
10380         CXXRecordDecl *Record = cast<CXXRecordDecl>(RecordT->getDecl());
10381         if (CXXDestructorDecl *Destructor = SemaRef.LookupDestructor(Record)) {
10382           SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Destructor);
10383         }
10384       }
10385     }
10386 
10387     return E;
10388   }
10389 
10390   QualType AllocType = AllocTypeInfo->getType();
10391   if (!ArraySize.get()) {
10392     // If no array size was specified, but the new expression was
10393     // instantiated with an array type (e.g., "new T" where T is
10394     // instantiated with "int[4]"), extract the outer bound from the
10395     // array type as our array size. We do this with constant and
10396     // dependently-sized array types.
10397     const ArrayType *ArrayT = SemaRef.Context.getAsArrayType(AllocType);
10398     if (!ArrayT) {
10399       // Do nothing
10400     } else if (const ConstantArrayType *ConsArrayT
10401                                      = dyn_cast<ConstantArrayType>(ArrayT)) {
10402       ArraySize = IntegerLiteral::Create(SemaRef.Context, ConsArrayT->getSize(),
10403                                          SemaRef.Context.getSizeType(),
10404                                          /*FIXME:*/ E->getBeginLoc());
10405       AllocType = ConsArrayT->getElementType();
10406     } else if (const DependentSizedArrayType *DepArrayT
10407                               = dyn_cast<DependentSizedArrayType>(ArrayT)) {
10408       if (DepArrayT->getSizeExpr()) {
10409         ArraySize = DepArrayT->getSizeExpr();
10410         AllocType = DepArrayT->getElementType();
10411       }
10412     }
10413   }
10414 
10415   return getDerived().RebuildCXXNewExpr(
10416       E->getBeginLoc(), E->isGlobalNew(),
10417       /*FIXME:*/ E->getBeginLoc(), PlacementArgs,
10418       /*FIXME:*/ E->getBeginLoc(), E->getTypeIdParens(), AllocType,
10419       AllocTypeInfo, ArraySize.get(), E->getDirectInitRange(), NewInit.get());
10420 }
10421 
10422 template<typename Derived>
10423 ExprResult
10424 TreeTransform<Derived>::TransformCXXDeleteExpr(CXXDeleteExpr *E) {
10425   ExprResult Operand = getDerived().TransformExpr(E->getArgument());
10426   if (Operand.isInvalid())
10427     return ExprError();
10428 
10429   // Transform the delete operator, if known.
10430   FunctionDecl *OperatorDelete = nullptr;
10431   if (E->getOperatorDelete()) {
10432     OperatorDelete = cast_or_null<FunctionDecl>(
10433         getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorDelete()));
10434     if (!OperatorDelete)
10435       return ExprError();
10436   }
10437 
10438   if (!getDerived().AlwaysRebuild() &&
10439       Operand.get() == E->getArgument() &&
10440       OperatorDelete == E->getOperatorDelete()) {
10441     // Mark any declarations we need as referenced.
10442     // FIXME: instantiation-specific.
10443     if (OperatorDelete)
10444       SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorDelete);
10445 
10446     if (!E->getArgument()->isTypeDependent()) {
10447       QualType Destroyed = SemaRef.Context.getBaseElementType(
10448                                                          E->getDestroyedType());
10449       if (const RecordType *DestroyedRec = Destroyed->getAs<RecordType>()) {
10450         CXXRecordDecl *Record = cast<CXXRecordDecl>(DestroyedRec->getDecl());
10451         SemaRef.MarkFunctionReferenced(E->getBeginLoc(),
10452                                        SemaRef.LookupDestructor(Record));
10453       }
10454     }
10455 
10456     return E;
10457   }
10458 
10459   return getDerived().RebuildCXXDeleteExpr(
10460       E->getBeginLoc(), E->isGlobalDelete(), E->isArrayForm(), Operand.get());
10461 }
10462 
10463 template<typename Derived>
10464 ExprResult
10465 TreeTransform<Derived>::TransformCXXPseudoDestructorExpr(
10466                                                      CXXPseudoDestructorExpr *E) {
10467   ExprResult Base = getDerived().TransformExpr(E->getBase());
10468   if (Base.isInvalid())
10469     return ExprError();
10470 
10471   ParsedType ObjectTypePtr;
10472   bool MayBePseudoDestructor = false;
10473   Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(),
10474                                               E->getOperatorLoc(),
10475                                         E->isArrow()? tok::arrow : tok::period,
10476                                               ObjectTypePtr,
10477                                               MayBePseudoDestructor);
10478   if (Base.isInvalid())
10479     return ExprError();
10480 
10481   QualType ObjectType = ObjectTypePtr.get();
10482   NestedNameSpecifierLoc QualifierLoc = E->getQualifierLoc();
10483   if (QualifierLoc) {
10484     QualifierLoc
10485       = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc, ObjectType);
10486     if (!QualifierLoc)
10487       return ExprError();
10488   }
10489   CXXScopeSpec SS;
10490   SS.Adopt(QualifierLoc);
10491 
10492   PseudoDestructorTypeStorage Destroyed;
10493   if (E->getDestroyedTypeInfo()) {
10494     TypeSourceInfo *DestroyedTypeInfo
10495       = getDerived().TransformTypeInObjectScope(E->getDestroyedTypeInfo(),
10496                                                 ObjectType, nullptr, SS);
10497     if (!DestroyedTypeInfo)
10498       return ExprError();
10499     Destroyed = DestroyedTypeInfo;
10500   } else if (!ObjectType.isNull() && ObjectType->isDependentType()) {
10501     // We aren't likely to be able to resolve the identifier down to a type
10502     // now anyway, so just retain the identifier.
10503     Destroyed = PseudoDestructorTypeStorage(E->getDestroyedTypeIdentifier(),
10504                                             E->getDestroyedTypeLoc());
10505   } else {
10506     // Look for a destructor known with the given name.
10507     ParsedType T = SemaRef.getDestructorName(E->getTildeLoc(),
10508                                               *E->getDestroyedTypeIdentifier(),
10509                                                 E->getDestroyedTypeLoc(),
10510                                                 /*Scope=*/nullptr,
10511                                                 SS, ObjectTypePtr,
10512                                                 false);
10513     if (!T)
10514       return ExprError();
10515 
10516     Destroyed
10517       = SemaRef.Context.getTrivialTypeSourceInfo(SemaRef.GetTypeFromParser(T),
10518                                                  E->getDestroyedTypeLoc());
10519   }
10520 
10521   TypeSourceInfo *ScopeTypeInfo = nullptr;
10522   if (E->getScopeTypeInfo()) {
10523     CXXScopeSpec EmptySS;
10524     ScopeTypeInfo = getDerived().TransformTypeInObjectScope(
10525                       E->getScopeTypeInfo(), ObjectType, nullptr, EmptySS);
10526     if (!ScopeTypeInfo)
10527       return ExprError();
10528   }
10529 
10530   return getDerived().RebuildCXXPseudoDestructorExpr(Base.get(),
10531                                                      E->getOperatorLoc(),
10532                                                      E->isArrow(),
10533                                                      SS,
10534                                                      ScopeTypeInfo,
10535                                                      E->getColonColonLoc(),
10536                                                      E->getTildeLoc(),
10537                                                      Destroyed);
10538 }
10539 
10540 template <typename Derived>
10541 bool TreeTransform<Derived>::TransformOverloadExprDecls(OverloadExpr *Old,
10542                                                         bool RequiresADL,
10543                                                         LookupResult &R) {
10544   // Transform all the decls.
10545   bool AllEmptyPacks = true;
10546   for (auto *OldD : Old->decls()) {
10547     Decl *InstD = getDerived().TransformDecl(Old->getNameLoc(), OldD);
10548     if (!InstD) {
10549       // Silently ignore these if a UsingShadowDecl instantiated to nothing.
10550       // This can happen because of dependent hiding.
10551       if (isa<UsingShadowDecl>(OldD))
10552         continue;
10553       else {
10554         R.clear();
10555         return true;
10556       }
10557     }
10558 
10559     // Expand using pack declarations.
10560     NamedDecl *SingleDecl = cast<NamedDecl>(InstD);
10561     ArrayRef<NamedDecl*> Decls = SingleDecl;
10562     if (auto *UPD = dyn_cast<UsingPackDecl>(InstD))
10563       Decls = UPD->expansions();
10564 
10565     // Expand using declarations.
10566     for (auto *D : Decls) {
10567       if (auto *UD = dyn_cast<UsingDecl>(D)) {
10568         for (auto *SD : UD->shadows())
10569           R.addDecl(SD);
10570       } else {
10571         R.addDecl(D);
10572       }
10573     }
10574 
10575     AllEmptyPacks &= Decls.empty();
10576   };
10577 
10578   // C++ [temp.res]/8.4.2:
10579   //   The program is ill-formed, no diagnostic required, if [...] lookup for
10580   //   a name in the template definition found a using-declaration, but the
10581   //   lookup in the corresponding scope in the instantiation odoes not find
10582   //   any declarations because the using-declaration was a pack expansion and
10583   //   the corresponding pack is empty
10584   if (AllEmptyPacks && !RequiresADL) {
10585     getSema().Diag(Old->getNameLoc(), diag::err_using_pack_expansion_empty)
10586         << isa<UnresolvedMemberExpr>(Old) << Old->getName();
10587     return true;
10588   }
10589 
10590   // Resolve a kind, but don't do any further analysis.  If it's
10591   // ambiguous, the callee needs to deal with it.
10592   R.resolveKind();
10593   return false;
10594 }
10595 
10596 template<typename Derived>
10597 ExprResult
10598 TreeTransform<Derived>::TransformUnresolvedLookupExpr(
10599                                                   UnresolvedLookupExpr *Old) {
10600   LookupResult R(SemaRef, Old->getName(), Old->getNameLoc(),
10601                  Sema::LookupOrdinaryName);
10602 
10603   // Transform the declaration set.
10604   if (TransformOverloadExprDecls(Old, Old->requiresADL(), R))
10605     return ExprError();
10606 
10607   // Rebuild the nested-name qualifier, if present.
10608   CXXScopeSpec SS;
10609   if (Old->getQualifierLoc()) {
10610     NestedNameSpecifierLoc QualifierLoc
10611       = getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc());
10612     if (!QualifierLoc)
10613       return ExprError();
10614 
10615     SS.Adopt(QualifierLoc);
10616   }
10617 
10618   if (Old->getNamingClass()) {
10619     CXXRecordDecl *NamingClass
10620       = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl(
10621                                                             Old->getNameLoc(),
10622                                                         Old->getNamingClass()));
10623     if (!NamingClass) {
10624       R.clear();
10625       return ExprError();
10626     }
10627 
10628     R.setNamingClass(NamingClass);
10629   }
10630 
10631   SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc();
10632 
10633   // If we have neither explicit template arguments, nor the template keyword,
10634   // it's a normal declaration name or member reference.
10635   if (!Old->hasExplicitTemplateArgs() && !TemplateKWLoc.isValid()) {
10636     NamedDecl *D = R.getAsSingle<NamedDecl>();
10637     // In a C++11 unevaluated context, an UnresolvedLookupExpr might refer to an
10638     // instance member. In other contexts, BuildPossibleImplicitMemberExpr will
10639     // give a good diagnostic.
10640     if (D && D->isCXXInstanceMember()) {
10641       return SemaRef.BuildPossibleImplicitMemberExpr(SS, TemplateKWLoc, R,
10642                                                      /*TemplateArgs=*/nullptr,
10643                                                      /*Scope=*/nullptr);
10644     }
10645 
10646     return getDerived().RebuildDeclarationNameExpr(SS, R, Old->requiresADL());
10647   }
10648 
10649   // If we have template arguments, rebuild them, then rebuild the
10650   // templateid expression.
10651   TemplateArgumentListInfo TransArgs(Old->getLAngleLoc(), Old->getRAngleLoc());
10652   if (Old->hasExplicitTemplateArgs() &&
10653       getDerived().TransformTemplateArguments(Old->getTemplateArgs(),
10654                                               Old->getNumTemplateArgs(),
10655                                               TransArgs)) {
10656     R.clear();
10657     return ExprError();
10658   }
10659 
10660   return getDerived().RebuildTemplateIdExpr(SS, TemplateKWLoc, R,
10661                                             Old->requiresADL(), &TransArgs);
10662 }
10663 
10664 template<typename Derived>
10665 ExprResult
10666 TreeTransform<Derived>::TransformTypeTraitExpr(TypeTraitExpr *E) {
10667   bool ArgChanged = false;
10668   SmallVector<TypeSourceInfo *, 4> Args;
10669   for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) {
10670     TypeSourceInfo *From = E->getArg(I);
10671     TypeLoc FromTL = From->getTypeLoc();
10672     if (!FromTL.getAs<PackExpansionTypeLoc>()) {
10673       TypeLocBuilder TLB;
10674       TLB.reserve(FromTL.getFullDataSize());
10675       QualType To = getDerived().TransformType(TLB, FromTL);
10676       if (To.isNull())
10677         return ExprError();
10678 
10679       if (To == From->getType())
10680         Args.push_back(From);
10681       else {
10682         Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
10683         ArgChanged = true;
10684       }
10685       continue;
10686     }
10687 
10688     ArgChanged = true;
10689 
10690     // We have a pack expansion. Instantiate it.
10691     PackExpansionTypeLoc ExpansionTL = FromTL.castAs<PackExpansionTypeLoc>();
10692     TypeLoc PatternTL = ExpansionTL.getPatternLoc();
10693     SmallVector<UnexpandedParameterPack, 2> Unexpanded;
10694     SemaRef.collectUnexpandedParameterPacks(PatternTL, Unexpanded);
10695 
10696     // Determine whether the set of unexpanded parameter packs can and should
10697     // be expanded.
10698     bool Expand = true;
10699     bool RetainExpansion = false;
10700     Optional<unsigned> OrigNumExpansions =
10701         ExpansionTL.getTypePtr()->getNumExpansions();
10702     Optional<unsigned> NumExpansions = OrigNumExpansions;
10703     if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(),
10704                                              PatternTL.getSourceRange(),
10705                                              Unexpanded,
10706                                              Expand, RetainExpansion,
10707                                              NumExpansions))
10708       return ExprError();
10709 
10710     if (!Expand) {
10711       // The transform has determined that we should perform a simple
10712       // transformation on the pack expansion, producing another pack
10713       // expansion.
10714       Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
10715 
10716       TypeLocBuilder TLB;
10717       TLB.reserve(From->getTypeLoc().getFullDataSize());
10718 
10719       QualType To = getDerived().TransformType(TLB, PatternTL);
10720       if (To.isNull())
10721         return ExprError();
10722 
10723       To = getDerived().RebuildPackExpansionType(To,
10724                                                  PatternTL.getSourceRange(),
10725                                                  ExpansionTL.getEllipsisLoc(),
10726                                                  NumExpansions);
10727       if (To.isNull())
10728         return ExprError();
10729 
10730       PackExpansionTypeLoc ToExpansionTL
10731         = TLB.push<PackExpansionTypeLoc>(To);
10732       ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc());
10733       Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
10734       continue;
10735     }
10736 
10737     // Expand the pack expansion by substituting for each argument in the
10738     // pack(s).
10739     for (unsigned I = 0; I != *NumExpansions; ++I) {
10740       Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(SemaRef, I);
10741       TypeLocBuilder TLB;
10742       TLB.reserve(PatternTL.getFullDataSize());
10743       QualType To = getDerived().TransformType(TLB, PatternTL);
10744       if (To.isNull())
10745         return ExprError();
10746 
10747       if (To->containsUnexpandedParameterPack()) {
10748         To = getDerived().RebuildPackExpansionType(To,
10749                                                    PatternTL.getSourceRange(),
10750                                                    ExpansionTL.getEllipsisLoc(),
10751                                                    NumExpansions);
10752         if (To.isNull())
10753           return ExprError();
10754 
10755         PackExpansionTypeLoc ToExpansionTL
10756           = TLB.push<PackExpansionTypeLoc>(To);
10757         ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc());
10758       }
10759 
10760       Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
10761     }
10762 
10763     if (!RetainExpansion)
10764       continue;
10765 
10766     // If we're supposed to retain a pack expansion, do so by temporarily
10767     // forgetting the partially-substituted parameter pack.
10768     ForgetPartiallySubstitutedPackRAII Forget(getDerived());
10769 
10770     TypeLocBuilder TLB;
10771     TLB.reserve(From->getTypeLoc().getFullDataSize());
10772 
10773     QualType To = getDerived().TransformType(TLB, PatternTL);
10774     if (To.isNull())
10775       return ExprError();
10776 
10777     To = getDerived().RebuildPackExpansionType(To,
10778                                                PatternTL.getSourceRange(),
10779                                                ExpansionTL.getEllipsisLoc(),
10780                                                NumExpansions);
10781     if (To.isNull())
10782       return ExprError();
10783 
10784     PackExpansionTypeLoc ToExpansionTL
10785       = TLB.push<PackExpansionTypeLoc>(To);
10786     ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc());
10787     Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
10788   }
10789 
10790   if (!getDerived().AlwaysRebuild() && !ArgChanged)
10791     return E;
10792 
10793   return getDerived().RebuildTypeTrait(E->getTrait(), E->getBeginLoc(), Args,
10794                                        E->getEndLoc());
10795 }
10796 
10797 template<typename Derived>
10798 ExprResult
10799 TreeTransform<Derived>::TransformArrayTypeTraitExpr(ArrayTypeTraitExpr *E) {
10800   TypeSourceInfo *T = getDerived().TransformType(E->getQueriedTypeSourceInfo());
10801   if (!T)
10802     return ExprError();
10803 
10804   if (!getDerived().AlwaysRebuild() &&
10805       T == E->getQueriedTypeSourceInfo())
10806     return E;
10807 
10808   ExprResult SubExpr;
10809   {
10810     EnterExpressionEvaluationContext Unevaluated(
10811         SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
10812     SubExpr = getDerived().TransformExpr(E->getDimensionExpression());
10813     if (SubExpr.isInvalid())
10814       return ExprError();
10815 
10816     if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getDimensionExpression())
10817       return E;
10818   }
10819 
10820   return getDerived().RebuildArrayTypeTrait(E->getTrait(), E->getBeginLoc(), T,
10821                                             SubExpr.get(), E->getEndLoc());
10822 }
10823 
10824 template<typename Derived>
10825 ExprResult
10826 TreeTransform<Derived>::TransformExpressionTraitExpr(ExpressionTraitExpr *E) {
10827   ExprResult SubExpr;
10828   {
10829     EnterExpressionEvaluationContext Unevaluated(
10830         SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
10831     SubExpr = getDerived().TransformExpr(E->getQueriedExpression());
10832     if (SubExpr.isInvalid())
10833       return ExprError();
10834 
10835     if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getQueriedExpression())
10836       return E;
10837   }
10838 
10839   return getDerived().RebuildExpressionTrait(E->getTrait(), E->getBeginLoc(),
10840                                              SubExpr.get(), E->getEndLoc());
10841 }
10842 
10843 template <typename Derived>
10844 ExprResult TreeTransform<Derived>::TransformParenDependentScopeDeclRefExpr(
10845     ParenExpr *PE, DependentScopeDeclRefExpr *DRE, bool AddrTaken,
10846     TypeSourceInfo **RecoveryTSI) {
10847   ExprResult NewDRE = getDerived().TransformDependentScopeDeclRefExpr(
10848       DRE, AddrTaken, RecoveryTSI);
10849 
10850   // Propagate both errors and recovered types, which return ExprEmpty.
10851   if (!NewDRE.isUsable())
10852     return NewDRE;
10853 
10854   // We got an expr, wrap it up in parens.
10855   if (!getDerived().AlwaysRebuild() && NewDRE.get() == DRE)
10856     return PE;
10857   return getDerived().RebuildParenExpr(NewDRE.get(), PE->getLParen(),
10858                                        PE->getRParen());
10859 }
10860 
10861 template <typename Derived>
10862 ExprResult TreeTransform<Derived>::TransformDependentScopeDeclRefExpr(
10863     DependentScopeDeclRefExpr *E) {
10864   return TransformDependentScopeDeclRefExpr(E, /*IsAddressOfOperand=*/false,
10865                                             nullptr);
10866 }
10867 
10868 template<typename Derived>
10869 ExprResult
10870 TreeTransform<Derived>::TransformDependentScopeDeclRefExpr(
10871                                                DependentScopeDeclRefExpr *E,
10872                                                bool IsAddressOfOperand,
10873                                                TypeSourceInfo **RecoveryTSI) {
10874   assert(E->getQualifierLoc());
10875   NestedNameSpecifierLoc QualifierLoc
10876   = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
10877   if (!QualifierLoc)
10878     return ExprError();
10879   SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc();
10880 
10881   // TODO: If this is a conversion-function-id, verify that the
10882   // destination type name (if present) resolves the same way after
10883   // instantiation as it did in the local scope.
10884 
10885   DeclarationNameInfo NameInfo
10886     = getDerived().TransformDeclarationNameInfo(E->getNameInfo());
10887   if (!NameInfo.getName())
10888     return ExprError();
10889 
10890   if (!E->hasExplicitTemplateArgs()) {
10891     if (!getDerived().AlwaysRebuild() &&
10892         QualifierLoc == E->getQualifierLoc() &&
10893         // Note: it is sufficient to compare the Name component of NameInfo:
10894         // if name has not changed, DNLoc has not changed either.
10895         NameInfo.getName() == E->getDeclName())
10896       return E;
10897 
10898     return getDerived().RebuildDependentScopeDeclRefExpr(
10899         QualifierLoc, TemplateKWLoc, NameInfo, /*TemplateArgs=*/nullptr,
10900         IsAddressOfOperand, RecoveryTSI);
10901   }
10902 
10903   TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc());
10904   if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
10905                                               E->getNumTemplateArgs(),
10906                                               TransArgs))
10907     return ExprError();
10908 
10909   return getDerived().RebuildDependentScopeDeclRefExpr(
10910       QualifierLoc, TemplateKWLoc, NameInfo, &TransArgs, IsAddressOfOperand,
10911       RecoveryTSI);
10912 }
10913 
10914 template<typename Derived>
10915 ExprResult
10916 TreeTransform<Derived>::TransformCXXConstructExpr(CXXConstructExpr *E) {
10917   // CXXConstructExprs other than for list-initialization and
10918   // CXXTemporaryObjectExpr are always implicit, so when we have
10919   // a 1-argument construction we just transform that argument.
10920   if ((E->getNumArgs() == 1 ||
10921        (E->getNumArgs() > 1 && getDerived().DropCallArgument(E->getArg(1)))) &&
10922       (!getDerived().DropCallArgument(E->getArg(0))) &&
10923       !E->isListInitialization())
10924     return getDerived().TransformExpr(E->getArg(0));
10925 
10926   TemporaryBase Rebase(*this, /*FIXME*/ E->getBeginLoc(), DeclarationName());
10927 
10928   QualType T = getDerived().TransformType(E->getType());
10929   if (T.isNull())
10930     return ExprError();
10931 
10932   CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>(
10933       getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor()));
10934   if (!Constructor)
10935     return ExprError();
10936 
10937   bool ArgumentChanged = false;
10938   SmallVector<Expr*, 8> Args;
10939   {
10940     EnterExpressionEvaluationContext Context(
10941         getSema(), EnterExpressionEvaluationContext::InitList,
10942         E->isListInitialization());
10943     if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
10944                                     &ArgumentChanged))
10945       return ExprError();
10946   }
10947 
10948   if (!getDerived().AlwaysRebuild() &&
10949       T == E->getType() &&
10950       Constructor == E->getConstructor() &&
10951       !ArgumentChanged) {
10952     // Mark the constructor as referenced.
10953     // FIXME: Instantiation-specific
10954     SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor);
10955     return E;
10956   }
10957 
10958   return getDerived().RebuildCXXConstructExpr(
10959       T, /*FIXME:*/ E->getBeginLoc(), Constructor, E->isElidable(), Args,
10960       E->hadMultipleCandidates(), E->isListInitialization(),
10961       E->isStdInitListInitialization(), E->requiresZeroInitialization(),
10962       E->getConstructionKind(), E->getParenOrBraceRange());
10963 }
10964 
10965 template<typename Derived>
10966 ExprResult TreeTransform<Derived>::TransformCXXInheritedCtorInitExpr(
10967     CXXInheritedCtorInitExpr *E) {
10968   QualType T = getDerived().TransformType(E->getType());
10969   if (T.isNull())
10970     return ExprError();
10971 
10972   CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>(
10973       getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor()));
10974   if (!Constructor)
10975     return ExprError();
10976 
10977   if (!getDerived().AlwaysRebuild() &&
10978       T == E->getType() &&
10979       Constructor == E->getConstructor()) {
10980     // Mark the constructor as referenced.
10981     // FIXME: Instantiation-specific
10982     SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor);
10983     return E;
10984   }
10985 
10986   return getDerived().RebuildCXXInheritedCtorInitExpr(
10987       T, E->getLocation(), Constructor,
10988       E->constructsVBase(), E->inheritedFromVBase());
10989 }
10990 
10991 /// Transform a C++ temporary-binding expression.
10992 ///
10993 /// Since CXXBindTemporaryExpr nodes are implicitly generated, we just
10994 /// transform the subexpression and return that.
10995 template<typename Derived>
10996 ExprResult
10997 TreeTransform<Derived>::TransformCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) {
10998   return getDerived().TransformExpr(E->getSubExpr());
10999 }
11000 
11001 /// Transform a C++ expression that contains cleanups that should
11002 /// be run after the expression is evaluated.
11003 ///
11004 /// Since ExprWithCleanups nodes are implicitly generated, we
11005 /// just transform the subexpression and return that.
11006 template<typename Derived>
11007 ExprResult
11008 TreeTransform<Derived>::TransformExprWithCleanups(ExprWithCleanups *E) {
11009   return getDerived().TransformExpr(E->getSubExpr());
11010 }
11011 
11012 template<typename Derived>
11013 ExprResult
11014 TreeTransform<Derived>::TransformCXXTemporaryObjectExpr(
11015                                                     CXXTemporaryObjectExpr *E) {
11016   TypeSourceInfo *T =
11017       getDerived().TransformTypeWithDeducedTST(E->getTypeSourceInfo());
11018   if (!T)
11019     return ExprError();
11020 
11021   CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>(
11022       getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor()));
11023   if (!Constructor)
11024     return ExprError();
11025 
11026   bool ArgumentChanged = false;
11027   SmallVector<Expr*, 8> Args;
11028   Args.reserve(E->getNumArgs());
11029   {
11030     EnterExpressionEvaluationContext Context(
11031         getSema(), EnterExpressionEvaluationContext::InitList,
11032         E->isListInitialization());
11033     if (TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
11034                        &ArgumentChanged))
11035       return ExprError();
11036   }
11037 
11038   if (!getDerived().AlwaysRebuild() &&
11039       T == E->getTypeSourceInfo() &&
11040       Constructor == E->getConstructor() &&
11041       !ArgumentChanged) {
11042     // FIXME: Instantiation-specific
11043     SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor);
11044     return SemaRef.MaybeBindToTemporary(E);
11045   }
11046 
11047   // FIXME: We should just pass E->isListInitialization(), but we're not
11048   // prepared to handle list-initialization without a child InitListExpr.
11049   SourceLocation LParenLoc = T->getTypeLoc().getEndLoc();
11050   return getDerived().RebuildCXXTemporaryObjectExpr(
11051       T, LParenLoc, Args, E->getEndLoc(),
11052       /*ListInitialization=*/LParenLoc.isInvalid());
11053 }
11054 
11055 template<typename Derived>
11056 ExprResult
11057 TreeTransform<Derived>::TransformLambdaExpr(LambdaExpr *E) {
11058   // Transform any init-capture expressions before entering the scope of the
11059   // lambda body, because they are not semantically within that scope.
11060   typedef std::pair<ExprResult, QualType> InitCaptureInfoTy;
11061   SmallVector<InitCaptureInfoTy, 8> InitCaptureExprsAndTypes;
11062   InitCaptureExprsAndTypes.resize(E->explicit_capture_end() -
11063                                   E->explicit_capture_begin());
11064   for (LambdaExpr::capture_iterator C = E->capture_begin(),
11065                                     CEnd = E->capture_end();
11066        C != CEnd; ++C) {
11067     if (!E->isInitCapture(C))
11068       continue;
11069     EnterExpressionEvaluationContext EEEC(
11070         getSema(), Sema::ExpressionEvaluationContext::PotentiallyEvaluated);
11071     ExprResult NewExprInitResult = getDerived().TransformInitializer(
11072         C->getCapturedVar()->getInit(),
11073         C->getCapturedVar()->getInitStyle() == VarDecl::CallInit);
11074 
11075     if (NewExprInitResult.isInvalid())
11076       return ExprError();
11077     Expr *NewExprInit = NewExprInitResult.get();
11078 
11079     VarDecl *OldVD = C->getCapturedVar();
11080     QualType NewInitCaptureType =
11081         getSema().buildLambdaInitCaptureInitialization(
11082             C->getLocation(), OldVD->getType()->isReferenceType(),
11083             OldVD->getIdentifier(),
11084             C->getCapturedVar()->getInitStyle() != VarDecl::CInit, NewExprInit);
11085     NewExprInitResult = NewExprInit;
11086     InitCaptureExprsAndTypes[C - E->capture_begin()] =
11087         std::make_pair(NewExprInitResult, NewInitCaptureType);
11088   }
11089 
11090   // Transform the template parameters, and add them to the current
11091   // instantiation scope. The null case is handled correctly.
11092   auto TPL = getDerived().TransformTemplateParameterList(
11093       E->getTemplateParameterList());
11094 
11095   // Transform the type of the original lambda's call operator.
11096   // The transformation MUST be done in the CurrentInstantiationScope since
11097   // it introduces a mapping of the original to the newly created
11098   // transformed parameters.
11099   TypeSourceInfo *NewCallOpTSI = nullptr;
11100   {
11101     TypeSourceInfo *OldCallOpTSI = E->getCallOperator()->getTypeSourceInfo();
11102     FunctionProtoTypeLoc OldCallOpFPTL =
11103         OldCallOpTSI->getTypeLoc().getAs<FunctionProtoTypeLoc>();
11104 
11105     TypeLocBuilder NewCallOpTLBuilder;
11106     SmallVector<QualType, 4> ExceptionStorage;
11107     TreeTransform *This = this; // Work around gcc.gnu.org/PR56135.
11108     QualType NewCallOpType = TransformFunctionProtoType(
11109         NewCallOpTLBuilder, OldCallOpFPTL, nullptr, Qualifiers(),
11110         [&](FunctionProtoType::ExceptionSpecInfo &ESI, bool &Changed) {
11111           return This->TransformExceptionSpec(OldCallOpFPTL.getBeginLoc(), ESI,
11112                                               ExceptionStorage, Changed);
11113         });
11114     if (NewCallOpType.isNull())
11115       return ExprError();
11116     NewCallOpTSI = NewCallOpTLBuilder.getTypeSourceInfo(getSema().Context,
11117                                                         NewCallOpType);
11118   }
11119 
11120   LambdaScopeInfo *LSI = getSema().PushLambdaScope();
11121   Sema::FunctionScopeRAII FuncScopeCleanup(getSema());
11122   LSI->GLTemplateParameterList = TPL;
11123 
11124   // Create the local class that will describe the lambda.
11125   CXXRecordDecl *Class
11126     = getSema().createLambdaClosureType(E->getIntroducerRange(),
11127                                         NewCallOpTSI,
11128                                         /*KnownDependent=*/false,
11129                                         E->getCaptureDefault());
11130   getDerived().transformedLocalDecl(E->getLambdaClass(), Class);
11131 
11132   // Build the call operator.
11133   CXXMethodDecl *NewCallOperator = getSema().startLambdaDefinition(
11134       Class, E->getIntroducerRange(), NewCallOpTSI,
11135       E->getCallOperator()->getEndLoc(),
11136       NewCallOpTSI->getTypeLoc().castAs<FunctionProtoTypeLoc>().getParams(),
11137       E->getCallOperator()->isConstexpr());
11138 
11139   LSI->CallOperator = NewCallOperator;
11140 
11141   for (unsigned I = 0, NumParams = NewCallOperator->getNumParams();
11142        I != NumParams; ++I) {
11143     auto *P = NewCallOperator->getParamDecl(I);
11144     if (P->hasUninstantiatedDefaultArg()) {
11145       EnterExpressionEvaluationContext Eval(
11146           getSema(),
11147           Sema::ExpressionEvaluationContext::PotentiallyEvaluatedIfUsed, P);
11148       ExprResult R = getDerived().TransformExpr(
11149           E->getCallOperator()->getParamDecl(I)->getDefaultArg());
11150       P->setDefaultArg(R.get());
11151     }
11152   }
11153 
11154   getDerived().transformAttrs(E->getCallOperator(), NewCallOperator);
11155   getDerived().transformedLocalDecl(E->getCallOperator(), NewCallOperator);
11156 
11157   // Introduce the context of the call operator.
11158   Sema::ContextRAII SavedContext(getSema(), NewCallOperator,
11159                                  /*NewThisContext*/false);
11160 
11161   // Enter the scope of the lambda.
11162   getSema().buildLambdaScope(LSI, NewCallOperator,
11163                              E->getIntroducerRange(),
11164                              E->getCaptureDefault(),
11165                              E->getCaptureDefaultLoc(),
11166                              E->hasExplicitParameters(),
11167                              E->hasExplicitResultType(),
11168                              E->isMutable());
11169 
11170   bool Invalid = false;
11171 
11172   // Transform captures.
11173   bool FinishedExplicitCaptures = false;
11174   for (LambdaExpr::capture_iterator C = E->capture_begin(),
11175                                  CEnd = E->capture_end();
11176        C != CEnd; ++C) {
11177     // When we hit the first implicit capture, tell Sema that we've finished
11178     // the list of explicit captures.
11179     if (!FinishedExplicitCaptures && C->isImplicit()) {
11180       getSema().finishLambdaExplicitCaptures(LSI);
11181       FinishedExplicitCaptures = true;
11182     }
11183 
11184     // Capturing 'this' is trivial.
11185     if (C->capturesThis()) {
11186       getSema().CheckCXXThisCapture(C->getLocation(), C->isExplicit(),
11187                                     /*BuildAndDiagnose*/ true, nullptr,
11188                                     C->getCaptureKind() == LCK_StarThis);
11189       continue;
11190     }
11191     // Captured expression will be recaptured during captured variables
11192     // rebuilding.
11193     if (C->capturesVLAType())
11194       continue;
11195 
11196     // Rebuild init-captures, including the implied field declaration.
11197     if (E->isInitCapture(C)) {
11198       InitCaptureInfoTy InitExprTypePair =
11199           InitCaptureExprsAndTypes[C - E->capture_begin()];
11200       ExprResult Init = InitExprTypePair.first;
11201       QualType InitQualType = InitExprTypePair.second;
11202       if (Init.isInvalid() || InitQualType.isNull()) {
11203         Invalid = true;
11204         continue;
11205       }
11206       VarDecl *OldVD = C->getCapturedVar();
11207       VarDecl *NewVD = getSema().createLambdaInitCaptureVarDecl(
11208           OldVD->getLocation(), InitExprTypePair.second, OldVD->getIdentifier(),
11209           OldVD->getInitStyle(), Init.get());
11210       if (!NewVD)
11211         Invalid = true;
11212       else {
11213         getDerived().transformedLocalDecl(OldVD, NewVD);
11214       }
11215       getSema().buildInitCaptureField(LSI, NewVD);
11216       continue;
11217     }
11218 
11219     assert(C->capturesVariable() && "unexpected kind of lambda capture");
11220 
11221     // Determine the capture kind for Sema.
11222     Sema::TryCaptureKind Kind
11223       = C->isImplicit()? Sema::TryCapture_Implicit
11224                        : C->getCaptureKind() == LCK_ByCopy
11225                            ? Sema::TryCapture_ExplicitByVal
11226                            : Sema::TryCapture_ExplicitByRef;
11227     SourceLocation EllipsisLoc;
11228     if (C->isPackExpansion()) {
11229       UnexpandedParameterPack Unexpanded(C->getCapturedVar(), C->getLocation());
11230       bool ShouldExpand = false;
11231       bool RetainExpansion = false;
11232       Optional<unsigned> NumExpansions;
11233       if (getDerived().TryExpandParameterPacks(C->getEllipsisLoc(),
11234                                                C->getLocation(),
11235                                                Unexpanded,
11236                                                ShouldExpand, RetainExpansion,
11237                                                NumExpansions)) {
11238         Invalid = true;
11239         continue;
11240       }
11241 
11242       if (ShouldExpand) {
11243         // The transform has determined that we should perform an expansion;
11244         // transform and capture each of the arguments.
11245         // expansion of the pattern. Do so.
11246         VarDecl *Pack = C->getCapturedVar();
11247         for (unsigned I = 0; I != *NumExpansions; ++I) {
11248           Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
11249           VarDecl *CapturedVar
11250             = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(),
11251                                                                Pack));
11252           if (!CapturedVar) {
11253             Invalid = true;
11254             continue;
11255           }
11256 
11257           // Capture the transformed variable.
11258           getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind);
11259         }
11260 
11261         // FIXME: Retain a pack expansion if RetainExpansion is true.
11262 
11263         continue;
11264       }
11265 
11266       EllipsisLoc = C->getEllipsisLoc();
11267     }
11268 
11269     // Transform the captured variable.
11270     VarDecl *CapturedVar
11271       = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(),
11272                                                          C->getCapturedVar()));
11273     if (!CapturedVar || CapturedVar->isInvalidDecl()) {
11274       Invalid = true;
11275       continue;
11276     }
11277 
11278     // Capture the transformed variable.
11279     getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind,
11280                                  EllipsisLoc);
11281   }
11282   if (!FinishedExplicitCaptures)
11283     getSema().finishLambdaExplicitCaptures(LSI);
11284 
11285   // Enter a new evaluation context to insulate the lambda from any
11286   // cleanups from the enclosing full-expression.
11287   getSema().PushExpressionEvaluationContext(
11288       Sema::ExpressionEvaluationContext::PotentiallyEvaluated);
11289 
11290   // Instantiate the body of the lambda expression.
11291   StmtResult Body =
11292       Invalid ? StmtError() : getDerived().TransformStmt(E->getBody());
11293 
11294   // ActOnLambda* will pop the function scope for us.
11295   FuncScopeCleanup.disable();
11296 
11297   if (Body.isInvalid()) {
11298     SavedContext.pop();
11299     getSema().ActOnLambdaError(E->getBeginLoc(), /*CurScope=*/nullptr,
11300                                /*IsInstantiation=*/true);
11301     return ExprError();
11302   }
11303 
11304   // Copy the LSI before ActOnFinishFunctionBody removes it.
11305   // FIXME: This is dumb. Store the lambda information somewhere that outlives
11306   // the call operator.
11307   auto LSICopy = *LSI;
11308   getSema().ActOnFinishFunctionBody(NewCallOperator, Body.get(),
11309                                     /*IsInstantiation*/ true);
11310   SavedContext.pop();
11311 
11312   return getSema().BuildLambdaExpr(E->getBeginLoc(), Body.get()->getEndLoc(),
11313                                    &LSICopy);
11314 }
11315 
11316 template<typename Derived>
11317 ExprResult
11318 TreeTransform<Derived>::TransformCXXUnresolvedConstructExpr(
11319                                                   CXXUnresolvedConstructExpr *E) {
11320   TypeSourceInfo *T =
11321       getDerived().TransformTypeWithDeducedTST(E->getTypeSourceInfo());
11322   if (!T)
11323     return ExprError();
11324 
11325   bool ArgumentChanged = false;
11326   SmallVector<Expr*, 8> Args;
11327   Args.reserve(E->arg_size());
11328   {
11329     EnterExpressionEvaluationContext Context(
11330         getSema(), EnterExpressionEvaluationContext::InitList,
11331         E->isListInitialization());
11332     if (getDerived().TransformExprs(E->arg_begin(), E->arg_size(), true, Args,
11333                                     &ArgumentChanged))
11334       return ExprError();
11335   }
11336 
11337   if (!getDerived().AlwaysRebuild() &&
11338       T == E->getTypeSourceInfo() &&
11339       !ArgumentChanged)
11340     return E;
11341 
11342   // FIXME: we're faking the locations of the commas
11343   return getDerived().RebuildCXXUnresolvedConstructExpr(
11344       T, E->getLParenLoc(), Args, E->getRParenLoc(), E->isListInitialization());
11345 }
11346 
11347 template<typename Derived>
11348 ExprResult
11349 TreeTransform<Derived>::TransformCXXDependentScopeMemberExpr(
11350                                              CXXDependentScopeMemberExpr *E) {
11351   // Transform the base of the expression.
11352   ExprResult Base((Expr*) nullptr);
11353   Expr *OldBase;
11354   QualType BaseType;
11355   QualType ObjectType;
11356   if (!E->isImplicitAccess()) {
11357     OldBase = E->getBase();
11358     Base = getDerived().TransformExpr(OldBase);
11359     if (Base.isInvalid())
11360       return ExprError();
11361 
11362     // Start the member reference and compute the object's type.
11363     ParsedType ObjectTy;
11364     bool MayBePseudoDestructor = false;
11365     Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(),
11366                                                 E->getOperatorLoc(),
11367                                       E->isArrow()? tok::arrow : tok::period,
11368                                                 ObjectTy,
11369                                                 MayBePseudoDestructor);
11370     if (Base.isInvalid())
11371       return ExprError();
11372 
11373     ObjectType = ObjectTy.get();
11374     BaseType = ((Expr*) Base.get())->getType();
11375   } else {
11376     OldBase = nullptr;
11377     BaseType = getDerived().TransformType(E->getBaseType());
11378     ObjectType = BaseType->getAs<PointerType>()->getPointeeType();
11379   }
11380 
11381   // Transform the first part of the nested-name-specifier that qualifies
11382   // the member name.
11383   NamedDecl *FirstQualifierInScope
11384     = getDerived().TransformFirstQualifierInScope(
11385                                             E->getFirstQualifierFoundInScope(),
11386                                             E->getQualifierLoc().getBeginLoc());
11387 
11388   NestedNameSpecifierLoc QualifierLoc;
11389   if (E->getQualifier()) {
11390     QualifierLoc
11391       = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc(),
11392                                                      ObjectType,
11393                                                      FirstQualifierInScope);
11394     if (!QualifierLoc)
11395       return ExprError();
11396   }
11397 
11398   SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc();
11399 
11400   // TODO: If this is a conversion-function-id, verify that the
11401   // destination type name (if present) resolves the same way after
11402   // instantiation as it did in the local scope.
11403 
11404   DeclarationNameInfo NameInfo
11405     = getDerived().TransformDeclarationNameInfo(E->getMemberNameInfo());
11406   if (!NameInfo.getName())
11407     return ExprError();
11408 
11409   if (!E->hasExplicitTemplateArgs()) {
11410     // This is a reference to a member without an explicitly-specified
11411     // template argument list. Optimize for this common case.
11412     if (!getDerived().AlwaysRebuild() &&
11413         Base.get() == OldBase &&
11414         BaseType == E->getBaseType() &&
11415         QualifierLoc == E->getQualifierLoc() &&
11416         NameInfo.getName() == E->getMember() &&
11417         FirstQualifierInScope == E->getFirstQualifierFoundInScope())
11418       return E;
11419 
11420     return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(),
11421                                                        BaseType,
11422                                                        E->isArrow(),
11423                                                        E->getOperatorLoc(),
11424                                                        QualifierLoc,
11425                                                        TemplateKWLoc,
11426                                                        FirstQualifierInScope,
11427                                                        NameInfo,
11428                                                        /*TemplateArgs*/nullptr);
11429   }
11430 
11431   TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc());
11432   if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
11433                                               E->getNumTemplateArgs(),
11434                                               TransArgs))
11435     return ExprError();
11436 
11437   return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(),
11438                                                      BaseType,
11439                                                      E->isArrow(),
11440                                                      E->getOperatorLoc(),
11441                                                      QualifierLoc,
11442                                                      TemplateKWLoc,
11443                                                      FirstQualifierInScope,
11444                                                      NameInfo,
11445                                                      &TransArgs);
11446 }
11447 
11448 template<typename Derived>
11449 ExprResult
11450 TreeTransform<Derived>::TransformUnresolvedMemberExpr(UnresolvedMemberExpr *Old) {
11451   // Transform the base of the expression.
11452   ExprResult Base((Expr*) nullptr);
11453   QualType BaseType;
11454   if (!Old->isImplicitAccess()) {
11455     Base = getDerived().TransformExpr(Old->getBase());
11456     if (Base.isInvalid())
11457       return ExprError();
11458     Base = getSema().PerformMemberExprBaseConversion(Base.get(),
11459                                                      Old->isArrow());
11460     if (Base.isInvalid())
11461       return ExprError();
11462     BaseType = Base.get()->getType();
11463   } else {
11464     BaseType = getDerived().TransformType(Old->getBaseType());
11465   }
11466 
11467   NestedNameSpecifierLoc QualifierLoc;
11468   if (Old->getQualifierLoc()) {
11469     QualifierLoc
11470     = getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc());
11471     if (!QualifierLoc)
11472       return ExprError();
11473   }
11474 
11475   SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc();
11476 
11477   LookupResult R(SemaRef, Old->getMemberNameInfo(),
11478                  Sema::LookupOrdinaryName);
11479 
11480   // Transform the declaration set.
11481   if (TransformOverloadExprDecls(Old, /*RequiresADL*/false, R))
11482     return ExprError();
11483 
11484   // Determine the naming class.
11485   if (Old->getNamingClass()) {
11486     CXXRecordDecl *NamingClass
11487       = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl(
11488                                                           Old->getMemberLoc(),
11489                                                         Old->getNamingClass()));
11490     if (!NamingClass)
11491       return ExprError();
11492 
11493     R.setNamingClass(NamingClass);
11494   }
11495 
11496   TemplateArgumentListInfo TransArgs;
11497   if (Old->hasExplicitTemplateArgs()) {
11498     TransArgs.setLAngleLoc(Old->getLAngleLoc());
11499     TransArgs.setRAngleLoc(Old->getRAngleLoc());
11500     if (getDerived().TransformTemplateArguments(Old->getTemplateArgs(),
11501                                                 Old->getNumTemplateArgs(),
11502                                                 TransArgs))
11503       return ExprError();
11504   }
11505 
11506   // FIXME: to do this check properly, we will need to preserve the
11507   // first-qualifier-in-scope here, just in case we had a dependent
11508   // base (and therefore couldn't do the check) and a
11509   // nested-name-qualifier (and therefore could do the lookup).
11510   NamedDecl *FirstQualifierInScope = nullptr;
11511 
11512   return getDerived().RebuildUnresolvedMemberExpr(Base.get(),
11513                                                   BaseType,
11514                                                   Old->getOperatorLoc(),
11515                                                   Old->isArrow(),
11516                                                   QualifierLoc,
11517                                                   TemplateKWLoc,
11518                                                   FirstQualifierInScope,
11519                                                   R,
11520                                               (Old->hasExplicitTemplateArgs()
11521                                                   ? &TransArgs : nullptr));
11522 }
11523 
11524 template<typename Derived>
11525 ExprResult
11526 TreeTransform<Derived>::TransformCXXNoexceptExpr(CXXNoexceptExpr *E) {
11527   EnterExpressionEvaluationContext Unevaluated(
11528       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
11529   ExprResult SubExpr = getDerived().TransformExpr(E->getOperand());
11530   if (SubExpr.isInvalid())
11531     return ExprError();
11532 
11533   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getOperand())
11534     return E;
11535 
11536   return getDerived().RebuildCXXNoexceptExpr(E->getSourceRange(),SubExpr.get());
11537 }
11538 
11539 template<typename Derived>
11540 ExprResult
11541 TreeTransform<Derived>::TransformPackExpansionExpr(PackExpansionExpr *E) {
11542   ExprResult Pattern = getDerived().TransformExpr(E->getPattern());
11543   if (Pattern.isInvalid())
11544     return ExprError();
11545 
11546   if (!getDerived().AlwaysRebuild() && Pattern.get() == E->getPattern())
11547     return E;
11548 
11549   return getDerived().RebuildPackExpansion(Pattern.get(), E->getEllipsisLoc(),
11550                                            E->getNumExpansions());
11551 }
11552 
11553 template<typename Derived>
11554 ExprResult
11555 TreeTransform<Derived>::TransformSizeOfPackExpr(SizeOfPackExpr *E) {
11556   // If E is not value-dependent, then nothing will change when we transform it.
11557   // Note: This is an instantiation-centric view.
11558   if (!E->isValueDependent())
11559     return E;
11560 
11561   EnterExpressionEvaluationContext Unevaluated(
11562       getSema(), Sema::ExpressionEvaluationContext::Unevaluated);
11563 
11564   ArrayRef<TemplateArgument> PackArgs;
11565   TemplateArgument ArgStorage;
11566 
11567   // Find the argument list to transform.
11568   if (E->isPartiallySubstituted()) {
11569     PackArgs = E->getPartialArguments();
11570   } else if (E->isValueDependent()) {
11571     UnexpandedParameterPack Unexpanded(E->getPack(), E->getPackLoc());
11572     bool ShouldExpand = false;
11573     bool RetainExpansion = false;
11574     Optional<unsigned> NumExpansions;
11575     if (getDerived().TryExpandParameterPacks(E->getOperatorLoc(), E->getPackLoc(),
11576                                              Unexpanded,
11577                                              ShouldExpand, RetainExpansion,
11578                                              NumExpansions))
11579       return ExprError();
11580 
11581     // If we need to expand the pack, build a template argument from it and
11582     // expand that.
11583     if (ShouldExpand) {
11584       auto *Pack = E->getPack();
11585       if (auto *TTPD = dyn_cast<TemplateTypeParmDecl>(Pack)) {
11586         ArgStorage = getSema().Context.getPackExpansionType(
11587             getSema().Context.getTypeDeclType(TTPD), None);
11588       } else if (auto *TTPD = dyn_cast<TemplateTemplateParmDecl>(Pack)) {
11589         ArgStorage = TemplateArgument(TemplateName(TTPD), None);
11590       } else {
11591         auto *VD = cast<ValueDecl>(Pack);
11592         ExprResult DRE = getSema().BuildDeclRefExpr(
11593             VD, VD->getType().getNonLValueExprType(getSema().Context),
11594             VD->getType()->isReferenceType() ? VK_LValue : VK_RValue,
11595             E->getPackLoc());
11596         if (DRE.isInvalid())
11597           return ExprError();
11598         ArgStorage = new (getSema().Context) PackExpansionExpr(
11599             getSema().Context.DependentTy, DRE.get(), E->getPackLoc(), None);
11600       }
11601       PackArgs = ArgStorage;
11602     }
11603   }
11604 
11605   // If we're not expanding the pack, just transform the decl.
11606   if (!PackArgs.size()) {
11607     auto *Pack = cast_or_null<NamedDecl>(
11608         getDerived().TransformDecl(E->getPackLoc(), E->getPack()));
11609     if (!Pack)
11610       return ExprError();
11611     return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), Pack,
11612                                               E->getPackLoc(),
11613                                               E->getRParenLoc(), None, None);
11614   }
11615 
11616   // Try to compute the result without performing a partial substitution.
11617   Optional<unsigned> Result = 0;
11618   for (const TemplateArgument &Arg : PackArgs) {
11619     if (!Arg.isPackExpansion()) {
11620       Result = *Result + 1;
11621       continue;
11622     }
11623 
11624     TemplateArgumentLoc ArgLoc;
11625     InventTemplateArgumentLoc(Arg, ArgLoc);
11626 
11627     // Find the pattern of the pack expansion.
11628     SourceLocation Ellipsis;
11629     Optional<unsigned> OrigNumExpansions;
11630     TemplateArgumentLoc Pattern =
11631         getSema().getTemplateArgumentPackExpansionPattern(ArgLoc, Ellipsis,
11632                                                           OrigNumExpansions);
11633 
11634     // Substitute under the pack expansion. Do not expand the pack (yet).
11635     TemplateArgumentLoc OutPattern;
11636     Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
11637     if (getDerived().TransformTemplateArgument(Pattern, OutPattern,
11638                                                /*Uneval*/ true))
11639       return true;
11640 
11641     // See if we can determine the number of arguments from the result.
11642     Optional<unsigned> NumExpansions =
11643         getSema().getFullyPackExpandedSize(OutPattern.getArgument());
11644     if (!NumExpansions) {
11645       // No: we must be in an alias template expansion, and we're going to need
11646       // to actually expand the packs.
11647       Result = None;
11648       break;
11649     }
11650 
11651     Result = *Result + *NumExpansions;
11652   }
11653 
11654   // Common case: we could determine the number of expansions without
11655   // substituting.
11656   if (Result)
11657     return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(),
11658                                               E->getPackLoc(),
11659                                               E->getRParenLoc(), *Result, None);
11660 
11661   TemplateArgumentListInfo TransformedPackArgs(E->getPackLoc(),
11662                                                E->getPackLoc());
11663   {
11664     TemporaryBase Rebase(*this, E->getPackLoc(), getBaseEntity());
11665     typedef TemplateArgumentLocInventIterator<
11666         Derived, const TemplateArgument*> PackLocIterator;
11667     if (TransformTemplateArguments(PackLocIterator(*this, PackArgs.begin()),
11668                                    PackLocIterator(*this, PackArgs.end()),
11669                                    TransformedPackArgs, /*Uneval*/true))
11670       return ExprError();
11671   }
11672 
11673   // Check whether we managed to fully-expand the pack.
11674   // FIXME: Is it possible for us to do so and not hit the early exit path?
11675   SmallVector<TemplateArgument, 8> Args;
11676   bool PartialSubstitution = false;
11677   for (auto &Loc : TransformedPackArgs.arguments()) {
11678     Args.push_back(Loc.getArgument());
11679     if (Loc.getArgument().isPackExpansion())
11680       PartialSubstitution = true;
11681   }
11682 
11683   if (PartialSubstitution)
11684     return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(),
11685                                               E->getPackLoc(),
11686                                               E->getRParenLoc(), None, Args);
11687 
11688   return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(),
11689                                             E->getPackLoc(), E->getRParenLoc(),
11690                                             Args.size(), None);
11691 }
11692 
11693 template<typename Derived>
11694 ExprResult
11695 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmPackExpr(
11696                                           SubstNonTypeTemplateParmPackExpr *E) {
11697   // Default behavior is to do nothing with this transformation.
11698   return E;
11699 }
11700 
11701 template<typename Derived>
11702 ExprResult
11703 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmExpr(
11704                                           SubstNonTypeTemplateParmExpr *E) {
11705   // Default behavior is to do nothing with this transformation.
11706   return E;
11707 }
11708 
11709 template<typename Derived>
11710 ExprResult
11711 TreeTransform<Derived>::TransformFunctionParmPackExpr(FunctionParmPackExpr *E) {
11712   // Default behavior is to do nothing with this transformation.
11713   return E;
11714 }
11715 
11716 template<typename Derived>
11717 ExprResult
11718 TreeTransform<Derived>::TransformMaterializeTemporaryExpr(
11719                                                   MaterializeTemporaryExpr *E) {
11720   return getDerived().TransformExpr(E->GetTemporaryExpr());
11721 }
11722 
11723 template<typename Derived>
11724 ExprResult
11725 TreeTransform<Derived>::TransformCXXFoldExpr(CXXFoldExpr *E) {
11726   Expr *Pattern = E->getPattern();
11727 
11728   SmallVector<UnexpandedParameterPack, 2> Unexpanded;
11729   getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
11730   assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
11731 
11732   // Determine whether the set of unexpanded parameter packs can and should
11733   // be expanded.
11734   bool Expand = true;
11735   bool RetainExpansion = false;
11736   Optional<unsigned> NumExpansions;
11737   if (getDerived().TryExpandParameterPacks(E->getEllipsisLoc(),
11738                                            Pattern->getSourceRange(),
11739                                            Unexpanded,
11740                                            Expand, RetainExpansion,
11741                                            NumExpansions))
11742     return true;
11743 
11744   if (!Expand) {
11745     // Do not expand any packs here, just transform and rebuild a fold
11746     // expression.
11747     Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
11748 
11749     ExprResult LHS =
11750         E->getLHS() ? getDerived().TransformExpr(E->getLHS()) : ExprResult();
11751     if (LHS.isInvalid())
11752       return true;
11753 
11754     ExprResult RHS =
11755         E->getRHS() ? getDerived().TransformExpr(E->getRHS()) : ExprResult();
11756     if (RHS.isInvalid())
11757       return true;
11758 
11759     if (!getDerived().AlwaysRebuild() &&
11760         LHS.get() == E->getLHS() && RHS.get() == E->getRHS())
11761       return E;
11762 
11763     return getDerived().RebuildCXXFoldExpr(
11764         E->getBeginLoc(), LHS.get(), E->getOperator(), E->getEllipsisLoc(),
11765         RHS.get(), E->getEndLoc());
11766   }
11767 
11768   // The transform has determined that we should perform an elementwise
11769   // expansion of the pattern. Do so.
11770   ExprResult Result = getDerived().TransformExpr(E->getInit());
11771   if (Result.isInvalid())
11772     return true;
11773   bool LeftFold = E->isLeftFold();
11774 
11775   // If we're retaining an expansion for a right fold, it is the innermost
11776   // component and takes the init (if any).
11777   if (!LeftFold && RetainExpansion) {
11778     ForgetPartiallySubstitutedPackRAII Forget(getDerived());
11779 
11780     ExprResult Out = getDerived().TransformExpr(Pattern);
11781     if (Out.isInvalid())
11782       return true;
11783 
11784     Result = getDerived().RebuildCXXFoldExpr(
11785         E->getBeginLoc(), Out.get(), E->getOperator(), E->getEllipsisLoc(),
11786         Result.get(), E->getEndLoc());
11787     if (Result.isInvalid())
11788       return true;
11789   }
11790 
11791   for (unsigned I = 0; I != *NumExpansions; ++I) {
11792     Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(
11793         getSema(), LeftFold ? I : *NumExpansions - I - 1);
11794     ExprResult Out = getDerived().TransformExpr(Pattern);
11795     if (Out.isInvalid())
11796       return true;
11797 
11798     if (Out.get()->containsUnexpandedParameterPack()) {
11799       // We still have a pack; retain a pack expansion for this slice.
11800       Result = getDerived().RebuildCXXFoldExpr(
11801           E->getBeginLoc(), LeftFold ? Result.get() : Out.get(),
11802           E->getOperator(), E->getEllipsisLoc(),
11803           LeftFold ? Out.get() : Result.get(), E->getEndLoc());
11804     } else if (Result.isUsable()) {
11805       // We've got down to a single element; build a binary operator.
11806       Result = getDerived().RebuildBinaryOperator(
11807           E->getEllipsisLoc(), E->getOperator(),
11808           LeftFold ? Result.get() : Out.get(),
11809           LeftFold ? Out.get() : Result.get());
11810     } else
11811       Result = Out;
11812 
11813     if (Result.isInvalid())
11814       return true;
11815   }
11816 
11817   // If we're retaining an expansion for a left fold, it is the outermost
11818   // component and takes the complete expansion so far as its init (if any).
11819   if (LeftFold && RetainExpansion) {
11820     ForgetPartiallySubstitutedPackRAII Forget(getDerived());
11821 
11822     ExprResult Out = getDerived().TransformExpr(Pattern);
11823     if (Out.isInvalid())
11824       return true;
11825 
11826     Result = getDerived().RebuildCXXFoldExpr(
11827         E->getBeginLoc(), Result.get(), E->getOperator(), E->getEllipsisLoc(),
11828         Out.get(), E->getEndLoc());
11829     if (Result.isInvalid())
11830       return true;
11831   }
11832 
11833   // If we had no init and an empty pack, and we're not retaining an expansion,
11834   // then produce a fallback value or error.
11835   if (Result.isUnset())
11836     return getDerived().RebuildEmptyCXXFoldExpr(E->getEllipsisLoc(),
11837                                                 E->getOperator());
11838 
11839   return Result;
11840 }
11841 
11842 template<typename Derived>
11843 ExprResult
11844 TreeTransform<Derived>::TransformCXXStdInitializerListExpr(
11845     CXXStdInitializerListExpr *E) {
11846   return getDerived().TransformExpr(E->getSubExpr());
11847 }
11848 
11849 template<typename Derived>
11850 ExprResult
11851 TreeTransform<Derived>::TransformObjCStringLiteral(ObjCStringLiteral *E) {
11852   return SemaRef.MaybeBindToTemporary(E);
11853 }
11854 
11855 template<typename Derived>
11856 ExprResult
11857 TreeTransform<Derived>::TransformObjCBoolLiteralExpr(ObjCBoolLiteralExpr *E) {
11858   return E;
11859 }
11860 
11861 template<typename Derived>
11862 ExprResult
11863 TreeTransform<Derived>::TransformObjCBoxedExpr(ObjCBoxedExpr *E) {
11864   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
11865   if (SubExpr.isInvalid())
11866     return ExprError();
11867 
11868   if (!getDerived().AlwaysRebuild() &&
11869       SubExpr.get() == E->getSubExpr())
11870     return E;
11871 
11872   return getDerived().RebuildObjCBoxedExpr(E->getSourceRange(), SubExpr.get());
11873 }
11874 
11875 template<typename Derived>
11876 ExprResult
11877 TreeTransform<Derived>::TransformObjCArrayLiteral(ObjCArrayLiteral *E) {
11878   // Transform each of the elements.
11879   SmallVector<Expr *, 8> Elements;
11880   bool ArgChanged = false;
11881   if (getDerived().TransformExprs(E->getElements(), E->getNumElements(),
11882                                   /*IsCall=*/false, Elements, &ArgChanged))
11883     return ExprError();
11884 
11885   if (!getDerived().AlwaysRebuild() && !ArgChanged)
11886     return SemaRef.MaybeBindToTemporary(E);
11887 
11888   return getDerived().RebuildObjCArrayLiteral(E->getSourceRange(),
11889                                               Elements.data(),
11890                                               Elements.size());
11891 }
11892 
11893 template<typename Derived>
11894 ExprResult
11895 TreeTransform<Derived>::TransformObjCDictionaryLiteral(
11896                                                     ObjCDictionaryLiteral *E) {
11897   // Transform each of the elements.
11898   SmallVector<ObjCDictionaryElement, 8> Elements;
11899   bool ArgChanged = false;
11900   for (unsigned I = 0, N = E->getNumElements(); I != N; ++I) {
11901     ObjCDictionaryElement OrigElement = E->getKeyValueElement(I);
11902 
11903     if (OrigElement.isPackExpansion()) {
11904       // This key/value element is a pack expansion.
11905       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
11906       getSema().collectUnexpandedParameterPacks(OrigElement.Key, Unexpanded);
11907       getSema().collectUnexpandedParameterPacks(OrigElement.Value, Unexpanded);
11908       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
11909 
11910       // Determine whether the set of unexpanded parameter packs can
11911       // and should be expanded.
11912       bool Expand = true;
11913       bool RetainExpansion = false;
11914       Optional<unsigned> OrigNumExpansions = OrigElement.NumExpansions;
11915       Optional<unsigned> NumExpansions = OrigNumExpansions;
11916       SourceRange PatternRange(OrigElement.Key->getBeginLoc(),
11917                                OrigElement.Value->getEndLoc());
11918       if (getDerived().TryExpandParameterPacks(OrigElement.EllipsisLoc,
11919                                                PatternRange, Unexpanded, Expand,
11920                                                RetainExpansion, NumExpansions))
11921         return ExprError();
11922 
11923       if (!Expand) {
11924         // The transform has determined that we should perform a simple
11925         // transformation on the pack expansion, producing another pack
11926         // expansion.
11927         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
11928         ExprResult Key = getDerived().TransformExpr(OrigElement.Key);
11929         if (Key.isInvalid())
11930           return ExprError();
11931 
11932         if (Key.get() != OrigElement.Key)
11933           ArgChanged = true;
11934 
11935         ExprResult Value = getDerived().TransformExpr(OrigElement.Value);
11936         if (Value.isInvalid())
11937           return ExprError();
11938 
11939         if (Value.get() != OrigElement.Value)
11940           ArgChanged = true;
11941 
11942         ObjCDictionaryElement Expansion = {
11943           Key.get(), Value.get(), OrigElement.EllipsisLoc, NumExpansions
11944         };
11945         Elements.push_back(Expansion);
11946         continue;
11947       }
11948 
11949       // Record right away that the argument was changed.  This needs
11950       // to happen even if the array expands to nothing.
11951       ArgChanged = true;
11952 
11953       // The transform has determined that we should perform an elementwise
11954       // expansion of the pattern. Do so.
11955       for (unsigned I = 0; I != *NumExpansions; ++I) {
11956         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
11957         ExprResult Key = getDerived().TransformExpr(OrigElement.Key);
11958         if (Key.isInvalid())
11959           return ExprError();
11960 
11961         ExprResult Value = getDerived().TransformExpr(OrigElement.Value);
11962         if (Value.isInvalid())
11963           return ExprError();
11964 
11965         ObjCDictionaryElement Element = {
11966           Key.get(), Value.get(), SourceLocation(), NumExpansions
11967         };
11968 
11969         // If any unexpanded parameter packs remain, we still have a
11970         // pack expansion.
11971         // FIXME: Can this really happen?
11972         if (Key.get()->containsUnexpandedParameterPack() ||
11973             Value.get()->containsUnexpandedParameterPack())
11974           Element.EllipsisLoc = OrigElement.EllipsisLoc;
11975 
11976         Elements.push_back(Element);
11977       }
11978 
11979       // FIXME: Retain a pack expansion if RetainExpansion is true.
11980 
11981       // We've finished with this pack expansion.
11982       continue;
11983     }
11984 
11985     // Transform and check key.
11986     ExprResult Key = getDerived().TransformExpr(OrigElement.Key);
11987     if (Key.isInvalid())
11988       return ExprError();
11989 
11990     if (Key.get() != OrigElement.Key)
11991       ArgChanged = true;
11992 
11993     // Transform and check value.
11994     ExprResult Value
11995       = getDerived().TransformExpr(OrigElement.Value);
11996     if (Value.isInvalid())
11997       return ExprError();
11998 
11999     if (Value.get() != OrigElement.Value)
12000       ArgChanged = true;
12001 
12002     ObjCDictionaryElement Element = {
12003       Key.get(), Value.get(), SourceLocation(), None
12004     };
12005     Elements.push_back(Element);
12006   }
12007 
12008   if (!getDerived().AlwaysRebuild() && !ArgChanged)
12009     return SemaRef.MaybeBindToTemporary(E);
12010 
12011   return getDerived().RebuildObjCDictionaryLiteral(E->getSourceRange(),
12012                                                    Elements);
12013 }
12014 
12015 template<typename Derived>
12016 ExprResult
12017 TreeTransform<Derived>::TransformObjCEncodeExpr(ObjCEncodeExpr *E) {
12018   TypeSourceInfo *EncodedTypeInfo
12019     = getDerived().TransformType(E->getEncodedTypeSourceInfo());
12020   if (!EncodedTypeInfo)
12021     return ExprError();
12022 
12023   if (!getDerived().AlwaysRebuild() &&
12024       EncodedTypeInfo == E->getEncodedTypeSourceInfo())
12025     return E;
12026 
12027   return getDerived().RebuildObjCEncodeExpr(E->getAtLoc(),
12028                                             EncodedTypeInfo,
12029                                             E->getRParenLoc());
12030 }
12031 
12032 template<typename Derived>
12033 ExprResult TreeTransform<Derived>::
12034 TransformObjCIndirectCopyRestoreExpr(ObjCIndirectCopyRestoreExpr *E) {
12035   // This is a kind of implicit conversion, and it needs to get dropped
12036   // and recomputed for the same general reasons that ImplicitCastExprs
12037   // do, as well a more specific one: this expression is only valid when
12038   // it appears *immediately* as an argument expression.
12039   return getDerived().TransformExpr(E->getSubExpr());
12040 }
12041 
12042 template<typename Derived>
12043 ExprResult TreeTransform<Derived>::
12044 TransformObjCBridgedCastExpr(ObjCBridgedCastExpr *E) {
12045   TypeSourceInfo *TSInfo
12046     = getDerived().TransformType(E->getTypeInfoAsWritten());
12047   if (!TSInfo)
12048     return ExprError();
12049 
12050   ExprResult Result = getDerived().TransformExpr(E->getSubExpr());
12051   if (Result.isInvalid())
12052     return ExprError();
12053 
12054   if (!getDerived().AlwaysRebuild() &&
12055       TSInfo == E->getTypeInfoAsWritten() &&
12056       Result.get() == E->getSubExpr())
12057     return E;
12058 
12059   return SemaRef.BuildObjCBridgedCast(E->getLParenLoc(), E->getBridgeKind(),
12060                                       E->getBridgeKeywordLoc(), TSInfo,
12061                                       Result.get());
12062 }
12063 
12064 template <typename Derived>
12065 ExprResult TreeTransform<Derived>::TransformObjCAvailabilityCheckExpr(
12066     ObjCAvailabilityCheckExpr *E) {
12067   return E;
12068 }
12069 
12070 template<typename Derived>
12071 ExprResult
12072 TreeTransform<Derived>::TransformObjCMessageExpr(ObjCMessageExpr *E) {
12073   // Transform arguments.
12074   bool ArgChanged = false;
12075   SmallVector<Expr*, 8> Args;
12076   Args.reserve(E->getNumArgs());
12077   if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), false, Args,
12078                                   &ArgChanged))
12079     return ExprError();
12080 
12081   if (E->getReceiverKind() == ObjCMessageExpr::Class) {
12082     // Class message: transform the receiver type.
12083     TypeSourceInfo *ReceiverTypeInfo
12084       = getDerived().TransformType(E->getClassReceiverTypeInfo());
12085     if (!ReceiverTypeInfo)
12086       return ExprError();
12087 
12088     // If nothing changed, just retain the existing message send.
12089     if (!getDerived().AlwaysRebuild() &&
12090         ReceiverTypeInfo == E->getClassReceiverTypeInfo() && !ArgChanged)
12091       return SemaRef.MaybeBindToTemporary(E);
12092 
12093     // Build a new class message send.
12094     SmallVector<SourceLocation, 16> SelLocs;
12095     E->getSelectorLocs(SelLocs);
12096     return getDerived().RebuildObjCMessageExpr(ReceiverTypeInfo,
12097                                                E->getSelector(),
12098                                                SelLocs,
12099                                                E->getMethodDecl(),
12100                                                E->getLeftLoc(),
12101                                                Args,
12102                                                E->getRightLoc());
12103   }
12104   else if (E->getReceiverKind() == ObjCMessageExpr::SuperClass ||
12105            E->getReceiverKind() == ObjCMessageExpr::SuperInstance) {
12106     if (!E->getMethodDecl())
12107       return ExprError();
12108 
12109     // Build a new class message send to 'super'.
12110     SmallVector<SourceLocation, 16> SelLocs;
12111     E->getSelectorLocs(SelLocs);
12112     return getDerived().RebuildObjCMessageExpr(E->getSuperLoc(),
12113                                                E->getSelector(),
12114                                                SelLocs,
12115                                                E->getReceiverType(),
12116                                                E->getMethodDecl(),
12117                                                E->getLeftLoc(),
12118                                                Args,
12119                                                E->getRightLoc());
12120   }
12121 
12122   // Instance message: transform the receiver
12123   assert(E->getReceiverKind() == ObjCMessageExpr::Instance &&
12124          "Only class and instance messages may be instantiated");
12125   ExprResult Receiver
12126     = getDerived().TransformExpr(E->getInstanceReceiver());
12127   if (Receiver.isInvalid())
12128     return ExprError();
12129 
12130   // If nothing changed, just retain the existing message send.
12131   if (!getDerived().AlwaysRebuild() &&
12132       Receiver.get() == E->getInstanceReceiver() && !ArgChanged)
12133     return SemaRef.MaybeBindToTemporary(E);
12134 
12135   // Build a new instance message send.
12136   SmallVector<SourceLocation, 16> SelLocs;
12137   E->getSelectorLocs(SelLocs);
12138   return getDerived().RebuildObjCMessageExpr(Receiver.get(),
12139                                              E->getSelector(),
12140                                              SelLocs,
12141                                              E->getMethodDecl(),
12142                                              E->getLeftLoc(),
12143                                              Args,
12144                                              E->getRightLoc());
12145 }
12146 
12147 template<typename Derived>
12148 ExprResult
12149 TreeTransform<Derived>::TransformObjCSelectorExpr(ObjCSelectorExpr *E) {
12150   return E;
12151 }
12152 
12153 template<typename Derived>
12154 ExprResult
12155 TreeTransform<Derived>::TransformObjCProtocolExpr(ObjCProtocolExpr *E) {
12156   return E;
12157 }
12158 
12159 template<typename Derived>
12160 ExprResult
12161 TreeTransform<Derived>::TransformObjCIvarRefExpr(ObjCIvarRefExpr *E) {
12162   // Transform the base expression.
12163   ExprResult Base = getDerived().TransformExpr(E->getBase());
12164   if (Base.isInvalid())
12165     return ExprError();
12166 
12167   // We don't need to transform the ivar; it will never change.
12168 
12169   // If nothing changed, just retain the existing expression.
12170   if (!getDerived().AlwaysRebuild() &&
12171       Base.get() == E->getBase())
12172     return E;
12173 
12174   return getDerived().RebuildObjCIvarRefExpr(Base.get(), E->getDecl(),
12175                                              E->getLocation(),
12176                                              E->isArrow(), E->isFreeIvar());
12177 }
12178 
12179 template<typename Derived>
12180 ExprResult
12181 TreeTransform<Derived>::TransformObjCPropertyRefExpr(ObjCPropertyRefExpr *E) {
12182   // 'super' and types never change. Property never changes. Just
12183   // retain the existing expression.
12184   if (!E->isObjectReceiver())
12185     return E;
12186 
12187   // Transform the base expression.
12188   ExprResult Base = getDerived().TransformExpr(E->getBase());
12189   if (Base.isInvalid())
12190     return ExprError();
12191 
12192   // We don't need to transform the property; it will never change.
12193 
12194   // If nothing changed, just retain the existing expression.
12195   if (!getDerived().AlwaysRebuild() &&
12196       Base.get() == E->getBase())
12197     return E;
12198 
12199   if (E->isExplicitProperty())
12200     return getDerived().RebuildObjCPropertyRefExpr(Base.get(),
12201                                                    E->getExplicitProperty(),
12202                                                    E->getLocation());
12203 
12204   return getDerived().RebuildObjCPropertyRefExpr(Base.get(),
12205                                                  SemaRef.Context.PseudoObjectTy,
12206                                                  E->getImplicitPropertyGetter(),
12207                                                  E->getImplicitPropertySetter(),
12208                                                  E->getLocation());
12209 }
12210 
12211 template<typename Derived>
12212 ExprResult
12213 TreeTransform<Derived>::TransformObjCSubscriptRefExpr(ObjCSubscriptRefExpr *E) {
12214   // Transform the base expression.
12215   ExprResult Base = getDerived().TransformExpr(E->getBaseExpr());
12216   if (Base.isInvalid())
12217     return ExprError();
12218 
12219   // Transform the key expression.
12220   ExprResult Key = getDerived().TransformExpr(E->getKeyExpr());
12221   if (Key.isInvalid())
12222     return ExprError();
12223 
12224   // If nothing changed, just retain the existing expression.
12225   if (!getDerived().AlwaysRebuild() &&
12226       Key.get() == E->getKeyExpr() && Base.get() == E->getBaseExpr())
12227     return E;
12228 
12229   return getDerived().RebuildObjCSubscriptRefExpr(E->getRBracket(),
12230                                                   Base.get(), Key.get(),
12231                                                   E->getAtIndexMethodDecl(),
12232                                                   E->setAtIndexMethodDecl());
12233 }
12234 
12235 template<typename Derived>
12236 ExprResult
12237 TreeTransform<Derived>::TransformObjCIsaExpr(ObjCIsaExpr *E) {
12238   // Transform the base expression.
12239   ExprResult Base = getDerived().TransformExpr(E->getBase());
12240   if (Base.isInvalid())
12241     return ExprError();
12242 
12243   // If nothing changed, just retain the existing expression.
12244   if (!getDerived().AlwaysRebuild() &&
12245       Base.get() == E->getBase())
12246     return E;
12247 
12248   return getDerived().RebuildObjCIsaExpr(Base.get(), E->getIsaMemberLoc(),
12249                                          E->getOpLoc(),
12250                                          E->isArrow());
12251 }
12252 
12253 template<typename Derived>
12254 ExprResult
12255 TreeTransform<Derived>::TransformShuffleVectorExpr(ShuffleVectorExpr *E) {
12256   bool ArgumentChanged = false;
12257   SmallVector<Expr*, 8> SubExprs;
12258   SubExprs.reserve(E->getNumSubExprs());
12259   if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false,
12260                                   SubExprs, &ArgumentChanged))
12261     return ExprError();
12262 
12263   if (!getDerived().AlwaysRebuild() &&
12264       !ArgumentChanged)
12265     return E;
12266 
12267   return getDerived().RebuildShuffleVectorExpr(E->getBuiltinLoc(),
12268                                                SubExprs,
12269                                                E->getRParenLoc());
12270 }
12271 
12272 template<typename Derived>
12273 ExprResult
12274 TreeTransform<Derived>::TransformConvertVectorExpr(ConvertVectorExpr *E) {
12275   ExprResult SrcExpr = getDerived().TransformExpr(E->getSrcExpr());
12276   if (SrcExpr.isInvalid())
12277     return ExprError();
12278 
12279   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo());
12280   if (!Type)
12281     return ExprError();
12282 
12283   if (!getDerived().AlwaysRebuild() &&
12284       Type == E->getTypeSourceInfo() &&
12285       SrcExpr.get() == E->getSrcExpr())
12286     return E;
12287 
12288   return getDerived().RebuildConvertVectorExpr(E->getBuiltinLoc(),
12289                                                SrcExpr.get(), Type,
12290                                                E->getRParenLoc());
12291 }
12292 
12293 template<typename Derived>
12294 ExprResult
12295 TreeTransform<Derived>::TransformBlockExpr(BlockExpr *E) {
12296   BlockDecl *oldBlock = E->getBlockDecl();
12297 
12298   SemaRef.ActOnBlockStart(E->getCaretLocation(), /*Scope=*/nullptr);
12299   BlockScopeInfo *blockScope = SemaRef.getCurBlock();
12300 
12301   blockScope->TheDecl->setIsVariadic(oldBlock->isVariadic());
12302   blockScope->TheDecl->setBlockMissingReturnType(
12303                          oldBlock->blockMissingReturnType());
12304 
12305   SmallVector<ParmVarDecl*, 4> params;
12306   SmallVector<QualType, 4> paramTypes;
12307 
12308   const FunctionProtoType *exprFunctionType = E->getFunctionType();
12309 
12310   // Parameter substitution.
12311   Sema::ExtParameterInfoBuilder extParamInfos;
12312   if (getDerived().TransformFunctionTypeParams(
12313           E->getCaretLocation(), oldBlock->parameters(), nullptr,
12314           exprFunctionType->getExtParameterInfosOrNull(), paramTypes, &params,
12315           extParamInfos)) {
12316     getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr);
12317     return ExprError();
12318   }
12319 
12320   QualType exprResultType =
12321       getDerived().TransformType(exprFunctionType->getReturnType());
12322 
12323   auto epi = exprFunctionType->getExtProtoInfo();
12324   epi.ExtParameterInfos = extParamInfos.getPointerOrNull(paramTypes.size());
12325 
12326   QualType functionType =
12327     getDerived().RebuildFunctionProtoType(exprResultType, paramTypes, epi);
12328   blockScope->FunctionType = functionType;
12329 
12330   // Set the parameters on the block decl.
12331   if (!params.empty())
12332     blockScope->TheDecl->setParams(params);
12333 
12334   if (!oldBlock->blockMissingReturnType()) {
12335     blockScope->HasImplicitReturnType = false;
12336     blockScope->ReturnType = exprResultType;
12337   }
12338 
12339   // Transform the body
12340   StmtResult body = getDerived().TransformStmt(E->getBody());
12341   if (body.isInvalid()) {
12342     getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr);
12343     return ExprError();
12344   }
12345 
12346 #ifndef NDEBUG
12347   // In builds with assertions, make sure that we captured everything we
12348   // captured before.
12349   if (!SemaRef.getDiagnostics().hasErrorOccurred()) {
12350     for (const auto &I : oldBlock->captures()) {
12351       VarDecl *oldCapture = I.getVariable();
12352 
12353       // Ignore parameter packs.
12354       if (isa<ParmVarDecl>(oldCapture) &&
12355           cast<ParmVarDecl>(oldCapture)->isParameterPack())
12356         continue;
12357 
12358       VarDecl *newCapture =
12359         cast<VarDecl>(getDerived().TransformDecl(E->getCaretLocation(),
12360                                                  oldCapture));
12361       assert(blockScope->CaptureMap.count(newCapture));
12362     }
12363     assert(oldBlock->capturesCXXThis() == blockScope->isCXXThisCaptured());
12364   }
12365 #endif
12366 
12367   return SemaRef.ActOnBlockStmtExpr(E->getCaretLocation(), body.get(),
12368                                     /*Scope=*/nullptr);
12369 }
12370 
12371 template<typename Derived>
12372 ExprResult
12373 TreeTransform<Derived>::TransformAsTypeExpr(AsTypeExpr *E) {
12374   llvm_unreachable("Cannot transform asType expressions yet");
12375 }
12376 
12377 template<typename Derived>
12378 ExprResult
12379 TreeTransform<Derived>::TransformAtomicExpr(AtomicExpr *E) {
12380   QualType RetTy = getDerived().TransformType(E->getType());
12381   bool ArgumentChanged = false;
12382   SmallVector<Expr*, 8> SubExprs;
12383   SubExprs.reserve(E->getNumSubExprs());
12384   if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false,
12385                                   SubExprs, &ArgumentChanged))
12386     return ExprError();
12387 
12388   if (!getDerived().AlwaysRebuild() &&
12389       !ArgumentChanged)
12390     return E;
12391 
12392   return getDerived().RebuildAtomicExpr(E->getBuiltinLoc(), SubExprs,
12393                                         RetTy, E->getOp(), E->getRParenLoc());
12394 }
12395 
12396 //===----------------------------------------------------------------------===//
12397 // Type reconstruction
12398 //===----------------------------------------------------------------------===//
12399 
12400 template<typename Derived>
12401 QualType TreeTransform<Derived>::RebuildPointerType(QualType PointeeType,
12402                                                     SourceLocation Star) {
12403   return SemaRef.BuildPointerType(PointeeType, Star,
12404                                   getDerived().getBaseEntity());
12405 }
12406 
12407 template<typename Derived>
12408 QualType TreeTransform<Derived>::RebuildBlockPointerType(QualType PointeeType,
12409                                                          SourceLocation Star) {
12410   return SemaRef.BuildBlockPointerType(PointeeType, Star,
12411                                        getDerived().getBaseEntity());
12412 }
12413 
12414 template<typename Derived>
12415 QualType
12416 TreeTransform<Derived>::RebuildReferenceType(QualType ReferentType,
12417                                              bool WrittenAsLValue,
12418                                              SourceLocation Sigil) {
12419   return SemaRef.BuildReferenceType(ReferentType, WrittenAsLValue,
12420                                     Sigil, getDerived().getBaseEntity());
12421 }
12422 
12423 template<typename Derived>
12424 QualType
12425 TreeTransform<Derived>::RebuildMemberPointerType(QualType PointeeType,
12426                                                  QualType ClassType,
12427                                                  SourceLocation Sigil) {
12428   return SemaRef.BuildMemberPointerType(PointeeType, ClassType, Sigil,
12429                                         getDerived().getBaseEntity());
12430 }
12431 
12432 template<typename Derived>
12433 QualType TreeTransform<Derived>::RebuildObjCTypeParamType(
12434            const ObjCTypeParamDecl *Decl,
12435            SourceLocation ProtocolLAngleLoc,
12436            ArrayRef<ObjCProtocolDecl *> Protocols,
12437            ArrayRef<SourceLocation> ProtocolLocs,
12438            SourceLocation ProtocolRAngleLoc) {
12439   return SemaRef.BuildObjCTypeParamType(Decl,
12440                                         ProtocolLAngleLoc, Protocols,
12441                                         ProtocolLocs, ProtocolRAngleLoc,
12442                                         /*FailOnError=*/true);
12443 }
12444 
12445 template<typename Derived>
12446 QualType TreeTransform<Derived>::RebuildObjCObjectType(
12447            QualType BaseType,
12448            SourceLocation Loc,
12449            SourceLocation TypeArgsLAngleLoc,
12450            ArrayRef<TypeSourceInfo *> TypeArgs,
12451            SourceLocation TypeArgsRAngleLoc,
12452            SourceLocation ProtocolLAngleLoc,
12453            ArrayRef<ObjCProtocolDecl *> Protocols,
12454            ArrayRef<SourceLocation> ProtocolLocs,
12455            SourceLocation ProtocolRAngleLoc) {
12456   return SemaRef.BuildObjCObjectType(BaseType, Loc, TypeArgsLAngleLoc,
12457                                      TypeArgs, TypeArgsRAngleLoc,
12458                                      ProtocolLAngleLoc, Protocols, ProtocolLocs,
12459                                      ProtocolRAngleLoc,
12460                                      /*FailOnError=*/true);
12461 }
12462 
12463 template<typename Derived>
12464 QualType TreeTransform<Derived>::RebuildObjCObjectPointerType(
12465            QualType PointeeType,
12466            SourceLocation Star) {
12467   return SemaRef.Context.getObjCObjectPointerType(PointeeType);
12468 }
12469 
12470 template<typename Derived>
12471 QualType
12472 TreeTransform<Derived>::RebuildArrayType(QualType ElementType,
12473                                          ArrayType::ArraySizeModifier SizeMod,
12474                                          const llvm::APInt *Size,
12475                                          Expr *SizeExpr,
12476                                          unsigned IndexTypeQuals,
12477                                          SourceRange BracketsRange) {
12478   if (SizeExpr || !Size)
12479     return SemaRef.BuildArrayType(ElementType, SizeMod, SizeExpr,
12480                                   IndexTypeQuals, BracketsRange,
12481                                   getDerived().getBaseEntity());
12482 
12483   QualType Types[] = {
12484     SemaRef.Context.UnsignedCharTy, SemaRef.Context.UnsignedShortTy,
12485     SemaRef.Context.UnsignedIntTy, SemaRef.Context.UnsignedLongTy,
12486     SemaRef.Context.UnsignedLongLongTy, SemaRef.Context.UnsignedInt128Ty
12487   };
12488   const unsigned NumTypes = llvm::array_lengthof(Types);
12489   QualType SizeType;
12490   for (unsigned I = 0; I != NumTypes; ++I)
12491     if (Size->getBitWidth() == SemaRef.Context.getIntWidth(Types[I])) {
12492       SizeType = Types[I];
12493       break;
12494     }
12495 
12496   // Note that we can return a VariableArrayType here in the case where
12497   // the element type was a dependent VariableArrayType.
12498   IntegerLiteral *ArraySize
12499       = IntegerLiteral::Create(SemaRef.Context, *Size, SizeType,
12500                                /*FIXME*/BracketsRange.getBegin());
12501   return SemaRef.BuildArrayType(ElementType, SizeMod, ArraySize,
12502                                 IndexTypeQuals, BracketsRange,
12503                                 getDerived().getBaseEntity());
12504 }
12505 
12506 template<typename Derived>
12507 QualType
12508 TreeTransform<Derived>::RebuildConstantArrayType(QualType ElementType,
12509                                                  ArrayType::ArraySizeModifier SizeMod,
12510                                                  const llvm::APInt &Size,
12511                                                  unsigned IndexTypeQuals,
12512                                                  SourceRange BracketsRange) {
12513   return getDerived().RebuildArrayType(ElementType, SizeMod, &Size, nullptr,
12514                                         IndexTypeQuals, BracketsRange);
12515 }
12516 
12517 template<typename Derived>
12518 QualType
12519 TreeTransform<Derived>::RebuildIncompleteArrayType(QualType ElementType,
12520                                           ArrayType::ArraySizeModifier SizeMod,
12521                                                  unsigned IndexTypeQuals,
12522                                                    SourceRange BracketsRange) {
12523   return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr, nullptr,
12524                                        IndexTypeQuals, BracketsRange);
12525 }
12526 
12527 template<typename Derived>
12528 QualType
12529 TreeTransform<Derived>::RebuildVariableArrayType(QualType ElementType,
12530                                           ArrayType::ArraySizeModifier SizeMod,
12531                                                  Expr *SizeExpr,
12532                                                  unsigned IndexTypeQuals,
12533                                                  SourceRange BracketsRange) {
12534   return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr,
12535                                        SizeExpr,
12536                                        IndexTypeQuals, BracketsRange);
12537 }
12538 
12539 template<typename Derived>
12540 QualType
12541 TreeTransform<Derived>::RebuildDependentSizedArrayType(QualType ElementType,
12542                                           ArrayType::ArraySizeModifier SizeMod,
12543                                                        Expr *SizeExpr,
12544                                                        unsigned IndexTypeQuals,
12545                                                    SourceRange BracketsRange) {
12546   return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr,
12547                                        SizeExpr,
12548                                        IndexTypeQuals, BracketsRange);
12549 }
12550 
12551 template <typename Derived>
12552 QualType TreeTransform<Derived>::RebuildDependentAddressSpaceType(
12553     QualType PointeeType, Expr *AddrSpaceExpr, SourceLocation AttributeLoc) {
12554   return SemaRef.BuildAddressSpaceAttr(PointeeType, AddrSpaceExpr,
12555                                           AttributeLoc);
12556 }
12557 
12558 template <typename Derived>
12559 QualType
12560 TreeTransform<Derived>::RebuildVectorType(QualType ElementType,
12561                                           unsigned NumElements,
12562                                           VectorType::VectorKind VecKind) {
12563   // FIXME: semantic checking!
12564   return SemaRef.Context.getVectorType(ElementType, NumElements, VecKind);
12565 }
12566 
12567 template <typename Derived>
12568 QualType TreeTransform<Derived>::RebuildDependentVectorType(
12569     QualType ElementType, Expr *SizeExpr, SourceLocation AttributeLoc,
12570     VectorType::VectorKind VecKind) {
12571   return SemaRef.BuildVectorType(ElementType, SizeExpr, AttributeLoc);
12572 }
12573 
12574 template<typename Derived>
12575 QualType TreeTransform<Derived>::RebuildExtVectorType(QualType ElementType,
12576                                                       unsigned NumElements,
12577                                                  SourceLocation AttributeLoc) {
12578   llvm::APInt numElements(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy),
12579                           NumElements, true);
12580   IntegerLiteral *VectorSize
12581     = IntegerLiteral::Create(SemaRef.Context, numElements, SemaRef.Context.IntTy,
12582                              AttributeLoc);
12583   return SemaRef.BuildExtVectorType(ElementType, VectorSize, AttributeLoc);
12584 }
12585 
12586 template<typename Derived>
12587 QualType
12588 TreeTransform<Derived>::RebuildDependentSizedExtVectorType(QualType ElementType,
12589                                                            Expr *SizeExpr,
12590                                                   SourceLocation AttributeLoc) {
12591   return SemaRef.BuildExtVectorType(ElementType, SizeExpr, AttributeLoc);
12592 }
12593 
12594 template<typename Derived>
12595 QualType TreeTransform<Derived>::RebuildFunctionProtoType(
12596     QualType T,
12597     MutableArrayRef<QualType> ParamTypes,
12598     const FunctionProtoType::ExtProtoInfo &EPI) {
12599   return SemaRef.BuildFunctionType(T, ParamTypes,
12600                                    getDerived().getBaseLocation(),
12601                                    getDerived().getBaseEntity(),
12602                                    EPI);
12603 }
12604 
12605 template<typename Derived>
12606 QualType TreeTransform<Derived>::RebuildFunctionNoProtoType(QualType T) {
12607   return SemaRef.Context.getFunctionNoProtoType(T);
12608 }
12609 
12610 template<typename Derived>
12611 QualType TreeTransform<Derived>::RebuildUnresolvedUsingType(SourceLocation Loc,
12612                                                             Decl *D) {
12613   assert(D && "no decl found");
12614   if (D->isInvalidDecl()) return QualType();
12615 
12616   // FIXME: Doesn't account for ObjCInterfaceDecl!
12617   TypeDecl *Ty;
12618   if (auto *UPD = dyn_cast<UsingPackDecl>(D)) {
12619     // A valid resolved using typename pack expansion decl can have multiple
12620     // UsingDecls, but they must each have exactly one type, and it must be
12621     // the same type in every case. But we must have at least one expansion!
12622     if (UPD->expansions().empty()) {
12623       getSema().Diag(Loc, diag::err_using_pack_expansion_empty)
12624           << UPD->isCXXClassMember() << UPD;
12625       return QualType();
12626     }
12627 
12628     // We might still have some unresolved types. Try to pick a resolved type
12629     // if we can. The final instantiation will check that the remaining
12630     // unresolved types instantiate to the type we pick.
12631     QualType FallbackT;
12632     QualType T;
12633     for (auto *E : UPD->expansions()) {
12634       QualType ThisT = RebuildUnresolvedUsingType(Loc, E);
12635       if (ThisT.isNull())
12636         continue;
12637       else if (ThisT->getAs<UnresolvedUsingType>())
12638         FallbackT = ThisT;
12639       else if (T.isNull())
12640         T = ThisT;
12641       else
12642         assert(getSema().Context.hasSameType(ThisT, T) &&
12643                "mismatched resolved types in using pack expansion");
12644     }
12645     return T.isNull() ? FallbackT : T;
12646   } else if (auto *Using = dyn_cast<UsingDecl>(D)) {
12647     assert(Using->hasTypename() &&
12648            "UnresolvedUsingTypenameDecl transformed to non-typename using");
12649 
12650     // A valid resolved using typename decl points to exactly one type decl.
12651     assert(++Using->shadow_begin() == Using->shadow_end());
12652     Ty = cast<TypeDecl>((*Using->shadow_begin())->getTargetDecl());
12653   } else {
12654     assert(isa<UnresolvedUsingTypenameDecl>(D) &&
12655            "UnresolvedUsingTypenameDecl transformed to non-using decl");
12656     Ty = cast<UnresolvedUsingTypenameDecl>(D);
12657   }
12658 
12659   return SemaRef.Context.getTypeDeclType(Ty);
12660 }
12661 
12662 template<typename Derived>
12663 QualType TreeTransform<Derived>::RebuildTypeOfExprType(Expr *E,
12664                                                        SourceLocation Loc) {
12665   return SemaRef.BuildTypeofExprType(E, Loc);
12666 }
12667 
12668 template<typename Derived>
12669 QualType TreeTransform<Derived>::RebuildTypeOfType(QualType Underlying) {
12670   return SemaRef.Context.getTypeOfType(Underlying);
12671 }
12672 
12673 template<typename Derived>
12674 QualType TreeTransform<Derived>::RebuildDecltypeType(Expr *E,
12675                                                      SourceLocation Loc) {
12676   return SemaRef.BuildDecltypeType(E, Loc);
12677 }
12678 
12679 template<typename Derived>
12680 QualType TreeTransform<Derived>::RebuildUnaryTransformType(QualType BaseType,
12681                                             UnaryTransformType::UTTKind UKind,
12682                                             SourceLocation Loc) {
12683   return SemaRef.BuildUnaryTransformType(BaseType, UKind, Loc);
12684 }
12685 
12686 template<typename Derived>
12687 QualType TreeTransform<Derived>::RebuildTemplateSpecializationType(
12688                                                       TemplateName Template,
12689                                              SourceLocation TemplateNameLoc,
12690                                      TemplateArgumentListInfo &TemplateArgs) {
12691   return SemaRef.CheckTemplateIdType(Template, TemplateNameLoc, TemplateArgs);
12692 }
12693 
12694 template<typename Derived>
12695 QualType TreeTransform<Derived>::RebuildAtomicType(QualType ValueType,
12696                                                    SourceLocation KWLoc) {
12697   return SemaRef.BuildAtomicType(ValueType, KWLoc);
12698 }
12699 
12700 template<typename Derived>
12701 QualType TreeTransform<Derived>::RebuildPipeType(QualType ValueType,
12702                                                  SourceLocation KWLoc,
12703                                                  bool isReadPipe) {
12704   return isReadPipe ? SemaRef.BuildReadPipeType(ValueType, KWLoc)
12705                     : SemaRef.BuildWritePipeType(ValueType, KWLoc);
12706 }
12707 
12708 template<typename Derived>
12709 TemplateName
12710 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS,
12711                                             bool TemplateKW,
12712                                             TemplateDecl *Template) {
12713   return SemaRef.Context.getQualifiedTemplateName(SS.getScopeRep(), TemplateKW,
12714                                                   Template);
12715 }
12716 
12717 template<typename Derived>
12718 TemplateName
12719 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS,
12720                                             SourceLocation TemplateKWLoc,
12721                                             const IdentifierInfo &Name,
12722                                             SourceLocation NameLoc,
12723                                             QualType ObjectType,
12724                                             NamedDecl *FirstQualifierInScope,
12725                                             bool AllowInjectedClassName) {
12726   UnqualifiedId TemplateName;
12727   TemplateName.setIdentifier(&Name, NameLoc);
12728   Sema::TemplateTy Template;
12729   getSema().ActOnDependentTemplateName(/*Scope=*/nullptr,
12730                                        SS, TemplateKWLoc, TemplateName,
12731                                        ParsedType::make(ObjectType),
12732                                        /*EnteringContext=*/false,
12733                                        Template, AllowInjectedClassName);
12734   return Template.get();
12735 }
12736 
12737 template<typename Derived>
12738 TemplateName
12739 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS,
12740                                             SourceLocation TemplateKWLoc,
12741                                             OverloadedOperatorKind Operator,
12742                                             SourceLocation NameLoc,
12743                                             QualType ObjectType,
12744                                             bool AllowInjectedClassName) {
12745   UnqualifiedId Name;
12746   // FIXME: Bogus location information.
12747   SourceLocation SymbolLocations[3] = { NameLoc, NameLoc, NameLoc };
12748   Name.setOperatorFunctionId(NameLoc, Operator, SymbolLocations);
12749   Sema::TemplateTy Template;
12750   getSema().ActOnDependentTemplateName(/*Scope=*/nullptr,
12751                                        SS, TemplateKWLoc, Name,
12752                                        ParsedType::make(ObjectType),
12753                                        /*EnteringContext=*/false,
12754                                        Template, AllowInjectedClassName);
12755   return Template.get();
12756 }
12757 
12758 template<typename Derived>
12759 ExprResult
12760 TreeTransform<Derived>::RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op,
12761                                                    SourceLocation OpLoc,
12762                                                    Expr *OrigCallee,
12763                                                    Expr *First,
12764                                                    Expr *Second) {
12765   Expr *Callee = OrigCallee->IgnoreParenCasts();
12766   bool isPostIncDec = Second && (Op == OO_PlusPlus || Op == OO_MinusMinus);
12767 
12768   if (First->getObjectKind() == OK_ObjCProperty) {
12769     BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op);
12770     if (BinaryOperator::isAssignmentOp(Opc))
12771       return SemaRef.checkPseudoObjectAssignment(/*Scope=*/nullptr, OpLoc, Opc,
12772                                                  First, Second);
12773     ExprResult Result = SemaRef.CheckPlaceholderExpr(First);
12774     if (Result.isInvalid())
12775       return ExprError();
12776     First = Result.get();
12777   }
12778 
12779   if (Second && Second->getObjectKind() == OK_ObjCProperty) {
12780     ExprResult Result = SemaRef.CheckPlaceholderExpr(Second);
12781     if (Result.isInvalid())
12782       return ExprError();
12783     Second = Result.get();
12784   }
12785 
12786   // Determine whether this should be a builtin operation.
12787   if (Op == OO_Subscript) {
12788     if (!First->getType()->isOverloadableType() &&
12789         !Second->getType()->isOverloadableType())
12790       return getSema().CreateBuiltinArraySubscriptExpr(
12791           First, Callee->getBeginLoc(), Second, OpLoc);
12792   } else if (Op == OO_Arrow) {
12793     // -> is never a builtin operation.
12794     return SemaRef.BuildOverloadedArrowExpr(nullptr, First, OpLoc);
12795   } else if (Second == nullptr || isPostIncDec) {
12796     if (!First->getType()->isOverloadableType() ||
12797         (Op == OO_Amp && getSema().isQualifiedMemberAccess(First))) {
12798       // The argument is not of overloadable type, or this is an expression
12799       // of the form &Class::member, so try to create a built-in unary
12800       // operation.
12801       UnaryOperatorKind Opc
12802         = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec);
12803 
12804       return getSema().CreateBuiltinUnaryOp(OpLoc, Opc, First);
12805     }
12806   } else {
12807     if (!First->getType()->isOverloadableType() &&
12808         !Second->getType()->isOverloadableType()) {
12809       // Neither of the arguments is an overloadable type, so try to
12810       // create a built-in binary operation.
12811       BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op);
12812       ExprResult Result
12813         = SemaRef.CreateBuiltinBinOp(OpLoc, Opc, First, Second);
12814       if (Result.isInvalid())
12815         return ExprError();
12816 
12817       return Result;
12818     }
12819   }
12820 
12821   // Compute the transformed set of functions (and function templates) to be
12822   // used during overload resolution.
12823   UnresolvedSet<16> Functions;
12824   bool RequiresADL;
12825 
12826   if (UnresolvedLookupExpr *ULE = dyn_cast<UnresolvedLookupExpr>(Callee)) {
12827     Functions.append(ULE->decls_begin(), ULE->decls_end());
12828     // If the overload could not be resolved in the template definition
12829     // (because we had a dependent argument), ADL is performed as part of
12830     // template instantiation.
12831     RequiresADL = ULE->requiresADL();
12832   } else {
12833     // If we've resolved this to a particular non-member function, just call
12834     // that function. If we resolved it to a member function,
12835     // CreateOverloaded* will find that function for us.
12836     NamedDecl *ND = cast<DeclRefExpr>(Callee)->getDecl();
12837     if (!isa<CXXMethodDecl>(ND))
12838       Functions.addDecl(ND);
12839     RequiresADL = false;
12840   }
12841 
12842   // Add any functions found via argument-dependent lookup.
12843   Expr *Args[2] = { First, Second };
12844   unsigned NumArgs = 1 + (Second != nullptr);
12845 
12846   // Create the overloaded operator invocation for unary operators.
12847   if (NumArgs == 1 || isPostIncDec) {
12848     UnaryOperatorKind Opc
12849       = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec);
12850     return SemaRef.CreateOverloadedUnaryOp(OpLoc, Opc, Functions, First,
12851                                            RequiresADL);
12852   }
12853 
12854   if (Op == OO_Subscript) {
12855     SourceLocation LBrace;
12856     SourceLocation RBrace;
12857 
12858     if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Callee)) {
12859         DeclarationNameLoc NameLoc = DRE->getNameInfo().getInfo();
12860         LBrace = SourceLocation::getFromRawEncoding(
12861                     NameLoc.CXXOperatorName.BeginOpNameLoc);
12862         RBrace = SourceLocation::getFromRawEncoding(
12863                     NameLoc.CXXOperatorName.EndOpNameLoc);
12864     } else {
12865       LBrace = Callee->getBeginLoc();
12866       RBrace = OpLoc;
12867     }
12868 
12869     return SemaRef.CreateOverloadedArraySubscriptExpr(LBrace, RBrace,
12870                                                       First, Second);
12871   }
12872 
12873   // Create the overloaded operator invocation for binary operators.
12874   BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op);
12875   ExprResult Result = SemaRef.CreateOverloadedBinOp(
12876       OpLoc, Opc, Functions, Args[0], Args[1], RequiresADL);
12877   if (Result.isInvalid())
12878     return ExprError();
12879 
12880   return Result;
12881 }
12882 
12883 template<typename Derived>
12884 ExprResult
12885 TreeTransform<Derived>::RebuildCXXPseudoDestructorExpr(Expr *Base,
12886                                                      SourceLocation OperatorLoc,
12887                                                        bool isArrow,
12888                                                        CXXScopeSpec &SS,
12889                                                      TypeSourceInfo *ScopeType,
12890                                                        SourceLocation CCLoc,
12891                                                        SourceLocation TildeLoc,
12892                                         PseudoDestructorTypeStorage Destroyed) {
12893   QualType BaseType = Base->getType();
12894   if (Base->isTypeDependent() || Destroyed.getIdentifier() ||
12895       (!isArrow && !BaseType->getAs<RecordType>()) ||
12896       (isArrow && BaseType->getAs<PointerType>() &&
12897        !BaseType->getAs<PointerType>()->getPointeeType()
12898                                               ->template getAs<RecordType>())){
12899     // This pseudo-destructor expression is still a pseudo-destructor.
12900     return SemaRef.BuildPseudoDestructorExpr(
12901         Base, OperatorLoc, isArrow ? tok::arrow : tok::period, SS, ScopeType,
12902         CCLoc, TildeLoc, Destroyed);
12903   }
12904 
12905   TypeSourceInfo *DestroyedType = Destroyed.getTypeSourceInfo();
12906   DeclarationName Name(SemaRef.Context.DeclarationNames.getCXXDestructorName(
12907                  SemaRef.Context.getCanonicalType(DestroyedType->getType())));
12908   DeclarationNameInfo NameInfo(Name, Destroyed.getLocation());
12909   NameInfo.setNamedTypeInfo(DestroyedType);
12910 
12911   // The scope type is now known to be a valid nested name specifier
12912   // component. Tack it on to the end of the nested name specifier.
12913   if (ScopeType) {
12914     if (!ScopeType->getType()->getAs<TagType>()) {
12915       getSema().Diag(ScopeType->getTypeLoc().getBeginLoc(),
12916                      diag::err_expected_class_or_namespace)
12917           << ScopeType->getType() << getSema().getLangOpts().CPlusPlus;
12918       return ExprError();
12919     }
12920     SS.Extend(SemaRef.Context, SourceLocation(), ScopeType->getTypeLoc(),
12921               CCLoc);
12922   }
12923 
12924   SourceLocation TemplateKWLoc; // FIXME: retrieve it from caller.
12925   return getSema().BuildMemberReferenceExpr(Base, BaseType,
12926                                             OperatorLoc, isArrow,
12927                                             SS, TemplateKWLoc,
12928                                             /*FIXME: FirstQualifier*/ nullptr,
12929                                             NameInfo,
12930                                             /*TemplateArgs*/ nullptr,
12931                                             /*S*/nullptr);
12932 }
12933 
12934 template<typename Derived>
12935 StmtResult
12936 TreeTransform<Derived>::TransformCapturedStmt(CapturedStmt *S) {
12937   SourceLocation Loc = S->getBeginLoc();
12938   CapturedDecl *CD = S->getCapturedDecl();
12939   unsigned NumParams = CD->getNumParams();
12940   unsigned ContextParamPos = CD->getContextParamPosition();
12941   SmallVector<Sema::CapturedParamNameType, 4> Params;
12942   for (unsigned I = 0; I < NumParams; ++I) {
12943     if (I != ContextParamPos) {
12944       Params.push_back(
12945              std::make_pair(
12946                   CD->getParam(I)->getName(),
12947                   getDerived().TransformType(CD->getParam(I)->getType())));
12948     } else {
12949       Params.push_back(std::make_pair(StringRef(), QualType()));
12950     }
12951   }
12952   getSema().ActOnCapturedRegionStart(Loc, /*CurScope*/nullptr,
12953                                      S->getCapturedRegionKind(), Params);
12954   StmtResult Body;
12955   {
12956     Sema::CompoundScopeRAII CompoundScope(getSema());
12957     Body = getDerived().TransformStmt(S->getCapturedStmt());
12958   }
12959 
12960   if (Body.isInvalid()) {
12961     getSema().ActOnCapturedRegionError();
12962     return StmtError();
12963   }
12964 
12965   return getSema().ActOnCapturedRegionEnd(Body.get());
12966 }
12967 
12968 } // end namespace clang
12969 
12970 #endif // LLVM_CLANG_LIB_SEMA_TREETRANSFORM_H
12971