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/ExprConcepts.h"
23 #include "clang/AST/ExprCXX.h"
24 #include "clang/AST/ExprObjC.h"
25 #include "clang/AST/ExprOpenMP.h"
26 #include "clang/AST/OpenMPClause.h"
27 #include "clang/AST/Stmt.h"
28 #include "clang/AST/StmtCXX.h"
29 #include "clang/AST/StmtObjC.h"
30 #include "clang/AST/StmtOpenMP.h"
31 #include "clang/Sema/Designator.h"
32 #include "clang/Sema/Lookup.h"
33 #include "clang/Sema/Ownership.h"
34 #include "clang/Sema/ParsedTemplate.h"
35 #include "clang/Sema/ScopeInfo.h"
36 #include "clang/Sema/SemaDiagnostic.h"
37 #include "clang/Sema/SemaInternal.h"
38 #include "llvm/ADT/ArrayRef.h"
39 #include "llvm/Support/ErrorHandling.h"
40 #include <algorithm>
41 
42 using namespace llvm::omp;
43 
44 namespace clang {
45 using namespace sema;
46 
47 /// A semantic tree transformation that allows one to transform one
48 /// abstract syntax tree into another.
49 ///
50 /// A new tree transformation is defined by creating a new subclass \c X of
51 /// \c TreeTransform<X> and then overriding certain operations to provide
52 /// behavior specific to that transformation. For example, template
53 /// instantiation is implemented as a tree transformation where the
54 /// transformation of TemplateTypeParmType nodes involves substituting the
55 /// template arguments for their corresponding template parameters; a similar
56 /// transformation is performed for non-type template parameters and
57 /// template template parameters.
58 ///
59 /// This tree-transformation template uses static polymorphism to allow
60 /// subclasses to customize any of its operations. Thus, a subclass can
61 /// override any of the transformation or rebuild operators by providing an
62 /// operation with the same signature as the default implementation. The
63 /// overriding function should not be virtual.
64 ///
65 /// Semantic tree transformations are split into two stages, either of which
66 /// can be replaced by a subclass. The "transform" step transforms an AST node
67 /// or the parts of an AST node using the various transformation functions,
68 /// then passes the pieces on to the "rebuild" step, which constructs a new AST
69 /// node of the appropriate kind from the pieces. The default transformation
70 /// routines recursively transform the operands to composite AST nodes (e.g.,
71 /// the pointee type of a PointerType node) and, if any of those operand nodes
72 /// were changed by the transformation, invokes the rebuild operation to create
73 /// a new AST node.
74 ///
75 /// Subclasses can customize the transformation at various levels. The
76 /// most coarse-grained transformations involve replacing TransformType(),
77 /// TransformExpr(), TransformDecl(), TransformNestedNameSpecifierLoc(),
78 /// TransformTemplateName(), or TransformTemplateArgument() with entirely
79 /// new implementations.
80 ///
81 /// For more fine-grained transformations, subclasses can replace any of the
82 /// \c TransformXXX functions (where XXX is the name of an AST node, e.g.,
83 /// PointerType, StmtExpr) to alter the transformation. As mentioned previously,
84 /// replacing TransformTemplateTypeParmType() allows template instantiation
85 /// to substitute template arguments for their corresponding template
86 /// parameters. Additionally, subclasses can override the \c RebuildXXX
87 /// functions to control how AST nodes are rebuilt when their operands change.
88 /// By default, \c TreeTransform will invoke semantic analysis to rebuild
89 /// AST nodes. However, certain other tree transformations (e.g, cloning) may
90 /// be able to use more efficient rebuild steps.
91 ///
92 /// There are a handful of other functions that can be overridden, allowing one
93 /// to avoid traversing nodes that don't need any transformation
94 /// (\c AlreadyTransformed()), force rebuilding AST nodes even when their
95 /// operands have not changed (\c AlwaysRebuild()), and customize the
96 /// default locations and entity names used for type-checking
97 /// (\c getBaseLocation(), \c getBaseEntity()).
98 template<typename Derived>
99 class TreeTransform {
100   /// Private RAII object that helps us forget and then re-remember
101   /// the template argument corresponding to a partially-substituted parameter
102   /// pack.
103   class ForgetPartiallySubstitutedPackRAII {
104     Derived &Self;
105     TemplateArgument Old;
106 
107   public:
108     ForgetPartiallySubstitutedPackRAII(Derived &Self) : Self(Self) {
109       Old = Self.ForgetPartiallySubstitutedPack();
110     }
111 
112     ~ForgetPartiallySubstitutedPackRAII() {
113       Self.RememberPartiallySubstitutedPack(Old);
114     }
115   };
116 
117 protected:
118   Sema &SemaRef;
119 
120   /// The set of local declarations that have been transformed, for
121   /// cases where we are forced to build new declarations within the transformer
122   /// rather than in the subclass (e.g., lambda closure types).
123   llvm::DenseMap<Decl *, Decl *> TransformedLocalDecls;
124 
125 public:
126   /// Initializes a new tree transformer.
127   TreeTransform(Sema &SemaRef) : SemaRef(SemaRef) { }
128 
129   /// Retrieves a reference to the derived class.
130   Derived &getDerived() { return static_cast<Derived&>(*this); }
131 
132   /// Retrieves a reference to the derived class.
133   const Derived &getDerived() const {
134     return static_cast<const Derived&>(*this);
135   }
136 
137   static inline ExprResult Owned(Expr *E) { return E; }
138   static inline StmtResult Owned(Stmt *S) { return S; }
139 
140   /// Retrieves a reference to the semantic analysis object used for
141   /// this tree transform.
142   Sema &getSema() const { return SemaRef; }
143 
144   /// Whether the transformation should always rebuild AST nodes, even
145   /// if none of the children have changed.
146   ///
147   /// Subclasses may override this function to specify when the transformation
148   /// should rebuild all AST nodes.
149   ///
150   /// We must always rebuild all AST nodes when performing variadic template
151   /// pack expansion, in order to avoid violating the AST invariant that each
152   /// statement node appears at most once in its containing declaration.
153   bool AlwaysRebuild() { return SemaRef.ArgumentPackSubstitutionIndex != -1; }
154 
155   /// Whether the transformation is forming an expression or statement that
156   /// replaces the original. In this case, we'll reuse mangling numbers from
157   /// existing lambdas.
158   bool ReplacingOriginal() { return false; }
159 
160   /// Returns the location of the entity being transformed, if that
161   /// information was not available elsewhere in the AST.
162   ///
163   /// By default, returns no source-location information. Subclasses can
164   /// provide an alternative implementation that provides better location
165   /// information.
166   SourceLocation getBaseLocation() { return SourceLocation(); }
167 
168   /// Returns the name of the entity being transformed, if that
169   /// information was not available elsewhere in the AST.
170   ///
171   /// By default, returns an empty name. Subclasses can provide an alternative
172   /// implementation with a more precise name.
173   DeclarationName getBaseEntity() { return DeclarationName(); }
174 
175   /// Sets the "base" location and entity when that
176   /// information is known based on another transformation.
177   ///
178   /// By default, the source location and entity are ignored. Subclasses can
179   /// override this function to provide a customized implementation.
180   void setBase(SourceLocation Loc, DeclarationName Entity) { }
181 
182   /// RAII object that temporarily sets the base location and entity
183   /// used for reporting diagnostics in types.
184   class TemporaryBase {
185     TreeTransform &Self;
186     SourceLocation OldLocation;
187     DeclarationName OldEntity;
188 
189   public:
190     TemporaryBase(TreeTransform &Self, SourceLocation Location,
191                   DeclarationName Entity) : Self(Self) {
192       OldLocation = Self.getDerived().getBaseLocation();
193       OldEntity = Self.getDerived().getBaseEntity();
194 
195       if (Location.isValid())
196         Self.getDerived().setBase(Location, Entity);
197     }
198 
199     ~TemporaryBase() {
200       Self.getDerived().setBase(OldLocation, OldEntity);
201     }
202   };
203 
204   /// Determine whether the given type \p T has already been
205   /// transformed.
206   ///
207   /// Subclasses can provide an alternative implementation of this routine
208   /// to short-circuit evaluation when it is known that a given type will
209   /// not change. For example, template instantiation need not traverse
210   /// non-dependent types.
211   bool AlreadyTransformed(QualType T) {
212     return T.isNull();
213   }
214 
215   /// Determine whether the given call argument should be dropped, e.g.,
216   /// because it is a default argument.
217   ///
218   /// Subclasses can provide an alternative implementation of this routine to
219   /// determine which kinds of call arguments get dropped. By default,
220   /// CXXDefaultArgument nodes are dropped (prior to transformation).
221   bool DropCallArgument(Expr *E) {
222     return E->isDefaultArgument();
223   }
224 
225   /// Determine whether we should expand a pack expansion with the
226   /// given set of parameter packs into separate arguments by repeatedly
227   /// transforming the pattern.
228   ///
229   /// By default, the transformer never tries to expand pack expansions.
230   /// Subclasses can override this routine to provide different behavior.
231   ///
232   /// \param EllipsisLoc The location of the ellipsis that identifies the
233   /// pack expansion.
234   ///
235   /// \param PatternRange The source range that covers the entire pattern of
236   /// the pack expansion.
237   ///
238   /// \param Unexpanded The set of unexpanded parameter packs within the
239   /// pattern.
240   ///
241   /// \param ShouldExpand Will be set to \c true if the transformer should
242   /// expand the corresponding pack expansions into separate arguments. When
243   /// set, \c NumExpansions must also be set.
244   ///
245   /// \param RetainExpansion Whether the caller should add an unexpanded
246   /// pack expansion after all of the expanded arguments. This is used
247   /// when extending explicitly-specified template argument packs per
248   /// C++0x [temp.arg.explicit]p9.
249   ///
250   /// \param NumExpansions The number of separate arguments that will be in
251   /// the expanded form of the corresponding pack expansion. This is both an
252   /// input and an output parameter, which can be set by the caller if the
253   /// number of expansions is known a priori (e.g., due to a prior substitution)
254   /// and will be set by the callee when the number of expansions is known.
255   /// The callee must set this value when \c ShouldExpand is \c true; it may
256   /// set this value in other cases.
257   ///
258   /// \returns true if an error occurred (e.g., because the parameter packs
259   /// are to be instantiated with arguments of different lengths), false
260   /// otherwise. If false, \c ShouldExpand (and possibly \c NumExpansions)
261   /// must be set.
262   bool TryExpandParameterPacks(SourceLocation EllipsisLoc,
263                                SourceRange PatternRange,
264                                ArrayRef<UnexpandedParameterPack> Unexpanded,
265                                bool &ShouldExpand,
266                                bool &RetainExpansion,
267                                Optional<unsigned> &NumExpansions) {
268     ShouldExpand = false;
269     return false;
270   }
271 
272   /// "Forget" about the partially-substituted pack template argument,
273   /// when 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   TemplateArgument ForgetPartiallySubstitutedPack() {
278     return TemplateArgument();
279   }
280 
281   /// "Remember" the partially-substituted pack template argument
282   /// after performing an instantiation that must preserve the parameter pack
283   /// use.
284   ///
285   /// This routine is meant to be overridden by the template instantiator.
286   void RememberPartiallySubstitutedPack(TemplateArgument Arg) { }
287 
288   /// Note to the derived class when a function parameter pack is
289   /// being expanded.
290   void ExpandingFunctionParameterPack(ParmVarDecl *Pack) { }
291 
292   /// Transforms the given type into another type.
293   ///
294   /// By default, this routine transforms a type by creating a
295   /// TypeSourceInfo for it and delegating to the appropriate
296   /// function.  This is expensive, but we don't mind, because
297   /// this method is deprecated anyway;  all users should be
298   /// switched to storing TypeSourceInfos.
299   ///
300   /// \returns the transformed type.
301   QualType TransformType(QualType T);
302 
303   /// Transforms the given type-with-location into a new
304   /// type-with-location.
305   ///
306   /// By default, this routine transforms a type by delegating to the
307   /// appropriate TransformXXXType to build a new type.  Subclasses
308   /// may override this function (to take over all type
309   /// transformations) or some set of the TransformXXXType functions
310   /// to alter the transformation.
311   TypeSourceInfo *TransformType(TypeSourceInfo *DI);
312 
313   /// Transform the given type-with-location into a new
314   /// type, collecting location information in the given builder
315   /// as necessary.
316   ///
317   QualType TransformType(TypeLocBuilder &TLB, TypeLoc TL);
318 
319   /// Transform a type that is permitted to produce a
320   /// DeducedTemplateSpecializationType.
321   ///
322   /// This is used in the (relatively rare) contexts where it is acceptable
323   /// for transformation to produce a class template type with deduced
324   /// template arguments.
325   /// @{
326   QualType TransformTypeWithDeducedTST(QualType T);
327   TypeSourceInfo *TransformTypeWithDeducedTST(TypeSourceInfo *DI);
328   /// @}
329 
330   /// The reason why the value of a statement is not discarded, if any.
331   enum StmtDiscardKind {
332     SDK_Discarded,
333     SDK_NotDiscarded,
334     SDK_StmtExprResult,
335   };
336 
337   /// Transform the given statement.
338   ///
339   /// By default, this routine transforms a statement by delegating to the
340   /// appropriate TransformXXXStmt function to transform a specific kind of
341   /// statement or the TransformExpr() function to transform an expression.
342   /// Subclasses may override this function to transform statements using some
343   /// other mechanism.
344   ///
345   /// \returns the transformed statement.
346   StmtResult TransformStmt(Stmt *S, StmtDiscardKind SDK = SDK_Discarded);
347 
348   /// Transform the given statement.
349   ///
350   /// By default, this routine transforms a statement by delegating to the
351   /// appropriate TransformOMPXXXClause function to transform a specific kind
352   /// of clause. Subclasses may override this function to transform statements
353   /// using some other mechanism.
354   ///
355   /// \returns the transformed OpenMP clause.
356   OMPClause *TransformOMPClause(OMPClause *S);
357 
358   /// Transform the given attribute.
359   ///
360   /// By default, this routine transforms a statement by delegating to the
361   /// appropriate TransformXXXAttr function to transform a specific kind
362   /// of attribute. Subclasses may override this function to transform
363   /// attributed statements using some other mechanism.
364   ///
365   /// \returns the transformed attribute
366   const Attr *TransformAttr(const Attr *S);
367 
368 /// Transform the specified attribute.
369 ///
370 /// Subclasses should override the transformation of attributes with a pragma
371 /// spelling to transform expressions stored within the attribute.
372 ///
373 /// \returns the transformed attribute.
374 #define ATTR(X)
375 #define PRAGMA_SPELLING_ATTR(X)                                                \
376   const X##Attr *Transform##X##Attr(const X##Attr *R) { return R; }
377 #include "clang/Basic/AttrList.inc"
378 
379   /// Transform the given expression.
380   ///
381   /// By default, this routine transforms an expression by delegating to the
382   /// appropriate TransformXXXExpr function to build a new expression.
383   /// Subclasses may override this function to transform expressions using some
384   /// other mechanism.
385   ///
386   /// \returns the transformed expression.
387   ExprResult TransformExpr(Expr *E);
388 
389   /// Transform the given initializer.
390   ///
391   /// By default, this routine transforms an initializer by stripping off the
392   /// semantic nodes added by initialization, then passing the result to
393   /// TransformExpr or TransformExprs.
394   ///
395   /// \returns the transformed initializer.
396   ExprResult TransformInitializer(Expr *Init, bool NotCopyInit);
397 
398   /// Transform the given list of expressions.
399   ///
400   /// This routine transforms a list of expressions by invoking
401   /// \c TransformExpr() for each subexpression. However, it also provides
402   /// support for variadic templates by expanding any pack expansions (if the
403   /// derived class permits such expansion) along the way. When pack expansions
404   /// are present, the number of outputs may not equal the number of inputs.
405   ///
406   /// \param Inputs The set of expressions to be transformed.
407   ///
408   /// \param NumInputs The number of expressions in \c Inputs.
409   ///
410   /// \param IsCall If \c true, then this transform is being performed on
411   /// function-call arguments, and any arguments that should be dropped, will
412   /// be.
413   ///
414   /// \param Outputs The transformed input expressions will be added to this
415   /// vector.
416   ///
417   /// \param ArgChanged If non-NULL, will be set \c true if any argument changed
418   /// due to transformation.
419   ///
420   /// \returns true if an error occurred, false otherwise.
421   bool TransformExprs(Expr *const *Inputs, unsigned NumInputs, bool IsCall,
422                       SmallVectorImpl<Expr *> &Outputs,
423                       bool *ArgChanged = nullptr);
424 
425   /// Transform the given declaration, which is referenced from a type
426   /// or expression.
427   ///
428   /// By default, acts as the identity function on declarations, unless the
429   /// transformer has had to transform the declaration itself. Subclasses
430   /// may override this function to provide alternate behavior.
431   Decl *TransformDecl(SourceLocation Loc, Decl *D) {
432     llvm::DenseMap<Decl *, Decl *>::iterator Known
433       = TransformedLocalDecls.find(D);
434     if (Known != TransformedLocalDecls.end())
435       return Known->second;
436 
437     return D;
438   }
439 
440   /// Transform the specified condition.
441   ///
442   /// By default, this transforms the variable and expression and rebuilds
443   /// the condition.
444   Sema::ConditionResult TransformCondition(SourceLocation Loc, VarDecl *Var,
445                                            Expr *Expr,
446                                            Sema::ConditionKind Kind);
447 
448   /// Transform the attributes associated with the given declaration and
449   /// place them on the new declaration.
450   ///
451   /// By default, this operation does nothing. Subclasses may override this
452   /// behavior to transform attributes.
453   void transformAttrs(Decl *Old, Decl *New) { }
454 
455   /// Note that a local declaration has been transformed by this
456   /// transformer.
457   ///
458   /// Local declarations are typically transformed via a call to
459   /// TransformDefinition. However, in some cases (e.g., lambda expressions),
460   /// the transformer itself has to transform the declarations. This routine
461   /// can be overridden by a subclass that keeps track of such mappings.
462   void transformedLocalDecl(Decl *Old, ArrayRef<Decl *> New) {
463     assert(New.size() == 1 &&
464            "must override transformedLocalDecl if performing pack expansion");
465     TransformedLocalDecls[Old] = New.front();
466   }
467 
468   /// Transform the definition of the given declaration.
469   ///
470   /// By default, invokes TransformDecl() to transform the declaration.
471   /// Subclasses may override this function to provide alternate behavior.
472   Decl *TransformDefinition(SourceLocation Loc, Decl *D) {
473     return getDerived().TransformDecl(Loc, D);
474   }
475 
476   /// Transform the given declaration, which was the first part of a
477   /// nested-name-specifier in a member access expression.
478   ///
479   /// This specific declaration transformation only applies to the first
480   /// identifier in a nested-name-specifier of a member access expression, e.g.,
481   /// the \c T in \c x->T::member
482   ///
483   /// By default, invokes TransformDecl() to transform the declaration.
484   /// Subclasses may override this function to provide alternate behavior.
485   NamedDecl *TransformFirstQualifierInScope(NamedDecl *D, SourceLocation Loc) {
486     return cast_or_null<NamedDecl>(getDerived().TransformDecl(Loc, D));
487   }
488 
489   /// Transform the set of declarations in an OverloadExpr.
490   bool TransformOverloadExprDecls(OverloadExpr *Old, bool RequiresADL,
491                                   LookupResult &R);
492 
493   /// Transform the given nested-name-specifier with source-location
494   /// information.
495   ///
496   /// By default, transforms all of the types and declarations within the
497   /// nested-name-specifier. Subclasses may override this function to provide
498   /// alternate behavior.
499   NestedNameSpecifierLoc
500   TransformNestedNameSpecifierLoc(NestedNameSpecifierLoc NNS,
501                                   QualType ObjectType = QualType(),
502                                   NamedDecl *FirstQualifierInScope = nullptr);
503 
504   /// Transform the given declaration name.
505   ///
506   /// By default, transforms the types of conversion function, constructor,
507   /// and destructor names and then (if needed) rebuilds the declaration name.
508   /// Identifiers and selectors are returned unmodified. Sublcasses may
509   /// override this function to provide alternate behavior.
510   DeclarationNameInfo
511   TransformDeclarationNameInfo(const DeclarationNameInfo &NameInfo);
512 
513   bool TransformRequiresExprRequirements(ArrayRef<concepts::Requirement *> Reqs,
514       llvm::SmallVectorImpl<concepts::Requirement *> &Transformed);
515   concepts::TypeRequirement *
516   TransformTypeRequirement(concepts::TypeRequirement *Req);
517   concepts::ExprRequirement *
518   TransformExprRequirement(concepts::ExprRequirement *Req);
519   concepts::NestedRequirement *
520   TransformNestedRequirement(concepts::NestedRequirement *Req);
521 
522   /// Transform the given template name.
523   ///
524   /// \param SS The nested-name-specifier that qualifies the template
525   /// name. This nested-name-specifier must already have been transformed.
526   ///
527   /// \param Name The template name to transform.
528   ///
529   /// \param NameLoc The source location of the template name.
530   ///
531   /// \param ObjectType If we're translating a template name within a member
532   /// access expression, this is the type of the object whose member template
533   /// is being referenced.
534   ///
535   /// \param FirstQualifierInScope If the first part of a nested-name-specifier
536   /// also refers to a name within the current (lexical) scope, this is the
537   /// declaration it refers to.
538   ///
539   /// By default, transforms the template name by transforming the declarations
540   /// and nested-name-specifiers that occur within the template name.
541   /// Subclasses may override this function to provide alternate behavior.
542   TemplateName
543   TransformTemplateName(CXXScopeSpec &SS, TemplateName Name,
544                         SourceLocation NameLoc,
545                         QualType ObjectType = QualType(),
546                         NamedDecl *FirstQualifierInScope = nullptr,
547                         bool AllowInjectedClassName = false);
548 
549   /// Transform the given template argument.
550   ///
551   /// By default, this operation transforms the type, expression, or
552   /// declaration stored within the template argument and constructs a
553   /// new template argument from the transformed result. Subclasses may
554   /// override this function to provide alternate behavior.
555   ///
556   /// Returns true if there was an error.
557   bool TransformTemplateArgument(const TemplateArgumentLoc &Input,
558                                  TemplateArgumentLoc &Output,
559                                  bool Uneval = false);
560 
561   /// Transform the given set of template arguments.
562   ///
563   /// By default, this operation transforms all of the template arguments
564   /// in the input set using \c TransformTemplateArgument(), and appends
565   /// the transformed arguments to the output list.
566   ///
567   /// Note that this overload of \c TransformTemplateArguments() is merely
568   /// a convenience function. Subclasses that wish to override this behavior
569   /// should override the iterator-based member template version.
570   ///
571   /// \param Inputs The set of template arguments to be transformed.
572   ///
573   /// \param NumInputs The number of template arguments in \p Inputs.
574   ///
575   /// \param Outputs The set of transformed template arguments output by this
576   /// routine.
577   ///
578   /// Returns true if an error occurred.
579   bool TransformTemplateArguments(const TemplateArgumentLoc *Inputs,
580                                   unsigned NumInputs,
581                                   TemplateArgumentListInfo &Outputs,
582                                   bool Uneval = false) {
583     return TransformTemplateArguments(Inputs, Inputs + NumInputs, Outputs,
584                                       Uneval);
585   }
586 
587   /// Transform the given set of template arguments.
588   ///
589   /// By default, this operation transforms all of the template arguments
590   /// in the input set using \c TransformTemplateArgument(), and appends
591   /// the transformed arguments to the output list.
592   ///
593   /// \param First An iterator to the first template argument.
594   ///
595   /// \param Last An iterator one step past the last template argument.
596   ///
597   /// \param Outputs The set of transformed template arguments output by this
598   /// routine.
599   ///
600   /// Returns true if an error occurred.
601   template<typename InputIterator>
602   bool TransformTemplateArguments(InputIterator First,
603                                   InputIterator Last,
604                                   TemplateArgumentListInfo &Outputs,
605                                   bool Uneval = false);
606 
607   /// Fakes up a TemplateArgumentLoc for a given TemplateArgument.
608   void InventTemplateArgumentLoc(const TemplateArgument &Arg,
609                                  TemplateArgumentLoc &ArgLoc);
610 
611   /// Fakes up a TypeSourceInfo for a type.
612   TypeSourceInfo *InventTypeSourceInfo(QualType T) {
613     return SemaRef.Context.getTrivialTypeSourceInfo(T,
614                        getDerived().getBaseLocation());
615   }
616 
617 #define ABSTRACT_TYPELOC(CLASS, PARENT)
618 #define TYPELOC(CLASS, PARENT)                                   \
619   QualType Transform##CLASS##Type(TypeLocBuilder &TLB, CLASS##TypeLoc T);
620 #include "clang/AST/TypeLocNodes.def"
621 
622   template<typename Fn>
623   QualType TransformFunctionProtoType(TypeLocBuilder &TLB,
624                                       FunctionProtoTypeLoc TL,
625                                       CXXRecordDecl *ThisContext,
626                                       Qualifiers ThisTypeQuals,
627                                       Fn TransformExceptionSpec);
628 
629   bool TransformExceptionSpec(SourceLocation Loc,
630                               FunctionProtoType::ExceptionSpecInfo &ESI,
631                               SmallVectorImpl<QualType> &Exceptions,
632                               bool &Changed);
633 
634   StmtResult TransformSEHHandler(Stmt *Handler);
635 
636   QualType
637   TransformTemplateSpecializationType(TypeLocBuilder &TLB,
638                                       TemplateSpecializationTypeLoc TL,
639                                       TemplateName Template);
640 
641   QualType
642   TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB,
643                                       DependentTemplateSpecializationTypeLoc TL,
644                                                TemplateName Template,
645                                                CXXScopeSpec &SS);
646 
647   QualType TransformDependentTemplateSpecializationType(
648       TypeLocBuilder &TLB, DependentTemplateSpecializationTypeLoc TL,
649       NestedNameSpecifierLoc QualifierLoc);
650 
651   /// Transforms the parameters of a function type into the
652   /// given vectors.
653   ///
654   /// The result vectors should be kept in sync; null entries in the
655   /// variables vector are acceptable.
656   ///
657   /// Return true on error.
658   bool TransformFunctionTypeParams(
659       SourceLocation Loc, ArrayRef<ParmVarDecl *> Params,
660       const QualType *ParamTypes,
661       const FunctionProtoType::ExtParameterInfo *ParamInfos,
662       SmallVectorImpl<QualType> &PTypes, SmallVectorImpl<ParmVarDecl *> *PVars,
663       Sema::ExtParameterInfoBuilder &PInfos);
664 
665   /// Transforms a single function-type parameter.  Return null
666   /// on error.
667   ///
668   /// \param indexAdjustment - A number to add to the parameter's
669   ///   scope index;  can be negative
670   ParmVarDecl *TransformFunctionTypeParam(ParmVarDecl *OldParm,
671                                           int indexAdjustment,
672                                           Optional<unsigned> NumExpansions,
673                                           bool ExpectParameterPack);
674 
675   /// Transform the body of a lambda-expression.
676   StmtResult TransformLambdaBody(LambdaExpr *E, Stmt *Body);
677   /// Alternative implementation of TransformLambdaBody that skips transforming
678   /// the body.
679   StmtResult SkipLambdaBody(LambdaExpr *E, Stmt *Body);
680 
681   QualType TransformReferenceType(TypeLocBuilder &TLB, ReferenceTypeLoc TL);
682 
683   StmtResult TransformCompoundStmt(CompoundStmt *S, bool IsStmtExpr);
684   ExprResult TransformCXXNamedCastExpr(CXXNamedCastExpr *E);
685 
686   TemplateParameterList *TransformTemplateParameterList(
687         TemplateParameterList *TPL) {
688     return TPL;
689   }
690 
691   ExprResult TransformAddressOfOperand(Expr *E);
692 
693   ExprResult TransformDependentScopeDeclRefExpr(DependentScopeDeclRefExpr *E,
694                                                 bool IsAddressOfOperand,
695                                                 TypeSourceInfo **RecoveryTSI);
696 
697   ExprResult TransformParenDependentScopeDeclRefExpr(
698       ParenExpr *PE, DependentScopeDeclRefExpr *DRE, bool IsAddressOfOperand,
699       TypeSourceInfo **RecoveryTSI);
700 
701   StmtResult TransformOMPExecutableDirective(OMPExecutableDirective *S);
702 
703 // FIXME: We use LLVM_ATTRIBUTE_NOINLINE because inlining causes a ridiculous
704 // amount of stack usage with clang.
705 #define STMT(Node, Parent)                        \
706   LLVM_ATTRIBUTE_NOINLINE \
707   StmtResult Transform##Node(Node *S);
708 #define VALUESTMT(Node, Parent)                   \
709   LLVM_ATTRIBUTE_NOINLINE \
710   StmtResult Transform##Node(Node *S, StmtDiscardKind SDK);
711 #define EXPR(Node, Parent)                        \
712   LLVM_ATTRIBUTE_NOINLINE \
713   ExprResult Transform##Node(Node *E);
714 #define ABSTRACT_STMT(Stmt)
715 #include "clang/AST/StmtNodes.inc"
716 
717 #define OPENMP_CLAUSE(Name, Class)                        \
718   LLVM_ATTRIBUTE_NOINLINE \
719   OMPClause *Transform ## Class(Class *S);
720 #include "clang/Basic/OpenMPKinds.def"
721 
722   /// Build a new qualified type given its unqualified type and type location.
723   ///
724   /// By default, this routine adds type qualifiers only to types that can
725   /// have qualifiers, and silently suppresses those qualifiers that are not
726   /// permitted. Subclasses may override this routine to provide different
727   /// behavior.
728   QualType RebuildQualifiedType(QualType T, QualifiedTypeLoc TL);
729 
730   /// Build a new pointer type given its pointee type.
731   ///
732   /// By default, performs semantic analysis when building the pointer type.
733   /// Subclasses may override this routine to provide different behavior.
734   QualType RebuildPointerType(QualType PointeeType, SourceLocation Sigil);
735 
736   /// Build a new block pointer type given its pointee type.
737   ///
738   /// By default, performs semantic analysis when building the block pointer
739   /// type. Subclasses may override this routine to provide different behavior.
740   QualType RebuildBlockPointerType(QualType PointeeType, SourceLocation Sigil);
741 
742   /// Build a new reference type given the type it references.
743   ///
744   /// By default, performs semantic analysis when building the
745   /// reference type. Subclasses may override this routine to provide
746   /// different behavior.
747   ///
748   /// \param LValue whether the type was written with an lvalue sigil
749   /// or an rvalue sigil.
750   QualType RebuildReferenceType(QualType ReferentType,
751                                 bool LValue,
752                                 SourceLocation Sigil);
753 
754   /// Build a new member pointer type given the pointee type and the
755   /// class type it refers into.
756   ///
757   /// By default, performs semantic analysis when building the member pointer
758   /// type. Subclasses may override this routine to provide different behavior.
759   QualType RebuildMemberPointerType(QualType PointeeType, QualType ClassType,
760                                     SourceLocation Sigil);
761 
762   QualType RebuildObjCTypeParamType(const ObjCTypeParamDecl *Decl,
763                                     SourceLocation ProtocolLAngleLoc,
764                                     ArrayRef<ObjCProtocolDecl *> Protocols,
765                                     ArrayRef<SourceLocation> ProtocolLocs,
766                                     SourceLocation ProtocolRAngleLoc);
767 
768   /// Build an Objective-C object type.
769   ///
770   /// By default, performs semantic analysis when building the object type.
771   /// Subclasses may override this routine to provide different behavior.
772   QualType RebuildObjCObjectType(QualType BaseType,
773                                  SourceLocation Loc,
774                                  SourceLocation TypeArgsLAngleLoc,
775                                  ArrayRef<TypeSourceInfo *> TypeArgs,
776                                  SourceLocation TypeArgsRAngleLoc,
777                                  SourceLocation ProtocolLAngleLoc,
778                                  ArrayRef<ObjCProtocolDecl *> Protocols,
779                                  ArrayRef<SourceLocation> ProtocolLocs,
780                                  SourceLocation ProtocolRAngleLoc);
781 
782   /// Build a new Objective-C object pointer type given the pointee type.
783   ///
784   /// By default, directly builds the pointer type, with no additional semantic
785   /// analysis.
786   QualType RebuildObjCObjectPointerType(QualType PointeeType,
787                                         SourceLocation Star);
788 
789   /// Build a new array type given the element type, size
790   /// modifier, size of the array (if known), size expression, and index type
791   /// qualifiers.
792   ///
793   /// By default, performs semantic analysis when building the array type.
794   /// Subclasses may override this routine to provide different behavior.
795   /// Also by default, all of the other Rebuild*Array
796   QualType RebuildArrayType(QualType ElementType,
797                             ArrayType::ArraySizeModifier SizeMod,
798                             const llvm::APInt *Size,
799                             Expr *SizeExpr,
800                             unsigned IndexTypeQuals,
801                             SourceRange BracketsRange);
802 
803   /// Build a new constant array type given the element type, size
804   /// modifier, (known) size of the array, and index type qualifiers.
805   ///
806   /// By default, performs semantic analysis when building the array type.
807   /// Subclasses may override this routine to provide different behavior.
808   QualType RebuildConstantArrayType(QualType ElementType,
809                                     ArrayType::ArraySizeModifier SizeMod,
810                                     const llvm::APInt &Size,
811                                     Expr *SizeExpr,
812                                     unsigned IndexTypeQuals,
813                                     SourceRange BracketsRange);
814 
815   /// Build a new incomplete array type given the element type, size
816   /// modifier, and index type qualifiers.
817   ///
818   /// By default, performs semantic analysis when building the array type.
819   /// Subclasses may override this routine to provide different behavior.
820   QualType RebuildIncompleteArrayType(QualType ElementType,
821                                       ArrayType::ArraySizeModifier SizeMod,
822                                       unsigned IndexTypeQuals,
823                                       SourceRange BracketsRange);
824 
825   /// Build a new variable-length array type given the element type,
826   /// size modifier, size expression, and index type qualifiers.
827   ///
828   /// By default, performs semantic analysis when building the array type.
829   /// Subclasses may override this routine to provide different behavior.
830   QualType RebuildVariableArrayType(QualType ElementType,
831                                     ArrayType::ArraySizeModifier SizeMod,
832                                     Expr *SizeExpr,
833                                     unsigned IndexTypeQuals,
834                                     SourceRange BracketsRange);
835 
836   /// Build a new dependent-sized array type given the element type,
837   /// size modifier, size expression, and index type qualifiers.
838   ///
839   /// By default, performs semantic analysis when building the array type.
840   /// Subclasses may override this routine to provide different behavior.
841   QualType RebuildDependentSizedArrayType(QualType ElementType,
842                                           ArrayType::ArraySizeModifier SizeMod,
843                                           Expr *SizeExpr,
844                                           unsigned IndexTypeQuals,
845                                           SourceRange BracketsRange);
846 
847   /// Build a new vector type given the element type and
848   /// number of elements.
849   ///
850   /// By default, performs semantic analysis when building the vector type.
851   /// Subclasses may override this routine to provide different behavior.
852   QualType RebuildVectorType(QualType ElementType, unsigned NumElements,
853                              VectorType::VectorKind VecKind);
854 
855   /// Build a new potentially dependently-sized extended vector type
856   /// given the element type and number of elements.
857   ///
858   /// By default, performs semantic analysis when building the vector type.
859   /// Subclasses may override this routine to provide different behavior.
860   QualType RebuildDependentVectorType(QualType ElementType, Expr *SizeExpr,
861                                            SourceLocation AttributeLoc,
862                                            VectorType::VectorKind);
863 
864   /// Build a new extended vector type given the element type and
865   /// number of elements.
866   ///
867   /// By default, performs semantic analysis when building the vector type.
868   /// Subclasses may override this routine to provide different behavior.
869   QualType RebuildExtVectorType(QualType ElementType, unsigned NumElements,
870                                 SourceLocation AttributeLoc);
871 
872   /// Build a new potentially dependently-sized extended vector type
873   /// given the element type and number of elements.
874   ///
875   /// By default, performs semantic analysis when building the vector type.
876   /// Subclasses may override this routine to provide different behavior.
877   QualType RebuildDependentSizedExtVectorType(QualType ElementType,
878                                               Expr *SizeExpr,
879                                               SourceLocation AttributeLoc);
880 
881   /// Build a new DependentAddressSpaceType or return the pointee
882   /// type variable with the correct address space (retrieved from
883   /// AddrSpaceExpr) applied to it. The former will be returned in cases
884   /// where the address space remains dependent.
885   ///
886   /// By default, performs semantic analysis when building the type with address
887   /// space applied. Subclasses may override this routine to provide different
888   /// behavior.
889   QualType RebuildDependentAddressSpaceType(QualType PointeeType,
890                                             Expr *AddrSpaceExpr,
891                                             SourceLocation AttributeLoc);
892 
893   /// Build a new function type.
894   ///
895   /// By default, performs semantic analysis when building the function type.
896   /// Subclasses may override this routine to provide different behavior.
897   QualType RebuildFunctionProtoType(QualType T,
898                                     MutableArrayRef<QualType> ParamTypes,
899                                     const FunctionProtoType::ExtProtoInfo &EPI);
900 
901   /// Build a new unprototyped function type.
902   QualType RebuildFunctionNoProtoType(QualType ResultType);
903 
904   /// Rebuild an unresolved typename type, given the decl that
905   /// the UnresolvedUsingTypenameDecl was transformed to.
906   QualType RebuildUnresolvedUsingType(SourceLocation NameLoc, Decl *D);
907 
908   /// Build a new typedef type.
909   QualType RebuildTypedefType(TypedefNameDecl *Typedef) {
910     return SemaRef.Context.getTypeDeclType(Typedef);
911   }
912 
913   /// Build a new MacroDefined type.
914   QualType RebuildMacroQualifiedType(QualType T,
915                                      const IdentifierInfo *MacroII) {
916     return SemaRef.Context.getMacroQualifiedType(T, MacroII);
917   }
918 
919   /// Build a new class/struct/union type.
920   QualType RebuildRecordType(RecordDecl *Record) {
921     return SemaRef.Context.getTypeDeclType(Record);
922   }
923 
924   /// Build a new Enum type.
925   QualType RebuildEnumType(EnumDecl *Enum) {
926     return SemaRef.Context.getTypeDeclType(Enum);
927   }
928 
929   /// Build a new typeof(expr) type.
930   ///
931   /// By default, performs semantic analysis when building the typeof type.
932   /// Subclasses may override this routine to provide different behavior.
933   QualType RebuildTypeOfExprType(Expr *Underlying, SourceLocation Loc);
934 
935   /// Build a new typeof(type) type.
936   ///
937   /// By default, builds a new TypeOfType with the given underlying type.
938   QualType RebuildTypeOfType(QualType Underlying);
939 
940   /// Build a new unary transform type.
941   QualType RebuildUnaryTransformType(QualType BaseType,
942                                      UnaryTransformType::UTTKind UKind,
943                                      SourceLocation Loc);
944 
945   /// Build a new C++11 decltype type.
946   ///
947   /// By default, performs semantic analysis when building the decltype type.
948   /// Subclasses may override this routine to provide different behavior.
949   QualType RebuildDecltypeType(Expr *Underlying, SourceLocation Loc);
950 
951   /// Build a new C++11 auto type.
952   ///
953   /// By default, builds a new AutoType with the given deduced type.
954   QualType RebuildAutoType(QualType Deduced, AutoTypeKeyword Keyword,
955                            ConceptDecl *TypeConstraintConcept,
956                            ArrayRef<TemplateArgument> TypeConstraintArgs) {
957     // Note, IsDependent is always false here: we implicitly convert an 'auto'
958     // which has been deduced to a dependent type into an undeduced 'auto', so
959     // that we'll retry deduction after the transformation.
960     return SemaRef.Context.getAutoType(Deduced, Keyword,
961                                        /*IsDependent*/ false, /*IsPack=*/false,
962                                        TypeConstraintConcept,
963                                        TypeConstraintArgs);
964   }
965 
966   /// By default, builds a new DeducedTemplateSpecializationType with the given
967   /// deduced type.
968   QualType RebuildDeducedTemplateSpecializationType(TemplateName Template,
969       QualType Deduced) {
970     return SemaRef.Context.getDeducedTemplateSpecializationType(
971         Template, Deduced, /*IsDependent*/ false);
972   }
973 
974   /// Build a new template specialization type.
975   ///
976   /// By default, performs semantic analysis when building the template
977   /// specialization type. Subclasses may override this routine to provide
978   /// different behavior.
979   QualType RebuildTemplateSpecializationType(TemplateName Template,
980                                              SourceLocation TemplateLoc,
981                                              TemplateArgumentListInfo &Args);
982 
983   /// Build a new parenthesized type.
984   ///
985   /// By default, builds a new ParenType type from the inner type.
986   /// Subclasses may override this routine to provide different behavior.
987   QualType RebuildParenType(QualType InnerType) {
988     return SemaRef.BuildParenType(InnerType);
989   }
990 
991   /// Build a new qualified name type.
992   ///
993   /// By default, builds a new ElaboratedType type from the keyword,
994   /// the nested-name-specifier and the named type.
995   /// Subclasses may override this routine to provide different behavior.
996   QualType RebuildElaboratedType(SourceLocation KeywordLoc,
997                                  ElaboratedTypeKeyword Keyword,
998                                  NestedNameSpecifierLoc QualifierLoc,
999                                  QualType Named) {
1000     return SemaRef.Context.getElaboratedType(Keyword,
1001                                          QualifierLoc.getNestedNameSpecifier(),
1002                                              Named);
1003   }
1004 
1005   /// Build a new typename type that refers to a template-id.
1006   ///
1007   /// By default, builds a new DependentNameType type from the
1008   /// nested-name-specifier and the given type. Subclasses may override
1009   /// this routine to provide different behavior.
1010   QualType RebuildDependentTemplateSpecializationType(
1011                                           ElaboratedTypeKeyword Keyword,
1012                                           NestedNameSpecifierLoc QualifierLoc,
1013                                           SourceLocation TemplateKWLoc,
1014                                           const IdentifierInfo *Name,
1015                                           SourceLocation NameLoc,
1016                                           TemplateArgumentListInfo &Args,
1017                                           bool AllowInjectedClassName) {
1018     // Rebuild the template name.
1019     // TODO: avoid TemplateName abstraction
1020     CXXScopeSpec SS;
1021     SS.Adopt(QualifierLoc);
1022     TemplateName InstName = getDerived().RebuildTemplateName(
1023         SS, TemplateKWLoc, *Name, NameLoc, QualType(), nullptr,
1024         AllowInjectedClassName);
1025 
1026     if (InstName.isNull())
1027       return QualType();
1028 
1029     // If it's still dependent, make a dependent specialization.
1030     if (InstName.getAsDependentTemplateName())
1031       return SemaRef.Context.getDependentTemplateSpecializationType(Keyword,
1032                                           QualifierLoc.getNestedNameSpecifier(),
1033                                                                     Name,
1034                                                                     Args);
1035 
1036     // Otherwise, make an elaborated type wrapping a non-dependent
1037     // specialization.
1038     QualType T =
1039     getDerived().RebuildTemplateSpecializationType(InstName, NameLoc, Args);
1040     if (T.isNull()) return QualType();
1041 
1042     if (Keyword == ETK_None && QualifierLoc.getNestedNameSpecifier() == nullptr)
1043       return T;
1044 
1045     return SemaRef.Context.getElaboratedType(Keyword,
1046                                        QualifierLoc.getNestedNameSpecifier(),
1047                                              T);
1048   }
1049 
1050   /// Build a new typename type that refers to an identifier.
1051   ///
1052   /// By default, performs semantic analysis when building the typename type
1053   /// (or elaborated type). Subclasses may override this routine to provide
1054   /// different behavior.
1055   QualType RebuildDependentNameType(ElaboratedTypeKeyword Keyword,
1056                                     SourceLocation KeywordLoc,
1057                                     NestedNameSpecifierLoc QualifierLoc,
1058                                     const IdentifierInfo *Id,
1059                                     SourceLocation IdLoc,
1060                                     bool DeducedTSTContext) {
1061     CXXScopeSpec SS;
1062     SS.Adopt(QualifierLoc);
1063 
1064     if (QualifierLoc.getNestedNameSpecifier()->isDependent()) {
1065       // If the name is still dependent, just build a new dependent name type.
1066       if (!SemaRef.computeDeclContext(SS))
1067         return SemaRef.Context.getDependentNameType(Keyword,
1068                                           QualifierLoc.getNestedNameSpecifier(),
1069                                                     Id);
1070     }
1071 
1072     if (Keyword == ETK_None || Keyword == ETK_Typename) {
1073       return SemaRef.CheckTypenameType(Keyword, KeywordLoc, QualifierLoc,
1074                                        *Id, IdLoc, DeducedTSTContext);
1075     }
1076 
1077     TagTypeKind Kind = TypeWithKeyword::getTagTypeKindForKeyword(Keyword);
1078 
1079     // We had a dependent elaborated-type-specifier that has been transformed
1080     // into a non-dependent elaborated-type-specifier. Find the tag we're
1081     // referring to.
1082     LookupResult Result(SemaRef, Id, IdLoc, Sema::LookupTagName);
1083     DeclContext *DC = SemaRef.computeDeclContext(SS, false);
1084     if (!DC)
1085       return QualType();
1086 
1087     if (SemaRef.RequireCompleteDeclContext(SS, DC))
1088       return QualType();
1089 
1090     TagDecl *Tag = nullptr;
1091     SemaRef.LookupQualifiedName(Result, DC);
1092     switch (Result.getResultKind()) {
1093       case LookupResult::NotFound:
1094       case LookupResult::NotFoundInCurrentInstantiation:
1095         break;
1096 
1097       case LookupResult::Found:
1098         Tag = Result.getAsSingle<TagDecl>();
1099         break;
1100 
1101       case LookupResult::FoundOverloaded:
1102       case LookupResult::FoundUnresolvedValue:
1103         llvm_unreachable("Tag lookup cannot find non-tags");
1104 
1105       case LookupResult::Ambiguous:
1106         // Let the LookupResult structure handle ambiguities.
1107         return QualType();
1108     }
1109 
1110     if (!Tag) {
1111       // Check where the name exists but isn't a tag type and use that to emit
1112       // better diagnostics.
1113       LookupResult Result(SemaRef, Id, IdLoc, Sema::LookupTagName);
1114       SemaRef.LookupQualifiedName(Result, DC);
1115       switch (Result.getResultKind()) {
1116         case LookupResult::Found:
1117         case LookupResult::FoundOverloaded:
1118         case LookupResult::FoundUnresolvedValue: {
1119           NamedDecl *SomeDecl = Result.getRepresentativeDecl();
1120           Sema::NonTagKind NTK = SemaRef.getNonTagTypeDeclKind(SomeDecl, Kind);
1121           SemaRef.Diag(IdLoc, diag::err_tag_reference_non_tag) << SomeDecl
1122                                                                << NTK << Kind;
1123           SemaRef.Diag(SomeDecl->getLocation(), diag::note_declared_at);
1124           break;
1125         }
1126         default:
1127           SemaRef.Diag(IdLoc, diag::err_not_tag_in_scope)
1128               << Kind << Id << DC << QualifierLoc.getSourceRange();
1129           break;
1130       }
1131       return QualType();
1132     }
1133 
1134     if (!SemaRef.isAcceptableTagRedeclaration(Tag, Kind, /*isDefinition*/false,
1135                                               IdLoc, Id)) {
1136       SemaRef.Diag(KeywordLoc, diag::err_use_with_wrong_tag) << Id;
1137       SemaRef.Diag(Tag->getLocation(), diag::note_previous_use);
1138       return QualType();
1139     }
1140 
1141     // Build the elaborated-type-specifier type.
1142     QualType T = SemaRef.Context.getTypeDeclType(Tag);
1143     return SemaRef.Context.getElaboratedType(Keyword,
1144                                          QualifierLoc.getNestedNameSpecifier(),
1145                                              T);
1146   }
1147 
1148   /// Build a new pack expansion type.
1149   ///
1150   /// By default, builds a new PackExpansionType type from the given pattern.
1151   /// Subclasses may override this routine to provide different behavior.
1152   QualType RebuildPackExpansionType(QualType Pattern,
1153                                     SourceRange PatternRange,
1154                                     SourceLocation EllipsisLoc,
1155                                     Optional<unsigned> NumExpansions) {
1156     return getSema().CheckPackExpansion(Pattern, PatternRange, EllipsisLoc,
1157                                         NumExpansions);
1158   }
1159 
1160   /// Build a new atomic type given its value type.
1161   ///
1162   /// By default, performs semantic analysis when building the atomic type.
1163   /// Subclasses may override this routine to provide different behavior.
1164   QualType RebuildAtomicType(QualType ValueType, SourceLocation KWLoc);
1165 
1166   /// Build a new pipe type given its value type.
1167   QualType RebuildPipeType(QualType ValueType, SourceLocation KWLoc,
1168                            bool isReadPipe);
1169 
1170   /// Build a new template name given a nested name specifier, a flag
1171   /// indicating whether the "template" keyword was provided, and the template
1172   /// that the template name refers to.
1173   ///
1174   /// By default, builds the new template name directly. Subclasses may override
1175   /// this routine to provide different behavior.
1176   TemplateName RebuildTemplateName(CXXScopeSpec &SS,
1177                                    bool TemplateKW,
1178                                    TemplateDecl *Template);
1179 
1180   /// Build a new template name given a nested name specifier and the
1181   /// name that is referred to as a template.
1182   ///
1183   /// By default, performs semantic analysis to determine whether the name can
1184   /// be resolved to a specific template, then builds the appropriate kind of
1185   /// template name. Subclasses may override this routine to provide different
1186   /// behavior.
1187   TemplateName RebuildTemplateName(CXXScopeSpec &SS,
1188                                    SourceLocation TemplateKWLoc,
1189                                    const IdentifierInfo &Name,
1190                                    SourceLocation NameLoc, QualType ObjectType,
1191                                    NamedDecl *FirstQualifierInScope,
1192                                    bool AllowInjectedClassName);
1193 
1194   /// Build a new template name given a nested name specifier and the
1195   /// overloaded operator name that is referred to as a template.
1196   ///
1197   /// By default, performs semantic analysis to determine whether the name can
1198   /// be resolved to a specific template, then builds the appropriate kind of
1199   /// template name. Subclasses may override this routine to provide different
1200   /// behavior.
1201   TemplateName RebuildTemplateName(CXXScopeSpec &SS,
1202                                    SourceLocation TemplateKWLoc,
1203                                    OverloadedOperatorKind Operator,
1204                                    SourceLocation NameLoc, QualType ObjectType,
1205                                    bool AllowInjectedClassName);
1206 
1207   /// Build a new template name given a template template parameter pack
1208   /// and the
1209   ///
1210   /// By default, performs semantic analysis to determine whether the name can
1211   /// be resolved to a specific template, then builds the appropriate kind of
1212   /// template name. Subclasses may override this routine to provide different
1213   /// behavior.
1214   TemplateName RebuildTemplateName(TemplateTemplateParmDecl *Param,
1215                                    const TemplateArgument &ArgPack) {
1216     return getSema().Context.getSubstTemplateTemplateParmPack(Param, ArgPack);
1217   }
1218 
1219   /// Build a new compound statement.
1220   ///
1221   /// By default, performs semantic analysis to build the new statement.
1222   /// Subclasses may override this routine to provide different behavior.
1223   StmtResult RebuildCompoundStmt(SourceLocation LBraceLoc,
1224                                        MultiStmtArg Statements,
1225                                        SourceLocation RBraceLoc,
1226                                        bool IsStmtExpr) {
1227     return getSema().ActOnCompoundStmt(LBraceLoc, RBraceLoc, Statements,
1228                                        IsStmtExpr);
1229   }
1230 
1231   /// Build a new case 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 RebuildCaseStmt(SourceLocation CaseLoc,
1236                                    Expr *LHS,
1237                                    SourceLocation EllipsisLoc,
1238                                    Expr *RHS,
1239                                    SourceLocation ColonLoc) {
1240     return getSema().ActOnCaseStmt(CaseLoc, LHS, EllipsisLoc, RHS,
1241                                    ColonLoc);
1242   }
1243 
1244   /// Attach the body to a new case statement.
1245   ///
1246   /// By default, performs semantic analysis to build the new statement.
1247   /// Subclasses may override this routine to provide different behavior.
1248   StmtResult RebuildCaseStmtBody(Stmt *S, Stmt *Body) {
1249     getSema().ActOnCaseStmtBody(S, Body);
1250     return S;
1251   }
1252 
1253   /// Build a new default statement.
1254   ///
1255   /// By default, performs semantic analysis to build the new statement.
1256   /// Subclasses may override this routine to provide different behavior.
1257   StmtResult RebuildDefaultStmt(SourceLocation DefaultLoc,
1258                                       SourceLocation ColonLoc,
1259                                       Stmt *SubStmt) {
1260     return getSema().ActOnDefaultStmt(DefaultLoc, ColonLoc, SubStmt,
1261                                       /*CurScope=*/nullptr);
1262   }
1263 
1264   /// Build a new label statement.
1265   ///
1266   /// By default, performs semantic analysis to build the new statement.
1267   /// Subclasses may override this routine to provide different behavior.
1268   StmtResult RebuildLabelStmt(SourceLocation IdentLoc, LabelDecl *L,
1269                               SourceLocation ColonLoc, Stmt *SubStmt) {
1270     return SemaRef.ActOnLabelStmt(IdentLoc, L, ColonLoc, SubStmt);
1271   }
1272 
1273   /// Build a new label statement.
1274   ///
1275   /// By default, performs semantic analysis to build the new statement.
1276   /// Subclasses may override this routine to provide different behavior.
1277   StmtResult RebuildAttributedStmt(SourceLocation AttrLoc,
1278                                    ArrayRef<const Attr*> Attrs,
1279                                    Stmt *SubStmt) {
1280     return SemaRef.ActOnAttributedStmt(AttrLoc, Attrs, SubStmt);
1281   }
1282 
1283   /// Build a new "if" statement.
1284   ///
1285   /// By default, performs semantic analysis to build the new statement.
1286   /// Subclasses may override this routine to provide different behavior.
1287   StmtResult RebuildIfStmt(SourceLocation IfLoc, bool IsConstexpr,
1288                            Sema::ConditionResult Cond, Stmt *Init, Stmt *Then,
1289                            SourceLocation ElseLoc, Stmt *Else) {
1290     return getSema().ActOnIfStmt(IfLoc, IsConstexpr, Init, Cond, Then,
1291                                  ElseLoc, Else);
1292   }
1293 
1294   /// Start building a new switch statement.
1295   ///
1296   /// By default, performs semantic analysis to build the new statement.
1297   /// Subclasses may override this routine to provide different behavior.
1298   StmtResult RebuildSwitchStmtStart(SourceLocation SwitchLoc, Stmt *Init,
1299                                     Sema::ConditionResult Cond) {
1300     return getSema().ActOnStartOfSwitchStmt(SwitchLoc, Init, Cond);
1301   }
1302 
1303   /// Attach the body to the switch statement.
1304   ///
1305   /// By default, performs semantic analysis to build the new statement.
1306   /// Subclasses may override this routine to provide different behavior.
1307   StmtResult RebuildSwitchStmtBody(SourceLocation SwitchLoc,
1308                                    Stmt *Switch, Stmt *Body) {
1309     return getSema().ActOnFinishSwitchStmt(SwitchLoc, Switch, Body);
1310   }
1311 
1312   /// Build a new while statement.
1313   ///
1314   /// By default, performs semantic analysis to build the new statement.
1315   /// Subclasses may override this routine to provide different behavior.
1316   StmtResult RebuildWhileStmt(SourceLocation WhileLoc,
1317                               Sema::ConditionResult Cond, Stmt *Body) {
1318     return getSema().ActOnWhileStmt(WhileLoc, Cond, Body);
1319   }
1320 
1321   /// Build a new do-while statement.
1322   ///
1323   /// By default, performs semantic analysis to build the new statement.
1324   /// Subclasses may override this routine to provide different behavior.
1325   StmtResult RebuildDoStmt(SourceLocation DoLoc, Stmt *Body,
1326                            SourceLocation WhileLoc, SourceLocation LParenLoc,
1327                            Expr *Cond, SourceLocation RParenLoc) {
1328     return getSema().ActOnDoStmt(DoLoc, Body, WhileLoc, LParenLoc,
1329                                  Cond, RParenLoc);
1330   }
1331 
1332   /// Build a new for statement.
1333   ///
1334   /// By default, performs semantic analysis to build the new statement.
1335   /// Subclasses may override this routine to provide different behavior.
1336   StmtResult RebuildForStmt(SourceLocation ForLoc, SourceLocation LParenLoc,
1337                             Stmt *Init, Sema::ConditionResult Cond,
1338                             Sema::FullExprArg Inc, SourceLocation RParenLoc,
1339                             Stmt *Body) {
1340     return getSema().ActOnForStmt(ForLoc, LParenLoc, Init, Cond,
1341                                   Inc, RParenLoc, Body);
1342   }
1343 
1344   /// Build a new goto statement.
1345   ///
1346   /// By default, performs semantic analysis to build the new statement.
1347   /// Subclasses may override this routine to provide different behavior.
1348   StmtResult RebuildGotoStmt(SourceLocation GotoLoc, SourceLocation LabelLoc,
1349                              LabelDecl *Label) {
1350     return getSema().ActOnGotoStmt(GotoLoc, LabelLoc, Label);
1351   }
1352 
1353   /// Build a new indirect goto statement.
1354   ///
1355   /// By default, performs semantic analysis to build the new statement.
1356   /// Subclasses may override this routine to provide different behavior.
1357   StmtResult RebuildIndirectGotoStmt(SourceLocation GotoLoc,
1358                                      SourceLocation StarLoc,
1359                                      Expr *Target) {
1360     return getSema().ActOnIndirectGotoStmt(GotoLoc, StarLoc, Target);
1361   }
1362 
1363   /// Build a new return statement.
1364   ///
1365   /// By default, performs semantic analysis to build the new statement.
1366   /// Subclasses may override this routine to provide different behavior.
1367   StmtResult RebuildReturnStmt(SourceLocation ReturnLoc, Expr *Result) {
1368     return getSema().BuildReturnStmt(ReturnLoc, Result);
1369   }
1370 
1371   /// Build a new declaration statement.
1372   ///
1373   /// By default, performs semantic analysis to build the new statement.
1374   /// Subclasses may override this routine to provide different behavior.
1375   StmtResult RebuildDeclStmt(MutableArrayRef<Decl *> Decls,
1376                              SourceLocation StartLoc, SourceLocation EndLoc) {
1377     Sema::DeclGroupPtrTy DG = getSema().BuildDeclaratorGroup(Decls);
1378     return getSema().ActOnDeclStmt(DG, StartLoc, EndLoc);
1379   }
1380 
1381   /// Build a new inline asm statement.
1382   ///
1383   /// By default, performs semantic analysis to build the new statement.
1384   /// Subclasses may override this routine to provide different behavior.
1385   StmtResult RebuildGCCAsmStmt(SourceLocation AsmLoc, bool IsSimple,
1386                                bool IsVolatile, unsigned NumOutputs,
1387                                unsigned NumInputs, IdentifierInfo **Names,
1388                                MultiExprArg Constraints, MultiExprArg Exprs,
1389                                Expr *AsmString, MultiExprArg Clobbers,
1390                                unsigned NumLabels,
1391                                SourceLocation RParenLoc) {
1392     return getSema().ActOnGCCAsmStmt(AsmLoc, IsSimple, IsVolatile, NumOutputs,
1393                                      NumInputs, Names, Constraints, Exprs,
1394                                      AsmString, Clobbers, NumLabels, RParenLoc);
1395   }
1396 
1397   /// Build a new MS style inline asm statement.
1398   ///
1399   /// By default, performs semantic analysis to build the new statement.
1400   /// Subclasses may override this routine to provide different behavior.
1401   StmtResult RebuildMSAsmStmt(SourceLocation AsmLoc, SourceLocation LBraceLoc,
1402                               ArrayRef<Token> AsmToks,
1403                               StringRef AsmString,
1404                               unsigned NumOutputs, unsigned NumInputs,
1405                               ArrayRef<StringRef> Constraints,
1406                               ArrayRef<StringRef> Clobbers,
1407                               ArrayRef<Expr*> Exprs,
1408                               SourceLocation EndLoc) {
1409     return getSema().ActOnMSAsmStmt(AsmLoc, LBraceLoc, AsmToks, AsmString,
1410                                     NumOutputs, NumInputs,
1411                                     Constraints, Clobbers, Exprs, EndLoc);
1412   }
1413 
1414   /// Build a new co_return statement.
1415   ///
1416   /// By default, performs semantic analysis to build the new statement.
1417   /// Subclasses may override this routine to provide different behavior.
1418   StmtResult RebuildCoreturnStmt(SourceLocation CoreturnLoc, Expr *Result,
1419                                  bool IsImplicit) {
1420     return getSema().BuildCoreturnStmt(CoreturnLoc, Result, IsImplicit);
1421   }
1422 
1423   /// Build a new co_await expression.
1424   ///
1425   /// By default, performs semantic analysis to build the new expression.
1426   /// Subclasses may override this routine to provide different behavior.
1427   ExprResult RebuildCoawaitExpr(SourceLocation CoawaitLoc, Expr *Result,
1428                                 bool IsImplicit) {
1429     return getSema().BuildResolvedCoawaitExpr(CoawaitLoc, Result, IsImplicit);
1430   }
1431 
1432   /// Build a new co_await expression.
1433   ///
1434   /// By default, performs semantic analysis to build the new expression.
1435   /// Subclasses may override this routine to provide different behavior.
1436   ExprResult RebuildDependentCoawaitExpr(SourceLocation CoawaitLoc,
1437                                          Expr *Result,
1438                                          UnresolvedLookupExpr *Lookup) {
1439     return getSema().BuildUnresolvedCoawaitExpr(CoawaitLoc, Result, Lookup);
1440   }
1441 
1442   /// Build a new co_yield expression.
1443   ///
1444   /// By default, performs semantic analysis to build the new expression.
1445   /// Subclasses may override this routine to provide different behavior.
1446   ExprResult RebuildCoyieldExpr(SourceLocation CoyieldLoc, Expr *Result) {
1447     return getSema().BuildCoyieldExpr(CoyieldLoc, Result);
1448   }
1449 
1450   StmtResult RebuildCoroutineBodyStmt(CoroutineBodyStmt::CtorArgs Args) {
1451     return getSema().BuildCoroutineBodyStmt(Args);
1452   }
1453 
1454   /// Build a new Objective-C \@try statement.
1455   ///
1456   /// By default, performs semantic analysis to build the new statement.
1457   /// Subclasses may override this routine to provide different behavior.
1458   StmtResult RebuildObjCAtTryStmt(SourceLocation AtLoc,
1459                                         Stmt *TryBody,
1460                                         MultiStmtArg CatchStmts,
1461                                         Stmt *Finally) {
1462     return getSema().ActOnObjCAtTryStmt(AtLoc, TryBody, CatchStmts,
1463                                         Finally);
1464   }
1465 
1466   /// Rebuild an Objective-C exception declaration.
1467   ///
1468   /// By default, performs semantic analysis to build the new declaration.
1469   /// Subclasses may override this routine to provide different behavior.
1470   VarDecl *RebuildObjCExceptionDecl(VarDecl *ExceptionDecl,
1471                                     TypeSourceInfo *TInfo, QualType T) {
1472     return getSema().BuildObjCExceptionDecl(TInfo, T,
1473                                             ExceptionDecl->getInnerLocStart(),
1474                                             ExceptionDecl->getLocation(),
1475                                             ExceptionDecl->getIdentifier());
1476   }
1477 
1478   /// Build a new Objective-C \@catch statement.
1479   ///
1480   /// By default, performs semantic analysis to build the new statement.
1481   /// Subclasses may override this routine to provide different behavior.
1482   StmtResult RebuildObjCAtCatchStmt(SourceLocation AtLoc,
1483                                           SourceLocation RParenLoc,
1484                                           VarDecl *Var,
1485                                           Stmt *Body) {
1486     return getSema().ActOnObjCAtCatchStmt(AtLoc, RParenLoc,
1487                                           Var, Body);
1488   }
1489 
1490   /// Build a new Objective-C \@finally statement.
1491   ///
1492   /// By default, performs semantic analysis to build the new statement.
1493   /// Subclasses may override this routine to provide different behavior.
1494   StmtResult RebuildObjCAtFinallyStmt(SourceLocation AtLoc,
1495                                             Stmt *Body) {
1496     return getSema().ActOnObjCAtFinallyStmt(AtLoc, Body);
1497   }
1498 
1499   /// Build a new Objective-C \@throw statement.
1500   ///
1501   /// By default, performs semantic analysis to build the new statement.
1502   /// Subclasses may override this routine to provide different behavior.
1503   StmtResult RebuildObjCAtThrowStmt(SourceLocation AtLoc,
1504                                           Expr *Operand) {
1505     return getSema().BuildObjCAtThrowStmt(AtLoc, Operand);
1506   }
1507 
1508   /// Build a new OpenMP executable directive.
1509   ///
1510   /// By default, performs semantic analysis to build the new statement.
1511   /// Subclasses may override this routine to provide different behavior.
1512   StmtResult RebuildOMPExecutableDirective(OpenMPDirectiveKind Kind,
1513                                            DeclarationNameInfo DirName,
1514                                            OpenMPDirectiveKind CancelRegion,
1515                                            ArrayRef<OMPClause *> Clauses,
1516                                            Stmt *AStmt, SourceLocation StartLoc,
1517                                            SourceLocation EndLoc) {
1518     return getSema().ActOnOpenMPExecutableDirective(
1519         Kind, DirName, CancelRegion, Clauses, AStmt, StartLoc, EndLoc);
1520   }
1521 
1522   /// Build a new OpenMP 'if' clause.
1523   ///
1524   /// By default, performs semantic analysis to build the new OpenMP clause.
1525   /// Subclasses may override this routine to provide different behavior.
1526   OMPClause *RebuildOMPIfClause(OpenMPDirectiveKind NameModifier,
1527                                 Expr *Condition, SourceLocation StartLoc,
1528                                 SourceLocation LParenLoc,
1529                                 SourceLocation NameModifierLoc,
1530                                 SourceLocation ColonLoc,
1531                                 SourceLocation EndLoc) {
1532     return getSema().ActOnOpenMPIfClause(NameModifier, Condition, StartLoc,
1533                                          LParenLoc, NameModifierLoc, ColonLoc,
1534                                          EndLoc);
1535   }
1536 
1537   /// Build a new OpenMP 'final' 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 *RebuildOMPFinalClause(Expr *Condition, SourceLocation StartLoc,
1542                                    SourceLocation LParenLoc,
1543                                    SourceLocation EndLoc) {
1544     return getSema().ActOnOpenMPFinalClause(Condition, StartLoc, LParenLoc,
1545                                             EndLoc);
1546   }
1547 
1548   /// Build a new OpenMP 'num_threads' clause.
1549   ///
1550   /// By default, performs semantic analysis to build the new OpenMP clause.
1551   /// Subclasses may override this routine to provide different behavior.
1552   OMPClause *RebuildOMPNumThreadsClause(Expr *NumThreads,
1553                                         SourceLocation StartLoc,
1554                                         SourceLocation LParenLoc,
1555                                         SourceLocation EndLoc) {
1556     return getSema().ActOnOpenMPNumThreadsClause(NumThreads, StartLoc,
1557                                                  LParenLoc, EndLoc);
1558   }
1559 
1560   /// Build a new OpenMP 'safelen' clause.
1561   ///
1562   /// By default, performs semantic analysis to build the new OpenMP clause.
1563   /// Subclasses may override this routine to provide different behavior.
1564   OMPClause *RebuildOMPSafelenClause(Expr *Len, SourceLocation StartLoc,
1565                                      SourceLocation LParenLoc,
1566                                      SourceLocation EndLoc) {
1567     return getSema().ActOnOpenMPSafelenClause(Len, StartLoc, LParenLoc, EndLoc);
1568   }
1569 
1570   /// Build a new OpenMP 'simdlen' clause.
1571   ///
1572   /// By default, performs semantic analysis to build the new OpenMP clause.
1573   /// Subclasses may override this routine to provide different behavior.
1574   OMPClause *RebuildOMPSimdlenClause(Expr *Len, SourceLocation StartLoc,
1575                                      SourceLocation LParenLoc,
1576                                      SourceLocation EndLoc) {
1577     return getSema().ActOnOpenMPSimdlenClause(Len, StartLoc, LParenLoc, EndLoc);
1578   }
1579 
1580   /// Build a new OpenMP 'allocator' clause.
1581   ///
1582   /// By default, performs semantic analysis to build the new OpenMP clause.
1583   /// Subclasses may override this routine to provide different behavior.
1584   OMPClause *RebuildOMPAllocatorClause(Expr *A, SourceLocation StartLoc,
1585                                        SourceLocation LParenLoc,
1586                                        SourceLocation EndLoc) {
1587     return getSema().ActOnOpenMPAllocatorClause(A, StartLoc, LParenLoc, EndLoc);
1588   }
1589 
1590   /// Build a new OpenMP 'collapse' clause.
1591   ///
1592   /// By default, performs semantic analysis to build the new OpenMP clause.
1593   /// Subclasses may override this routine to provide different behavior.
1594   OMPClause *RebuildOMPCollapseClause(Expr *Num, SourceLocation StartLoc,
1595                                       SourceLocation LParenLoc,
1596                                       SourceLocation EndLoc) {
1597     return getSema().ActOnOpenMPCollapseClause(Num, StartLoc, LParenLoc,
1598                                                EndLoc);
1599   }
1600 
1601   /// Build a new OpenMP 'default' clause.
1602   ///
1603   /// By default, performs semantic analysis to build the new OpenMP clause.
1604   /// Subclasses may override this routine to provide different behavior.
1605   OMPClause *RebuildOMPDefaultClause(OpenMPDefaultClauseKind Kind,
1606                                      SourceLocation KindKwLoc,
1607                                      SourceLocation StartLoc,
1608                                      SourceLocation LParenLoc,
1609                                      SourceLocation EndLoc) {
1610     return getSema().ActOnOpenMPDefaultClause(Kind, KindKwLoc,
1611                                               StartLoc, LParenLoc, EndLoc);
1612   }
1613 
1614   /// Build a new OpenMP 'proc_bind' clause.
1615   ///
1616   /// By default, performs semantic analysis to build the new OpenMP clause.
1617   /// Subclasses may override this routine to provide different behavior.
1618   OMPClause *RebuildOMPProcBindClause(ProcBindKind Kind,
1619                                       SourceLocation KindKwLoc,
1620                                       SourceLocation StartLoc,
1621                                       SourceLocation LParenLoc,
1622                                       SourceLocation EndLoc) {
1623     return getSema().ActOnOpenMPProcBindClause(Kind, KindKwLoc,
1624                                                StartLoc, LParenLoc, EndLoc);
1625   }
1626 
1627   /// Build a new OpenMP 'schedule' clause.
1628   ///
1629   /// By default, performs semantic analysis to build the new OpenMP clause.
1630   /// Subclasses may override this routine to provide different behavior.
1631   OMPClause *RebuildOMPScheduleClause(
1632       OpenMPScheduleClauseModifier M1, OpenMPScheduleClauseModifier M2,
1633       OpenMPScheduleClauseKind Kind, Expr *ChunkSize, SourceLocation StartLoc,
1634       SourceLocation LParenLoc, SourceLocation M1Loc, SourceLocation M2Loc,
1635       SourceLocation KindLoc, SourceLocation CommaLoc, SourceLocation EndLoc) {
1636     return getSema().ActOnOpenMPScheduleClause(
1637         M1, M2, Kind, ChunkSize, StartLoc, LParenLoc, M1Loc, M2Loc, KindLoc,
1638         CommaLoc, EndLoc);
1639   }
1640 
1641   /// Build a new OpenMP 'ordered' clause.
1642   ///
1643   /// By default, performs semantic analysis to build the new OpenMP clause.
1644   /// Subclasses may override this routine to provide different behavior.
1645   OMPClause *RebuildOMPOrderedClause(SourceLocation StartLoc,
1646                                      SourceLocation EndLoc,
1647                                      SourceLocation LParenLoc, Expr *Num) {
1648     return getSema().ActOnOpenMPOrderedClause(StartLoc, EndLoc, LParenLoc, Num);
1649   }
1650 
1651   /// Build a new OpenMP 'private' clause.
1652   ///
1653   /// By default, performs semantic analysis to build the new OpenMP clause.
1654   /// Subclasses may override this routine to provide different behavior.
1655   OMPClause *RebuildOMPPrivateClause(ArrayRef<Expr *> VarList,
1656                                      SourceLocation StartLoc,
1657                                      SourceLocation LParenLoc,
1658                                      SourceLocation EndLoc) {
1659     return getSema().ActOnOpenMPPrivateClause(VarList, StartLoc, LParenLoc,
1660                                               EndLoc);
1661   }
1662 
1663   /// Build a new OpenMP 'firstprivate' clause.
1664   ///
1665   /// By default, performs semantic analysis to build the new OpenMP clause.
1666   /// Subclasses may override this routine to provide different behavior.
1667   OMPClause *RebuildOMPFirstprivateClause(ArrayRef<Expr *> VarList,
1668                                           SourceLocation StartLoc,
1669                                           SourceLocation LParenLoc,
1670                                           SourceLocation EndLoc) {
1671     return getSema().ActOnOpenMPFirstprivateClause(VarList, StartLoc, LParenLoc,
1672                                                    EndLoc);
1673   }
1674 
1675   /// Build a new OpenMP 'lastprivate' clause.
1676   ///
1677   /// By default, performs semantic analysis to build the new OpenMP clause.
1678   /// Subclasses may override this routine to provide different behavior.
1679   OMPClause *RebuildOMPLastprivateClause(ArrayRef<Expr *> VarList,
1680                                          OpenMPLastprivateModifier LPKind,
1681                                          SourceLocation LPKindLoc,
1682                                          SourceLocation ColonLoc,
1683                                          SourceLocation StartLoc,
1684                                          SourceLocation LParenLoc,
1685                                          SourceLocation EndLoc) {
1686     return getSema().ActOnOpenMPLastprivateClause(
1687         VarList, LPKind, LPKindLoc, ColonLoc, StartLoc, LParenLoc, EndLoc);
1688   }
1689 
1690   /// Build a new OpenMP 'shared' clause.
1691   ///
1692   /// By default, performs semantic analysis to build the new OpenMP clause.
1693   /// Subclasses may override this routine to provide different behavior.
1694   OMPClause *RebuildOMPSharedClause(ArrayRef<Expr *> VarList,
1695                                     SourceLocation StartLoc,
1696                                     SourceLocation LParenLoc,
1697                                     SourceLocation EndLoc) {
1698     return getSema().ActOnOpenMPSharedClause(VarList, StartLoc, LParenLoc,
1699                                              EndLoc);
1700   }
1701 
1702   /// Build a new OpenMP 'reduction' clause.
1703   ///
1704   /// By default, performs semantic analysis to build the new statement.
1705   /// Subclasses may override this routine to provide different behavior.
1706   OMPClause *RebuildOMPReductionClause(ArrayRef<Expr *> VarList,
1707                                        SourceLocation StartLoc,
1708                                        SourceLocation LParenLoc,
1709                                        SourceLocation ColonLoc,
1710                                        SourceLocation EndLoc,
1711                                        CXXScopeSpec &ReductionIdScopeSpec,
1712                                        const DeclarationNameInfo &ReductionId,
1713                                        ArrayRef<Expr *> UnresolvedReductions) {
1714     return getSema().ActOnOpenMPReductionClause(
1715         VarList, StartLoc, LParenLoc, ColonLoc, EndLoc, ReductionIdScopeSpec,
1716         ReductionId, UnresolvedReductions);
1717   }
1718 
1719   /// Build a new OpenMP 'task_reduction' clause.
1720   ///
1721   /// By default, performs semantic analysis to build the new statement.
1722   /// Subclasses may override this routine to provide different behavior.
1723   OMPClause *RebuildOMPTaskReductionClause(
1724       ArrayRef<Expr *> VarList, SourceLocation StartLoc,
1725       SourceLocation LParenLoc, SourceLocation ColonLoc, SourceLocation EndLoc,
1726       CXXScopeSpec &ReductionIdScopeSpec,
1727       const DeclarationNameInfo &ReductionId,
1728       ArrayRef<Expr *> UnresolvedReductions) {
1729     return getSema().ActOnOpenMPTaskReductionClause(
1730         VarList, StartLoc, LParenLoc, ColonLoc, EndLoc, ReductionIdScopeSpec,
1731         ReductionId, UnresolvedReductions);
1732   }
1733 
1734   /// Build a new OpenMP 'in_reduction' clause.
1735   ///
1736   /// By default, performs semantic analysis to build the new statement.
1737   /// Subclasses may override this routine to provide different behavior.
1738   OMPClause *
1739   RebuildOMPInReductionClause(ArrayRef<Expr *> VarList, SourceLocation StartLoc,
1740                               SourceLocation LParenLoc, SourceLocation ColonLoc,
1741                               SourceLocation EndLoc,
1742                               CXXScopeSpec &ReductionIdScopeSpec,
1743                               const DeclarationNameInfo &ReductionId,
1744                               ArrayRef<Expr *> UnresolvedReductions) {
1745     return getSema().ActOnOpenMPInReductionClause(
1746         VarList, StartLoc, LParenLoc, ColonLoc, EndLoc, ReductionIdScopeSpec,
1747         ReductionId, UnresolvedReductions);
1748   }
1749 
1750   /// Build a new OpenMP 'linear' clause.
1751   ///
1752   /// By default, performs semantic analysis to build the new OpenMP clause.
1753   /// Subclasses may override this routine to provide different behavior.
1754   OMPClause *RebuildOMPLinearClause(ArrayRef<Expr *> VarList, Expr *Step,
1755                                     SourceLocation StartLoc,
1756                                     SourceLocation LParenLoc,
1757                                     OpenMPLinearClauseKind Modifier,
1758                                     SourceLocation ModifierLoc,
1759                                     SourceLocation ColonLoc,
1760                                     SourceLocation EndLoc) {
1761     return getSema().ActOnOpenMPLinearClause(VarList, Step, StartLoc, LParenLoc,
1762                                              Modifier, ModifierLoc, ColonLoc,
1763                                              EndLoc);
1764   }
1765 
1766   /// Build a new OpenMP 'aligned' clause.
1767   ///
1768   /// By default, performs semantic analysis to build the new OpenMP clause.
1769   /// Subclasses may override this routine to provide different behavior.
1770   OMPClause *RebuildOMPAlignedClause(ArrayRef<Expr *> VarList, Expr *Alignment,
1771                                      SourceLocation StartLoc,
1772                                      SourceLocation LParenLoc,
1773                                      SourceLocation ColonLoc,
1774                                      SourceLocation EndLoc) {
1775     return getSema().ActOnOpenMPAlignedClause(VarList, Alignment, StartLoc,
1776                                               LParenLoc, ColonLoc, EndLoc);
1777   }
1778 
1779   /// Build a new OpenMP 'copyin' 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 *RebuildOMPCopyinClause(ArrayRef<Expr *> VarList,
1784                                     SourceLocation StartLoc,
1785                                     SourceLocation LParenLoc,
1786                                     SourceLocation EndLoc) {
1787     return getSema().ActOnOpenMPCopyinClause(VarList, StartLoc, LParenLoc,
1788                                              EndLoc);
1789   }
1790 
1791   /// Build a new OpenMP 'copyprivate' clause.
1792   ///
1793   /// By default, performs semantic analysis to build the new OpenMP clause.
1794   /// Subclasses may override this routine to provide different behavior.
1795   OMPClause *RebuildOMPCopyprivateClause(ArrayRef<Expr *> VarList,
1796                                          SourceLocation StartLoc,
1797                                          SourceLocation LParenLoc,
1798                                          SourceLocation EndLoc) {
1799     return getSema().ActOnOpenMPCopyprivateClause(VarList, StartLoc, LParenLoc,
1800                                                   EndLoc);
1801   }
1802 
1803   /// Build a new OpenMP 'flush' pseudo 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 *RebuildOMPFlushClause(ArrayRef<Expr *> VarList,
1808                                    SourceLocation StartLoc,
1809                                    SourceLocation LParenLoc,
1810                                    SourceLocation EndLoc) {
1811     return getSema().ActOnOpenMPFlushClause(VarList, StartLoc, LParenLoc,
1812                                             EndLoc);
1813   }
1814 
1815   /// Build a new OpenMP 'depend' pseudo clause.
1816   ///
1817   /// By default, performs semantic analysis to build the new OpenMP clause.
1818   /// Subclasses may override this routine to provide different behavior.
1819   OMPClause *
1820   RebuildOMPDependClause(OpenMPDependClauseKind DepKind, SourceLocation DepLoc,
1821                          SourceLocation ColonLoc, ArrayRef<Expr *> VarList,
1822                          SourceLocation StartLoc, SourceLocation LParenLoc,
1823                          SourceLocation EndLoc) {
1824     return getSema().ActOnOpenMPDependClause(DepKind, DepLoc, ColonLoc, VarList,
1825                                              StartLoc, LParenLoc, EndLoc);
1826   }
1827 
1828   /// Build a new OpenMP 'device' clause.
1829   ///
1830   /// By default, performs semantic analysis to build the new statement.
1831   /// Subclasses may override this routine to provide different behavior.
1832   OMPClause *RebuildOMPDeviceClause(Expr *Device, SourceLocation StartLoc,
1833                                     SourceLocation LParenLoc,
1834                                     SourceLocation EndLoc) {
1835     return getSema().ActOnOpenMPDeviceClause(Device, StartLoc, LParenLoc,
1836                                              EndLoc);
1837   }
1838 
1839   /// Build a new OpenMP 'map' clause.
1840   ///
1841   /// By default, performs semantic analysis to build the new OpenMP clause.
1842   /// Subclasses may override this routine to provide different behavior.
1843   OMPClause *RebuildOMPMapClause(
1844       ArrayRef<OpenMPMapModifierKind> MapTypeModifiers,
1845       ArrayRef<SourceLocation> MapTypeModifiersLoc,
1846       CXXScopeSpec MapperIdScopeSpec, DeclarationNameInfo MapperId,
1847       OpenMPMapClauseKind MapType, bool IsMapTypeImplicit,
1848       SourceLocation MapLoc, SourceLocation ColonLoc, ArrayRef<Expr *> VarList,
1849       const OMPVarListLocTy &Locs, ArrayRef<Expr *> UnresolvedMappers) {
1850     return getSema().ActOnOpenMPMapClause(MapTypeModifiers, MapTypeModifiersLoc,
1851                                           MapperIdScopeSpec, MapperId, MapType,
1852                                           IsMapTypeImplicit, MapLoc, ColonLoc,
1853                                           VarList, Locs, UnresolvedMappers);
1854   }
1855 
1856   /// Build a new OpenMP 'allocate' clause.
1857   ///
1858   /// By default, performs semantic analysis to build the new OpenMP clause.
1859   /// Subclasses may override this routine to provide different behavior.
1860   OMPClause *RebuildOMPAllocateClause(Expr *Allocate, ArrayRef<Expr *> VarList,
1861                                       SourceLocation StartLoc,
1862                                       SourceLocation LParenLoc,
1863                                       SourceLocation ColonLoc,
1864                                       SourceLocation EndLoc) {
1865     return getSema().ActOnOpenMPAllocateClause(Allocate, VarList, StartLoc,
1866                                                LParenLoc, ColonLoc, EndLoc);
1867   }
1868 
1869   /// Build a new OpenMP 'num_teams' clause.
1870   ///
1871   /// By default, performs semantic analysis to build the new statement.
1872   /// Subclasses may override this routine to provide different behavior.
1873   OMPClause *RebuildOMPNumTeamsClause(Expr *NumTeams, SourceLocation StartLoc,
1874                                       SourceLocation LParenLoc,
1875                                       SourceLocation EndLoc) {
1876     return getSema().ActOnOpenMPNumTeamsClause(NumTeams, StartLoc, LParenLoc,
1877                                                EndLoc);
1878   }
1879 
1880   /// Build a new OpenMP 'thread_limit' clause.
1881   ///
1882   /// By default, performs semantic analysis to build the new statement.
1883   /// Subclasses may override this routine to provide different behavior.
1884   OMPClause *RebuildOMPThreadLimitClause(Expr *ThreadLimit,
1885                                          SourceLocation StartLoc,
1886                                          SourceLocation LParenLoc,
1887                                          SourceLocation EndLoc) {
1888     return getSema().ActOnOpenMPThreadLimitClause(ThreadLimit, StartLoc,
1889                                                   LParenLoc, EndLoc);
1890   }
1891 
1892   /// Build a new OpenMP 'priority' clause.
1893   ///
1894   /// By default, performs semantic analysis to build the new statement.
1895   /// Subclasses may override this routine to provide different behavior.
1896   OMPClause *RebuildOMPPriorityClause(Expr *Priority, SourceLocation StartLoc,
1897                                       SourceLocation LParenLoc,
1898                                       SourceLocation EndLoc) {
1899     return getSema().ActOnOpenMPPriorityClause(Priority, StartLoc, LParenLoc,
1900                                                EndLoc);
1901   }
1902 
1903   /// Build a new OpenMP 'grainsize' clause.
1904   ///
1905   /// By default, performs semantic analysis to build the new statement.
1906   /// Subclasses may override this routine to provide different behavior.
1907   OMPClause *RebuildOMPGrainsizeClause(Expr *Grainsize, SourceLocation StartLoc,
1908                                        SourceLocation LParenLoc,
1909                                        SourceLocation EndLoc) {
1910     return getSema().ActOnOpenMPGrainsizeClause(Grainsize, StartLoc, LParenLoc,
1911                                                 EndLoc);
1912   }
1913 
1914   /// Build a new OpenMP 'num_tasks' clause.
1915   ///
1916   /// By default, performs semantic analysis to build the new statement.
1917   /// Subclasses may override this routine to provide different behavior.
1918   OMPClause *RebuildOMPNumTasksClause(Expr *NumTasks, SourceLocation StartLoc,
1919                                       SourceLocation LParenLoc,
1920                                       SourceLocation EndLoc) {
1921     return getSema().ActOnOpenMPNumTasksClause(NumTasks, StartLoc, LParenLoc,
1922                                                EndLoc);
1923   }
1924 
1925   /// Build a new OpenMP 'hint' clause.
1926   ///
1927   /// By default, performs semantic analysis to build the new statement.
1928   /// Subclasses may override this routine to provide different behavior.
1929   OMPClause *RebuildOMPHintClause(Expr *Hint, SourceLocation StartLoc,
1930                                   SourceLocation LParenLoc,
1931                                   SourceLocation EndLoc) {
1932     return getSema().ActOnOpenMPHintClause(Hint, StartLoc, LParenLoc, EndLoc);
1933   }
1934 
1935   /// Build a new OpenMP 'dist_schedule' clause.
1936   ///
1937   /// By default, performs semantic analysis to build the new OpenMP clause.
1938   /// Subclasses may override this routine to provide different behavior.
1939   OMPClause *
1940   RebuildOMPDistScheduleClause(OpenMPDistScheduleClauseKind Kind,
1941                                Expr *ChunkSize, SourceLocation StartLoc,
1942                                SourceLocation LParenLoc, SourceLocation KindLoc,
1943                                SourceLocation CommaLoc, SourceLocation EndLoc) {
1944     return getSema().ActOnOpenMPDistScheduleClause(
1945         Kind, ChunkSize, StartLoc, LParenLoc, KindLoc, CommaLoc, EndLoc);
1946   }
1947 
1948   /// Build a new OpenMP 'to' clause.
1949   ///
1950   /// By default, performs semantic analysis to build the new statement.
1951   /// Subclasses may override this routine to provide different behavior.
1952   OMPClause *RebuildOMPToClause(ArrayRef<Expr *> VarList,
1953                                 CXXScopeSpec &MapperIdScopeSpec,
1954                                 DeclarationNameInfo &MapperId,
1955                                 const OMPVarListLocTy &Locs,
1956                                 ArrayRef<Expr *> UnresolvedMappers) {
1957     return getSema().ActOnOpenMPToClause(VarList, MapperIdScopeSpec, MapperId,
1958                                          Locs, UnresolvedMappers);
1959   }
1960 
1961   /// Build a new OpenMP 'from' clause.
1962   ///
1963   /// By default, performs semantic analysis to build the new statement.
1964   /// Subclasses may override this routine to provide different behavior.
1965   OMPClause *RebuildOMPFromClause(ArrayRef<Expr *> VarList,
1966                                   CXXScopeSpec &MapperIdScopeSpec,
1967                                   DeclarationNameInfo &MapperId,
1968                                   const OMPVarListLocTy &Locs,
1969                                   ArrayRef<Expr *> UnresolvedMappers) {
1970     return getSema().ActOnOpenMPFromClause(VarList, MapperIdScopeSpec, MapperId,
1971                                            Locs, UnresolvedMappers);
1972   }
1973 
1974   /// Build a new OpenMP 'use_device_ptr' clause.
1975   ///
1976   /// By default, performs semantic analysis to build the new OpenMP clause.
1977   /// Subclasses may override this routine to provide different behavior.
1978   OMPClause *RebuildOMPUseDevicePtrClause(ArrayRef<Expr *> VarList,
1979                                           const OMPVarListLocTy &Locs) {
1980     return getSema().ActOnOpenMPUseDevicePtrClause(VarList, Locs);
1981   }
1982 
1983   /// Build a new OpenMP 'is_device_ptr' clause.
1984   ///
1985   /// By default, performs semantic analysis to build the new OpenMP clause.
1986   /// Subclasses may override this routine to provide different behavior.
1987   OMPClause *RebuildOMPIsDevicePtrClause(ArrayRef<Expr *> VarList,
1988                                          const OMPVarListLocTy &Locs) {
1989     return getSema().ActOnOpenMPIsDevicePtrClause(VarList, Locs);
1990   }
1991 
1992   /// Build a new OpenMP 'defaultmap' clause.
1993   ///
1994   /// By default, performs semantic analysis to build the new OpenMP clause.
1995   /// Subclasses may override this routine to provide different behavior.
1996   OMPClause *RebuildOMPDefaultmapClause(OpenMPDefaultmapClauseModifier M,
1997                                         OpenMPDefaultmapClauseKind Kind,
1998                                         SourceLocation StartLoc,
1999                                         SourceLocation LParenLoc,
2000                                         SourceLocation MLoc,
2001                                         SourceLocation KindLoc,
2002                                         SourceLocation EndLoc) {
2003     return getSema().ActOnOpenMPDefaultmapClause(M, Kind, StartLoc, LParenLoc,
2004                                                  MLoc, KindLoc, EndLoc);
2005   }
2006 
2007   /// Build a new OpenMP 'nontemporal' clause.
2008   ///
2009   /// By default, performs semantic analysis to build the new OpenMP clause.
2010   /// Subclasses may override this routine to provide different behavior.
2011   OMPClause *RebuildOMPNontemporalClause(ArrayRef<Expr *> VarList,
2012                                          SourceLocation StartLoc,
2013                                          SourceLocation LParenLoc,
2014                                          SourceLocation EndLoc) {
2015     return getSema().ActOnOpenMPNontemporalClause(VarList, StartLoc, LParenLoc,
2016                                                   EndLoc);
2017   }
2018 
2019   /// Build a new OpenMP 'order' clause.
2020   ///
2021   /// By default, performs semantic analysis to build the new OpenMP clause.
2022   /// Subclasses may override this routine to provide different behavior.
2023   OMPClause *RebuildOMPOrderClause(OpenMPOrderClauseKind Kind,
2024                                    SourceLocation KindKwLoc,
2025                                    SourceLocation StartLoc,
2026                                    SourceLocation LParenLoc,
2027                                    SourceLocation EndLoc) {
2028     return getSema().ActOnOpenMPOrderClause(Kind, KindKwLoc, StartLoc,
2029                                             LParenLoc, EndLoc);
2030   }
2031 
2032   /// Rebuild the operand to an Objective-C \@synchronized statement.
2033   ///
2034   /// By default, performs semantic analysis to build the new statement.
2035   /// Subclasses may override this routine to provide different behavior.
2036   ExprResult RebuildObjCAtSynchronizedOperand(SourceLocation atLoc,
2037                                               Expr *object) {
2038     return getSema().ActOnObjCAtSynchronizedOperand(atLoc, object);
2039   }
2040 
2041   /// Build a new Objective-C \@synchronized statement.
2042   ///
2043   /// By default, performs semantic analysis to build the new statement.
2044   /// Subclasses may override this routine to provide different behavior.
2045   StmtResult RebuildObjCAtSynchronizedStmt(SourceLocation AtLoc,
2046                                            Expr *Object, Stmt *Body) {
2047     return getSema().ActOnObjCAtSynchronizedStmt(AtLoc, Object, Body);
2048   }
2049 
2050   /// Build a new Objective-C \@autoreleasepool statement.
2051   ///
2052   /// By default, performs semantic analysis to build the new statement.
2053   /// Subclasses may override this routine to provide different behavior.
2054   StmtResult RebuildObjCAutoreleasePoolStmt(SourceLocation AtLoc,
2055                                             Stmt *Body) {
2056     return getSema().ActOnObjCAutoreleasePoolStmt(AtLoc, Body);
2057   }
2058 
2059   /// Build a new Objective-C fast enumeration statement.
2060   ///
2061   /// By default, performs semantic analysis to build the new statement.
2062   /// Subclasses may override this routine to provide different behavior.
2063   StmtResult RebuildObjCForCollectionStmt(SourceLocation ForLoc,
2064                                           Stmt *Element,
2065                                           Expr *Collection,
2066                                           SourceLocation RParenLoc,
2067                                           Stmt *Body) {
2068     StmtResult ForEachStmt = getSema().ActOnObjCForCollectionStmt(ForLoc,
2069                                                 Element,
2070                                                 Collection,
2071                                                 RParenLoc);
2072     if (ForEachStmt.isInvalid())
2073       return StmtError();
2074 
2075     return getSema().FinishObjCForCollectionStmt(ForEachStmt.get(), Body);
2076   }
2077 
2078   /// Build a new C++ exception declaration.
2079   ///
2080   /// By default, performs semantic analysis to build the new decaration.
2081   /// Subclasses may override this routine to provide different behavior.
2082   VarDecl *RebuildExceptionDecl(VarDecl *ExceptionDecl,
2083                                 TypeSourceInfo *Declarator,
2084                                 SourceLocation StartLoc,
2085                                 SourceLocation IdLoc,
2086                                 IdentifierInfo *Id) {
2087     VarDecl *Var = getSema().BuildExceptionDeclaration(nullptr, Declarator,
2088                                                        StartLoc, IdLoc, Id);
2089     if (Var)
2090       getSema().CurContext->addDecl(Var);
2091     return Var;
2092   }
2093 
2094   /// Build a new C++ catch statement.
2095   ///
2096   /// By default, performs semantic analysis to build the new statement.
2097   /// Subclasses may override this routine to provide different behavior.
2098   StmtResult RebuildCXXCatchStmt(SourceLocation CatchLoc,
2099                                  VarDecl *ExceptionDecl,
2100                                  Stmt *Handler) {
2101     return Owned(new (getSema().Context) CXXCatchStmt(CatchLoc, ExceptionDecl,
2102                                                       Handler));
2103   }
2104 
2105   /// Build a new C++ try statement.
2106   ///
2107   /// By default, performs semantic analysis to build the new statement.
2108   /// Subclasses may override this routine to provide different behavior.
2109   StmtResult RebuildCXXTryStmt(SourceLocation TryLoc, Stmt *TryBlock,
2110                                ArrayRef<Stmt *> Handlers) {
2111     return getSema().ActOnCXXTryBlock(TryLoc, TryBlock, Handlers);
2112   }
2113 
2114   /// Build a new C++0x range-based for statement.
2115   ///
2116   /// By default, performs semantic analysis to build the new statement.
2117   /// Subclasses may override this routine to provide different behavior.
2118   StmtResult RebuildCXXForRangeStmt(SourceLocation ForLoc,
2119                                     SourceLocation CoawaitLoc, Stmt *Init,
2120                                     SourceLocation ColonLoc, Stmt *Range,
2121                                     Stmt *Begin, Stmt *End, Expr *Cond,
2122                                     Expr *Inc, Stmt *LoopVar,
2123                                     SourceLocation RParenLoc) {
2124     // If we've just learned that the range is actually an Objective-C
2125     // collection, treat this as an Objective-C fast enumeration loop.
2126     if (DeclStmt *RangeStmt = dyn_cast<DeclStmt>(Range)) {
2127       if (RangeStmt->isSingleDecl()) {
2128         if (VarDecl *RangeVar = dyn_cast<VarDecl>(RangeStmt->getSingleDecl())) {
2129           if (RangeVar->isInvalidDecl())
2130             return StmtError();
2131 
2132           Expr *RangeExpr = RangeVar->getInit();
2133           if (!RangeExpr->isTypeDependent() &&
2134               RangeExpr->getType()->isObjCObjectPointerType()) {
2135             // FIXME: Support init-statements in Objective-C++20 ranged for
2136             // statement.
2137             if (Init) {
2138               return SemaRef.Diag(Init->getBeginLoc(),
2139                                   diag::err_objc_for_range_init_stmt)
2140                          << Init->getSourceRange();
2141             }
2142             return getSema().ActOnObjCForCollectionStmt(ForLoc, LoopVar,
2143                                                         RangeExpr, RParenLoc);
2144           }
2145         }
2146       }
2147     }
2148 
2149     return getSema().BuildCXXForRangeStmt(ForLoc, CoawaitLoc, Init, ColonLoc,
2150                                           Range, Begin, End, Cond, Inc, LoopVar,
2151                                           RParenLoc, Sema::BFRK_Rebuild);
2152   }
2153 
2154   /// Build a new C++0x range-based for statement.
2155   ///
2156   /// By default, performs semantic analysis to build the new statement.
2157   /// Subclasses may override this routine to provide different behavior.
2158   StmtResult RebuildMSDependentExistsStmt(SourceLocation KeywordLoc,
2159                                           bool IsIfExists,
2160                                           NestedNameSpecifierLoc QualifierLoc,
2161                                           DeclarationNameInfo NameInfo,
2162                                           Stmt *Nested) {
2163     return getSema().BuildMSDependentExistsStmt(KeywordLoc, IsIfExists,
2164                                                 QualifierLoc, NameInfo, Nested);
2165   }
2166 
2167   /// Attach body to a C++0x range-based for statement.
2168   ///
2169   /// By default, performs semantic analysis to finish the new statement.
2170   /// Subclasses may override this routine to provide different behavior.
2171   StmtResult FinishCXXForRangeStmt(Stmt *ForRange, Stmt *Body) {
2172     return getSema().FinishCXXForRangeStmt(ForRange, Body);
2173   }
2174 
2175   StmtResult RebuildSEHTryStmt(bool IsCXXTry, SourceLocation TryLoc,
2176                                Stmt *TryBlock, Stmt *Handler) {
2177     return getSema().ActOnSEHTryBlock(IsCXXTry, TryLoc, TryBlock, Handler);
2178   }
2179 
2180   StmtResult RebuildSEHExceptStmt(SourceLocation Loc, Expr *FilterExpr,
2181                                   Stmt *Block) {
2182     return getSema().ActOnSEHExceptBlock(Loc, FilterExpr, Block);
2183   }
2184 
2185   StmtResult RebuildSEHFinallyStmt(SourceLocation Loc, Stmt *Block) {
2186     return SEHFinallyStmt::Create(getSema().getASTContext(), Loc, Block);
2187   }
2188 
2189   /// Build a new predefined expression.
2190   ///
2191   /// By default, performs semantic analysis to build the new expression.
2192   /// Subclasses may override this routine to provide different behavior.
2193   ExprResult RebuildPredefinedExpr(SourceLocation Loc,
2194                                    PredefinedExpr::IdentKind IK) {
2195     return getSema().BuildPredefinedExpr(Loc, IK);
2196   }
2197 
2198   /// Build a new expression that references a declaration.
2199   ///
2200   /// By default, performs semantic analysis to build the new expression.
2201   /// Subclasses may override this routine to provide different behavior.
2202   ExprResult RebuildDeclarationNameExpr(const CXXScopeSpec &SS,
2203                                         LookupResult &R,
2204                                         bool RequiresADL) {
2205     return getSema().BuildDeclarationNameExpr(SS, R, RequiresADL);
2206   }
2207 
2208 
2209   /// Build a new expression that references a declaration.
2210   ///
2211   /// By default, performs semantic analysis to build the new expression.
2212   /// Subclasses may override this routine to provide different behavior.
2213   ExprResult RebuildDeclRefExpr(NestedNameSpecifierLoc QualifierLoc,
2214                                 ValueDecl *VD,
2215                                 const DeclarationNameInfo &NameInfo,
2216                                 NamedDecl *Found,
2217                                 TemplateArgumentListInfo *TemplateArgs) {
2218     CXXScopeSpec SS;
2219     SS.Adopt(QualifierLoc);
2220     return getSema().BuildDeclarationNameExpr(SS, NameInfo, VD, Found,
2221                                               TemplateArgs);
2222   }
2223 
2224   /// Build a new expression in parentheses.
2225   ///
2226   /// By default, performs semantic analysis to build the new expression.
2227   /// Subclasses may override this routine to provide different behavior.
2228   ExprResult RebuildParenExpr(Expr *SubExpr, SourceLocation LParen,
2229                                     SourceLocation RParen) {
2230     return getSema().ActOnParenExpr(LParen, RParen, SubExpr);
2231   }
2232 
2233   /// Build a new pseudo-destructor 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 RebuildCXXPseudoDestructorExpr(Expr *Base,
2238                                             SourceLocation OperatorLoc,
2239                                             bool isArrow,
2240                                             CXXScopeSpec &SS,
2241                                             TypeSourceInfo *ScopeType,
2242                                             SourceLocation CCLoc,
2243                                             SourceLocation TildeLoc,
2244                                         PseudoDestructorTypeStorage Destroyed);
2245 
2246   /// Build a new unary operator expression.
2247   ///
2248   /// By default, performs semantic analysis to build the new expression.
2249   /// Subclasses may override this routine to provide different behavior.
2250   ExprResult RebuildUnaryOperator(SourceLocation OpLoc,
2251                                         UnaryOperatorKind Opc,
2252                                         Expr *SubExpr) {
2253     return getSema().BuildUnaryOp(/*Scope=*/nullptr, OpLoc, Opc, SubExpr);
2254   }
2255 
2256   /// Build a new builtin offsetof expression.
2257   ///
2258   /// By default, performs semantic analysis to build the new expression.
2259   /// Subclasses may override this routine to provide different behavior.
2260   ExprResult RebuildOffsetOfExpr(SourceLocation OperatorLoc,
2261                                  TypeSourceInfo *Type,
2262                                  ArrayRef<Sema::OffsetOfComponent> Components,
2263                                  SourceLocation RParenLoc) {
2264     return getSema().BuildBuiltinOffsetOf(OperatorLoc, Type, Components,
2265                                           RParenLoc);
2266   }
2267 
2268   /// Build a new sizeof, alignof or vec_step expression with a
2269   /// type argument.
2270   ///
2271   /// By default, performs semantic analysis to build the new expression.
2272   /// Subclasses may override this routine to provide different behavior.
2273   ExprResult RebuildUnaryExprOrTypeTrait(TypeSourceInfo *TInfo,
2274                                          SourceLocation OpLoc,
2275                                          UnaryExprOrTypeTrait ExprKind,
2276                                          SourceRange R) {
2277     return getSema().CreateUnaryExprOrTypeTraitExpr(TInfo, OpLoc, ExprKind, R);
2278   }
2279 
2280   /// Build a new sizeof, alignof or vec step expression with an
2281   /// expression argument.
2282   ///
2283   /// By default, performs semantic analysis to build the new expression.
2284   /// Subclasses may override this routine to provide different behavior.
2285   ExprResult RebuildUnaryExprOrTypeTrait(Expr *SubExpr, SourceLocation OpLoc,
2286                                          UnaryExprOrTypeTrait ExprKind,
2287                                          SourceRange R) {
2288     ExprResult Result
2289       = getSema().CreateUnaryExprOrTypeTraitExpr(SubExpr, OpLoc, ExprKind);
2290     if (Result.isInvalid())
2291       return ExprError();
2292 
2293     return Result;
2294   }
2295 
2296   /// Build a new array subscript expression.
2297   ///
2298   /// By default, performs semantic analysis to build the new expression.
2299   /// Subclasses may override this routine to provide different behavior.
2300   ExprResult RebuildArraySubscriptExpr(Expr *LHS,
2301                                              SourceLocation LBracketLoc,
2302                                              Expr *RHS,
2303                                              SourceLocation RBracketLoc) {
2304     return getSema().ActOnArraySubscriptExpr(/*Scope=*/nullptr, LHS,
2305                                              LBracketLoc, RHS,
2306                                              RBracketLoc);
2307   }
2308 
2309   /// Build a new array section expression.
2310   ///
2311   /// By default, performs semantic analysis to build the new expression.
2312   /// Subclasses may override this routine to provide different behavior.
2313   ExprResult RebuildOMPArraySectionExpr(Expr *Base, SourceLocation LBracketLoc,
2314                                         Expr *LowerBound,
2315                                         SourceLocation ColonLoc, Expr *Length,
2316                                         SourceLocation RBracketLoc) {
2317     return getSema().ActOnOMPArraySectionExpr(Base, LBracketLoc, LowerBound,
2318                                               ColonLoc, Length, RBracketLoc);
2319   }
2320 
2321   /// Build a new call expression.
2322   ///
2323   /// By default, performs semantic analysis to build the new expression.
2324   /// Subclasses may override this routine to provide different behavior.
2325   ExprResult RebuildCallExpr(Expr *Callee, SourceLocation LParenLoc,
2326                                    MultiExprArg Args,
2327                                    SourceLocation RParenLoc,
2328                                    Expr *ExecConfig = nullptr) {
2329     return getSema().BuildCallExpr(/*Scope=*/nullptr, Callee, LParenLoc, Args,
2330                                    RParenLoc, ExecConfig);
2331   }
2332 
2333   /// Build a new member access expression.
2334   ///
2335   /// By default, performs semantic analysis to build the new expression.
2336   /// Subclasses may override this routine to provide different behavior.
2337   ExprResult RebuildMemberExpr(Expr *Base, SourceLocation OpLoc,
2338                                bool isArrow,
2339                                NestedNameSpecifierLoc QualifierLoc,
2340                                SourceLocation TemplateKWLoc,
2341                                const DeclarationNameInfo &MemberNameInfo,
2342                                ValueDecl *Member,
2343                                NamedDecl *FoundDecl,
2344                         const TemplateArgumentListInfo *ExplicitTemplateArgs,
2345                                NamedDecl *FirstQualifierInScope) {
2346     ExprResult BaseResult = getSema().PerformMemberExprBaseConversion(Base,
2347                                                                       isArrow);
2348     if (!Member->getDeclName()) {
2349       // We have a reference to an unnamed field.  This is always the
2350       // base of an anonymous struct/union member access, i.e. the
2351       // field is always of record type.
2352       assert(Member->getType()->isRecordType() &&
2353              "unnamed member not of record type?");
2354 
2355       BaseResult =
2356         getSema().PerformObjectMemberConversion(BaseResult.get(),
2357                                                 QualifierLoc.getNestedNameSpecifier(),
2358                                                 FoundDecl, Member);
2359       if (BaseResult.isInvalid())
2360         return ExprError();
2361       Base = BaseResult.get();
2362 
2363       CXXScopeSpec EmptySS;
2364       return getSema().BuildFieldReferenceExpr(
2365           Base, isArrow, OpLoc, EmptySS, cast<FieldDecl>(Member),
2366           DeclAccessPair::make(FoundDecl, FoundDecl->getAccess()), MemberNameInfo);
2367     }
2368 
2369     CXXScopeSpec SS;
2370     SS.Adopt(QualifierLoc);
2371 
2372     Base = BaseResult.get();
2373     QualType BaseType = Base->getType();
2374 
2375     if (isArrow && !BaseType->isPointerType())
2376       return ExprError();
2377 
2378     // FIXME: this involves duplicating earlier analysis in a lot of
2379     // cases; we should avoid this when possible.
2380     LookupResult R(getSema(), MemberNameInfo, Sema::LookupMemberName);
2381     R.addDecl(FoundDecl);
2382     R.resolveKind();
2383 
2384     return getSema().BuildMemberReferenceExpr(Base, BaseType, OpLoc, isArrow,
2385                                               SS, TemplateKWLoc,
2386                                               FirstQualifierInScope,
2387                                               R, ExplicitTemplateArgs,
2388                                               /*S*/nullptr);
2389   }
2390 
2391   /// Build a new binary operator expression.
2392   ///
2393   /// By default, performs semantic analysis to build the new expression.
2394   /// Subclasses may override this routine to provide different behavior.
2395   ExprResult RebuildBinaryOperator(SourceLocation OpLoc,
2396                                          BinaryOperatorKind Opc,
2397                                          Expr *LHS, Expr *RHS) {
2398     return getSema().BuildBinOp(/*Scope=*/nullptr, OpLoc, Opc, LHS, RHS);
2399   }
2400 
2401   /// Build a new rewritten operator expression.
2402   ///
2403   /// By default, performs semantic analysis to build the new expression.
2404   /// Subclasses may override this routine to provide different behavior.
2405   ExprResult RebuildCXXRewrittenBinaryOperator(
2406       SourceLocation OpLoc, BinaryOperatorKind Opcode,
2407       const UnresolvedSetImpl &UnqualLookups, Expr *LHS, Expr *RHS) {
2408     return getSema().CreateOverloadedBinOp(OpLoc, Opcode, UnqualLookups, LHS,
2409                                            RHS, /*RequiresADL*/false);
2410   }
2411 
2412   /// Build a new conditional operator expression.
2413   ///
2414   /// By default, performs semantic analysis to build the new expression.
2415   /// Subclasses may override this routine to provide different behavior.
2416   ExprResult RebuildConditionalOperator(Expr *Cond,
2417                                         SourceLocation QuestionLoc,
2418                                         Expr *LHS,
2419                                         SourceLocation ColonLoc,
2420                                         Expr *RHS) {
2421     return getSema().ActOnConditionalOp(QuestionLoc, ColonLoc, Cond,
2422                                         LHS, RHS);
2423   }
2424 
2425   /// Build a new C-style cast expression.
2426   ///
2427   /// By default, performs semantic analysis to build the new expression.
2428   /// Subclasses may override this routine to provide different behavior.
2429   ExprResult RebuildCStyleCastExpr(SourceLocation LParenLoc,
2430                                          TypeSourceInfo *TInfo,
2431                                          SourceLocation RParenLoc,
2432                                          Expr *SubExpr) {
2433     return getSema().BuildCStyleCastExpr(LParenLoc, TInfo, RParenLoc,
2434                                          SubExpr);
2435   }
2436 
2437   /// Build a new compound literal expression.
2438   ///
2439   /// By default, performs semantic analysis to build the new expression.
2440   /// Subclasses may override this routine to provide different behavior.
2441   ExprResult RebuildCompoundLiteralExpr(SourceLocation LParenLoc,
2442                                               TypeSourceInfo *TInfo,
2443                                               SourceLocation RParenLoc,
2444                                               Expr *Init) {
2445     return getSema().BuildCompoundLiteralExpr(LParenLoc, TInfo, RParenLoc,
2446                                               Init);
2447   }
2448 
2449   /// Build a new extended vector element access 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 RebuildExtVectorElementExpr(Expr *Base,
2454                                                SourceLocation OpLoc,
2455                                                SourceLocation AccessorLoc,
2456                                                IdentifierInfo &Accessor) {
2457 
2458     CXXScopeSpec SS;
2459     DeclarationNameInfo NameInfo(&Accessor, AccessorLoc);
2460     return getSema().BuildMemberReferenceExpr(Base, Base->getType(),
2461                                               OpLoc, /*IsArrow*/ false,
2462                                               SS, SourceLocation(),
2463                                               /*FirstQualifierInScope*/ nullptr,
2464                                               NameInfo,
2465                                               /* TemplateArgs */ nullptr,
2466                                               /*S*/ nullptr);
2467   }
2468 
2469   /// Build a new initializer list expression.
2470   ///
2471   /// By default, performs semantic analysis to build the new expression.
2472   /// Subclasses may override this routine to provide different behavior.
2473   ExprResult RebuildInitList(SourceLocation LBraceLoc,
2474                              MultiExprArg Inits,
2475                              SourceLocation RBraceLoc) {
2476     return SemaRef.BuildInitList(LBraceLoc, Inits, RBraceLoc);
2477   }
2478 
2479   /// Build a new designated initializer expression.
2480   ///
2481   /// By default, performs semantic analysis to build the new expression.
2482   /// Subclasses may override this routine to provide different behavior.
2483   ExprResult RebuildDesignatedInitExpr(Designation &Desig,
2484                                              MultiExprArg ArrayExprs,
2485                                              SourceLocation EqualOrColonLoc,
2486                                              bool GNUSyntax,
2487                                              Expr *Init) {
2488     ExprResult Result
2489       = SemaRef.ActOnDesignatedInitializer(Desig, EqualOrColonLoc, GNUSyntax,
2490                                            Init);
2491     if (Result.isInvalid())
2492       return ExprError();
2493 
2494     return Result;
2495   }
2496 
2497   /// Build a new value-initialized expression.
2498   ///
2499   /// By default, builds the implicit value initialization without performing
2500   /// any semantic analysis. Subclasses may override this routine to provide
2501   /// different behavior.
2502   ExprResult RebuildImplicitValueInitExpr(QualType T) {
2503     return new (SemaRef.Context) ImplicitValueInitExpr(T);
2504   }
2505 
2506   /// Build a new \c va_arg expression.
2507   ///
2508   /// By default, performs semantic analysis to build the new expression.
2509   /// Subclasses may override this routine to provide different behavior.
2510   ExprResult RebuildVAArgExpr(SourceLocation BuiltinLoc,
2511                                     Expr *SubExpr, TypeSourceInfo *TInfo,
2512                                     SourceLocation RParenLoc) {
2513     return getSema().BuildVAArgExpr(BuiltinLoc,
2514                                     SubExpr, TInfo,
2515                                     RParenLoc);
2516   }
2517 
2518   /// Build a new expression list in parentheses.
2519   ///
2520   /// By default, performs semantic analysis to build the new expression.
2521   /// Subclasses may override this routine to provide different behavior.
2522   ExprResult RebuildParenListExpr(SourceLocation LParenLoc,
2523                                   MultiExprArg SubExprs,
2524                                   SourceLocation RParenLoc) {
2525     return getSema().ActOnParenListExpr(LParenLoc, RParenLoc, SubExprs);
2526   }
2527 
2528   /// Build a new address-of-label expression.
2529   ///
2530   /// By default, performs semantic analysis, using the name of the label
2531   /// rather than attempting to map the label statement itself.
2532   /// Subclasses may override this routine to provide different behavior.
2533   ExprResult RebuildAddrLabelExpr(SourceLocation AmpAmpLoc,
2534                                   SourceLocation LabelLoc, LabelDecl *Label) {
2535     return getSema().ActOnAddrLabel(AmpAmpLoc, LabelLoc, Label);
2536   }
2537 
2538   /// Build a new GNU statement expression.
2539   ///
2540   /// By default, performs semantic analysis to build the new expression.
2541   /// Subclasses may override this routine to provide different behavior.
2542   ExprResult RebuildStmtExpr(SourceLocation LParenLoc,
2543                                    Stmt *SubStmt,
2544                                    SourceLocation RParenLoc) {
2545     return getSema().ActOnStmtExpr(LParenLoc, SubStmt, RParenLoc);
2546   }
2547 
2548   /// Build a new __builtin_choose_expr expression.
2549   ///
2550   /// By default, performs semantic analysis to build the new expression.
2551   /// Subclasses may override this routine to provide different behavior.
2552   ExprResult RebuildChooseExpr(SourceLocation BuiltinLoc,
2553                                      Expr *Cond, Expr *LHS, Expr *RHS,
2554                                      SourceLocation RParenLoc) {
2555     return SemaRef.ActOnChooseExpr(BuiltinLoc,
2556                                    Cond, LHS, RHS,
2557                                    RParenLoc);
2558   }
2559 
2560   /// Build a new generic selection expression.
2561   ///
2562   /// By default, performs semantic analysis to build the new expression.
2563   /// Subclasses may override this routine to provide different behavior.
2564   ExprResult RebuildGenericSelectionExpr(SourceLocation KeyLoc,
2565                                          SourceLocation DefaultLoc,
2566                                          SourceLocation RParenLoc,
2567                                          Expr *ControllingExpr,
2568                                          ArrayRef<TypeSourceInfo *> Types,
2569                                          ArrayRef<Expr *> Exprs) {
2570     return getSema().CreateGenericSelectionExpr(KeyLoc, DefaultLoc, RParenLoc,
2571                                                 ControllingExpr, Types, Exprs);
2572   }
2573 
2574   /// Build a new overloaded operator call expression.
2575   ///
2576   /// By default, performs semantic analysis to build the new expression.
2577   /// The semantic analysis provides the behavior of template instantiation,
2578   /// copying with transformations that turn what looks like an overloaded
2579   /// operator call into a use of a builtin operator, performing
2580   /// argument-dependent lookup, etc. Subclasses may override this routine to
2581   /// provide different behavior.
2582   ExprResult RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op,
2583                                               SourceLocation OpLoc,
2584                                               Expr *Callee,
2585                                               Expr *First,
2586                                               Expr *Second);
2587 
2588   /// Build a new C++ "named" cast expression, such as static_cast or
2589   /// reinterpret_cast.
2590   ///
2591   /// By default, this routine dispatches to one of the more-specific routines
2592   /// for a particular named case, e.g., RebuildCXXStaticCastExpr().
2593   /// Subclasses may override this routine to provide different behavior.
2594   ExprResult RebuildCXXNamedCastExpr(SourceLocation OpLoc,
2595                                            Stmt::StmtClass Class,
2596                                            SourceLocation LAngleLoc,
2597                                            TypeSourceInfo *TInfo,
2598                                            SourceLocation RAngleLoc,
2599                                            SourceLocation LParenLoc,
2600                                            Expr *SubExpr,
2601                                            SourceLocation RParenLoc) {
2602     switch (Class) {
2603     case Stmt::CXXStaticCastExprClass:
2604       return getDerived().RebuildCXXStaticCastExpr(OpLoc, LAngleLoc, TInfo,
2605                                                    RAngleLoc, LParenLoc,
2606                                                    SubExpr, RParenLoc);
2607 
2608     case Stmt::CXXDynamicCastExprClass:
2609       return getDerived().RebuildCXXDynamicCastExpr(OpLoc, LAngleLoc, TInfo,
2610                                                     RAngleLoc, LParenLoc,
2611                                                     SubExpr, RParenLoc);
2612 
2613     case Stmt::CXXReinterpretCastExprClass:
2614       return getDerived().RebuildCXXReinterpretCastExpr(OpLoc, LAngleLoc, TInfo,
2615                                                         RAngleLoc, LParenLoc,
2616                                                         SubExpr,
2617                                                         RParenLoc);
2618 
2619     case Stmt::CXXConstCastExprClass:
2620       return getDerived().RebuildCXXConstCastExpr(OpLoc, LAngleLoc, TInfo,
2621                                                    RAngleLoc, LParenLoc,
2622                                                    SubExpr, RParenLoc);
2623 
2624     default:
2625       llvm_unreachable("Invalid C++ named cast");
2626     }
2627   }
2628 
2629   /// Build a new C++ static_cast expression.
2630   ///
2631   /// By default, performs semantic analysis to build the new expression.
2632   /// Subclasses may override this routine to provide different behavior.
2633   ExprResult RebuildCXXStaticCastExpr(SourceLocation OpLoc,
2634                                             SourceLocation LAngleLoc,
2635                                             TypeSourceInfo *TInfo,
2636                                             SourceLocation RAngleLoc,
2637                                             SourceLocation LParenLoc,
2638                                             Expr *SubExpr,
2639                                             SourceLocation RParenLoc) {
2640     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_static_cast,
2641                                        TInfo, SubExpr,
2642                                        SourceRange(LAngleLoc, RAngleLoc),
2643                                        SourceRange(LParenLoc, RParenLoc));
2644   }
2645 
2646   /// Build a new C++ dynamic_cast expression.
2647   ///
2648   /// By default, performs semantic analysis to build the new expression.
2649   /// Subclasses may override this routine to provide different behavior.
2650   ExprResult RebuildCXXDynamicCastExpr(SourceLocation OpLoc,
2651                                              SourceLocation LAngleLoc,
2652                                              TypeSourceInfo *TInfo,
2653                                              SourceLocation RAngleLoc,
2654                                              SourceLocation LParenLoc,
2655                                              Expr *SubExpr,
2656                                              SourceLocation RParenLoc) {
2657     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_dynamic_cast,
2658                                        TInfo, SubExpr,
2659                                        SourceRange(LAngleLoc, RAngleLoc),
2660                                        SourceRange(LParenLoc, RParenLoc));
2661   }
2662 
2663   /// Build a new C++ reinterpret_cast expression.
2664   ///
2665   /// By default, performs semantic analysis to build the new expression.
2666   /// Subclasses may override this routine to provide different behavior.
2667   ExprResult RebuildCXXReinterpretCastExpr(SourceLocation OpLoc,
2668                                                  SourceLocation LAngleLoc,
2669                                                  TypeSourceInfo *TInfo,
2670                                                  SourceLocation RAngleLoc,
2671                                                  SourceLocation LParenLoc,
2672                                                  Expr *SubExpr,
2673                                                  SourceLocation RParenLoc) {
2674     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_reinterpret_cast,
2675                                        TInfo, SubExpr,
2676                                        SourceRange(LAngleLoc, RAngleLoc),
2677                                        SourceRange(LParenLoc, RParenLoc));
2678   }
2679 
2680   /// Build a new C++ const_cast expression.
2681   ///
2682   /// By default, performs semantic analysis to build the new expression.
2683   /// Subclasses may override this routine to provide different behavior.
2684   ExprResult RebuildCXXConstCastExpr(SourceLocation OpLoc,
2685                                            SourceLocation LAngleLoc,
2686                                            TypeSourceInfo *TInfo,
2687                                            SourceLocation RAngleLoc,
2688                                            SourceLocation LParenLoc,
2689                                            Expr *SubExpr,
2690                                            SourceLocation RParenLoc) {
2691     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_const_cast,
2692                                        TInfo, SubExpr,
2693                                        SourceRange(LAngleLoc, RAngleLoc),
2694                                        SourceRange(LParenLoc, RParenLoc));
2695   }
2696 
2697   /// Build a new C++ functional-style cast expression.
2698   ///
2699   /// By default, performs semantic analysis to build the new expression.
2700   /// Subclasses may override this routine to provide different behavior.
2701   ExprResult RebuildCXXFunctionalCastExpr(TypeSourceInfo *TInfo,
2702                                           SourceLocation LParenLoc,
2703                                           Expr *Sub,
2704                                           SourceLocation RParenLoc,
2705                                           bool ListInitialization) {
2706     return getSema().BuildCXXTypeConstructExpr(TInfo, LParenLoc,
2707                                                MultiExprArg(&Sub, 1), RParenLoc,
2708                                                ListInitialization);
2709   }
2710 
2711   /// Build a new C++ __builtin_bit_cast expression.
2712   ///
2713   /// By default, performs semantic analysis to build the new expression.
2714   /// Subclasses may override this routine to provide different behavior.
2715   ExprResult RebuildBuiltinBitCastExpr(SourceLocation KWLoc,
2716                                        TypeSourceInfo *TSI, Expr *Sub,
2717                                        SourceLocation RParenLoc) {
2718     return getSema().BuildBuiltinBitCastExpr(KWLoc, TSI, Sub, RParenLoc);
2719   }
2720 
2721   /// Build a new C++ typeid(type) expression.
2722   ///
2723   /// By default, performs semantic analysis to build the new expression.
2724   /// Subclasses may override this routine to provide different behavior.
2725   ExprResult RebuildCXXTypeidExpr(QualType TypeInfoType,
2726                                         SourceLocation TypeidLoc,
2727                                         TypeSourceInfo *Operand,
2728                                         SourceLocation RParenLoc) {
2729     return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand,
2730                                     RParenLoc);
2731   }
2732 
2733 
2734   /// Build a new C++ typeid(expr) expression.
2735   ///
2736   /// By default, performs semantic analysis to build the new expression.
2737   /// Subclasses may override this routine to provide different behavior.
2738   ExprResult RebuildCXXTypeidExpr(QualType TypeInfoType,
2739                                         SourceLocation TypeidLoc,
2740                                         Expr *Operand,
2741                                         SourceLocation RParenLoc) {
2742     return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand,
2743                                     RParenLoc);
2744   }
2745 
2746   /// Build a new C++ __uuidof(type) expression.
2747   ///
2748   /// By default, performs semantic analysis to build the new expression.
2749   /// Subclasses may override this routine to provide different behavior.
2750   ExprResult RebuildCXXUuidofExpr(QualType TypeInfoType,
2751                                         SourceLocation TypeidLoc,
2752                                         TypeSourceInfo *Operand,
2753                                         SourceLocation RParenLoc) {
2754     return getSema().BuildCXXUuidof(TypeInfoType, TypeidLoc, Operand,
2755                                     RParenLoc);
2756   }
2757 
2758   /// Build a new C++ __uuidof(expr) expression.
2759   ///
2760   /// By default, performs semantic analysis to build the new expression.
2761   /// Subclasses may override this routine to provide different behavior.
2762   ExprResult RebuildCXXUuidofExpr(QualType TypeInfoType,
2763                                         SourceLocation TypeidLoc,
2764                                         Expr *Operand,
2765                                         SourceLocation RParenLoc) {
2766     return getSema().BuildCXXUuidof(TypeInfoType, TypeidLoc, Operand,
2767                                     RParenLoc);
2768   }
2769 
2770   /// Build a new C++ "this" expression.
2771   ///
2772   /// By default, builds a new "this" expression without performing any
2773   /// semantic analysis. Subclasses may override this routine to provide
2774   /// different behavior.
2775   ExprResult RebuildCXXThisExpr(SourceLocation ThisLoc,
2776                                 QualType ThisType,
2777                                 bool isImplicit) {
2778     return getSema().BuildCXXThisExpr(ThisLoc, ThisType, isImplicit);
2779   }
2780 
2781   /// Build a new C++ throw expression.
2782   ///
2783   /// By default, performs semantic analysis to build the new expression.
2784   /// Subclasses may override this routine to provide different behavior.
2785   ExprResult RebuildCXXThrowExpr(SourceLocation ThrowLoc, Expr *Sub,
2786                                  bool IsThrownVariableInScope) {
2787     return getSema().BuildCXXThrow(ThrowLoc, Sub, IsThrownVariableInScope);
2788   }
2789 
2790   /// Build a new C++ default-argument expression.
2791   ///
2792   /// By default, builds a new default-argument expression, which does not
2793   /// require any semantic analysis. Subclasses may override this routine to
2794   /// provide different behavior.
2795   ExprResult RebuildCXXDefaultArgExpr(SourceLocation Loc, ParmVarDecl *Param) {
2796     return CXXDefaultArgExpr::Create(getSema().Context, Loc, Param,
2797                                      getSema().CurContext);
2798   }
2799 
2800   /// Build a new C++11 default-initialization expression.
2801   ///
2802   /// By default, builds a new default field initialization expression, which
2803   /// does not require any semantic analysis. Subclasses may override this
2804   /// routine to provide different behavior.
2805   ExprResult RebuildCXXDefaultInitExpr(SourceLocation Loc,
2806                                        FieldDecl *Field) {
2807     return CXXDefaultInitExpr::Create(getSema().Context, Loc, Field,
2808                                       getSema().CurContext);
2809   }
2810 
2811   /// Build a new C++ zero-initialization expression.
2812   ///
2813   /// By default, performs semantic analysis to build the new expression.
2814   /// Subclasses may override this routine to provide different behavior.
2815   ExprResult RebuildCXXScalarValueInitExpr(TypeSourceInfo *TSInfo,
2816                                            SourceLocation LParenLoc,
2817                                            SourceLocation RParenLoc) {
2818     return getSema().BuildCXXTypeConstructExpr(
2819         TSInfo, LParenLoc, None, RParenLoc, /*ListInitialization=*/false);
2820   }
2821 
2822   /// Build a new C++ "new" 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 RebuildCXXNewExpr(SourceLocation StartLoc,
2827                                bool UseGlobal,
2828                                SourceLocation PlacementLParen,
2829                                MultiExprArg PlacementArgs,
2830                                SourceLocation PlacementRParen,
2831                                SourceRange TypeIdParens,
2832                                QualType AllocatedType,
2833                                TypeSourceInfo *AllocatedTypeInfo,
2834                                Optional<Expr *> ArraySize,
2835                                SourceRange DirectInitRange,
2836                                Expr *Initializer) {
2837     return getSema().BuildCXXNew(StartLoc, UseGlobal,
2838                                  PlacementLParen,
2839                                  PlacementArgs,
2840                                  PlacementRParen,
2841                                  TypeIdParens,
2842                                  AllocatedType,
2843                                  AllocatedTypeInfo,
2844                                  ArraySize,
2845                                  DirectInitRange,
2846                                  Initializer);
2847   }
2848 
2849   /// Build a new C++ "delete" expression.
2850   ///
2851   /// By default, performs semantic analysis to build the new expression.
2852   /// Subclasses may override this routine to provide different behavior.
2853   ExprResult RebuildCXXDeleteExpr(SourceLocation StartLoc,
2854                                         bool IsGlobalDelete,
2855                                         bool IsArrayForm,
2856                                         Expr *Operand) {
2857     return getSema().ActOnCXXDelete(StartLoc, IsGlobalDelete, IsArrayForm,
2858                                     Operand);
2859   }
2860 
2861   /// Build a new type trait expression.
2862   ///
2863   /// By default, performs semantic analysis to build the new expression.
2864   /// Subclasses may override this routine to provide different behavior.
2865   ExprResult RebuildTypeTrait(TypeTrait Trait,
2866                               SourceLocation StartLoc,
2867                               ArrayRef<TypeSourceInfo *> Args,
2868                               SourceLocation RParenLoc) {
2869     return getSema().BuildTypeTrait(Trait, StartLoc, Args, RParenLoc);
2870   }
2871 
2872   /// Build a new array type trait expression.
2873   ///
2874   /// By default, performs semantic analysis to build the new expression.
2875   /// Subclasses may override this routine to provide different behavior.
2876   ExprResult RebuildArrayTypeTrait(ArrayTypeTrait Trait,
2877                                    SourceLocation StartLoc,
2878                                    TypeSourceInfo *TSInfo,
2879                                    Expr *DimExpr,
2880                                    SourceLocation RParenLoc) {
2881     return getSema().BuildArrayTypeTrait(Trait, StartLoc, TSInfo, DimExpr, RParenLoc);
2882   }
2883 
2884   /// Build a new expression trait expression.
2885   ///
2886   /// By default, performs semantic analysis to build the new expression.
2887   /// Subclasses may override this routine to provide different behavior.
2888   ExprResult RebuildExpressionTrait(ExpressionTrait Trait,
2889                                    SourceLocation StartLoc,
2890                                    Expr *Queried,
2891                                    SourceLocation RParenLoc) {
2892     return getSema().BuildExpressionTrait(Trait, StartLoc, Queried, RParenLoc);
2893   }
2894 
2895   /// Build a new (previously unresolved) declaration reference
2896   /// expression.
2897   ///
2898   /// By default, performs semantic analysis to build the new expression.
2899   /// Subclasses may override this routine to provide different behavior.
2900   ExprResult RebuildDependentScopeDeclRefExpr(
2901                                           NestedNameSpecifierLoc QualifierLoc,
2902                                           SourceLocation TemplateKWLoc,
2903                                        const DeclarationNameInfo &NameInfo,
2904                               const TemplateArgumentListInfo *TemplateArgs,
2905                                           bool IsAddressOfOperand,
2906                                           TypeSourceInfo **RecoveryTSI) {
2907     CXXScopeSpec SS;
2908     SS.Adopt(QualifierLoc);
2909 
2910     if (TemplateArgs || TemplateKWLoc.isValid())
2911       return getSema().BuildQualifiedTemplateIdExpr(SS, TemplateKWLoc, NameInfo,
2912                                                     TemplateArgs);
2913 
2914     return getSema().BuildQualifiedDeclarationNameExpr(
2915         SS, NameInfo, IsAddressOfOperand, /*S*/nullptr, RecoveryTSI);
2916   }
2917 
2918   /// Build a new template-id expression.
2919   ///
2920   /// By default, performs semantic analysis to build the new expression.
2921   /// Subclasses may override this routine to provide different behavior.
2922   ExprResult RebuildTemplateIdExpr(const CXXScopeSpec &SS,
2923                                    SourceLocation TemplateKWLoc,
2924                                    LookupResult &R,
2925                                    bool RequiresADL,
2926                               const TemplateArgumentListInfo *TemplateArgs) {
2927     return getSema().BuildTemplateIdExpr(SS, TemplateKWLoc, R, RequiresADL,
2928                                          TemplateArgs);
2929   }
2930 
2931   /// Build a new object-construction expression.
2932   ///
2933   /// By default, performs semantic analysis to build the new expression.
2934   /// Subclasses may override this routine to provide different behavior.
2935   ExprResult RebuildCXXConstructExpr(QualType T,
2936                                      SourceLocation Loc,
2937                                      CXXConstructorDecl *Constructor,
2938                                      bool IsElidable,
2939                                      MultiExprArg Args,
2940                                      bool HadMultipleCandidates,
2941                                      bool ListInitialization,
2942                                      bool StdInitListInitialization,
2943                                      bool RequiresZeroInit,
2944                              CXXConstructExpr::ConstructionKind ConstructKind,
2945                                      SourceRange ParenRange) {
2946     SmallVector<Expr*, 8> ConvertedArgs;
2947     if (getSema().CompleteConstructorCall(Constructor, Args, Loc,
2948                                           ConvertedArgs))
2949       return ExprError();
2950 
2951     return getSema().BuildCXXConstructExpr(Loc, T, Constructor,
2952                                            IsElidable,
2953                                            ConvertedArgs,
2954                                            HadMultipleCandidates,
2955                                            ListInitialization,
2956                                            StdInitListInitialization,
2957                                            RequiresZeroInit, ConstructKind,
2958                                            ParenRange);
2959   }
2960 
2961   /// Build a new implicit construction via inherited constructor
2962   /// expression.
2963   ExprResult RebuildCXXInheritedCtorInitExpr(QualType T, SourceLocation Loc,
2964                                              CXXConstructorDecl *Constructor,
2965                                              bool ConstructsVBase,
2966                                              bool InheritedFromVBase) {
2967     return new (getSema().Context) CXXInheritedCtorInitExpr(
2968         Loc, T, Constructor, ConstructsVBase, InheritedFromVBase);
2969   }
2970 
2971   /// Build a new object-construction expression.
2972   ///
2973   /// By default, performs semantic analysis to build the new expression.
2974   /// Subclasses may override this routine to provide different behavior.
2975   ExprResult RebuildCXXTemporaryObjectExpr(TypeSourceInfo *TSInfo,
2976                                            SourceLocation LParenOrBraceLoc,
2977                                            MultiExprArg Args,
2978                                            SourceLocation RParenOrBraceLoc,
2979                                            bool ListInitialization) {
2980     return getSema().BuildCXXTypeConstructExpr(
2981         TSInfo, LParenOrBraceLoc, Args, RParenOrBraceLoc, ListInitialization);
2982   }
2983 
2984   /// Build a new object-construction expression.
2985   ///
2986   /// By default, performs semantic analysis to build the new expression.
2987   /// Subclasses may override this routine to provide different behavior.
2988   ExprResult RebuildCXXUnresolvedConstructExpr(TypeSourceInfo *TSInfo,
2989                                                SourceLocation LParenLoc,
2990                                                MultiExprArg Args,
2991                                                SourceLocation RParenLoc,
2992                                                bool ListInitialization) {
2993     return getSema().BuildCXXTypeConstructExpr(TSInfo, LParenLoc, Args,
2994                                                RParenLoc, ListInitialization);
2995   }
2996 
2997   /// Build a new member reference expression.
2998   ///
2999   /// By default, performs semantic analysis to build the new expression.
3000   /// Subclasses may override this routine to provide different behavior.
3001   ExprResult RebuildCXXDependentScopeMemberExpr(Expr *BaseE,
3002                                                 QualType BaseType,
3003                                                 bool IsArrow,
3004                                                 SourceLocation OperatorLoc,
3005                                           NestedNameSpecifierLoc QualifierLoc,
3006                                                 SourceLocation TemplateKWLoc,
3007                                             NamedDecl *FirstQualifierInScope,
3008                                    const DeclarationNameInfo &MemberNameInfo,
3009                               const TemplateArgumentListInfo *TemplateArgs) {
3010     CXXScopeSpec SS;
3011     SS.Adopt(QualifierLoc);
3012 
3013     return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType,
3014                                             OperatorLoc, IsArrow,
3015                                             SS, TemplateKWLoc,
3016                                             FirstQualifierInScope,
3017                                             MemberNameInfo,
3018                                             TemplateArgs, /*S*/nullptr);
3019   }
3020 
3021   /// Build a new member reference expression.
3022   ///
3023   /// By default, performs semantic analysis to build the new expression.
3024   /// Subclasses may override this routine to provide different behavior.
3025   ExprResult RebuildUnresolvedMemberExpr(Expr *BaseE, QualType BaseType,
3026                                          SourceLocation OperatorLoc,
3027                                          bool IsArrow,
3028                                          NestedNameSpecifierLoc QualifierLoc,
3029                                          SourceLocation TemplateKWLoc,
3030                                          NamedDecl *FirstQualifierInScope,
3031                                          LookupResult &R,
3032                                 const TemplateArgumentListInfo *TemplateArgs) {
3033     CXXScopeSpec SS;
3034     SS.Adopt(QualifierLoc);
3035 
3036     return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType,
3037                                             OperatorLoc, IsArrow,
3038                                             SS, TemplateKWLoc,
3039                                             FirstQualifierInScope,
3040                                             R, TemplateArgs, /*S*/nullptr);
3041   }
3042 
3043   /// Build a new noexcept expression.
3044   ///
3045   /// By default, performs semantic analysis to build the new expression.
3046   /// Subclasses may override this routine to provide different behavior.
3047   ExprResult RebuildCXXNoexceptExpr(SourceRange Range, Expr *Arg) {
3048     return SemaRef.BuildCXXNoexceptExpr(Range.getBegin(), Arg, Range.getEnd());
3049   }
3050 
3051   /// Build a new expression to compute the length of a parameter pack.
3052   ExprResult RebuildSizeOfPackExpr(SourceLocation OperatorLoc,
3053                                    NamedDecl *Pack,
3054                                    SourceLocation PackLoc,
3055                                    SourceLocation RParenLoc,
3056                                    Optional<unsigned> Length,
3057                                    ArrayRef<TemplateArgument> PartialArgs) {
3058     return SizeOfPackExpr::Create(SemaRef.Context, OperatorLoc, Pack, PackLoc,
3059                                   RParenLoc, Length, PartialArgs);
3060   }
3061 
3062   /// Build a new expression representing a call to a source location
3063   ///  builtin.
3064   ///
3065   /// By default, performs semantic analysis to build the new expression.
3066   /// Subclasses may override this routine to provide different behavior.
3067   ExprResult RebuildSourceLocExpr(SourceLocExpr::IdentKind Kind,
3068                                   SourceLocation BuiltinLoc,
3069                                   SourceLocation RPLoc,
3070                                   DeclContext *ParentContext) {
3071     return getSema().BuildSourceLocExpr(Kind, BuiltinLoc, RPLoc, ParentContext);
3072   }
3073 
3074   /// Build a new Objective-C boxed expression.
3075   ///
3076   /// By default, performs semantic analysis to build the new expression.
3077   /// Subclasses may override this routine to provide different behavior.
3078   ExprResult RebuildConceptSpecializationExpr(NestedNameSpecifierLoc NNS,
3079       SourceLocation TemplateKWLoc, DeclarationNameInfo ConceptNameInfo,
3080       NamedDecl *FoundDecl, ConceptDecl *NamedConcept,
3081       TemplateArgumentListInfo *TALI) {
3082     CXXScopeSpec SS;
3083     SS.Adopt(NNS);
3084     ExprResult Result = getSema().CheckConceptTemplateId(SS, TemplateKWLoc,
3085                                                          ConceptNameInfo,
3086                                                          FoundDecl,
3087                                                          NamedConcept, TALI);
3088     if (Result.isInvalid())
3089       return ExprError();
3090     return Result;
3091   }
3092 
3093   /// \brief Build a new requires expression.
3094   ///
3095   /// By default, performs semantic analysis to build the new expression.
3096   /// Subclasses may override this routine to provide different behavior.
3097   ExprResult RebuildRequiresExpr(SourceLocation RequiresKWLoc,
3098                                  RequiresExprBodyDecl *Body,
3099                                  ArrayRef<ParmVarDecl *> LocalParameters,
3100                                  ArrayRef<concepts::Requirement *> Requirements,
3101                                  SourceLocation ClosingBraceLoc) {
3102     return RequiresExpr::Create(SemaRef.Context, RequiresKWLoc, Body,
3103                                 LocalParameters, Requirements, ClosingBraceLoc);
3104   }
3105 
3106   concepts::TypeRequirement *
3107   RebuildTypeRequirement(
3108       concepts::Requirement::SubstitutionDiagnostic *SubstDiag) {
3109     return SemaRef.BuildTypeRequirement(SubstDiag);
3110   }
3111 
3112   concepts::TypeRequirement *RebuildTypeRequirement(TypeSourceInfo *T) {
3113     return SemaRef.BuildTypeRequirement(T);
3114   }
3115 
3116   concepts::ExprRequirement *
3117   RebuildExprRequirement(
3118       concepts::Requirement::SubstitutionDiagnostic *SubstDiag, bool IsSimple,
3119       SourceLocation NoexceptLoc,
3120       concepts::ExprRequirement::ReturnTypeRequirement Ret) {
3121     return SemaRef.BuildExprRequirement(SubstDiag, IsSimple, NoexceptLoc,
3122                                         std::move(Ret));
3123   }
3124 
3125   concepts::ExprRequirement *
3126   RebuildExprRequirement(Expr *E, bool IsSimple, SourceLocation NoexceptLoc,
3127                          concepts::ExprRequirement::ReturnTypeRequirement Ret) {
3128     return SemaRef.BuildExprRequirement(E, IsSimple, NoexceptLoc,
3129                                         std::move(Ret));
3130   }
3131 
3132   concepts::NestedRequirement *
3133   RebuildNestedRequirement(
3134       concepts::Requirement::SubstitutionDiagnostic *SubstDiag) {
3135     return SemaRef.BuildNestedRequirement(SubstDiag);
3136   }
3137 
3138   concepts::NestedRequirement *RebuildNestedRequirement(Expr *Constraint) {
3139     return SemaRef.BuildNestedRequirement(Constraint);
3140   }
3141 
3142   /// \brief Build a new Objective-C boxed expression.
3143   ///
3144   /// By default, performs semantic analysis to build the new expression.
3145   /// Subclasses may override this routine to provide different behavior.
3146   ExprResult RebuildObjCBoxedExpr(SourceRange SR, Expr *ValueExpr) {
3147     return getSema().BuildObjCBoxedExpr(SR, ValueExpr);
3148   }
3149 
3150   /// Build a new Objective-C array literal.
3151   ///
3152   /// By default, performs semantic analysis to build the new expression.
3153   /// Subclasses may override this routine to provide different behavior.
3154   ExprResult RebuildObjCArrayLiteral(SourceRange Range,
3155                                      Expr **Elements, unsigned NumElements) {
3156     return getSema().BuildObjCArrayLiteral(Range,
3157                                            MultiExprArg(Elements, NumElements));
3158   }
3159 
3160   ExprResult RebuildObjCSubscriptRefExpr(SourceLocation RB,
3161                                          Expr *Base, Expr *Key,
3162                                          ObjCMethodDecl *getterMethod,
3163                                          ObjCMethodDecl *setterMethod) {
3164     return  getSema().BuildObjCSubscriptExpression(RB, Base, Key,
3165                                                    getterMethod, setterMethod);
3166   }
3167 
3168   /// Build a new Objective-C dictionary literal.
3169   ///
3170   /// By default, performs semantic analysis to build the new expression.
3171   /// Subclasses may override this routine to provide different behavior.
3172   ExprResult RebuildObjCDictionaryLiteral(SourceRange Range,
3173                               MutableArrayRef<ObjCDictionaryElement> Elements) {
3174     return getSema().BuildObjCDictionaryLiteral(Range, Elements);
3175   }
3176 
3177   /// Build a new Objective-C \@encode expression.
3178   ///
3179   /// By default, performs semantic analysis to build the new expression.
3180   /// Subclasses may override this routine to provide different behavior.
3181   ExprResult RebuildObjCEncodeExpr(SourceLocation AtLoc,
3182                                          TypeSourceInfo *EncodeTypeInfo,
3183                                          SourceLocation RParenLoc) {
3184     return SemaRef.BuildObjCEncodeExpression(AtLoc, EncodeTypeInfo, RParenLoc);
3185   }
3186 
3187   /// Build a new Objective-C class message.
3188   ExprResult RebuildObjCMessageExpr(TypeSourceInfo *ReceiverTypeInfo,
3189                                           Selector Sel,
3190                                           ArrayRef<SourceLocation> SelectorLocs,
3191                                           ObjCMethodDecl *Method,
3192                                           SourceLocation LBracLoc,
3193                                           MultiExprArg Args,
3194                                           SourceLocation RBracLoc) {
3195     return SemaRef.BuildClassMessage(ReceiverTypeInfo,
3196                                      ReceiverTypeInfo->getType(),
3197                                      /*SuperLoc=*/SourceLocation(),
3198                                      Sel, Method, LBracLoc, SelectorLocs,
3199                                      RBracLoc, Args);
3200   }
3201 
3202   /// Build a new Objective-C instance message.
3203   ExprResult RebuildObjCMessageExpr(Expr *Receiver,
3204                                           Selector Sel,
3205                                           ArrayRef<SourceLocation> SelectorLocs,
3206                                           ObjCMethodDecl *Method,
3207                                           SourceLocation LBracLoc,
3208                                           MultiExprArg Args,
3209                                           SourceLocation RBracLoc) {
3210     return SemaRef.BuildInstanceMessage(Receiver,
3211                                         Receiver->getType(),
3212                                         /*SuperLoc=*/SourceLocation(),
3213                                         Sel, Method, LBracLoc, SelectorLocs,
3214                                         RBracLoc, Args);
3215   }
3216 
3217   /// Build a new Objective-C instance/class message to 'super'.
3218   ExprResult RebuildObjCMessageExpr(SourceLocation SuperLoc,
3219                                     Selector Sel,
3220                                     ArrayRef<SourceLocation> SelectorLocs,
3221                                     QualType SuperType,
3222                                     ObjCMethodDecl *Method,
3223                                     SourceLocation LBracLoc,
3224                                     MultiExprArg Args,
3225                                     SourceLocation RBracLoc) {
3226     return Method->isInstanceMethod() ? SemaRef.BuildInstanceMessage(nullptr,
3227                                           SuperType,
3228                                           SuperLoc,
3229                                           Sel, Method, LBracLoc, SelectorLocs,
3230                                           RBracLoc, Args)
3231                                       : SemaRef.BuildClassMessage(nullptr,
3232                                           SuperType,
3233                                           SuperLoc,
3234                                           Sel, Method, LBracLoc, SelectorLocs,
3235                                           RBracLoc, Args);
3236 
3237 
3238   }
3239 
3240   /// Build a new Objective-C ivar reference expression.
3241   ///
3242   /// By default, performs semantic analysis to build the new expression.
3243   /// Subclasses may override this routine to provide different behavior.
3244   ExprResult RebuildObjCIvarRefExpr(Expr *BaseArg, ObjCIvarDecl *Ivar,
3245                                           SourceLocation IvarLoc,
3246                                           bool IsArrow, bool IsFreeIvar) {
3247     CXXScopeSpec SS;
3248     DeclarationNameInfo NameInfo(Ivar->getDeclName(), IvarLoc);
3249     ExprResult Result = getSema().BuildMemberReferenceExpr(
3250         BaseArg, BaseArg->getType(),
3251         /*FIXME:*/ IvarLoc, IsArrow, SS, SourceLocation(),
3252         /*FirstQualifierInScope=*/nullptr, NameInfo,
3253         /*TemplateArgs=*/nullptr,
3254         /*S=*/nullptr);
3255     if (IsFreeIvar && Result.isUsable())
3256       cast<ObjCIvarRefExpr>(Result.get())->setIsFreeIvar(IsFreeIvar);
3257     return Result;
3258   }
3259 
3260   /// Build a new Objective-C property reference expression.
3261   ///
3262   /// By default, performs semantic analysis to build the new expression.
3263   /// Subclasses may override this routine to provide different behavior.
3264   ExprResult RebuildObjCPropertyRefExpr(Expr *BaseArg,
3265                                         ObjCPropertyDecl *Property,
3266                                         SourceLocation PropertyLoc) {
3267     CXXScopeSpec SS;
3268     DeclarationNameInfo NameInfo(Property->getDeclName(), PropertyLoc);
3269     return getSema().BuildMemberReferenceExpr(BaseArg, BaseArg->getType(),
3270                                               /*FIXME:*/PropertyLoc,
3271                                               /*IsArrow=*/false,
3272                                               SS, SourceLocation(),
3273                                               /*FirstQualifierInScope=*/nullptr,
3274                                               NameInfo,
3275                                               /*TemplateArgs=*/nullptr,
3276                                               /*S=*/nullptr);
3277   }
3278 
3279   /// Build a new Objective-C property reference expression.
3280   ///
3281   /// By default, performs semantic analysis to build the new expression.
3282   /// Subclasses may override this routine to provide different behavior.
3283   ExprResult RebuildObjCPropertyRefExpr(Expr *Base, QualType T,
3284                                         ObjCMethodDecl *Getter,
3285                                         ObjCMethodDecl *Setter,
3286                                         SourceLocation PropertyLoc) {
3287     // Since these expressions can only be value-dependent, we do not
3288     // need to perform semantic analysis again.
3289     return Owned(
3290       new (getSema().Context) ObjCPropertyRefExpr(Getter, Setter, T,
3291                                                   VK_LValue, OK_ObjCProperty,
3292                                                   PropertyLoc, Base));
3293   }
3294 
3295   /// Build a new Objective-C "isa" expression.
3296   ///
3297   /// By default, performs semantic analysis to build the new expression.
3298   /// Subclasses may override this routine to provide different behavior.
3299   ExprResult RebuildObjCIsaExpr(Expr *BaseArg, SourceLocation IsaLoc,
3300                                 SourceLocation OpLoc, bool IsArrow) {
3301     CXXScopeSpec SS;
3302     DeclarationNameInfo NameInfo(&getSema().Context.Idents.get("isa"), IsaLoc);
3303     return getSema().BuildMemberReferenceExpr(BaseArg, BaseArg->getType(),
3304                                               OpLoc, IsArrow,
3305                                               SS, SourceLocation(),
3306                                               /*FirstQualifierInScope=*/nullptr,
3307                                               NameInfo,
3308                                               /*TemplateArgs=*/nullptr,
3309                                               /*S=*/nullptr);
3310   }
3311 
3312   /// Build a new shuffle vector expression.
3313   ///
3314   /// By default, performs semantic analysis to build the new expression.
3315   /// Subclasses may override this routine to provide different behavior.
3316   ExprResult RebuildShuffleVectorExpr(SourceLocation BuiltinLoc,
3317                                       MultiExprArg SubExprs,
3318                                       SourceLocation RParenLoc) {
3319     // Find the declaration for __builtin_shufflevector
3320     const IdentifierInfo &Name
3321       = SemaRef.Context.Idents.get("__builtin_shufflevector");
3322     TranslationUnitDecl *TUDecl = SemaRef.Context.getTranslationUnitDecl();
3323     DeclContext::lookup_result Lookup = TUDecl->lookup(DeclarationName(&Name));
3324     assert(!Lookup.empty() && "No __builtin_shufflevector?");
3325 
3326     // Build a reference to the __builtin_shufflevector builtin
3327     FunctionDecl *Builtin = cast<FunctionDecl>(Lookup.front());
3328     Expr *Callee = new (SemaRef.Context)
3329         DeclRefExpr(SemaRef.Context, Builtin, false,
3330                     SemaRef.Context.BuiltinFnTy, VK_RValue, BuiltinLoc);
3331     QualType CalleePtrTy = SemaRef.Context.getPointerType(Builtin->getType());
3332     Callee = SemaRef.ImpCastExprToType(Callee, CalleePtrTy,
3333                                        CK_BuiltinFnToFnPtr).get();
3334 
3335     // Build the CallExpr
3336     ExprResult TheCall = CallExpr::Create(
3337         SemaRef.Context, Callee, SubExprs, Builtin->getCallResultType(),
3338         Expr::getValueKindForType(Builtin->getReturnType()), RParenLoc);
3339 
3340     // Type-check the __builtin_shufflevector expression.
3341     return SemaRef.SemaBuiltinShuffleVector(cast<CallExpr>(TheCall.get()));
3342   }
3343 
3344   /// Build a new convert vector expression.
3345   ExprResult RebuildConvertVectorExpr(SourceLocation BuiltinLoc,
3346                                       Expr *SrcExpr, TypeSourceInfo *DstTInfo,
3347                                       SourceLocation RParenLoc) {
3348     return SemaRef.SemaConvertVectorExpr(SrcExpr, DstTInfo,
3349                                          BuiltinLoc, RParenLoc);
3350   }
3351 
3352   /// Build a new template argument pack expansion.
3353   ///
3354   /// By default, performs semantic analysis to build a new pack expansion
3355   /// for a template argument. Subclasses may override this routine to provide
3356   /// different behavior.
3357   TemplateArgumentLoc RebuildPackExpansion(TemplateArgumentLoc Pattern,
3358                                            SourceLocation EllipsisLoc,
3359                                            Optional<unsigned> NumExpansions) {
3360     switch (Pattern.getArgument().getKind()) {
3361     case TemplateArgument::Expression: {
3362       ExprResult Result
3363         = getSema().CheckPackExpansion(Pattern.getSourceExpression(),
3364                                        EllipsisLoc, NumExpansions);
3365       if (Result.isInvalid())
3366         return TemplateArgumentLoc();
3367 
3368       return TemplateArgumentLoc(Result.get(), Result.get());
3369     }
3370 
3371     case TemplateArgument::Template:
3372       return TemplateArgumentLoc(TemplateArgument(
3373                                           Pattern.getArgument().getAsTemplate(),
3374                                                   NumExpansions),
3375                                  Pattern.getTemplateQualifierLoc(),
3376                                  Pattern.getTemplateNameLoc(),
3377                                  EllipsisLoc);
3378 
3379     case TemplateArgument::Null:
3380     case TemplateArgument::Integral:
3381     case TemplateArgument::Declaration:
3382     case TemplateArgument::Pack:
3383     case TemplateArgument::TemplateExpansion:
3384     case TemplateArgument::NullPtr:
3385       llvm_unreachable("Pack expansion pattern has no parameter packs");
3386 
3387     case TemplateArgument::Type:
3388       if (TypeSourceInfo *Expansion
3389             = getSema().CheckPackExpansion(Pattern.getTypeSourceInfo(),
3390                                            EllipsisLoc,
3391                                            NumExpansions))
3392         return TemplateArgumentLoc(TemplateArgument(Expansion->getType()),
3393                                    Expansion);
3394       break;
3395     }
3396 
3397     return TemplateArgumentLoc();
3398   }
3399 
3400   /// Build a new expression pack expansion.
3401   ///
3402   /// By default, performs semantic analysis to build a new pack expansion
3403   /// for an expression. Subclasses may override this routine to provide
3404   /// different behavior.
3405   ExprResult RebuildPackExpansion(Expr *Pattern, SourceLocation EllipsisLoc,
3406                                   Optional<unsigned> NumExpansions) {
3407     return getSema().CheckPackExpansion(Pattern, EllipsisLoc, NumExpansions);
3408   }
3409 
3410   /// Build a new C++1z fold-expression.
3411   ///
3412   /// By default, performs semantic analysis in order to build a new fold
3413   /// expression.
3414   ExprResult RebuildCXXFoldExpr(SourceLocation LParenLoc, Expr *LHS,
3415                                 BinaryOperatorKind Operator,
3416                                 SourceLocation EllipsisLoc, Expr *RHS,
3417                                 SourceLocation RParenLoc,
3418                                 Optional<unsigned> NumExpansions) {
3419     return getSema().BuildCXXFoldExpr(LParenLoc, LHS, Operator, EllipsisLoc,
3420                                       RHS, RParenLoc, NumExpansions);
3421   }
3422 
3423   /// Build an empty C++1z fold-expression with the given operator.
3424   ///
3425   /// By default, produces the fallback value for the fold-expression, or
3426   /// produce an error if there is no fallback value.
3427   ExprResult RebuildEmptyCXXFoldExpr(SourceLocation EllipsisLoc,
3428                                      BinaryOperatorKind Operator) {
3429     return getSema().BuildEmptyCXXFoldExpr(EllipsisLoc, Operator);
3430   }
3431 
3432   /// Build a new atomic operation expression.
3433   ///
3434   /// By default, performs semantic analysis to build the new expression.
3435   /// Subclasses may override this routine to provide different behavior.
3436   ExprResult RebuildAtomicExpr(SourceLocation BuiltinLoc, MultiExprArg SubExprs,
3437                                AtomicExpr::AtomicOp Op,
3438                                SourceLocation RParenLoc) {
3439     // Use this for all of the locations, since we don't know the difference
3440     // between the call and the expr at this point.
3441     SourceRange Range{BuiltinLoc, RParenLoc};
3442     return getSema().BuildAtomicExpr(Range, Range, RParenLoc, SubExprs, Op,
3443                                      Sema::AtomicArgumentOrder::AST);
3444   }
3445 
3446 private:
3447   TypeLoc TransformTypeInObjectScope(TypeLoc TL,
3448                                      QualType ObjectType,
3449                                      NamedDecl *FirstQualifierInScope,
3450                                      CXXScopeSpec &SS);
3451 
3452   TypeSourceInfo *TransformTypeInObjectScope(TypeSourceInfo *TSInfo,
3453                                              QualType ObjectType,
3454                                              NamedDecl *FirstQualifierInScope,
3455                                              CXXScopeSpec &SS);
3456 
3457   TypeSourceInfo *TransformTSIInObjectScope(TypeLoc TL, QualType ObjectType,
3458                                             NamedDecl *FirstQualifierInScope,
3459                                             CXXScopeSpec &SS);
3460 
3461   QualType TransformDependentNameType(TypeLocBuilder &TLB,
3462                                       DependentNameTypeLoc TL,
3463                                       bool DeducibleTSTContext);
3464 };
3465 
3466 template <typename Derived>
3467 StmtResult TreeTransform<Derived>::TransformStmt(Stmt *S, StmtDiscardKind SDK) {
3468   if (!S)
3469     return S;
3470 
3471   switch (S->getStmtClass()) {
3472   case Stmt::NoStmtClass: break;
3473 
3474   // Transform individual statement nodes
3475   // Pass SDK into statements that can produce a value
3476 #define STMT(Node, Parent)                                              \
3477   case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(S));
3478 #define VALUESTMT(Node, Parent)                                         \
3479   case Stmt::Node##Class:                                               \
3480     return getDerived().Transform##Node(cast<Node>(S), SDK);
3481 #define ABSTRACT_STMT(Node)
3482 #define EXPR(Node, Parent)
3483 #include "clang/AST/StmtNodes.inc"
3484 
3485   // Transform expressions by calling TransformExpr.
3486 #define STMT(Node, Parent)
3487 #define ABSTRACT_STMT(Stmt)
3488 #define EXPR(Node, Parent) case Stmt::Node##Class:
3489 #include "clang/AST/StmtNodes.inc"
3490     {
3491       ExprResult E = getDerived().TransformExpr(cast<Expr>(S));
3492 
3493       if (SDK == SDK_StmtExprResult)
3494         E = getSema().ActOnStmtExprResult(E);
3495       return getSema().ActOnExprStmt(E, SDK == SDK_Discarded);
3496     }
3497   }
3498 
3499   return S;
3500 }
3501 
3502 template<typename Derived>
3503 OMPClause *TreeTransform<Derived>::TransformOMPClause(OMPClause *S) {
3504   if (!S)
3505     return S;
3506 
3507   switch (S->getClauseKind()) {
3508   default: break;
3509   // Transform individual clause nodes
3510 #define OPENMP_CLAUSE(Name, Class)                                             \
3511   case OMPC_ ## Name :                                                         \
3512     return getDerived().Transform ## Class(cast<Class>(S));
3513 #include "clang/Basic/OpenMPKinds.def"
3514   }
3515 
3516   return S;
3517 }
3518 
3519 
3520 template<typename Derived>
3521 ExprResult TreeTransform<Derived>::TransformExpr(Expr *E) {
3522   if (!E)
3523     return E;
3524 
3525   switch (E->getStmtClass()) {
3526     case Stmt::NoStmtClass: break;
3527 #define STMT(Node, Parent) case Stmt::Node##Class: break;
3528 #define ABSTRACT_STMT(Stmt)
3529 #define EXPR(Node, Parent)                                              \
3530     case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(E));
3531 #include "clang/AST/StmtNodes.inc"
3532   }
3533 
3534   return E;
3535 }
3536 
3537 template<typename Derived>
3538 ExprResult TreeTransform<Derived>::TransformInitializer(Expr *Init,
3539                                                         bool NotCopyInit) {
3540   // Initializers are instantiated like expressions, except that various outer
3541   // layers are stripped.
3542   if (!Init)
3543     return Init;
3544 
3545   if (auto *FE = dyn_cast<FullExpr>(Init))
3546     Init = FE->getSubExpr();
3547 
3548   if (auto *AIL = dyn_cast<ArrayInitLoopExpr>(Init))
3549     Init = AIL->getCommonExpr();
3550 
3551   if (MaterializeTemporaryExpr *MTE = dyn_cast<MaterializeTemporaryExpr>(Init))
3552     Init = MTE->getSubExpr();
3553 
3554   while (CXXBindTemporaryExpr *Binder = dyn_cast<CXXBindTemporaryExpr>(Init))
3555     Init = Binder->getSubExpr();
3556 
3557   if (ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(Init))
3558     Init = ICE->getSubExprAsWritten();
3559 
3560   if (CXXStdInitializerListExpr *ILE =
3561           dyn_cast<CXXStdInitializerListExpr>(Init))
3562     return TransformInitializer(ILE->getSubExpr(), NotCopyInit);
3563 
3564   // If this is copy-initialization, we only need to reconstruct
3565   // InitListExprs. Other forms of copy-initialization will be a no-op if
3566   // the initializer is already the right type.
3567   CXXConstructExpr *Construct = dyn_cast<CXXConstructExpr>(Init);
3568   if (!NotCopyInit && !(Construct && Construct->isListInitialization()))
3569     return getDerived().TransformExpr(Init);
3570 
3571   // Revert value-initialization back to empty parens.
3572   if (CXXScalarValueInitExpr *VIE = dyn_cast<CXXScalarValueInitExpr>(Init)) {
3573     SourceRange Parens = VIE->getSourceRange();
3574     return getDerived().RebuildParenListExpr(Parens.getBegin(), None,
3575                                              Parens.getEnd());
3576   }
3577 
3578   // FIXME: We shouldn't build ImplicitValueInitExprs for direct-initialization.
3579   if (isa<ImplicitValueInitExpr>(Init))
3580     return getDerived().RebuildParenListExpr(SourceLocation(), None,
3581                                              SourceLocation());
3582 
3583   // Revert initialization by constructor back to a parenthesized or braced list
3584   // of expressions. Any other form of initializer can just be reused directly.
3585   if (!Construct || isa<CXXTemporaryObjectExpr>(Construct))
3586     return getDerived().TransformExpr(Init);
3587 
3588   // If the initialization implicitly converted an initializer list to a
3589   // std::initializer_list object, unwrap the std::initializer_list too.
3590   if (Construct && Construct->isStdInitListInitialization())
3591     return TransformInitializer(Construct->getArg(0), NotCopyInit);
3592 
3593   // Enter a list-init context if this was list initialization.
3594   EnterExpressionEvaluationContext Context(
3595       getSema(), EnterExpressionEvaluationContext::InitList,
3596       Construct->isListInitialization());
3597 
3598   SmallVector<Expr*, 8> NewArgs;
3599   bool ArgChanged = false;
3600   if (getDerived().TransformExprs(Construct->getArgs(), Construct->getNumArgs(),
3601                                   /*IsCall*/true, NewArgs, &ArgChanged))
3602     return ExprError();
3603 
3604   // If this was list initialization, revert to syntactic list form.
3605   if (Construct->isListInitialization())
3606     return getDerived().RebuildInitList(Construct->getBeginLoc(), NewArgs,
3607                                         Construct->getEndLoc());
3608 
3609   // Build a ParenListExpr to represent anything else.
3610   SourceRange Parens = Construct->getParenOrBraceRange();
3611   if (Parens.isInvalid()) {
3612     // This was a variable declaration's initialization for which no initializer
3613     // was specified.
3614     assert(NewArgs.empty() &&
3615            "no parens or braces but have direct init with arguments?");
3616     return ExprEmpty();
3617   }
3618   return getDerived().RebuildParenListExpr(Parens.getBegin(), NewArgs,
3619                                            Parens.getEnd());
3620 }
3621 
3622 template<typename Derived>
3623 bool TreeTransform<Derived>::TransformExprs(Expr *const *Inputs,
3624                                             unsigned NumInputs,
3625                                             bool IsCall,
3626                                       SmallVectorImpl<Expr *> &Outputs,
3627                                             bool *ArgChanged) {
3628   for (unsigned I = 0; I != NumInputs; ++I) {
3629     // If requested, drop call arguments that need to be dropped.
3630     if (IsCall && getDerived().DropCallArgument(Inputs[I])) {
3631       if (ArgChanged)
3632         *ArgChanged = true;
3633 
3634       break;
3635     }
3636 
3637     if (PackExpansionExpr *Expansion = dyn_cast<PackExpansionExpr>(Inputs[I])) {
3638       Expr *Pattern = Expansion->getPattern();
3639 
3640       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
3641       getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
3642       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
3643 
3644       // Determine whether the set of unexpanded parameter packs can and should
3645       // be expanded.
3646       bool Expand = true;
3647       bool RetainExpansion = false;
3648       Optional<unsigned> OrigNumExpansions = Expansion->getNumExpansions();
3649       Optional<unsigned> NumExpansions = OrigNumExpansions;
3650       if (getDerived().TryExpandParameterPacks(Expansion->getEllipsisLoc(),
3651                                                Pattern->getSourceRange(),
3652                                                Unexpanded,
3653                                                Expand, RetainExpansion,
3654                                                NumExpansions))
3655         return true;
3656 
3657       if (!Expand) {
3658         // The transform has determined that we should perform a simple
3659         // transformation on the pack expansion, producing another pack
3660         // expansion.
3661         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
3662         ExprResult OutPattern = getDerived().TransformExpr(Pattern);
3663         if (OutPattern.isInvalid())
3664           return true;
3665 
3666         ExprResult Out = getDerived().RebuildPackExpansion(OutPattern.get(),
3667                                                 Expansion->getEllipsisLoc(),
3668                                                            NumExpansions);
3669         if (Out.isInvalid())
3670           return true;
3671 
3672         if (ArgChanged)
3673           *ArgChanged = true;
3674         Outputs.push_back(Out.get());
3675         continue;
3676       }
3677 
3678       // Record right away that the argument was changed.  This needs
3679       // to happen even if the array expands to nothing.
3680       if (ArgChanged) *ArgChanged = true;
3681 
3682       // The transform has determined that we should perform an elementwise
3683       // expansion of the pattern. Do so.
3684       for (unsigned I = 0; I != *NumExpansions; ++I) {
3685         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
3686         ExprResult Out = getDerived().TransformExpr(Pattern);
3687         if (Out.isInvalid())
3688           return true;
3689 
3690         if (Out.get()->containsUnexpandedParameterPack()) {
3691           Out = getDerived().RebuildPackExpansion(
3692               Out.get(), Expansion->getEllipsisLoc(), OrigNumExpansions);
3693           if (Out.isInvalid())
3694             return true;
3695         }
3696 
3697         Outputs.push_back(Out.get());
3698       }
3699 
3700       // If we're supposed to retain a pack expansion, do so by temporarily
3701       // forgetting the partially-substituted parameter pack.
3702       if (RetainExpansion) {
3703         ForgetPartiallySubstitutedPackRAII Forget(getDerived());
3704 
3705         ExprResult Out = getDerived().TransformExpr(Pattern);
3706         if (Out.isInvalid())
3707           return true;
3708 
3709         Out = getDerived().RebuildPackExpansion(
3710             Out.get(), Expansion->getEllipsisLoc(), OrigNumExpansions);
3711         if (Out.isInvalid())
3712           return true;
3713 
3714         Outputs.push_back(Out.get());
3715       }
3716 
3717       continue;
3718     }
3719 
3720     ExprResult Result =
3721       IsCall ? getDerived().TransformInitializer(Inputs[I], /*DirectInit*/false)
3722              : getDerived().TransformExpr(Inputs[I]);
3723     if (Result.isInvalid())
3724       return true;
3725 
3726     if (Result.get() != Inputs[I] && ArgChanged)
3727       *ArgChanged = true;
3728 
3729     Outputs.push_back(Result.get());
3730   }
3731 
3732   return false;
3733 }
3734 
3735 template <typename Derived>
3736 Sema::ConditionResult TreeTransform<Derived>::TransformCondition(
3737     SourceLocation Loc, VarDecl *Var, Expr *Expr, Sema::ConditionKind Kind) {
3738   if (Var) {
3739     VarDecl *ConditionVar = cast_or_null<VarDecl>(
3740         getDerived().TransformDefinition(Var->getLocation(), Var));
3741 
3742     if (!ConditionVar)
3743       return Sema::ConditionError();
3744 
3745     return getSema().ActOnConditionVariable(ConditionVar, Loc, Kind);
3746   }
3747 
3748   if (Expr) {
3749     ExprResult CondExpr = getDerived().TransformExpr(Expr);
3750 
3751     if (CondExpr.isInvalid())
3752       return Sema::ConditionError();
3753 
3754     return getSema().ActOnCondition(nullptr, Loc, CondExpr.get(), Kind);
3755   }
3756 
3757   return Sema::ConditionResult();
3758 }
3759 
3760 template<typename Derived>
3761 NestedNameSpecifierLoc
3762 TreeTransform<Derived>::TransformNestedNameSpecifierLoc(
3763                                                     NestedNameSpecifierLoc NNS,
3764                                                      QualType ObjectType,
3765                                              NamedDecl *FirstQualifierInScope) {
3766   SmallVector<NestedNameSpecifierLoc, 4> Qualifiers;
3767   for (NestedNameSpecifierLoc Qualifier = NNS; Qualifier;
3768        Qualifier = Qualifier.getPrefix())
3769     Qualifiers.push_back(Qualifier);
3770 
3771   CXXScopeSpec SS;
3772   while (!Qualifiers.empty()) {
3773     NestedNameSpecifierLoc Q = Qualifiers.pop_back_val();
3774     NestedNameSpecifier *QNNS = Q.getNestedNameSpecifier();
3775 
3776     switch (QNNS->getKind()) {
3777     case NestedNameSpecifier::Identifier: {
3778       Sema::NestedNameSpecInfo IdInfo(QNNS->getAsIdentifier(),
3779                           Q.getLocalBeginLoc(), Q.getLocalEndLoc(), ObjectType);
3780       if (SemaRef.BuildCXXNestedNameSpecifier(/*Scope=*/nullptr, IdInfo, false,
3781                                               SS, FirstQualifierInScope, false))
3782         return NestedNameSpecifierLoc();
3783     }
3784       break;
3785 
3786     case NestedNameSpecifier::Namespace: {
3787       NamespaceDecl *NS
3788         = cast_or_null<NamespaceDecl>(
3789                                     getDerived().TransformDecl(
3790                                                           Q.getLocalBeginLoc(),
3791                                                        QNNS->getAsNamespace()));
3792       SS.Extend(SemaRef.Context, NS, Q.getLocalBeginLoc(), Q.getLocalEndLoc());
3793       break;
3794     }
3795 
3796     case NestedNameSpecifier::NamespaceAlias: {
3797       NamespaceAliasDecl *Alias
3798         = cast_or_null<NamespaceAliasDecl>(
3799                       getDerived().TransformDecl(Q.getLocalBeginLoc(),
3800                                                  QNNS->getAsNamespaceAlias()));
3801       SS.Extend(SemaRef.Context, Alias, Q.getLocalBeginLoc(),
3802                 Q.getLocalEndLoc());
3803       break;
3804     }
3805 
3806     case NestedNameSpecifier::Global:
3807       // There is no meaningful transformation that one could perform on the
3808       // global scope.
3809       SS.MakeGlobal(SemaRef.Context, Q.getBeginLoc());
3810       break;
3811 
3812     case NestedNameSpecifier::Super: {
3813       CXXRecordDecl *RD =
3814           cast_or_null<CXXRecordDecl>(getDerived().TransformDecl(
3815               SourceLocation(), QNNS->getAsRecordDecl()));
3816       SS.MakeSuper(SemaRef.Context, RD, Q.getBeginLoc(), Q.getEndLoc());
3817       break;
3818     }
3819 
3820     case NestedNameSpecifier::TypeSpecWithTemplate:
3821     case NestedNameSpecifier::TypeSpec: {
3822       TypeLoc TL = TransformTypeInObjectScope(Q.getTypeLoc(), ObjectType,
3823                                               FirstQualifierInScope, SS);
3824 
3825       if (!TL)
3826         return NestedNameSpecifierLoc();
3827 
3828       if (TL.getType()->isDependentType() || TL.getType()->isRecordType() ||
3829           (SemaRef.getLangOpts().CPlusPlus11 &&
3830            TL.getType()->isEnumeralType())) {
3831         assert(!TL.getType().hasLocalQualifiers() &&
3832                "Can't get cv-qualifiers here");
3833         if (TL.getType()->isEnumeralType())
3834           SemaRef.Diag(TL.getBeginLoc(),
3835                        diag::warn_cxx98_compat_enum_nested_name_spec);
3836         SS.Extend(SemaRef.Context, /*FIXME:*/SourceLocation(), TL,
3837                   Q.getLocalEndLoc());
3838         break;
3839       }
3840       // If the nested-name-specifier is an invalid type def, don't emit an
3841       // error because a previous error should have already been emitted.
3842       TypedefTypeLoc TTL = TL.getAs<TypedefTypeLoc>();
3843       if (!TTL || !TTL.getTypedefNameDecl()->isInvalidDecl()) {
3844         SemaRef.Diag(TL.getBeginLoc(), diag::err_nested_name_spec_non_tag)
3845           << TL.getType() << SS.getRange();
3846       }
3847       return NestedNameSpecifierLoc();
3848     }
3849     }
3850 
3851     // The qualifier-in-scope and object type only apply to the leftmost entity.
3852     FirstQualifierInScope = nullptr;
3853     ObjectType = QualType();
3854   }
3855 
3856   // Don't rebuild the nested-name-specifier if we don't have to.
3857   if (SS.getScopeRep() == NNS.getNestedNameSpecifier() &&
3858       !getDerived().AlwaysRebuild())
3859     return NNS;
3860 
3861   // If we can re-use the source-location data from the original
3862   // nested-name-specifier, do so.
3863   if (SS.location_size() == NNS.getDataLength() &&
3864       memcmp(SS.location_data(), NNS.getOpaqueData(), SS.location_size()) == 0)
3865     return NestedNameSpecifierLoc(SS.getScopeRep(), NNS.getOpaqueData());
3866 
3867   // Allocate new nested-name-specifier location information.
3868   return SS.getWithLocInContext(SemaRef.Context);
3869 }
3870 
3871 template<typename Derived>
3872 DeclarationNameInfo
3873 TreeTransform<Derived>
3874 ::TransformDeclarationNameInfo(const DeclarationNameInfo &NameInfo) {
3875   DeclarationName Name = NameInfo.getName();
3876   if (!Name)
3877     return DeclarationNameInfo();
3878 
3879   switch (Name.getNameKind()) {
3880   case DeclarationName::Identifier:
3881   case DeclarationName::ObjCZeroArgSelector:
3882   case DeclarationName::ObjCOneArgSelector:
3883   case DeclarationName::ObjCMultiArgSelector:
3884   case DeclarationName::CXXOperatorName:
3885   case DeclarationName::CXXLiteralOperatorName:
3886   case DeclarationName::CXXUsingDirective:
3887     return NameInfo;
3888 
3889   case DeclarationName::CXXDeductionGuideName: {
3890     TemplateDecl *OldTemplate = Name.getCXXDeductionGuideTemplate();
3891     TemplateDecl *NewTemplate = cast_or_null<TemplateDecl>(
3892         getDerived().TransformDecl(NameInfo.getLoc(), OldTemplate));
3893     if (!NewTemplate)
3894       return DeclarationNameInfo();
3895 
3896     DeclarationNameInfo NewNameInfo(NameInfo);
3897     NewNameInfo.setName(
3898         SemaRef.Context.DeclarationNames.getCXXDeductionGuideName(NewTemplate));
3899     return NewNameInfo;
3900   }
3901 
3902   case DeclarationName::CXXConstructorName:
3903   case DeclarationName::CXXDestructorName:
3904   case DeclarationName::CXXConversionFunctionName: {
3905     TypeSourceInfo *NewTInfo;
3906     CanQualType NewCanTy;
3907     if (TypeSourceInfo *OldTInfo = NameInfo.getNamedTypeInfo()) {
3908       NewTInfo = getDerived().TransformType(OldTInfo);
3909       if (!NewTInfo)
3910         return DeclarationNameInfo();
3911       NewCanTy = SemaRef.Context.getCanonicalType(NewTInfo->getType());
3912     }
3913     else {
3914       NewTInfo = nullptr;
3915       TemporaryBase Rebase(*this, NameInfo.getLoc(), Name);
3916       QualType NewT = getDerived().TransformType(Name.getCXXNameType());
3917       if (NewT.isNull())
3918         return DeclarationNameInfo();
3919       NewCanTy = SemaRef.Context.getCanonicalType(NewT);
3920     }
3921 
3922     DeclarationName NewName
3923       = SemaRef.Context.DeclarationNames.getCXXSpecialName(Name.getNameKind(),
3924                                                            NewCanTy);
3925     DeclarationNameInfo NewNameInfo(NameInfo);
3926     NewNameInfo.setName(NewName);
3927     NewNameInfo.setNamedTypeInfo(NewTInfo);
3928     return NewNameInfo;
3929   }
3930   }
3931 
3932   llvm_unreachable("Unknown name kind.");
3933 }
3934 
3935 template<typename Derived>
3936 TemplateName
3937 TreeTransform<Derived>::TransformTemplateName(CXXScopeSpec &SS,
3938                                               TemplateName Name,
3939                                               SourceLocation NameLoc,
3940                                               QualType ObjectType,
3941                                               NamedDecl *FirstQualifierInScope,
3942                                               bool AllowInjectedClassName) {
3943   if (QualifiedTemplateName *QTN = Name.getAsQualifiedTemplateName()) {
3944     TemplateDecl *Template = QTN->getTemplateDecl();
3945     assert(Template && "qualified template name must refer to a template");
3946 
3947     TemplateDecl *TransTemplate
3948       = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc,
3949                                                               Template));
3950     if (!TransTemplate)
3951       return TemplateName();
3952 
3953     if (!getDerived().AlwaysRebuild() &&
3954         SS.getScopeRep() == QTN->getQualifier() &&
3955         TransTemplate == Template)
3956       return Name;
3957 
3958     return getDerived().RebuildTemplateName(SS, QTN->hasTemplateKeyword(),
3959                                             TransTemplate);
3960   }
3961 
3962   if (DependentTemplateName *DTN = Name.getAsDependentTemplateName()) {
3963     if (SS.getScopeRep()) {
3964       // These apply to the scope specifier, not the template.
3965       ObjectType = QualType();
3966       FirstQualifierInScope = nullptr;
3967     }
3968 
3969     if (!getDerived().AlwaysRebuild() &&
3970         SS.getScopeRep() == DTN->getQualifier() &&
3971         ObjectType.isNull())
3972       return Name;
3973 
3974     // FIXME: Preserve the location of the "template" keyword.
3975     SourceLocation TemplateKWLoc = NameLoc;
3976 
3977     if (DTN->isIdentifier()) {
3978       return getDerived().RebuildTemplateName(SS,
3979                                               TemplateKWLoc,
3980                                               *DTN->getIdentifier(),
3981                                               NameLoc,
3982                                               ObjectType,
3983                                               FirstQualifierInScope,
3984                                               AllowInjectedClassName);
3985     }
3986 
3987     return getDerived().RebuildTemplateName(SS, TemplateKWLoc,
3988                                             DTN->getOperator(), NameLoc,
3989                                             ObjectType, AllowInjectedClassName);
3990   }
3991 
3992   if (TemplateDecl *Template = Name.getAsTemplateDecl()) {
3993     TemplateDecl *TransTemplate
3994       = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc,
3995                                                               Template));
3996     if (!TransTemplate)
3997       return TemplateName();
3998 
3999     if (!getDerived().AlwaysRebuild() &&
4000         TransTemplate == Template)
4001       return Name;
4002 
4003     return TemplateName(TransTemplate);
4004   }
4005 
4006   if (SubstTemplateTemplateParmPackStorage *SubstPack
4007       = Name.getAsSubstTemplateTemplateParmPack()) {
4008     TemplateTemplateParmDecl *TransParam
4009     = cast_or_null<TemplateTemplateParmDecl>(
4010             getDerived().TransformDecl(NameLoc, SubstPack->getParameterPack()));
4011     if (!TransParam)
4012       return TemplateName();
4013 
4014     if (!getDerived().AlwaysRebuild() &&
4015         TransParam == SubstPack->getParameterPack())
4016       return Name;
4017 
4018     return getDerived().RebuildTemplateName(TransParam,
4019                                             SubstPack->getArgumentPack());
4020   }
4021 
4022   // These should be getting filtered out before they reach the AST.
4023   llvm_unreachable("overloaded function decl survived to here");
4024 }
4025 
4026 template<typename Derived>
4027 void TreeTransform<Derived>::InventTemplateArgumentLoc(
4028                                          const TemplateArgument &Arg,
4029                                          TemplateArgumentLoc &Output) {
4030   SourceLocation Loc = getDerived().getBaseLocation();
4031   switch (Arg.getKind()) {
4032   case TemplateArgument::Null:
4033     llvm_unreachable("null template argument in TreeTransform");
4034     break;
4035 
4036   case TemplateArgument::Type:
4037     Output = TemplateArgumentLoc(Arg,
4038                SemaRef.Context.getTrivialTypeSourceInfo(Arg.getAsType(), Loc));
4039 
4040     break;
4041 
4042   case TemplateArgument::Template:
4043   case TemplateArgument::TemplateExpansion: {
4044     NestedNameSpecifierLocBuilder Builder;
4045     TemplateName Template = Arg.getAsTemplateOrTemplatePattern();
4046     if (DependentTemplateName *DTN = Template.getAsDependentTemplateName())
4047       Builder.MakeTrivial(SemaRef.Context, DTN->getQualifier(), Loc);
4048     else if (QualifiedTemplateName *QTN = Template.getAsQualifiedTemplateName())
4049       Builder.MakeTrivial(SemaRef.Context, QTN->getQualifier(), Loc);
4050 
4051     if (Arg.getKind() == TemplateArgument::Template)
4052       Output = TemplateArgumentLoc(Arg,
4053                                    Builder.getWithLocInContext(SemaRef.Context),
4054                                    Loc);
4055     else
4056       Output = TemplateArgumentLoc(Arg,
4057                                    Builder.getWithLocInContext(SemaRef.Context),
4058                                    Loc, Loc);
4059 
4060     break;
4061   }
4062 
4063   case TemplateArgument::Expression:
4064     Output = TemplateArgumentLoc(Arg, Arg.getAsExpr());
4065     break;
4066 
4067   case TemplateArgument::Declaration:
4068   case TemplateArgument::Integral:
4069   case TemplateArgument::Pack:
4070   case TemplateArgument::NullPtr:
4071     Output = TemplateArgumentLoc(Arg, TemplateArgumentLocInfo());
4072     break;
4073   }
4074 }
4075 
4076 template<typename Derived>
4077 bool TreeTransform<Derived>::TransformTemplateArgument(
4078                                          const TemplateArgumentLoc &Input,
4079                                          TemplateArgumentLoc &Output, bool Uneval) {
4080   const TemplateArgument &Arg = Input.getArgument();
4081   switch (Arg.getKind()) {
4082   case TemplateArgument::Null:
4083   case TemplateArgument::Integral:
4084   case TemplateArgument::Pack:
4085   case TemplateArgument::Declaration:
4086   case TemplateArgument::NullPtr:
4087     llvm_unreachable("Unexpected TemplateArgument");
4088 
4089   case TemplateArgument::Type: {
4090     TypeSourceInfo *DI = Input.getTypeSourceInfo();
4091     if (!DI)
4092       DI = InventTypeSourceInfo(Input.getArgument().getAsType());
4093 
4094     DI = getDerived().TransformType(DI);
4095     if (!DI) return true;
4096 
4097     Output = TemplateArgumentLoc(TemplateArgument(DI->getType()), DI);
4098     return false;
4099   }
4100 
4101   case TemplateArgument::Template: {
4102     NestedNameSpecifierLoc QualifierLoc = Input.getTemplateQualifierLoc();
4103     if (QualifierLoc) {
4104       QualifierLoc = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc);
4105       if (!QualifierLoc)
4106         return true;
4107     }
4108 
4109     CXXScopeSpec SS;
4110     SS.Adopt(QualifierLoc);
4111     TemplateName Template
4112       = getDerived().TransformTemplateName(SS, Arg.getAsTemplate(),
4113                                            Input.getTemplateNameLoc());
4114     if (Template.isNull())
4115       return true;
4116 
4117     Output = TemplateArgumentLoc(TemplateArgument(Template), QualifierLoc,
4118                                  Input.getTemplateNameLoc());
4119     return false;
4120   }
4121 
4122   case TemplateArgument::TemplateExpansion:
4123     llvm_unreachable("Caller should expand pack expansions");
4124 
4125   case TemplateArgument::Expression: {
4126     // Template argument expressions are constant expressions.
4127     EnterExpressionEvaluationContext Unevaluated(
4128         getSema(),
4129         Uneval ? Sema::ExpressionEvaluationContext::Unevaluated
4130                : Sema::ExpressionEvaluationContext::ConstantEvaluated,
4131         /*LambdaContextDecl=*/nullptr, /*ExprContext=*/
4132         Sema::ExpressionEvaluationContextRecord::EK_TemplateArgument);
4133 
4134     Expr *InputExpr = Input.getSourceExpression();
4135     if (!InputExpr) InputExpr = Input.getArgument().getAsExpr();
4136 
4137     ExprResult E = getDerived().TransformExpr(InputExpr);
4138     E = SemaRef.ActOnConstantExpression(E);
4139     if (E.isInvalid()) return true;
4140     Output = TemplateArgumentLoc(TemplateArgument(E.get()), E.get());
4141     return false;
4142   }
4143   }
4144 
4145   // Work around bogus GCC warning
4146   return true;
4147 }
4148 
4149 /// Iterator adaptor that invents template argument location information
4150 /// for each of the template arguments in its underlying iterator.
4151 template<typename Derived, typename InputIterator>
4152 class TemplateArgumentLocInventIterator {
4153   TreeTransform<Derived> &Self;
4154   InputIterator Iter;
4155 
4156 public:
4157   typedef TemplateArgumentLoc value_type;
4158   typedef TemplateArgumentLoc reference;
4159   typedef typename std::iterator_traits<InputIterator>::difference_type
4160     difference_type;
4161   typedef std::input_iterator_tag iterator_category;
4162 
4163   class pointer {
4164     TemplateArgumentLoc Arg;
4165 
4166   public:
4167     explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { }
4168 
4169     const TemplateArgumentLoc *operator->() const { return &Arg; }
4170   };
4171 
4172   TemplateArgumentLocInventIterator() { }
4173 
4174   explicit TemplateArgumentLocInventIterator(TreeTransform<Derived> &Self,
4175                                              InputIterator Iter)
4176     : Self(Self), Iter(Iter) { }
4177 
4178   TemplateArgumentLocInventIterator &operator++() {
4179     ++Iter;
4180     return *this;
4181   }
4182 
4183   TemplateArgumentLocInventIterator operator++(int) {
4184     TemplateArgumentLocInventIterator Old(*this);
4185     ++(*this);
4186     return Old;
4187   }
4188 
4189   reference operator*() const {
4190     TemplateArgumentLoc Result;
4191     Self.InventTemplateArgumentLoc(*Iter, Result);
4192     return Result;
4193   }
4194 
4195   pointer operator->() const { return pointer(**this); }
4196 
4197   friend bool operator==(const TemplateArgumentLocInventIterator &X,
4198                          const TemplateArgumentLocInventIterator &Y) {
4199     return X.Iter == Y.Iter;
4200   }
4201 
4202   friend bool operator!=(const TemplateArgumentLocInventIterator &X,
4203                          const TemplateArgumentLocInventIterator &Y) {
4204     return X.Iter != Y.Iter;
4205   }
4206 };
4207 
4208 template<typename Derived>
4209 template<typename InputIterator>
4210 bool TreeTransform<Derived>::TransformTemplateArguments(
4211     InputIterator First, InputIterator Last, TemplateArgumentListInfo &Outputs,
4212     bool Uneval) {
4213   for (; First != Last; ++First) {
4214     TemplateArgumentLoc Out;
4215     TemplateArgumentLoc In = *First;
4216 
4217     if (In.getArgument().getKind() == TemplateArgument::Pack) {
4218       // Unpack argument packs, which we translate them into separate
4219       // arguments.
4220       // FIXME: We could do much better if we could guarantee that the
4221       // TemplateArgumentLocInfo for the pack expansion would be usable for
4222       // all of the template arguments in the argument pack.
4223       typedef TemplateArgumentLocInventIterator<Derived,
4224                                                 TemplateArgument::pack_iterator>
4225         PackLocIterator;
4226       if (TransformTemplateArguments(PackLocIterator(*this,
4227                                                  In.getArgument().pack_begin()),
4228                                      PackLocIterator(*this,
4229                                                    In.getArgument().pack_end()),
4230                                      Outputs, Uneval))
4231         return true;
4232 
4233       continue;
4234     }
4235 
4236     if (In.getArgument().isPackExpansion()) {
4237       // We have a pack expansion, for which we will be substituting into
4238       // the pattern.
4239       SourceLocation Ellipsis;
4240       Optional<unsigned> OrigNumExpansions;
4241       TemplateArgumentLoc Pattern
4242         = getSema().getTemplateArgumentPackExpansionPattern(
4243               In, Ellipsis, OrigNumExpansions);
4244 
4245       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
4246       getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
4247       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
4248 
4249       // Determine whether the set of unexpanded parameter packs can and should
4250       // be expanded.
4251       bool Expand = true;
4252       bool RetainExpansion = false;
4253       Optional<unsigned> NumExpansions = OrigNumExpansions;
4254       if (getDerived().TryExpandParameterPacks(Ellipsis,
4255                                                Pattern.getSourceRange(),
4256                                                Unexpanded,
4257                                                Expand,
4258                                                RetainExpansion,
4259                                                NumExpansions))
4260         return true;
4261 
4262       if (!Expand) {
4263         // The transform has determined that we should perform a simple
4264         // transformation on the pack expansion, producing another pack
4265         // expansion.
4266         TemplateArgumentLoc OutPattern;
4267         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
4268         if (getDerived().TransformTemplateArgument(Pattern, OutPattern, Uneval))
4269           return true;
4270 
4271         Out = getDerived().RebuildPackExpansion(OutPattern, Ellipsis,
4272                                                 NumExpansions);
4273         if (Out.getArgument().isNull())
4274           return true;
4275 
4276         Outputs.addArgument(Out);
4277         continue;
4278       }
4279 
4280       // The transform has determined that we should perform an elementwise
4281       // expansion of the pattern. Do so.
4282       for (unsigned I = 0; I != *NumExpansions; ++I) {
4283         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
4284 
4285         if (getDerived().TransformTemplateArgument(Pattern, Out, Uneval))
4286           return true;
4287 
4288         if (Out.getArgument().containsUnexpandedParameterPack()) {
4289           Out = getDerived().RebuildPackExpansion(Out, Ellipsis,
4290                                                   OrigNumExpansions);
4291           if (Out.getArgument().isNull())
4292             return true;
4293         }
4294 
4295         Outputs.addArgument(Out);
4296       }
4297 
4298       // If we're supposed to retain a pack expansion, do so by temporarily
4299       // forgetting the partially-substituted parameter pack.
4300       if (RetainExpansion) {
4301         ForgetPartiallySubstitutedPackRAII Forget(getDerived());
4302 
4303         if (getDerived().TransformTemplateArgument(Pattern, Out, Uneval))
4304           return true;
4305 
4306         Out = getDerived().RebuildPackExpansion(Out, Ellipsis,
4307                                                 OrigNumExpansions);
4308         if (Out.getArgument().isNull())
4309           return true;
4310 
4311         Outputs.addArgument(Out);
4312       }
4313 
4314       continue;
4315     }
4316 
4317     // The simple case:
4318     if (getDerived().TransformTemplateArgument(In, Out, Uneval))
4319       return true;
4320 
4321     Outputs.addArgument(Out);
4322   }
4323 
4324   return false;
4325 
4326 }
4327 
4328 //===----------------------------------------------------------------------===//
4329 // Type transformation
4330 //===----------------------------------------------------------------------===//
4331 
4332 template<typename Derived>
4333 QualType TreeTransform<Derived>::TransformType(QualType T) {
4334   if (getDerived().AlreadyTransformed(T))
4335     return T;
4336 
4337   // Temporary workaround.  All of these transformations should
4338   // eventually turn into transformations on TypeLocs.
4339   TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(T,
4340                                                 getDerived().getBaseLocation());
4341 
4342   TypeSourceInfo *NewDI = getDerived().TransformType(DI);
4343 
4344   if (!NewDI)
4345     return QualType();
4346 
4347   return NewDI->getType();
4348 }
4349 
4350 template<typename Derived>
4351 TypeSourceInfo *TreeTransform<Derived>::TransformType(TypeSourceInfo *DI) {
4352   // Refine the base location to the type's location.
4353   TemporaryBase Rebase(*this, DI->getTypeLoc().getBeginLoc(),
4354                        getDerived().getBaseEntity());
4355   if (getDerived().AlreadyTransformed(DI->getType()))
4356     return DI;
4357 
4358   TypeLocBuilder TLB;
4359 
4360   TypeLoc TL = DI->getTypeLoc();
4361   TLB.reserve(TL.getFullDataSize());
4362 
4363   QualType Result = getDerived().TransformType(TLB, TL);
4364   if (Result.isNull())
4365     return nullptr;
4366 
4367   return TLB.getTypeSourceInfo(SemaRef.Context, Result);
4368 }
4369 
4370 template<typename Derived>
4371 QualType
4372 TreeTransform<Derived>::TransformType(TypeLocBuilder &TLB, TypeLoc T) {
4373   switch (T.getTypeLocClass()) {
4374 #define ABSTRACT_TYPELOC(CLASS, PARENT)
4375 #define TYPELOC(CLASS, PARENT)                                                 \
4376   case TypeLoc::CLASS:                                                         \
4377     return getDerived().Transform##CLASS##Type(TLB,                            \
4378                                                T.castAs<CLASS##TypeLoc>());
4379 #include "clang/AST/TypeLocNodes.def"
4380   }
4381 
4382   llvm_unreachable("unhandled type loc!");
4383 }
4384 
4385 template<typename Derived>
4386 QualType TreeTransform<Derived>::TransformTypeWithDeducedTST(QualType T) {
4387   if (!isa<DependentNameType>(T))
4388     return TransformType(T);
4389 
4390   if (getDerived().AlreadyTransformed(T))
4391     return T;
4392   TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(T,
4393                                                 getDerived().getBaseLocation());
4394   TypeSourceInfo *NewDI = getDerived().TransformTypeWithDeducedTST(DI);
4395   return NewDI ? NewDI->getType() : QualType();
4396 }
4397 
4398 template<typename Derived>
4399 TypeSourceInfo *
4400 TreeTransform<Derived>::TransformTypeWithDeducedTST(TypeSourceInfo *DI) {
4401   if (!isa<DependentNameType>(DI->getType()))
4402     return TransformType(DI);
4403 
4404   // Refine the base location to the type's location.
4405   TemporaryBase Rebase(*this, DI->getTypeLoc().getBeginLoc(),
4406                        getDerived().getBaseEntity());
4407   if (getDerived().AlreadyTransformed(DI->getType()))
4408     return DI;
4409 
4410   TypeLocBuilder TLB;
4411 
4412   TypeLoc TL = DI->getTypeLoc();
4413   TLB.reserve(TL.getFullDataSize());
4414 
4415   auto QTL = TL.getAs<QualifiedTypeLoc>();
4416   if (QTL)
4417     TL = QTL.getUnqualifiedLoc();
4418 
4419   auto DNTL = TL.castAs<DependentNameTypeLoc>();
4420 
4421   QualType Result = getDerived().TransformDependentNameType(
4422       TLB, DNTL, /*DeducedTSTContext*/true);
4423   if (Result.isNull())
4424     return nullptr;
4425 
4426   if (QTL) {
4427     Result = getDerived().RebuildQualifiedType(Result, QTL);
4428     if (Result.isNull())
4429       return nullptr;
4430     TLB.TypeWasModifiedSafely(Result);
4431   }
4432 
4433   return TLB.getTypeSourceInfo(SemaRef.Context, Result);
4434 }
4435 
4436 template<typename Derived>
4437 QualType
4438 TreeTransform<Derived>::TransformQualifiedType(TypeLocBuilder &TLB,
4439                                                QualifiedTypeLoc T) {
4440   QualType Result = getDerived().TransformType(TLB, T.getUnqualifiedLoc());
4441   if (Result.isNull())
4442     return QualType();
4443 
4444   Result = getDerived().RebuildQualifiedType(Result, T);
4445 
4446   if (Result.isNull())
4447     return QualType();
4448 
4449   // RebuildQualifiedType might have updated the type, but not in a way
4450   // that invalidates the TypeLoc. (There's no location information for
4451   // qualifiers.)
4452   TLB.TypeWasModifiedSafely(Result);
4453 
4454   return Result;
4455 }
4456 
4457 template <typename Derived>
4458 QualType TreeTransform<Derived>::RebuildQualifiedType(QualType T,
4459                                                       QualifiedTypeLoc TL) {
4460 
4461   SourceLocation Loc = TL.getBeginLoc();
4462   Qualifiers Quals = TL.getType().getLocalQualifiers();
4463 
4464   if (((T.getAddressSpace() != LangAS::Default &&
4465         Quals.getAddressSpace() != LangAS::Default)) &&
4466       T.getAddressSpace() != Quals.getAddressSpace()) {
4467     SemaRef.Diag(Loc, diag::err_address_space_mismatch_templ_inst)
4468         << TL.getType() << T;
4469     return QualType();
4470   }
4471 
4472   // C++ [dcl.fct]p7:
4473   //   [When] adding cv-qualifications on top of the function type [...] the
4474   //   cv-qualifiers are ignored.
4475   if (T->isFunctionType()) {
4476     T = SemaRef.getASTContext().getAddrSpaceQualType(T,
4477                                                      Quals.getAddressSpace());
4478     return T;
4479   }
4480 
4481   // C++ [dcl.ref]p1:
4482   //   when the cv-qualifiers are introduced through the use of a typedef-name
4483   //   or decltype-specifier [...] the cv-qualifiers are ignored.
4484   // Note that [dcl.ref]p1 lists all cases in which cv-qualifiers can be
4485   // applied to a reference type.
4486   if (T->isReferenceType()) {
4487     // The only qualifier that applies to a reference type is restrict.
4488     if (!Quals.hasRestrict())
4489       return T;
4490     Quals = Qualifiers::fromCVRMask(Qualifiers::Restrict);
4491   }
4492 
4493   // Suppress Objective-C lifetime qualifiers if they don't make sense for the
4494   // resulting type.
4495   if (Quals.hasObjCLifetime()) {
4496     if (!T->isObjCLifetimeType() && !T->isDependentType())
4497       Quals.removeObjCLifetime();
4498     else if (T.getObjCLifetime()) {
4499       // Objective-C ARC:
4500       //   A lifetime qualifier applied to a substituted template parameter
4501       //   overrides the lifetime qualifier from the template argument.
4502       const AutoType *AutoTy;
4503       if (const SubstTemplateTypeParmType *SubstTypeParam
4504                                 = dyn_cast<SubstTemplateTypeParmType>(T)) {
4505         QualType Replacement = SubstTypeParam->getReplacementType();
4506         Qualifiers Qs = Replacement.getQualifiers();
4507         Qs.removeObjCLifetime();
4508         Replacement = SemaRef.Context.getQualifiedType(
4509             Replacement.getUnqualifiedType(), Qs);
4510         T = SemaRef.Context.getSubstTemplateTypeParmType(
4511             SubstTypeParam->getReplacedParameter(), Replacement);
4512       } else if ((AutoTy = dyn_cast<AutoType>(T)) && AutoTy->isDeduced()) {
4513         // 'auto' types behave the same way as template parameters.
4514         QualType Deduced = AutoTy->getDeducedType();
4515         Qualifiers Qs = Deduced.getQualifiers();
4516         Qs.removeObjCLifetime();
4517         Deduced =
4518             SemaRef.Context.getQualifiedType(Deduced.getUnqualifiedType(), Qs);
4519         T = SemaRef.Context.getAutoType(Deduced, AutoTy->getKeyword(),
4520                                         AutoTy->isDependentType(),
4521                                         /*isPack=*/false,
4522                                         AutoTy->getTypeConstraintConcept(),
4523                                         AutoTy->getTypeConstraintArguments());
4524       } else {
4525         // Otherwise, complain about the addition of a qualifier to an
4526         // already-qualified type.
4527         // FIXME: Why is this check not in Sema::BuildQualifiedType?
4528         SemaRef.Diag(Loc, diag::err_attr_objc_ownership_redundant) << T;
4529         Quals.removeObjCLifetime();
4530       }
4531     }
4532   }
4533 
4534   return SemaRef.BuildQualifiedType(T, Loc, Quals);
4535 }
4536 
4537 template<typename Derived>
4538 TypeLoc
4539 TreeTransform<Derived>::TransformTypeInObjectScope(TypeLoc TL,
4540                                                    QualType ObjectType,
4541                                                    NamedDecl *UnqualLookup,
4542                                                    CXXScopeSpec &SS) {
4543   if (getDerived().AlreadyTransformed(TL.getType()))
4544     return TL;
4545 
4546   TypeSourceInfo *TSI =
4547       TransformTSIInObjectScope(TL, ObjectType, UnqualLookup, SS);
4548   if (TSI)
4549     return TSI->getTypeLoc();
4550   return TypeLoc();
4551 }
4552 
4553 template<typename Derived>
4554 TypeSourceInfo *
4555 TreeTransform<Derived>::TransformTypeInObjectScope(TypeSourceInfo *TSInfo,
4556                                                    QualType ObjectType,
4557                                                    NamedDecl *UnqualLookup,
4558                                                    CXXScopeSpec &SS) {
4559   if (getDerived().AlreadyTransformed(TSInfo->getType()))
4560     return TSInfo;
4561 
4562   return TransformTSIInObjectScope(TSInfo->getTypeLoc(), ObjectType,
4563                                    UnqualLookup, SS);
4564 }
4565 
4566 template <typename Derived>
4567 TypeSourceInfo *TreeTransform<Derived>::TransformTSIInObjectScope(
4568     TypeLoc TL, QualType ObjectType, NamedDecl *UnqualLookup,
4569     CXXScopeSpec &SS) {
4570   QualType T = TL.getType();
4571   assert(!getDerived().AlreadyTransformed(T));
4572 
4573   TypeLocBuilder TLB;
4574   QualType Result;
4575 
4576   if (isa<TemplateSpecializationType>(T)) {
4577     TemplateSpecializationTypeLoc SpecTL =
4578         TL.castAs<TemplateSpecializationTypeLoc>();
4579 
4580     TemplateName Template = getDerived().TransformTemplateName(
4581         SS, SpecTL.getTypePtr()->getTemplateName(), SpecTL.getTemplateNameLoc(),
4582         ObjectType, UnqualLookup, /*AllowInjectedClassName*/true);
4583     if (Template.isNull())
4584       return nullptr;
4585 
4586     Result = getDerived().TransformTemplateSpecializationType(TLB, SpecTL,
4587                                                               Template);
4588   } else if (isa<DependentTemplateSpecializationType>(T)) {
4589     DependentTemplateSpecializationTypeLoc SpecTL =
4590         TL.castAs<DependentTemplateSpecializationTypeLoc>();
4591 
4592     TemplateName Template
4593       = getDerived().RebuildTemplateName(SS,
4594                                          SpecTL.getTemplateKeywordLoc(),
4595                                          *SpecTL.getTypePtr()->getIdentifier(),
4596                                          SpecTL.getTemplateNameLoc(),
4597                                          ObjectType, UnqualLookup,
4598                                          /*AllowInjectedClassName*/true);
4599     if (Template.isNull())
4600       return nullptr;
4601 
4602     Result = getDerived().TransformDependentTemplateSpecializationType(TLB,
4603                                                                        SpecTL,
4604                                                                        Template,
4605                                                                        SS);
4606   } else {
4607     // Nothing special needs to be done for these.
4608     Result = getDerived().TransformType(TLB, TL);
4609   }
4610 
4611   if (Result.isNull())
4612     return nullptr;
4613 
4614   return TLB.getTypeSourceInfo(SemaRef.Context, Result);
4615 }
4616 
4617 template <class TyLoc> static inline
4618 QualType TransformTypeSpecType(TypeLocBuilder &TLB, TyLoc T) {
4619   TyLoc NewT = TLB.push<TyLoc>(T.getType());
4620   NewT.setNameLoc(T.getNameLoc());
4621   return T.getType();
4622 }
4623 
4624 template<typename Derived>
4625 QualType TreeTransform<Derived>::TransformBuiltinType(TypeLocBuilder &TLB,
4626                                                       BuiltinTypeLoc T) {
4627   BuiltinTypeLoc NewT = TLB.push<BuiltinTypeLoc>(T.getType());
4628   NewT.setBuiltinLoc(T.getBuiltinLoc());
4629   if (T.needsExtraLocalData())
4630     NewT.getWrittenBuiltinSpecs() = T.getWrittenBuiltinSpecs();
4631   return T.getType();
4632 }
4633 
4634 template<typename Derived>
4635 QualType TreeTransform<Derived>::TransformComplexType(TypeLocBuilder &TLB,
4636                                                       ComplexTypeLoc T) {
4637   // FIXME: recurse?
4638   return TransformTypeSpecType(TLB, T);
4639 }
4640 
4641 template <typename Derived>
4642 QualType TreeTransform<Derived>::TransformAdjustedType(TypeLocBuilder &TLB,
4643                                                        AdjustedTypeLoc TL) {
4644   // Adjustments applied during transformation are handled elsewhere.
4645   return getDerived().TransformType(TLB, TL.getOriginalLoc());
4646 }
4647 
4648 template<typename Derived>
4649 QualType TreeTransform<Derived>::TransformDecayedType(TypeLocBuilder &TLB,
4650                                                       DecayedTypeLoc TL) {
4651   QualType OriginalType = getDerived().TransformType(TLB, TL.getOriginalLoc());
4652   if (OriginalType.isNull())
4653     return QualType();
4654 
4655   QualType Result = TL.getType();
4656   if (getDerived().AlwaysRebuild() ||
4657       OriginalType != TL.getOriginalLoc().getType())
4658     Result = SemaRef.Context.getDecayedType(OriginalType);
4659   TLB.push<DecayedTypeLoc>(Result);
4660   // Nothing to set for DecayedTypeLoc.
4661   return Result;
4662 }
4663 
4664 template<typename Derived>
4665 QualType TreeTransform<Derived>::TransformPointerType(TypeLocBuilder &TLB,
4666                                                       PointerTypeLoc TL) {
4667   QualType PointeeType
4668     = getDerived().TransformType(TLB, TL.getPointeeLoc());
4669   if (PointeeType.isNull())
4670     return QualType();
4671 
4672   QualType Result = TL.getType();
4673   if (PointeeType->getAs<ObjCObjectType>()) {
4674     // A dependent pointer type 'T *' has is being transformed such
4675     // that an Objective-C class type is being replaced for 'T'. The
4676     // resulting pointer type is an ObjCObjectPointerType, not a
4677     // PointerType.
4678     Result = SemaRef.Context.getObjCObjectPointerType(PointeeType);
4679 
4680     ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result);
4681     NewT.setStarLoc(TL.getStarLoc());
4682     return Result;
4683   }
4684 
4685   if (getDerived().AlwaysRebuild() ||
4686       PointeeType != TL.getPointeeLoc().getType()) {
4687     Result = getDerived().RebuildPointerType(PointeeType, TL.getSigilLoc());
4688     if (Result.isNull())
4689       return QualType();
4690   }
4691 
4692   // Objective-C ARC can add lifetime qualifiers to the type that we're
4693   // pointing to.
4694   TLB.TypeWasModifiedSafely(Result->getPointeeType());
4695 
4696   PointerTypeLoc NewT = TLB.push<PointerTypeLoc>(Result);
4697   NewT.setSigilLoc(TL.getSigilLoc());
4698   return Result;
4699 }
4700 
4701 template<typename Derived>
4702 QualType
4703 TreeTransform<Derived>::TransformBlockPointerType(TypeLocBuilder &TLB,
4704                                                   BlockPointerTypeLoc TL) {
4705   QualType PointeeType
4706     = getDerived().TransformType(TLB, TL.getPointeeLoc());
4707   if (PointeeType.isNull())
4708     return QualType();
4709 
4710   QualType Result = TL.getType();
4711   if (getDerived().AlwaysRebuild() ||
4712       PointeeType != TL.getPointeeLoc().getType()) {
4713     Result = getDerived().RebuildBlockPointerType(PointeeType,
4714                                                   TL.getSigilLoc());
4715     if (Result.isNull())
4716       return QualType();
4717   }
4718 
4719   BlockPointerTypeLoc NewT = TLB.push<BlockPointerTypeLoc>(Result);
4720   NewT.setSigilLoc(TL.getSigilLoc());
4721   return Result;
4722 }
4723 
4724 /// Transforms a reference type.  Note that somewhat paradoxically we
4725 /// don't care whether the type itself is an l-value type or an r-value
4726 /// type;  we only care if the type was *written* as an l-value type
4727 /// or an r-value type.
4728 template<typename Derived>
4729 QualType
4730 TreeTransform<Derived>::TransformReferenceType(TypeLocBuilder &TLB,
4731                                                ReferenceTypeLoc TL) {
4732   const ReferenceType *T = TL.getTypePtr();
4733 
4734   // Note that this works with the pointee-as-written.
4735   QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
4736   if (PointeeType.isNull())
4737     return QualType();
4738 
4739   QualType Result = TL.getType();
4740   if (getDerived().AlwaysRebuild() ||
4741       PointeeType != T->getPointeeTypeAsWritten()) {
4742     Result = getDerived().RebuildReferenceType(PointeeType,
4743                                                T->isSpelledAsLValue(),
4744                                                TL.getSigilLoc());
4745     if (Result.isNull())
4746       return QualType();
4747   }
4748 
4749   // Objective-C ARC can add lifetime qualifiers to the type that we're
4750   // referring to.
4751   TLB.TypeWasModifiedSafely(
4752       Result->castAs<ReferenceType>()->getPointeeTypeAsWritten());
4753 
4754   // r-value references can be rebuilt as l-value references.
4755   ReferenceTypeLoc NewTL;
4756   if (isa<LValueReferenceType>(Result))
4757     NewTL = TLB.push<LValueReferenceTypeLoc>(Result);
4758   else
4759     NewTL = TLB.push<RValueReferenceTypeLoc>(Result);
4760   NewTL.setSigilLoc(TL.getSigilLoc());
4761 
4762   return Result;
4763 }
4764 
4765 template<typename Derived>
4766 QualType
4767 TreeTransform<Derived>::TransformLValueReferenceType(TypeLocBuilder &TLB,
4768                                                  LValueReferenceTypeLoc TL) {
4769   return TransformReferenceType(TLB, TL);
4770 }
4771 
4772 template<typename Derived>
4773 QualType
4774 TreeTransform<Derived>::TransformRValueReferenceType(TypeLocBuilder &TLB,
4775                                                  RValueReferenceTypeLoc TL) {
4776   return TransformReferenceType(TLB, TL);
4777 }
4778 
4779 template<typename Derived>
4780 QualType
4781 TreeTransform<Derived>::TransformMemberPointerType(TypeLocBuilder &TLB,
4782                                                    MemberPointerTypeLoc TL) {
4783   QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
4784   if (PointeeType.isNull())
4785     return QualType();
4786 
4787   TypeSourceInfo* OldClsTInfo = TL.getClassTInfo();
4788   TypeSourceInfo *NewClsTInfo = nullptr;
4789   if (OldClsTInfo) {
4790     NewClsTInfo = getDerived().TransformType(OldClsTInfo);
4791     if (!NewClsTInfo)
4792       return QualType();
4793   }
4794 
4795   const MemberPointerType *T = TL.getTypePtr();
4796   QualType OldClsType = QualType(T->getClass(), 0);
4797   QualType NewClsType;
4798   if (NewClsTInfo)
4799     NewClsType = NewClsTInfo->getType();
4800   else {
4801     NewClsType = getDerived().TransformType(OldClsType);
4802     if (NewClsType.isNull())
4803       return QualType();
4804   }
4805 
4806   QualType Result = TL.getType();
4807   if (getDerived().AlwaysRebuild() ||
4808       PointeeType != T->getPointeeType() ||
4809       NewClsType != OldClsType) {
4810     Result = getDerived().RebuildMemberPointerType(PointeeType, NewClsType,
4811                                                    TL.getStarLoc());
4812     if (Result.isNull())
4813       return QualType();
4814   }
4815 
4816   // If we had to adjust the pointee type when building a member pointer, make
4817   // sure to push TypeLoc info for it.
4818   const MemberPointerType *MPT = Result->getAs<MemberPointerType>();
4819   if (MPT && PointeeType != MPT->getPointeeType()) {
4820     assert(isa<AdjustedType>(MPT->getPointeeType()));
4821     TLB.push<AdjustedTypeLoc>(MPT->getPointeeType());
4822   }
4823 
4824   MemberPointerTypeLoc NewTL = TLB.push<MemberPointerTypeLoc>(Result);
4825   NewTL.setSigilLoc(TL.getSigilLoc());
4826   NewTL.setClassTInfo(NewClsTInfo);
4827 
4828   return Result;
4829 }
4830 
4831 template<typename Derived>
4832 QualType
4833 TreeTransform<Derived>::TransformConstantArrayType(TypeLocBuilder &TLB,
4834                                                    ConstantArrayTypeLoc TL) {
4835   const ConstantArrayType *T = TL.getTypePtr();
4836   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
4837   if (ElementType.isNull())
4838     return QualType();
4839 
4840   // Prefer the expression from the TypeLoc;  the other may have been uniqued.
4841   Expr *OldSize = TL.getSizeExpr();
4842   if (!OldSize)
4843     OldSize = const_cast<Expr*>(T->getSizeExpr());
4844   Expr *NewSize = nullptr;
4845   if (OldSize) {
4846     EnterExpressionEvaluationContext Unevaluated(
4847         SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
4848     NewSize = getDerived().TransformExpr(OldSize).template getAs<Expr>();
4849     NewSize = SemaRef.ActOnConstantExpression(NewSize).get();
4850   }
4851 
4852   QualType Result = TL.getType();
4853   if (getDerived().AlwaysRebuild() ||
4854       ElementType != T->getElementType() ||
4855       (T->getSizeExpr() && NewSize != OldSize)) {
4856     Result = getDerived().RebuildConstantArrayType(ElementType,
4857                                                    T->getSizeModifier(),
4858                                                    T->getSize(), NewSize,
4859                                              T->getIndexTypeCVRQualifiers(),
4860                                                    TL.getBracketsRange());
4861     if (Result.isNull())
4862       return QualType();
4863   }
4864 
4865   // We might have either a ConstantArrayType or a VariableArrayType now:
4866   // a ConstantArrayType is allowed to have an element type which is a
4867   // VariableArrayType if the type is dependent.  Fortunately, all array
4868   // types have the same location layout.
4869   ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result);
4870   NewTL.setLBracketLoc(TL.getLBracketLoc());
4871   NewTL.setRBracketLoc(TL.getRBracketLoc());
4872   NewTL.setSizeExpr(NewSize);
4873 
4874   return Result;
4875 }
4876 
4877 template<typename Derived>
4878 QualType TreeTransform<Derived>::TransformIncompleteArrayType(
4879                                               TypeLocBuilder &TLB,
4880                                               IncompleteArrayTypeLoc TL) {
4881   const IncompleteArrayType *T = TL.getTypePtr();
4882   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
4883   if (ElementType.isNull())
4884     return QualType();
4885 
4886   QualType Result = TL.getType();
4887   if (getDerived().AlwaysRebuild() ||
4888       ElementType != T->getElementType()) {
4889     Result = getDerived().RebuildIncompleteArrayType(ElementType,
4890                                                      T->getSizeModifier(),
4891                                            T->getIndexTypeCVRQualifiers(),
4892                                                      TL.getBracketsRange());
4893     if (Result.isNull())
4894       return QualType();
4895   }
4896 
4897   IncompleteArrayTypeLoc NewTL = TLB.push<IncompleteArrayTypeLoc>(Result);
4898   NewTL.setLBracketLoc(TL.getLBracketLoc());
4899   NewTL.setRBracketLoc(TL.getRBracketLoc());
4900   NewTL.setSizeExpr(nullptr);
4901 
4902   return Result;
4903 }
4904 
4905 template<typename Derived>
4906 QualType
4907 TreeTransform<Derived>::TransformVariableArrayType(TypeLocBuilder &TLB,
4908                                                    VariableArrayTypeLoc TL) {
4909   const VariableArrayType *T = TL.getTypePtr();
4910   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
4911   if (ElementType.isNull())
4912     return QualType();
4913 
4914   ExprResult SizeResult;
4915   {
4916     EnterExpressionEvaluationContext Context(
4917         SemaRef, Sema::ExpressionEvaluationContext::PotentiallyEvaluated);
4918     SizeResult = getDerived().TransformExpr(T->getSizeExpr());
4919   }
4920   if (SizeResult.isInvalid())
4921     return QualType();
4922   SizeResult =
4923       SemaRef.ActOnFinishFullExpr(SizeResult.get(), /*DiscardedValue*/ false);
4924   if (SizeResult.isInvalid())
4925     return QualType();
4926 
4927   Expr *Size = SizeResult.get();
4928 
4929   QualType Result = TL.getType();
4930   if (getDerived().AlwaysRebuild() ||
4931       ElementType != T->getElementType() ||
4932       Size != T->getSizeExpr()) {
4933     Result = getDerived().RebuildVariableArrayType(ElementType,
4934                                                    T->getSizeModifier(),
4935                                                    Size,
4936                                              T->getIndexTypeCVRQualifiers(),
4937                                                    TL.getBracketsRange());
4938     if (Result.isNull())
4939       return QualType();
4940   }
4941 
4942   // We might have constant size array now, but fortunately it has the same
4943   // location layout.
4944   ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result);
4945   NewTL.setLBracketLoc(TL.getLBracketLoc());
4946   NewTL.setRBracketLoc(TL.getRBracketLoc());
4947   NewTL.setSizeExpr(Size);
4948 
4949   return Result;
4950 }
4951 
4952 template<typename Derived>
4953 QualType
4954 TreeTransform<Derived>::TransformDependentSizedArrayType(TypeLocBuilder &TLB,
4955                                              DependentSizedArrayTypeLoc TL) {
4956   const DependentSizedArrayType *T = TL.getTypePtr();
4957   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
4958   if (ElementType.isNull())
4959     return QualType();
4960 
4961   // Array bounds are constant expressions.
4962   EnterExpressionEvaluationContext Unevaluated(
4963       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
4964 
4965   // Prefer the expression from the TypeLoc;  the other may have been uniqued.
4966   Expr *origSize = TL.getSizeExpr();
4967   if (!origSize) origSize = T->getSizeExpr();
4968 
4969   ExprResult sizeResult
4970     = getDerived().TransformExpr(origSize);
4971   sizeResult = SemaRef.ActOnConstantExpression(sizeResult);
4972   if (sizeResult.isInvalid())
4973     return QualType();
4974 
4975   Expr *size = sizeResult.get();
4976 
4977   QualType Result = TL.getType();
4978   if (getDerived().AlwaysRebuild() ||
4979       ElementType != T->getElementType() ||
4980       size != origSize) {
4981     Result = getDerived().RebuildDependentSizedArrayType(ElementType,
4982                                                          T->getSizeModifier(),
4983                                                          size,
4984                                                 T->getIndexTypeCVRQualifiers(),
4985                                                         TL.getBracketsRange());
4986     if (Result.isNull())
4987       return QualType();
4988   }
4989 
4990   // We might have any sort of array type now, but fortunately they
4991   // all have the same location layout.
4992   ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result);
4993   NewTL.setLBracketLoc(TL.getLBracketLoc());
4994   NewTL.setRBracketLoc(TL.getRBracketLoc());
4995   NewTL.setSizeExpr(size);
4996 
4997   return Result;
4998 }
4999 
5000 template <typename Derived>
5001 QualType TreeTransform<Derived>::TransformDependentVectorType(
5002     TypeLocBuilder &TLB, DependentVectorTypeLoc TL) {
5003   const DependentVectorType *T = TL.getTypePtr();
5004   QualType ElementType = getDerived().TransformType(T->getElementType());
5005   if (ElementType.isNull())
5006     return QualType();
5007 
5008   EnterExpressionEvaluationContext Unevaluated(
5009       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
5010 
5011   ExprResult Size = getDerived().TransformExpr(T->getSizeExpr());
5012   Size = SemaRef.ActOnConstantExpression(Size);
5013   if (Size.isInvalid())
5014     return QualType();
5015 
5016   QualType Result = TL.getType();
5017   if (getDerived().AlwaysRebuild() || ElementType != T->getElementType() ||
5018       Size.get() != T->getSizeExpr()) {
5019     Result = getDerived().RebuildDependentVectorType(
5020         ElementType, Size.get(), T->getAttributeLoc(), T->getVectorKind());
5021     if (Result.isNull())
5022       return QualType();
5023   }
5024 
5025   // Result might be dependent or not.
5026   if (isa<DependentVectorType>(Result)) {
5027     DependentVectorTypeLoc NewTL =
5028         TLB.push<DependentVectorTypeLoc>(Result);
5029     NewTL.setNameLoc(TL.getNameLoc());
5030   } else {
5031     VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result);
5032     NewTL.setNameLoc(TL.getNameLoc());
5033   }
5034 
5035   return Result;
5036 }
5037 
5038 template<typename Derived>
5039 QualType TreeTransform<Derived>::TransformDependentSizedExtVectorType(
5040                                       TypeLocBuilder &TLB,
5041                                       DependentSizedExtVectorTypeLoc TL) {
5042   const DependentSizedExtVectorType *T = TL.getTypePtr();
5043 
5044   // FIXME: ext vector locs should be nested
5045   QualType ElementType = getDerived().TransformType(T->getElementType());
5046   if (ElementType.isNull())
5047     return QualType();
5048 
5049   // Vector sizes are constant expressions.
5050   EnterExpressionEvaluationContext Unevaluated(
5051       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
5052 
5053   ExprResult Size = getDerived().TransformExpr(T->getSizeExpr());
5054   Size = SemaRef.ActOnConstantExpression(Size);
5055   if (Size.isInvalid())
5056     return QualType();
5057 
5058   QualType Result = TL.getType();
5059   if (getDerived().AlwaysRebuild() ||
5060       ElementType != T->getElementType() ||
5061       Size.get() != T->getSizeExpr()) {
5062     Result = getDerived().RebuildDependentSizedExtVectorType(ElementType,
5063                                                              Size.get(),
5064                                                          T->getAttributeLoc());
5065     if (Result.isNull())
5066       return QualType();
5067   }
5068 
5069   // Result might be dependent or not.
5070   if (isa<DependentSizedExtVectorType>(Result)) {
5071     DependentSizedExtVectorTypeLoc NewTL
5072       = TLB.push<DependentSizedExtVectorTypeLoc>(Result);
5073     NewTL.setNameLoc(TL.getNameLoc());
5074   } else {
5075     ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result);
5076     NewTL.setNameLoc(TL.getNameLoc());
5077   }
5078 
5079   return Result;
5080 }
5081 
5082 template <typename Derived>
5083 QualType TreeTransform<Derived>::TransformDependentAddressSpaceType(
5084     TypeLocBuilder &TLB, DependentAddressSpaceTypeLoc TL) {
5085   const DependentAddressSpaceType *T = TL.getTypePtr();
5086 
5087   QualType pointeeType = getDerived().TransformType(T->getPointeeType());
5088 
5089   if (pointeeType.isNull())
5090     return QualType();
5091 
5092   // Address spaces are constant expressions.
5093   EnterExpressionEvaluationContext Unevaluated(
5094       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
5095 
5096   ExprResult AddrSpace = getDerived().TransformExpr(T->getAddrSpaceExpr());
5097   AddrSpace = SemaRef.ActOnConstantExpression(AddrSpace);
5098   if (AddrSpace.isInvalid())
5099     return QualType();
5100 
5101   QualType Result = TL.getType();
5102   if (getDerived().AlwaysRebuild() || pointeeType != T->getPointeeType() ||
5103       AddrSpace.get() != T->getAddrSpaceExpr()) {
5104     Result = getDerived().RebuildDependentAddressSpaceType(
5105         pointeeType, AddrSpace.get(), T->getAttributeLoc());
5106     if (Result.isNull())
5107       return QualType();
5108   }
5109 
5110   // Result might be dependent or not.
5111   if (isa<DependentAddressSpaceType>(Result)) {
5112     DependentAddressSpaceTypeLoc NewTL =
5113         TLB.push<DependentAddressSpaceTypeLoc>(Result);
5114 
5115     NewTL.setAttrOperandParensRange(TL.getAttrOperandParensRange());
5116     NewTL.setAttrExprOperand(TL.getAttrExprOperand());
5117     NewTL.setAttrNameLoc(TL.getAttrNameLoc());
5118 
5119   } else {
5120     TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(
5121         Result, getDerived().getBaseLocation());
5122     TransformType(TLB, DI->getTypeLoc());
5123   }
5124 
5125   return Result;
5126 }
5127 
5128 template <typename Derived>
5129 QualType TreeTransform<Derived>::TransformVectorType(TypeLocBuilder &TLB,
5130                                                      VectorTypeLoc TL) {
5131   const VectorType *T = TL.getTypePtr();
5132   QualType ElementType = getDerived().TransformType(T->getElementType());
5133   if (ElementType.isNull())
5134     return QualType();
5135 
5136   QualType Result = TL.getType();
5137   if (getDerived().AlwaysRebuild() ||
5138       ElementType != T->getElementType()) {
5139     Result = getDerived().RebuildVectorType(ElementType, T->getNumElements(),
5140                                             T->getVectorKind());
5141     if (Result.isNull())
5142       return QualType();
5143   }
5144 
5145   VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result);
5146   NewTL.setNameLoc(TL.getNameLoc());
5147 
5148   return Result;
5149 }
5150 
5151 template<typename Derived>
5152 QualType TreeTransform<Derived>::TransformExtVectorType(TypeLocBuilder &TLB,
5153                                                         ExtVectorTypeLoc TL) {
5154   const VectorType *T = TL.getTypePtr();
5155   QualType ElementType = getDerived().TransformType(T->getElementType());
5156   if (ElementType.isNull())
5157     return QualType();
5158 
5159   QualType Result = TL.getType();
5160   if (getDerived().AlwaysRebuild() ||
5161       ElementType != T->getElementType()) {
5162     Result = getDerived().RebuildExtVectorType(ElementType,
5163                                                T->getNumElements(),
5164                                                /*FIXME*/ SourceLocation());
5165     if (Result.isNull())
5166       return QualType();
5167   }
5168 
5169   ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result);
5170   NewTL.setNameLoc(TL.getNameLoc());
5171 
5172   return Result;
5173 }
5174 
5175 template <typename Derived>
5176 ParmVarDecl *TreeTransform<Derived>::TransformFunctionTypeParam(
5177     ParmVarDecl *OldParm, int indexAdjustment, Optional<unsigned> NumExpansions,
5178     bool ExpectParameterPack) {
5179   TypeSourceInfo *OldDI = OldParm->getTypeSourceInfo();
5180   TypeSourceInfo *NewDI = nullptr;
5181 
5182   if (NumExpansions && isa<PackExpansionType>(OldDI->getType())) {
5183     // If we're substituting into a pack expansion type and we know the
5184     // length we want to expand to, just substitute for the pattern.
5185     TypeLoc OldTL = OldDI->getTypeLoc();
5186     PackExpansionTypeLoc OldExpansionTL = OldTL.castAs<PackExpansionTypeLoc>();
5187 
5188     TypeLocBuilder TLB;
5189     TypeLoc NewTL = OldDI->getTypeLoc();
5190     TLB.reserve(NewTL.getFullDataSize());
5191 
5192     QualType Result = getDerived().TransformType(TLB,
5193                                                OldExpansionTL.getPatternLoc());
5194     if (Result.isNull())
5195       return nullptr;
5196 
5197     Result = RebuildPackExpansionType(Result,
5198                                 OldExpansionTL.getPatternLoc().getSourceRange(),
5199                                       OldExpansionTL.getEllipsisLoc(),
5200                                       NumExpansions);
5201     if (Result.isNull())
5202       return nullptr;
5203 
5204     PackExpansionTypeLoc NewExpansionTL
5205       = TLB.push<PackExpansionTypeLoc>(Result);
5206     NewExpansionTL.setEllipsisLoc(OldExpansionTL.getEllipsisLoc());
5207     NewDI = TLB.getTypeSourceInfo(SemaRef.Context, Result);
5208   } else
5209     NewDI = getDerived().TransformType(OldDI);
5210   if (!NewDI)
5211     return nullptr;
5212 
5213   if (NewDI == OldDI && indexAdjustment == 0)
5214     return OldParm;
5215 
5216   ParmVarDecl *newParm = ParmVarDecl::Create(SemaRef.Context,
5217                                              OldParm->getDeclContext(),
5218                                              OldParm->getInnerLocStart(),
5219                                              OldParm->getLocation(),
5220                                              OldParm->getIdentifier(),
5221                                              NewDI->getType(),
5222                                              NewDI,
5223                                              OldParm->getStorageClass(),
5224                                              /* DefArg */ nullptr);
5225   newParm->setScopeInfo(OldParm->getFunctionScopeDepth(),
5226                         OldParm->getFunctionScopeIndex() + indexAdjustment);
5227   return newParm;
5228 }
5229 
5230 template <typename Derived>
5231 bool TreeTransform<Derived>::TransformFunctionTypeParams(
5232     SourceLocation Loc, ArrayRef<ParmVarDecl *> Params,
5233     const QualType *ParamTypes,
5234     const FunctionProtoType::ExtParameterInfo *ParamInfos,
5235     SmallVectorImpl<QualType> &OutParamTypes,
5236     SmallVectorImpl<ParmVarDecl *> *PVars,
5237     Sema::ExtParameterInfoBuilder &PInfos) {
5238   int indexAdjustment = 0;
5239 
5240   unsigned NumParams = Params.size();
5241   for (unsigned i = 0; i != NumParams; ++i) {
5242     if (ParmVarDecl *OldParm = Params[i]) {
5243       assert(OldParm->getFunctionScopeIndex() == i);
5244 
5245       Optional<unsigned> NumExpansions;
5246       ParmVarDecl *NewParm = nullptr;
5247       if (OldParm->isParameterPack()) {
5248         // We have a function parameter pack that may need to be expanded.
5249         SmallVector<UnexpandedParameterPack, 2> Unexpanded;
5250 
5251         // Find the parameter packs that could be expanded.
5252         TypeLoc TL = OldParm->getTypeSourceInfo()->getTypeLoc();
5253         PackExpansionTypeLoc ExpansionTL = TL.castAs<PackExpansionTypeLoc>();
5254         TypeLoc Pattern = ExpansionTL.getPatternLoc();
5255         SemaRef.collectUnexpandedParameterPacks(Pattern, Unexpanded);
5256 
5257         // Determine whether we should expand the parameter packs.
5258         bool ShouldExpand = false;
5259         bool RetainExpansion = false;
5260         Optional<unsigned> OrigNumExpansions;
5261         if (Unexpanded.size() > 0) {
5262           OrigNumExpansions = ExpansionTL.getTypePtr()->getNumExpansions();
5263           NumExpansions = OrigNumExpansions;
5264           if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(),
5265                                                    Pattern.getSourceRange(),
5266                                                    Unexpanded,
5267                                                    ShouldExpand,
5268                                                    RetainExpansion,
5269                                                    NumExpansions)) {
5270             return true;
5271           }
5272         } else {
5273 #ifndef NDEBUG
5274           const AutoType *AT =
5275               Pattern.getType().getTypePtr()->getContainedAutoType();
5276           assert((AT && (!AT->isDeduced() || AT->getDeducedType().isNull())) &&
5277                  "Could not find parameter packs or undeduced auto type!");
5278 #endif
5279         }
5280 
5281         if (ShouldExpand) {
5282           // Expand the function parameter pack into multiple, separate
5283           // parameters.
5284           getDerived().ExpandingFunctionParameterPack(OldParm);
5285           for (unsigned I = 0; I != *NumExpansions; ++I) {
5286             Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
5287             ParmVarDecl *NewParm
5288               = getDerived().TransformFunctionTypeParam(OldParm,
5289                                                         indexAdjustment++,
5290                                                         OrigNumExpansions,
5291                                                 /*ExpectParameterPack=*/false);
5292             if (!NewParm)
5293               return true;
5294 
5295             if (ParamInfos)
5296               PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5297             OutParamTypes.push_back(NewParm->getType());
5298             if (PVars)
5299               PVars->push_back(NewParm);
5300           }
5301 
5302           // If we're supposed to retain a pack expansion, do so by temporarily
5303           // forgetting the partially-substituted parameter pack.
5304           if (RetainExpansion) {
5305             ForgetPartiallySubstitutedPackRAII Forget(getDerived());
5306             ParmVarDecl *NewParm
5307               = getDerived().TransformFunctionTypeParam(OldParm,
5308                                                         indexAdjustment++,
5309                                                         OrigNumExpansions,
5310                                                 /*ExpectParameterPack=*/false);
5311             if (!NewParm)
5312               return true;
5313 
5314             if (ParamInfos)
5315               PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5316             OutParamTypes.push_back(NewParm->getType());
5317             if (PVars)
5318               PVars->push_back(NewParm);
5319           }
5320 
5321           // The next parameter should have the same adjustment as the
5322           // last thing we pushed, but we post-incremented indexAdjustment
5323           // on every push.  Also, if we push nothing, the adjustment should
5324           // go down by one.
5325           indexAdjustment--;
5326 
5327           // We're done with the pack expansion.
5328           continue;
5329         }
5330 
5331         // We'll substitute the parameter now without expanding the pack
5332         // expansion.
5333         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
5334         NewParm = getDerived().TransformFunctionTypeParam(OldParm,
5335                                                           indexAdjustment,
5336                                                           NumExpansions,
5337                                                   /*ExpectParameterPack=*/true);
5338         assert(NewParm->isParameterPack() &&
5339                "Parameter pack no longer a parameter pack after "
5340                "transformation.");
5341       } else {
5342         NewParm = getDerived().TransformFunctionTypeParam(
5343             OldParm, indexAdjustment, None, /*ExpectParameterPack=*/ false);
5344       }
5345 
5346       if (!NewParm)
5347         return true;
5348 
5349       if (ParamInfos)
5350         PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5351       OutParamTypes.push_back(NewParm->getType());
5352       if (PVars)
5353         PVars->push_back(NewParm);
5354       continue;
5355     }
5356 
5357     // Deal with the possibility that we don't have a parameter
5358     // declaration for this parameter.
5359     QualType OldType = ParamTypes[i];
5360     bool IsPackExpansion = false;
5361     Optional<unsigned> NumExpansions;
5362     QualType NewType;
5363     if (const PackExpansionType *Expansion
5364                                        = dyn_cast<PackExpansionType>(OldType)) {
5365       // We have a function parameter pack that may need to be expanded.
5366       QualType Pattern = Expansion->getPattern();
5367       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
5368       getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
5369 
5370       // Determine whether we should expand the parameter packs.
5371       bool ShouldExpand = false;
5372       bool RetainExpansion = false;
5373       if (getDerived().TryExpandParameterPacks(Loc, SourceRange(),
5374                                                Unexpanded,
5375                                                ShouldExpand,
5376                                                RetainExpansion,
5377                                                NumExpansions)) {
5378         return true;
5379       }
5380 
5381       if (ShouldExpand) {
5382         // Expand the function parameter pack into multiple, separate
5383         // parameters.
5384         for (unsigned I = 0; I != *NumExpansions; ++I) {
5385           Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
5386           QualType NewType = getDerived().TransformType(Pattern);
5387           if (NewType.isNull())
5388             return true;
5389 
5390           if (NewType->containsUnexpandedParameterPack()) {
5391             NewType =
5392                 getSema().getASTContext().getPackExpansionType(NewType, None);
5393 
5394             if (NewType.isNull())
5395               return true;
5396           }
5397 
5398           if (ParamInfos)
5399             PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5400           OutParamTypes.push_back(NewType);
5401           if (PVars)
5402             PVars->push_back(nullptr);
5403         }
5404 
5405         // We're done with the pack expansion.
5406         continue;
5407       }
5408 
5409       // If we're supposed to retain a pack expansion, do so by temporarily
5410       // forgetting the partially-substituted parameter pack.
5411       if (RetainExpansion) {
5412         ForgetPartiallySubstitutedPackRAII Forget(getDerived());
5413         QualType NewType = getDerived().TransformType(Pattern);
5414         if (NewType.isNull())
5415           return true;
5416 
5417         if (ParamInfos)
5418           PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5419         OutParamTypes.push_back(NewType);
5420         if (PVars)
5421           PVars->push_back(nullptr);
5422       }
5423 
5424       // We'll substitute the parameter now without expanding the pack
5425       // expansion.
5426       OldType = Expansion->getPattern();
5427       IsPackExpansion = true;
5428       Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
5429       NewType = getDerived().TransformType(OldType);
5430     } else {
5431       NewType = getDerived().TransformType(OldType);
5432     }
5433 
5434     if (NewType.isNull())
5435       return true;
5436 
5437     if (IsPackExpansion)
5438       NewType = getSema().Context.getPackExpansionType(NewType,
5439                                                        NumExpansions);
5440 
5441     if (ParamInfos)
5442       PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5443     OutParamTypes.push_back(NewType);
5444     if (PVars)
5445       PVars->push_back(nullptr);
5446   }
5447 
5448 #ifndef NDEBUG
5449   if (PVars) {
5450     for (unsigned i = 0, e = PVars->size(); i != e; ++i)
5451       if (ParmVarDecl *parm = (*PVars)[i])
5452         assert(parm->getFunctionScopeIndex() == i);
5453   }
5454 #endif
5455 
5456   return false;
5457 }
5458 
5459 template<typename Derived>
5460 QualType
5461 TreeTransform<Derived>::TransformFunctionProtoType(TypeLocBuilder &TLB,
5462                                                    FunctionProtoTypeLoc TL) {
5463   SmallVector<QualType, 4> ExceptionStorage;
5464   TreeTransform *This = this; // Work around gcc.gnu.org/PR56135.
5465   return getDerived().TransformFunctionProtoType(
5466       TLB, TL, nullptr, Qualifiers(),
5467       [&](FunctionProtoType::ExceptionSpecInfo &ESI, bool &Changed) {
5468         return This->TransformExceptionSpec(TL.getBeginLoc(), ESI,
5469                                             ExceptionStorage, Changed);
5470       });
5471 }
5472 
5473 template<typename Derived> template<typename Fn>
5474 QualType TreeTransform<Derived>::TransformFunctionProtoType(
5475     TypeLocBuilder &TLB, FunctionProtoTypeLoc TL, CXXRecordDecl *ThisContext,
5476     Qualifiers ThisTypeQuals, Fn TransformExceptionSpec) {
5477 
5478   // Transform the parameters and return type.
5479   //
5480   // We are required to instantiate the params and return type in source order.
5481   // When the function has a trailing return type, we instantiate the
5482   // parameters before the return type,  since the return type can then refer
5483   // to the parameters themselves (via decltype, sizeof, etc.).
5484   //
5485   SmallVector<QualType, 4> ParamTypes;
5486   SmallVector<ParmVarDecl*, 4> ParamDecls;
5487   Sema::ExtParameterInfoBuilder ExtParamInfos;
5488   const FunctionProtoType *T = TL.getTypePtr();
5489 
5490   QualType ResultType;
5491 
5492   if (T->hasTrailingReturn()) {
5493     if (getDerived().TransformFunctionTypeParams(
5494             TL.getBeginLoc(), TL.getParams(),
5495             TL.getTypePtr()->param_type_begin(),
5496             T->getExtParameterInfosOrNull(),
5497             ParamTypes, &ParamDecls, ExtParamInfos))
5498       return QualType();
5499 
5500     {
5501       // C++11 [expr.prim.general]p3:
5502       //   If a declaration declares a member function or member function
5503       //   template of a class X, the expression this is a prvalue of type
5504       //   "pointer to cv-qualifier-seq X" between the optional cv-qualifer-seq
5505       //   and the end of the function-definition, member-declarator, or
5506       //   declarator.
5507       Sema::CXXThisScopeRAII ThisScope(SemaRef, ThisContext, ThisTypeQuals);
5508 
5509       ResultType = getDerived().TransformType(TLB, TL.getReturnLoc());
5510       if (ResultType.isNull())
5511         return QualType();
5512     }
5513   }
5514   else {
5515     ResultType = getDerived().TransformType(TLB, TL.getReturnLoc());
5516     if (ResultType.isNull())
5517       return QualType();
5518 
5519     if (getDerived().TransformFunctionTypeParams(
5520             TL.getBeginLoc(), TL.getParams(),
5521             TL.getTypePtr()->param_type_begin(),
5522             T->getExtParameterInfosOrNull(),
5523             ParamTypes, &ParamDecls, ExtParamInfos))
5524       return QualType();
5525   }
5526 
5527   FunctionProtoType::ExtProtoInfo EPI = T->getExtProtoInfo();
5528 
5529   bool EPIChanged = false;
5530   if (TransformExceptionSpec(EPI.ExceptionSpec, EPIChanged))
5531     return QualType();
5532 
5533   // Handle extended parameter information.
5534   if (auto NewExtParamInfos =
5535         ExtParamInfos.getPointerOrNull(ParamTypes.size())) {
5536     if (!EPI.ExtParameterInfos ||
5537         llvm::makeArrayRef(EPI.ExtParameterInfos, TL.getNumParams())
5538           != llvm::makeArrayRef(NewExtParamInfos, ParamTypes.size())) {
5539       EPIChanged = true;
5540     }
5541     EPI.ExtParameterInfos = NewExtParamInfos;
5542   } else if (EPI.ExtParameterInfos) {
5543     EPIChanged = true;
5544     EPI.ExtParameterInfos = nullptr;
5545   }
5546 
5547   QualType Result = TL.getType();
5548   if (getDerived().AlwaysRebuild() || ResultType != T->getReturnType() ||
5549       T->getParamTypes() != llvm::makeArrayRef(ParamTypes) || EPIChanged) {
5550     Result = getDerived().RebuildFunctionProtoType(ResultType, ParamTypes, EPI);
5551     if (Result.isNull())
5552       return QualType();
5553   }
5554 
5555   FunctionProtoTypeLoc NewTL = TLB.push<FunctionProtoTypeLoc>(Result);
5556   NewTL.setLocalRangeBegin(TL.getLocalRangeBegin());
5557   NewTL.setLParenLoc(TL.getLParenLoc());
5558   NewTL.setRParenLoc(TL.getRParenLoc());
5559   NewTL.setExceptionSpecRange(TL.getExceptionSpecRange());
5560   NewTL.setLocalRangeEnd(TL.getLocalRangeEnd());
5561   for (unsigned i = 0, e = NewTL.getNumParams(); i != e; ++i)
5562     NewTL.setParam(i, ParamDecls[i]);
5563 
5564   return Result;
5565 }
5566 
5567 template<typename Derived>
5568 bool TreeTransform<Derived>::TransformExceptionSpec(
5569     SourceLocation Loc, FunctionProtoType::ExceptionSpecInfo &ESI,
5570     SmallVectorImpl<QualType> &Exceptions, bool &Changed) {
5571   assert(ESI.Type != EST_Uninstantiated && ESI.Type != EST_Unevaluated);
5572 
5573   // Instantiate a dynamic noexcept expression, if any.
5574   if (isComputedNoexcept(ESI.Type)) {
5575     EnterExpressionEvaluationContext Unevaluated(
5576         getSema(), Sema::ExpressionEvaluationContext::ConstantEvaluated);
5577     ExprResult NoexceptExpr = getDerived().TransformExpr(ESI.NoexceptExpr);
5578     if (NoexceptExpr.isInvalid())
5579       return true;
5580 
5581     ExceptionSpecificationType EST = ESI.Type;
5582     NoexceptExpr =
5583         getSema().ActOnNoexceptSpec(Loc, NoexceptExpr.get(), EST);
5584     if (NoexceptExpr.isInvalid())
5585       return true;
5586 
5587     if (ESI.NoexceptExpr != NoexceptExpr.get() || EST != ESI.Type)
5588       Changed = true;
5589     ESI.NoexceptExpr = NoexceptExpr.get();
5590     ESI.Type = EST;
5591   }
5592 
5593   if (ESI.Type != EST_Dynamic)
5594     return false;
5595 
5596   // Instantiate a dynamic exception specification's type.
5597   for (QualType T : ESI.Exceptions) {
5598     if (const PackExpansionType *PackExpansion =
5599             T->getAs<PackExpansionType>()) {
5600       Changed = true;
5601 
5602       // We have a pack expansion. Instantiate it.
5603       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
5604       SemaRef.collectUnexpandedParameterPacks(PackExpansion->getPattern(),
5605                                               Unexpanded);
5606       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
5607 
5608       // Determine whether the set of unexpanded parameter packs can and
5609       // should
5610       // be expanded.
5611       bool Expand = false;
5612       bool RetainExpansion = false;
5613       Optional<unsigned> NumExpansions = PackExpansion->getNumExpansions();
5614       // FIXME: Track the location of the ellipsis (and track source location
5615       // information for the types in the exception specification in general).
5616       if (getDerived().TryExpandParameterPacks(
5617               Loc, SourceRange(), Unexpanded, Expand,
5618               RetainExpansion, NumExpansions))
5619         return true;
5620 
5621       if (!Expand) {
5622         // We can't expand this pack expansion into separate arguments yet;
5623         // just substitute into the pattern and create a new pack expansion
5624         // type.
5625         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
5626         QualType U = getDerived().TransformType(PackExpansion->getPattern());
5627         if (U.isNull())
5628           return true;
5629 
5630         U = SemaRef.Context.getPackExpansionType(U, NumExpansions);
5631         Exceptions.push_back(U);
5632         continue;
5633       }
5634 
5635       // Substitute into the pack expansion pattern for each slice of the
5636       // pack.
5637       for (unsigned ArgIdx = 0; ArgIdx != *NumExpansions; ++ArgIdx) {
5638         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), ArgIdx);
5639 
5640         QualType U = getDerived().TransformType(PackExpansion->getPattern());
5641         if (U.isNull() || SemaRef.CheckSpecifiedExceptionType(U, Loc))
5642           return true;
5643 
5644         Exceptions.push_back(U);
5645       }
5646     } else {
5647       QualType U = getDerived().TransformType(T);
5648       if (U.isNull() || SemaRef.CheckSpecifiedExceptionType(U, Loc))
5649         return true;
5650       if (T != U)
5651         Changed = true;
5652 
5653       Exceptions.push_back(U);
5654     }
5655   }
5656 
5657   ESI.Exceptions = Exceptions;
5658   if (ESI.Exceptions.empty())
5659     ESI.Type = EST_DynamicNone;
5660   return false;
5661 }
5662 
5663 template<typename Derived>
5664 QualType TreeTransform<Derived>::TransformFunctionNoProtoType(
5665                                                  TypeLocBuilder &TLB,
5666                                                  FunctionNoProtoTypeLoc TL) {
5667   const FunctionNoProtoType *T = TL.getTypePtr();
5668   QualType ResultType = getDerived().TransformType(TLB, TL.getReturnLoc());
5669   if (ResultType.isNull())
5670     return QualType();
5671 
5672   QualType Result = TL.getType();
5673   if (getDerived().AlwaysRebuild() || ResultType != T->getReturnType())
5674     Result = getDerived().RebuildFunctionNoProtoType(ResultType);
5675 
5676   FunctionNoProtoTypeLoc NewTL = TLB.push<FunctionNoProtoTypeLoc>(Result);
5677   NewTL.setLocalRangeBegin(TL.getLocalRangeBegin());
5678   NewTL.setLParenLoc(TL.getLParenLoc());
5679   NewTL.setRParenLoc(TL.getRParenLoc());
5680   NewTL.setLocalRangeEnd(TL.getLocalRangeEnd());
5681 
5682   return Result;
5683 }
5684 
5685 template<typename Derived> QualType
5686 TreeTransform<Derived>::TransformUnresolvedUsingType(TypeLocBuilder &TLB,
5687                                                  UnresolvedUsingTypeLoc TL) {
5688   const UnresolvedUsingType *T = TL.getTypePtr();
5689   Decl *D = getDerived().TransformDecl(TL.getNameLoc(), T->getDecl());
5690   if (!D)
5691     return QualType();
5692 
5693   QualType Result = TL.getType();
5694   if (getDerived().AlwaysRebuild() || D != T->getDecl()) {
5695     Result = getDerived().RebuildUnresolvedUsingType(TL.getNameLoc(), D);
5696     if (Result.isNull())
5697       return QualType();
5698   }
5699 
5700   // We might get an arbitrary type spec type back.  We should at
5701   // least always get a type spec type, though.
5702   TypeSpecTypeLoc NewTL = TLB.pushTypeSpec(Result);
5703   NewTL.setNameLoc(TL.getNameLoc());
5704 
5705   return Result;
5706 }
5707 
5708 template<typename Derived>
5709 QualType TreeTransform<Derived>::TransformTypedefType(TypeLocBuilder &TLB,
5710                                                       TypedefTypeLoc TL) {
5711   const TypedefType *T = TL.getTypePtr();
5712   TypedefNameDecl *Typedef
5713     = cast_or_null<TypedefNameDecl>(getDerived().TransformDecl(TL.getNameLoc(),
5714                                                                T->getDecl()));
5715   if (!Typedef)
5716     return QualType();
5717 
5718   QualType Result = TL.getType();
5719   if (getDerived().AlwaysRebuild() ||
5720       Typedef != T->getDecl()) {
5721     Result = getDerived().RebuildTypedefType(Typedef);
5722     if (Result.isNull())
5723       return QualType();
5724   }
5725 
5726   TypedefTypeLoc NewTL = TLB.push<TypedefTypeLoc>(Result);
5727   NewTL.setNameLoc(TL.getNameLoc());
5728 
5729   return Result;
5730 }
5731 
5732 template<typename Derived>
5733 QualType TreeTransform<Derived>::TransformTypeOfExprType(TypeLocBuilder &TLB,
5734                                                       TypeOfExprTypeLoc TL) {
5735   // typeof expressions are not potentially evaluated contexts
5736   EnterExpressionEvaluationContext Unevaluated(
5737       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated,
5738       Sema::ReuseLambdaContextDecl);
5739 
5740   ExprResult E = getDerived().TransformExpr(TL.getUnderlyingExpr());
5741   if (E.isInvalid())
5742     return QualType();
5743 
5744   E = SemaRef.HandleExprEvaluationContextForTypeof(E.get());
5745   if (E.isInvalid())
5746     return QualType();
5747 
5748   QualType Result = TL.getType();
5749   if (getDerived().AlwaysRebuild() ||
5750       E.get() != TL.getUnderlyingExpr()) {
5751     Result = getDerived().RebuildTypeOfExprType(E.get(), TL.getTypeofLoc());
5752     if (Result.isNull())
5753       return QualType();
5754   }
5755   else E.get();
5756 
5757   TypeOfExprTypeLoc NewTL = TLB.push<TypeOfExprTypeLoc>(Result);
5758   NewTL.setTypeofLoc(TL.getTypeofLoc());
5759   NewTL.setLParenLoc(TL.getLParenLoc());
5760   NewTL.setRParenLoc(TL.getRParenLoc());
5761 
5762   return Result;
5763 }
5764 
5765 template<typename Derived>
5766 QualType TreeTransform<Derived>::TransformTypeOfType(TypeLocBuilder &TLB,
5767                                                      TypeOfTypeLoc TL) {
5768   TypeSourceInfo* Old_Under_TI = TL.getUnderlyingTInfo();
5769   TypeSourceInfo* New_Under_TI = getDerived().TransformType(Old_Under_TI);
5770   if (!New_Under_TI)
5771     return QualType();
5772 
5773   QualType Result = TL.getType();
5774   if (getDerived().AlwaysRebuild() || New_Under_TI != Old_Under_TI) {
5775     Result = getDerived().RebuildTypeOfType(New_Under_TI->getType());
5776     if (Result.isNull())
5777       return QualType();
5778   }
5779 
5780   TypeOfTypeLoc NewTL = TLB.push<TypeOfTypeLoc>(Result);
5781   NewTL.setTypeofLoc(TL.getTypeofLoc());
5782   NewTL.setLParenLoc(TL.getLParenLoc());
5783   NewTL.setRParenLoc(TL.getRParenLoc());
5784   NewTL.setUnderlyingTInfo(New_Under_TI);
5785 
5786   return Result;
5787 }
5788 
5789 template<typename Derived>
5790 QualType TreeTransform<Derived>::TransformDecltypeType(TypeLocBuilder &TLB,
5791                                                        DecltypeTypeLoc TL) {
5792   const DecltypeType *T = TL.getTypePtr();
5793 
5794   // decltype expressions are not potentially evaluated contexts
5795   EnterExpressionEvaluationContext Unevaluated(
5796       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, nullptr,
5797       Sema::ExpressionEvaluationContextRecord::EK_Decltype);
5798 
5799   ExprResult E = getDerived().TransformExpr(T->getUnderlyingExpr());
5800   if (E.isInvalid())
5801     return QualType();
5802 
5803   E = getSema().ActOnDecltypeExpression(E.get());
5804   if (E.isInvalid())
5805     return QualType();
5806 
5807   QualType Result = TL.getType();
5808   if (getDerived().AlwaysRebuild() ||
5809       E.get() != T->getUnderlyingExpr()) {
5810     Result = getDerived().RebuildDecltypeType(E.get(), TL.getNameLoc());
5811     if (Result.isNull())
5812       return QualType();
5813   }
5814   else E.get();
5815 
5816   DecltypeTypeLoc NewTL = TLB.push<DecltypeTypeLoc>(Result);
5817   NewTL.setNameLoc(TL.getNameLoc());
5818 
5819   return Result;
5820 }
5821 
5822 template<typename Derived>
5823 QualType TreeTransform<Derived>::TransformUnaryTransformType(
5824                                                             TypeLocBuilder &TLB,
5825                                                      UnaryTransformTypeLoc TL) {
5826   QualType Result = TL.getType();
5827   if (Result->isDependentType()) {
5828     const UnaryTransformType *T = TL.getTypePtr();
5829     QualType NewBase =
5830       getDerived().TransformType(TL.getUnderlyingTInfo())->getType();
5831     Result = getDerived().RebuildUnaryTransformType(NewBase,
5832                                                     T->getUTTKind(),
5833                                                     TL.getKWLoc());
5834     if (Result.isNull())
5835       return QualType();
5836   }
5837 
5838   UnaryTransformTypeLoc NewTL = TLB.push<UnaryTransformTypeLoc>(Result);
5839   NewTL.setKWLoc(TL.getKWLoc());
5840   NewTL.setParensRange(TL.getParensRange());
5841   NewTL.setUnderlyingTInfo(TL.getUnderlyingTInfo());
5842   return Result;
5843 }
5844 
5845 template<typename Derived>
5846 QualType TreeTransform<Derived>::TransformDeducedTemplateSpecializationType(
5847     TypeLocBuilder &TLB, DeducedTemplateSpecializationTypeLoc TL) {
5848   const DeducedTemplateSpecializationType *T = TL.getTypePtr();
5849 
5850   CXXScopeSpec SS;
5851   TemplateName TemplateName = getDerived().TransformTemplateName(
5852       SS, T->getTemplateName(), TL.getTemplateNameLoc());
5853   if (TemplateName.isNull())
5854     return QualType();
5855 
5856   QualType OldDeduced = T->getDeducedType();
5857   QualType NewDeduced;
5858   if (!OldDeduced.isNull()) {
5859     NewDeduced = getDerived().TransformType(OldDeduced);
5860     if (NewDeduced.isNull())
5861       return QualType();
5862   }
5863 
5864   QualType Result = getDerived().RebuildDeducedTemplateSpecializationType(
5865       TemplateName, NewDeduced);
5866   if (Result.isNull())
5867     return QualType();
5868 
5869   DeducedTemplateSpecializationTypeLoc NewTL =
5870       TLB.push<DeducedTemplateSpecializationTypeLoc>(Result);
5871   NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
5872 
5873   return Result;
5874 }
5875 
5876 template<typename Derived>
5877 QualType TreeTransform<Derived>::TransformRecordType(TypeLocBuilder &TLB,
5878                                                      RecordTypeLoc TL) {
5879   const RecordType *T = TL.getTypePtr();
5880   RecordDecl *Record
5881     = cast_or_null<RecordDecl>(getDerived().TransformDecl(TL.getNameLoc(),
5882                                                           T->getDecl()));
5883   if (!Record)
5884     return QualType();
5885 
5886   QualType Result = TL.getType();
5887   if (getDerived().AlwaysRebuild() ||
5888       Record != T->getDecl()) {
5889     Result = getDerived().RebuildRecordType(Record);
5890     if (Result.isNull())
5891       return QualType();
5892   }
5893 
5894   RecordTypeLoc NewTL = TLB.push<RecordTypeLoc>(Result);
5895   NewTL.setNameLoc(TL.getNameLoc());
5896 
5897   return Result;
5898 }
5899 
5900 template<typename Derived>
5901 QualType TreeTransform<Derived>::TransformEnumType(TypeLocBuilder &TLB,
5902                                                    EnumTypeLoc TL) {
5903   const EnumType *T = TL.getTypePtr();
5904   EnumDecl *Enum
5905     = cast_or_null<EnumDecl>(getDerived().TransformDecl(TL.getNameLoc(),
5906                                                         T->getDecl()));
5907   if (!Enum)
5908     return QualType();
5909 
5910   QualType Result = TL.getType();
5911   if (getDerived().AlwaysRebuild() ||
5912       Enum != T->getDecl()) {
5913     Result = getDerived().RebuildEnumType(Enum);
5914     if (Result.isNull())
5915       return QualType();
5916   }
5917 
5918   EnumTypeLoc NewTL = TLB.push<EnumTypeLoc>(Result);
5919   NewTL.setNameLoc(TL.getNameLoc());
5920 
5921   return Result;
5922 }
5923 
5924 template<typename Derived>
5925 QualType TreeTransform<Derived>::TransformInjectedClassNameType(
5926                                          TypeLocBuilder &TLB,
5927                                          InjectedClassNameTypeLoc TL) {
5928   Decl *D = getDerived().TransformDecl(TL.getNameLoc(),
5929                                        TL.getTypePtr()->getDecl());
5930   if (!D) return QualType();
5931 
5932   QualType T = SemaRef.Context.getTypeDeclType(cast<TypeDecl>(D));
5933   TLB.pushTypeSpec(T).setNameLoc(TL.getNameLoc());
5934   return T;
5935 }
5936 
5937 template<typename Derived>
5938 QualType TreeTransform<Derived>::TransformTemplateTypeParmType(
5939                                                 TypeLocBuilder &TLB,
5940                                                 TemplateTypeParmTypeLoc TL) {
5941   return TransformTypeSpecType(TLB, TL);
5942 }
5943 
5944 template<typename Derived>
5945 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmType(
5946                                          TypeLocBuilder &TLB,
5947                                          SubstTemplateTypeParmTypeLoc TL) {
5948   const SubstTemplateTypeParmType *T = TL.getTypePtr();
5949 
5950   // Substitute into the replacement type, which itself might involve something
5951   // that needs to be transformed. This only tends to occur with default
5952   // template arguments of template template parameters.
5953   TemporaryBase Rebase(*this, TL.getNameLoc(), DeclarationName());
5954   QualType Replacement = getDerived().TransformType(T->getReplacementType());
5955   if (Replacement.isNull())
5956     return QualType();
5957 
5958   // Always canonicalize the replacement type.
5959   Replacement = SemaRef.Context.getCanonicalType(Replacement);
5960   QualType Result
5961     = SemaRef.Context.getSubstTemplateTypeParmType(T->getReplacedParameter(),
5962                                                    Replacement);
5963 
5964   // Propagate type-source information.
5965   SubstTemplateTypeParmTypeLoc NewTL
5966     = TLB.push<SubstTemplateTypeParmTypeLoc>(Result);
5967   NewTL.setNameLoc(TL.getNameLoc());
5968   return Result;
5969 
5970 }
5971 
5972 template<typename Derived>
5973 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmPackType(
5974                                           TypeLocBuilder &TLB,
5975                                           SubstTemplateTypeParmPackTypeLoc TL) {
5976   return TransformTypeSpecType(TLB, TL);
5977 }
5978 
5979 template<typename Derived>
5980 QualType TreeTransform<Derived>::TransformTemplateSpecializationType(
5981                                                         TypeLocBuilder &TLB,
5982                                            TemplateSpecializationTypeLoc TL) {
5983   const TemplateSpecializationType *T = TL.getTypePtr();
5984 
5985   // The nested-name-specifier never matters in a TemplateSpecializationType,
5986   // because we can't have a dependent nested-name-specifier anyway.
5987   CXXScopeSpec SS;
5988   TemplateName Template
5989     = getDerived().TransformTemplateName(SS, T->getTemplateName(),
5990                                          TL.getTemplateNameLoc());
5991   if (Template.isNull())
5992     return QualType();
5993 
5994   return getDerived().TransformTemplateSpecializationType(TLB, TL, Template);
5995 }
5996 
5997 template<typename Derived>
5998 QualType TreeTransform<Derived>::TransformAtomicType(TypeLocBuilder &TLB,
5999                                                      AtomicTypeLoc TL) {
6000   QualType ValueType = getDerived().TransformType(TLB, TL.getValueLoc());
6001   if (ValueType.isNull())
6002     return QualType();
6003 
6004   QualType Result = TL.getType();
6005   if (getDerived().AlwaysRebuild() ||
6006       ValueType != TL.getValueLoc().getType()) {
6007     Result = getDerived().RebuildAtomicType(ValueType, TL.getKWLoc());
6008     if (Result.isNull())
6009       return QualType();
6010   }
6011 
6012   AtomicTypeLoc NewTL = TLB.push<AtomicTypeLoc>(Result);
6013   NewTL.setKWLoc(TL.getKWLoc());
6014   NewTL.setLParenLoc(TL.getLParenLoc());
6015   NewTL.setRParenLoc(TL.getRParenLoc());
6016 
6017   return Result;
6018 }
6019 
6020 template <typename Derived>
6021 QualType TreeTransform<Derived>::TransformPipeType(TypeLocBuilder &TLB,
6022                                                    PipeTypeLoc TL) {
6023   QualType ValueType = getDerived().TransformType(TLB, TL.getValueLoc());
6024   if (ValueType.isNull())
6025     return QualType();
6026 
6027   QualType Result = TL.getType();
6028   if (getDerived().AlwaysRebuild() || ValueType != TL.getValueLoc().getType()) {
6029     const PipeType *PT = Result->castAs<PipeType>();
6030     bool isReadPipe = PT->isReadOnly();
6031     Result = getDerived().RebuildPipeType(ValueType, TL.getKWLoc(), isReadPipe);
6032     if (Result.isNull())
6033       return QualType();
6034   }
6035 
6036   PipeTypeLoc NewTL = TLB.push<PipeTypeLoc>(Result);
6037   NewTL.setKWLoc(TL.getKWLoc());
6038 
6039   return Result;
6040 }
6041 
6042   /// Simple iterator that traverses the template arguments in a
6043   /// container that provides a \c getArgLoc() member function.
6044   ///
6045   /// This iterator is intended to be used with the iterator form of
6046   /// \c TreeTransform<Derived>::TransformTemplateArguments().
6047   template<typename ArgLocContainer>
6048   class TemplateArgumentLocContainerIterator {
6049     ArgLocContainer *Container;
6050     unsigned Index;
6051 
6052   public:
6053     typedef TemplateArgumentLoc value_type;
6054     typedef TemplateArgumentLoc reference;
6055     typedef int difference_type;
6056     typedef std::input_iterator_tag iterator_category;
6057 
6058     class pointer {
6059       TemplateArgumentLoc Arg;
6060 
6061     public:
6062       explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { }
6063 
6064       const TemplateArgumentLoc *operator->() const {
6065         return &Arg;
6066       }
6067     };
6068 
6069 
6070     TemplateArgumentLocContainerIterator() {}
6071 
6072     TemplateArgumentLocContainerIterator(ArgLocContainer &Container,
6073                                  unsigned Index)
6074       : Container(&Container), Index(Index) { }
6075 
6076     TemplateArgumentLocContainerIterator &operator++() {
6077       ++Index;
6078       return *this;
6079     }
6080 
6081     TemplateArgumentLocContainerIterator operator++(int) {
6082       TemplateArgumentLocContainerIterator Old(*this);
6083       ++(*this);
6084       return Old;
6085     }
6086 
6087     TemplateArgumentLoc operator*() const {
6088       return Container->getArgLoc(Index);
6089     }
6090 
6091     pointer operator->() const {
6092       return pointer(Container->getArgLoc(Index));
6093     }
6094 
6095     friend bool operator==(const TemplateArgumentLocContainerIterator &X,
6096                            const TemplateArgumentLocContainerIterator &Y) {
6097       return X.Container == Y.Container && X.Index == Y.Index;
6098     }
6099 
6100     friend bool operator!=(const TemplateArgumentLocContainerIterator &X,
6101                            const TemplateArgumentLocContainerIterator &Y) {
6102       return !(X == Y);
6103     }
6104   };
6105 
6106 template<typename Derived>
6107 QualType TreeTransform<Derived>::TransformAutoType(TypeLocBuilder &TLB,
6108                                                    AutoTypeLoc TL) {
6109   const AutoType *T = TL.getTypePtr();
6110   QualType OldDeduced = T->getDeducedType();
6111   QualType NewDeduced;
6112   if (!OldDeduced.isNull()) {
6113     NewDeduced = getDerived().TransformType(OldDeduced);
6114     if (NewDeduced.isNull())
6115       return QualType();
6116   }
6117 
6118   ConceptDecl *NewCD = nullptr;
6119   TemplateArgumentListInfo NewTemplateArgs;
6120   NestedNameSpecifierLoc NewNestedNameSpec;
6121   if (TL.getTypePtr()->isConstrained()) {
6122     NewCD = cast_or_null<ConceptDecl>(
6123         getDerived().TransformDecl(
6124             TL.getConceptNameLoc(),
6125             TL.getTypePtr()->getTypeConstraintConcept()));
6126 
6127     NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
6128     NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
6129     typedef TemplateArgumentLocContainerIterator<AutoTypeLoc> ArgIterator;
6130     if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
6131                                                 ArgIterator(TL,
6132                                                             TL.getNumArgs()),
6133                                                 NewTemplateArgs))
6134       return QualType();
6135 
6136     if (TL.getNestedNameSpecifierLoc()) {
6137       NewNestedNameSpec
6138         = getDerived().TransformNestedNameSpecifierLoc(
6139             TL.getNestedNameSpecifierLoc());
6140       if (!NewNestedNameSpec)
6141         return QualType();
6142     }
6143   }
6144 
6145   QualType Result = TL.getType();
6146   if (getDerived().AlwaysRebuild() || NewDeduced != OldDeduced ||
6147       T->isDependentType()) {
6148     llvm::SmallVector<TemplateArgument, 4> NewArgList;
6149     NewArgList.reserve(NewArgList.size());
6150     for (const auto &ArgLoc : NewTemplateArgs.arguments())
6151       NewArgList.push_back(ArgLoc.getArgument());
6152     Result = getDerived().RebuildAutoType(NewDeduced, T->getKeyword(), NewCD,
6153                                           NewArgList);
6154     if (Result.isNull())
6155       return QualType();
6156   }
6157 
6158   AutoTypeLoc NewTL = TLB.push<AutoTypeLoc>(Result);
6159   NewTL.setNameLoc(TL.getNameLoc());
6160   NewTL.setNestedNameSpecifierLoc(NewNestedNameSpec);
6161   NewTL.setTemplateKWLoc(TL.getTemplateKWLoc());
6162   NewTL.setConceptNameLoc(TL.getConceptNameLoc());
6163   NewTL.setFoundDecl(TL.getFoundDecl());
6164   NewTL.setLAngleLoc(TL.getLAngleLoc());
6165   NewTL.setRAngleLoc(TL.getRAngleLoc());
6166   for (unsigned I = 0; I < TL.getNumArgs(); ++I)
6167     NewTL.setArgLocInfo(I, NewTemplateArgs.arguments()[I].getLocInfo());
6168 
6169   return Result;
6170 }
6171 
6172 template <typename Derived>
6173 QualType TreeTransform<Derived>::TransformTemplateSpecializationType(
6174                                                         TypeLocBuilder &TLB,
6175                                            TemplateSpecializationTypeLoc TL,
6176                                                       TemplateName Template) {
6177   TemplateArgumentListInfo NewTemplateArgs;
6178   NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
6179   NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
6180   typedef TemplateArgumentLocContainerIterator<TemplateSpecializationTypeLoc>
6181     ArgIterator;
6182   if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
6183                                               ArgIterator(TL, TL.getNumArgs()),
6184                                               NewTemplateArgs))
6185     return QualType();
6186 
6187   // FIXME: maybe don't rebuild if all the template arguments are the same.
6188 
6189   QualType Result =
6190     getDerived().RebuildTemplateSpecializationType(Template,
6191                                                    TL.getTemplateNameLoc(),
6192                                                    NewTemplateArgs);
6193 
6194   if (!Result.isNull()) {
6195     // Specializations of template template parameters are represented as
6196     // TemplateSpecializationTypes, and substitution of type alias templates
6197     // within a dependent context can transform them into
6198     // DependentTemplateSpecializationTypes.
6199     if (isa<DependentTemplateSpecializationType>(Result)) {
6200       DependentTemplateSpecializationTypeLoc NewTL
6201         = TLB.push<DependentTemplateSpecializationTypeLoc>(Result);
6202       NewTL.setElaboratedKeywordLoc(SourceLocation());
6203       NewTL.setQualifierLoc(NestedNameSpecifierLoc());
6204       NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6205       NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6206       NewTL.setLAngleLoc(TL.getLAngleLoc());
6207       NewTL.setRAngleLoc(TL.getRAngleLoc());
6208       for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
6209         NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
6210       return Result;
6211     }
6212 
6213     TemplateSpecializationTypeLoc NewTL
6214       = TLB.push<TemplateSpecializationTypeLoc>(Result);
6215     NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6216     NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6217     NewTL.setLAngleLoc(TL.getLAngleLoc());
6218     NewTL.setRAngleLoc(TL.getRAngleLoc());
6219     for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
6220       NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
6221   }
6222 
6223   return Result;
6224 }
6225 
6226 template <typename Derived>
6227 QualType TreeTransform<Derived>::TransformDependentTemplateSpecializationType(
6228                                      TypeLocBuilder &TLB,
6229                                      DependentTemplateSpecializationTypeLoc TL,
6230                                      TemplateName Template,
6231                                      CXXScopeSpec &SS) {
6232   TemplateArgumentListInfo NewTemplateArgs;
6233   NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
6234   NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
6235   typedef TemplateArgumentLocContainerIterator<
6236             DependentTemplateSpecializationTypeLoc> ArgIterator;
6237   if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
6238                                               ArgIterator(TL, TL.getNumArgs()),
6239                                               NewTemplateArgs))
6240     return QualType();
6241 
6242   // FIXME: maybe don't rebuild if all the template arguments are the same.
6243 
6244   if (DependentTemplateName *DTN = Template.getAsDependentTemplateName()) {
6245     QualType Result
6246       = getSema().Context.getDependentTemplateSpecializationType(
6247                                                 TL.getTypePtr()->getKeyword(),
6248                                                          DTN->getQualifier(),
6249                                                          DTN->getIdentifier(),
6250                                                                NewTemplateArgs);
6251 
6252     DependentTemplateSpecializationTypeLoc NewTL
6253       = TLB.push<DependentTemplateSpecializationTypeLoc>(Result);
6254     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6255     NewTL.setQualifierLoc(SS.getWithLocInContext(SemaRef.Context));
6256     NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6257     NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6258     NewTL.setLAngleLoc(TL.getLAngleLoc());
6259     NewTL.setRAngleLoc(TL.getRAngleLoc());
6260     for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
6261       NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
6262     return Result;
6263   }
6264 
6265   QualType Result
6266     = getDerived().RebuildTemplateSpecializationType(Template,
6267                                                      TL.getTemplateNameLoc(),
6268                                                      NewTemplateArgs);
6269 
6270   if (!Result.isNull()) {
6271     /// FIXME: Wrap this in an elaborated-type-specifier?
6272     TemplateSpecializationTypeLoc NewTL
6273       = TLB.push<TemplateSpecializationTypeLoc>(Result);
6274     NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6275     NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6276     NewTL.setLAngleLoc(TL.getLAngleLoc());
6277     NewTL.setRAngleLoc(TL.getRAngleLoc());
6278     for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
6279       NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
6280   }
6281 
6282   return Result;
6283 }
6284 
6285 template<typename Derived>
6286 QualType
6287 TreeTransform<Derived>::TransformElaboratedType(TypeLocBuilder &TLB,
6288                                                 ElaboratedTypeLoc TL) {
6289   const ElaboratedType *T = TL.getTypePtr();
6290 
6291   NestedNameSpecifierLoc QualifierLoc;
6292   // NOTE: the qualifier in an ElaboratedType is optional.
6293   if (TL.getQualifierLoc()) {
6294     QualifierLoc
6295       = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc());
6296     if (!QualifierLoc)
6297       return QualType();
6298   }
6299 
6300   QualType NamedT = getDerived().TransformType(TLB, TL.getNamedTypeLoc());
6301   if (NamedT.isNull())
6302     return QualType();
6303 
6304   // C++0x [dcl.type.elab]p2:
6305   //   If the identifier resolves to a typedef-name or the simple-template-id
6306   //   resolves to an alias template specialization, the
6307   //   elaborated-type-specifier is ill-formed.
6308   if (T->getKeyword() != ETK_None && T->getKeyword() != ETK_Typename) {
6309     if (const TemplateSpecializationType *TST =
6310           NamedT->getAs<TemplateSpecializationType>()) {
6311       TemplateName Template = TST->getTemplateName();
6312       if (TypeAliasTemplateDecl *TAT = dyn_cast_or_null<TypeAliasTemplateDecl>(
6313               Template.getAsTemplateDecl())) {
6314         SemaRef.Diag(TL.getNamedTypeLoc().getBeginLoc(),
6315                      diag::err_tag_reference_non_tag)
6316             << TAT << Sema::NTK_TypeAliasTemplate
6317             << ElaboratedType::getTagTypeKindForKeyword(T->getKeyword());
6318         SemaRef.Diag(TAT->getLocation(), diag::note_declared_at);
6319       }
6320     }
6321   }
6322 
6323   QualType Result = TL.getType();
6324   if (getDerived().AlwaysRebuild() ||
6325       QualifierLoc != TL.getQualifierLoc() ||
6326       NamedT != T->getNamedType()) {
6327     Result = getDerived().RebuildElaboratedType(TL.getElaboratedKeywordLoc(),
6328                                                 T->getKeyword(),
6329                                                 QualifierLoc, NamedT);
6330     if (Result.isNull())
6331       return QualType();
6332   }
6333 
6334   ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
6335   NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6336   NewTL.setQualifierLoc(QualifierLoc);
6337   return Result;
6338 }
6339 
6340 template<typename Derived>
6341 QualType TreeTransform<Derived>::TransformAttributedType(
6342                                                 TypeLocBuilder &TLB,
6343                                                 AttributedTypeLoc TL) {
6344   const AttributedType *oldType = TL.getTypePtr();
6345   QualType modifiedType = getDerived().TransformType(TLB, TL.getModifiedLoc());
6346   if (modifiedType.isNull())
6347     return QualType();
6348 
6349   // oldAttr can be null if we started with a QualType rather than a TypeLoc.
6350   const Attr *oldAttr = TL.getAttr();
6351   const Attr *newAttr = oldAttr ? getDerived().TransformAttr(oldAttr) : nullptr;
6352   if (oldAttr && !newAttr)
6353     return QualType();
6354 
6355   QualType result = TL.getType();
6356 
6357   // FIXME: dependent operand expressions?
6358   if (getDerived().AlwaysRebuild() ||
6359       modifiedType != oldType->getModifiedType()) {
6360     // TODO: this is really lame; we should really be rebuilding the
6361     // equivalent type from first principles.
6362     QualType equivalentType
6363       = getDerived().TransformType(oldType->getEquivalentType());
6364     if (equivalentType.isNull())
6365       return QualType();
6366 
6367     // Check whether we can add nullability; it is only represented as
6368     // type sugar, and therefore cannot be diagnosed in any other way.
6369     if (auto nullability = oldType->getImmediateNullability()) {
6370       if (!modifiedType->canHaveNullability()) {
6371         SemaRef.Diag(TL.getAttr()->getLocation(),
6372                      diag::err_nullability_nonpointer)
6373             << DiagNullabilityKind(*nullability, false) << modifiedType;
6374         return QualType();
6375       }
6376     }
6377 
6378     result = SemaRef.Context.getAttributedType(TL.getAttrKind(),
6379                                                modifiedType,
6380                                                equivalentType);
6381   }
6382 
6383   AttributedTypeLoc newTL = TLB.push<AttributedTypeLoc>(result);
6384   newTL.setAttr(newAttr);
6385   return result;
6386 }
6387 
6388 template<typename Derived>
6389 QualType
6390 TreeTransform<Derived>::TransformParenType(TypeLocBuilder &TLB,
6391                                            ParenTypeLoc TL) {
6392   QualType Inner = getDerived().TransformType(TLB, TL.getInnerLoc());
6393   if (Inner.isNull())
6394     return QualType();
6395 
6396   QualType Result = TL.getType();
6397   if (getDerived().AlwaysRebuild() ||
6398       Inner != TL.getInnerLoc().getType()) {
6399     Result = getDerived().RebuildParenType(Inner);
6400     if (Result.isNull())
6401       return QualType();
6402   }
6403 
6404   ParenTypeLoc NewTL = TLB.push<ParenTypeLoc>(Result);
6405   NewTL.setLParenLoc(TL.getLParenLoc());
6406   NewTL.setRParenLoc(TL.getRParenLoc());
6407   return Result;
6408 }
6409 
6410 template <typename Derived>
6411 QualType
6412 TreeTransform<Derived>::TransformMacroQualifiedType(TypeLocBuilder &TLB,
6413                                                     MacroQualifiedTypeLoc TL) {
6414   QualType Inner = getDerived().TransformType(TLB, TL.getInnerLoc());
6415   if (Inner.isNull())
6416     return QualType();
6417 
6418   QualType Result = TL.getType();
6419   if (getDerived().AlwaysRebuild() || Inner != TL.getInnerLoc().getType()) {
6420     Result =
6421         getDerived().RebuildMacroQualifiedType(Inner, TL.getMacroIdentifier());
6422     if (Result.isNull())
6423       return QualType();
6424   }
6425 
6426   MacroQualifiedTypeLoc NewTL = TLB.push<MacroQualifiedTypeLoc>(Result);
6427   NewTL.setExpansionLoc(TL.getExpansionLoc());
6428   return Result;
6429 }
6430 
6431 template<typename Derived>
6432 QualType TreeTransform<Derived>::TransformDependentNameType(
6433     TypeLocBuilder &TLB, DependentNameTypeLoc TL) {
6434   return TransformDependentNameType(TLB, TL, false);
6435 }
6436 
6437 template<typename Derived>
6438 QualType TreeTransform<Derived>::TransformDependentNameType(
6439     TypeLocBuilder &TLB, DependentNameTypeLoc TL, bool DeducedTSTContext) {
6440   const DependentNameType *T = TL.getTypePtr();
6441 
6442   NestedNameSpecifierLoc QualifierLoc
6443     = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc());
6444   if (!QualifierLoc)
6445     return QualType();
6446 
6447   QualType Result
6448     = getDerived().RebuildDependentNameType(T->getKeyword(),
6449                                             TL.getElaboratedKeywordLoc(),
6450                                             QualifierLoc,
6451                                             T->getIdentifier(),
6452                                             TL.getNameLoc(),
6453                                             DeducedTSTContext);
6454   if (Result.isNull())
6455     return QualType();
6456 
6457   if (const ElaboratedType* ElabT = Result->getAs<ElaboratedType>()) {
6458     QualType NamedT = ElabT->getNamedType();
6459     TLB.pushTypeSpec(NamedT).setNameLoc(TL.getNameLoc());
6460 
6461     ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
6462     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6463     NewTL.setQualifierLoc(QualifierLoc);
6464   } else {
6465     DependentNameTypeLoc NewTL = TLB.push<DependentNameTypeLoc>(Result);
6466     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6467     NewTL.setQualifierLoc(QualifierLoc);
6468     NewTL.setNameLoc(TL.getNameLoc());
6469   }
6470   return Result;
6471 }
6472 
6473 template<typename Derived>
6474 QualType TreeTransform<Derived>::
6475           TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB,
6476                                  DependentTemplateSpecializationTypeLoc TL) {
6477   NestedNameSpecifierLoc QualifierLoc;
6478   if (TL.getQualifierLoc()) {
6479     QualifierLoc
6480       = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc());
6481     if (!QualifierLoc)
6482       return QualType();
6483   }
6484 
6485   return getDerived()
6486            .TransformDependentTemplateSpecializationType(TLB, TL, QualifierLoc);
6487 }
6488 
6489 template<typename Derived>
6490 QualType TreeTransform<Derived>::
6491 TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB,
6492                                    DependentTemplateSpecializationTypeLoc TL,
6493                                        NestedNameSpecifierLoc QualifierLoc) {
6494   const DependentTemplateSpecializationType *T = TL.getTypePtr();
6495 
6496   TemplateArgumentListInfo NewTemplateArgs;
6497   NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
6498   NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
6499 
6500   typedef TemplateArgumentLocContainerIterator<
6501   DependentTemplateSpecializationTypeLoc> ArgIterator;
6502   if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
6503                                               ArgIterator(TL, TL.getNumArgs()),
6504                                               NewTemplateArgs))
6505     return QualType();
6506 
6507   QualType Result = getDerived().RebuildDependentTemplateSpecializationType(
6508       T->getKeyword(), QualifierLoc, TL.getTemplateKeywordLoc(),
6509       T->getIdentifier(), TL.getTemplateNameLoc(), NewTemplateArgs,
6510       /*AllowInjectedClassName*/ false);
6511   if (Result.isNull())
6512     return QualType();
6513 
6514   if (const ElaboratedType *ElabT = dyn_cast<ElaboratedType>(Result)) {
6515     QualType NamedT = ElabT->getNamedType();
6516 
6517     // Copy information relevant to the template specialization.
6518     TemplateSpecializationTypeLoc NamedTL
6519       = TLB.push<TemplateSpecializationTypeLoc>(NamedT);
6520     NamedTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6521     NamedTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6522     NamedTL.setLAngleLoc(TL.getLAngleLoc());
6523     NamedTL.setRAngleLoc(TL.getRAngleLoc());
6524     for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I)
6525       NamedTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo());
6526 
6527     // Copy information relevant to the elaborated type.
6528     ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
6529     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6530     NewTL.setQualifierLoc(QualifierLoc);
6531   } else if (isa<DependentTemplateSpecializationType>(Result)) {
6532     DependentTemplateSpecializationTypeLoc SpecTL
6533       = TLB.push<DependentTemplateSpecializationTypeLoc>(Result);
6534     SpecTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6535     SpecTL.setQualifierLoc(QualifierLoc);
6536     SpecTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6537     SpecTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6538     SpecTL.setLAngleLoc(TL.getLAngleLoc());
6539     SpecTL.setRAngleLoc(TL.getRAngleLoc());
6540     for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I)
6541       SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo());
6542   } else {
6543     TemplateSpecializationTypeLoc SpecTL
6544       = TLB.push<TemplateSpecializationTypeLoc>(Result);
6545     SpecTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6546     SpecTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6547     SpecTL.setLAngleLoc(TL.getLAngleLoc());
6548     SpecTL.setRAngleLoc(TL.getRAngleLoc());
6549     for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I)
6550       SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo());
6551   }
6552   return Result;
6553 }
6554 
6555 template<typename Derived>
6556 QualType TreeTransform<Derived>::TransformPackExpansionType(TypeLocBuilder &TLB,
6557                                                       PackExpansionTypeLoc TL) {
6558   QualType Pattern
6559     = getDerived().TransformType(TLB, TL.getPatternLoc());
6560   if (Pattern.isNull())
6561     return QualType();
6562 
6563   QualType Result = TL.getType();
6564   if (getDerived().AlwaysRebuild() ||
6565       Pattern != TL.getPatternLoc().getType()) {
6566     Result = getDerived().RebuildPackExpansionType(Pattern,
6567                                            TL.getPatternLoc().getSourceRange(),
6568                                                    TL.getEllipsisLoc(),
6569                                            TL.getTypePtr()->getNumExpansions());
6570     if (Result.isNull())
6571       return QualType();
6572   }
6573 
6574   PackExpansionTypeLoc NewT = TLB.push<PackExpansionTypeLoc>(Result);
6575   NewT.setEllipsisLoc(TL.getEllipsisLoc());
6576   return Result;
6577 }
6578 
6579 template<typename Derived>
6580 QualType
6581 TreeTransform<Derived>::TransformObjCInterfaceType(TypeLocBuilder &TLB,
6582                                                    ObjCInterfaceTypeLoc TL) {
6583   // ObjCInterfaceType is never dependent.
6584   TLB.pushFullCopy(TL);
6585   return TL.getType();
6586 }
6587 
6588 template<typename Derived>
6589 QualType
6590 TreeTransform<Derived>::TransformObjCTypeParamType(TypeLocBuilder &TLB,
6591                                                    ObjCTypeParamTypeLoc TL) {
6592   const ObjCTypeParamType *T = TL.getTypePtr();
6593   ObjCTypeParamDecl *OTP = cast_or_null<ObjCTypeParamDecl>(
6594       getDerived().TransformDecl(T->getDecl()->getLocation(), T->getDecl()));
6595   if (!OTP)
6596     return QualType();
6597 
6598   QualType Result = TL.getType();
6599   if (getDerived().AlwaysRebuild() ||
6600       OTP != T->getDecl()) {
6601     Result = getDerived().RebuildObjCTypeParamType(OTP,
6602                  TL.getProtocolLAngleLoc(),
6603                  llvm::makeArrayRef(TL.getTypePtr()->qual_begin(),
6604                                     TL.getNumProtocols()),
6605                  TL.getProtocolLocs(),
6606                  TL.getProtocolRAngleLoc());
6607     if (Result.isNull())
6608       return QualType();
6609   }
6610 
6611   ObjCTypeParamTypeLoc NewTL = TLB.push<ObjCTypeParamTypeLoc>(Result);
6612   if (TL.getNumProtocols()) {
6613     NewTL.setProtocolLAngleLoc(TL.getProtocolLAngleLoc());
6614     for (unsigned i = 0, n = TL.getNumProtocols(); i != n; ++i)
6615       NewTL.setProtocolLoc(i, TL.getProtocolLoc(i));
6616     NewTL.setProtocolRAngleLoc(TL.getProtocolRAngleLoc());
6617   }
6618   return Result;
6619 }
6620 
6621 template<typename Derived>
6622 QualType
6623 TreeTransform<Derived>::TransformObjCObjectType(TypeLocBuilder &TLB,
6624                                                 ObjCObjectTypeLoc TL) {
6625   // Transform base type.
6626   QualType BaseType = getDerived().TransformType(TLB, TL.getBaseLoc());
6627   if (BaseType.isNull())
6628     return QualType();
6629 
6630   bool AnyChanged = BaseType != TL.getBaseLoc().getType();
6631 
6632   // Transform type arguments.
6633   SmallVector<TypeSourceInfo *, 4> NewTypeArgInfos;
6634   for (unsigned i = 0, n = TL.getNumTypeArgs(); i != n; ++i) {
6635     TypeSourceInfo *TypeArgInfo = TL.getTypeArgTInfo(i);
6636     TypeLoc TypeArgLoc = TypeArgInfo->getTypeLoc();
6637     QualType TypeArg = TypeArgInfo->getType();
6638     if (auto PackExpansionLoc = TypeArgLoc.getAs<PackExpansionTypeLoc>()) {
6639       AnyChanged = true;
6640 
6641       // We have a pack expansion. Instantiate it.
6642       const auto *PackExpansion = PackExpansionLoc.getType()
6643                                     ->castAs<PackExpansionType>();
6644       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
6645       SemaRef.collectUnexpandedParameterPacks(PackExpansion->getPattern(),
6646                                               Unexpanded);
6647       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
6648 
6649       // Determine whether the set of unexpanded parameter packs can
6650       // and should be expanded.
6651       TypeLoc PatternLoc = PackExpansionLoc.getPatternLoc();
6652       bool Expand = false;
6653       bool RetainExpansion = false;
6654       Optional<unsigned> NumExpansions = PackExpansion->getNumExpansions();
6655       if (getDerived().TryExpandParameterPacks(
6656             PackExpansionLoc.getEllipsisLoc(), PatternLoc.getSourceRange(),
6657             Unexpanded, Expand, RetainExpansion, NumExpansions))
6658         return QualType();
6659 
6660       if (!Expand) {
6661         // We can't expand this pack expansion into separate arguments yet;
6662         // just substitute into the pattern and create a new pack expansion
6663         // type.
6664         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
6665 
6666         TypeLocBuilder TypeArgBuilder;
6667         TypeArgBuilder.reserve(PatternLoc.getFullDataSize());
6668         QualType NewPatternType = getDerived().TransformType(TypeArgBuilder,
6669                                                              PatternLoc);
6670         if (NewPatternType.isNull())
6671           return QualType();
6672 
6673         QualType NewExpansionType = SemaRef.Context.getPackExpansionType(
6674                                       NewPatternType, NumExpansions);
6675         auto NewExpansionLoc = TLB.push<PackExpansionTypeLoc>(NewExpansionType);
6676         NewExpansionLoc.setEllipsisLoc(PackExpansionLoc.getEllipsisLoc());
6677         NewTypeArgInfos.push_back(
6678           TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewExpansionType));
6679         continue;
6680       }
6681 
6682       // Substitute into the pack expansion pattern for each slice of the
6683       // pack.
6684       for (unsigned ArgIdx = 0; ArgIdx != *NumExpansions; ++ArgIdx) {
6685         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), ArgIdx);
6686 
6687         TypeLocBuilder TypeArgBuilder;
6688         TypeArgBuilder.reserve(PatternLoc.getFullDataSize());
6689 
6690         QualType NewTypeArg = getDerived().TransformType(TypeArgBuilder,
6691                                                          PatternLoc);
6692         if (NewTypeArg.isNull())
6693           return QualType();
6694 
6695         NewTypeArgInfos.push_back(
6696           TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewTypeArg));
6697       }
6698 
6699       continue;
6700     }
6701 
6702     TypeLocBuilder TypeArgBuilder;
6703     TypeArgBuilder.reserve(TypeArgLoc.getFullDataSize());
6704     QualType NewTypeArg = getDerived().TransformType(TypeArgBuilder, TypeArgLoc);
6705     if (NewTypeArg.isNull())
6706       return QualType();
6707 
6708     // If nothing changed, just keep the old TypeSourceInfo.
6709     if (NewTypeArg == TypeArg) {
6710       NewTypeArgInfos.push_back(TypeArgInfo);
6711       continue;
6712     }
6713 
6714     NewTypeArgInfos.push_back(
6715       TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewTypeArg));
6716     AnyChanged = true;
6717   }
6718 
6719   QualType Result = TL.getType();
6720   if (getDerived().AlwaysRebuild() || AnyChanged) {
6721     // Rebuild the type.
6722     Result = getDerived().RebuildObjCObjectType(
6723         BaseType, TL.getBeginLoc(), TL.getTypeArgsLAngleLoc(), NewTypeArgInfos,
6724         TL.getTypeArgsRAngleLoc(), TL.getProtocolLAngleLoc(),
6725         llvm::makeArrayRef(TL.getTypePtr()->qual_begin(), TL.getNumProtocols()),
6726         TL.getProtocolLocs(), TL.getProtocolRAngleLoc());
6727 
6728     if (Result.isNull())
6729       return QualType();
6730   }
6731 
6732   ObjCObjectTypeLoc NewT = TLB.push<ObjCObjectTypeLoc>(Result);
6733   NewT.setHasBaseTypeAsWritten(true);
6734   NewT.setTypeArgsLAngleLoc(TL.getTypeArgsLAngleLoc());
6735   for (unsigned i = 0, n = TL.getNumTypeArgs(); i != n; ++i)
6736     NewT.setTypeArgTInfo(i, NewTypeArgInfos[i]);
6737   NewT.setTypeArgsRAngleLoc(TL.getTypeArgsRAngleLoc());
6738   NewT.setProtocolLAngleLoc(TL.getProtocolLAngleLoc());
6739   for (unsigned i = 0, n = TL.getNumProtocols(); i != n; ++i)
6740     NewT.setProtocolLoc(i, TL.getProtocolLoc(i));
6741   NewT.setProtocolRAngleLoc(TL.getProtocolRAngleLoc());
6742   return Result;
6743 }
6744 
6745 template<typename Derived>
6746 QualType
6747 TreeTransform<Derived>::TransformObjCObjectPointerType(TypeLocBuilder &TLB,
6748                                                ObjCObjectPointerTypeLoc TL) {
6749   QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
6750   if (PointeeType.isNull())
6751     return QualType();
6752 
6753   QualType Result = TL.getType();
6754   if (getDerived().AlwaysRebuild() ||
6755       PointeeType != TL.getPointeeLoc().getType()) {
6756     Result = getDerived().RebuildObjCObjectPointerType(PointeeType,
6757                                                        TL.getStarLoc());
6758     if (Result.isNull())
6759       return QualType();
6760   }
6761 
6762   ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result);
6763   NewT.setStarLoc(TL.getStarLoc());
6764   return Result;
6765 }
6766 
6767 //===----------------------------------------------------------------------===//
6768 // Statement transformation
6769 //===----------------------------------------------------------------------===//
6770 template<typename Derived>
6771 StmtResult
6772 TreeTransform<Derived>::TransformNullStmt(NullStmt *S) {
6773   return S;
6774 }
6775 
6776 template<typename Derived>
6777 StmtResult
6778 TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S) {
6779   return getDerived().TransformCompoundStmt(S, false);
6780 }
6781 
6782 template<typename Derived>
6783 StmtResult
6784 TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S,
6785                                               bool IsStmtExpr) {
6786   Sema::CompoundScopeRAII CompoundScope(getSema());
6787 
6788   const Stmt *ExprResult = S->getStmtExprResult();
6789   bool SubStmtInvalid = false;
6790   bool SubStmtChanged = false;
6791   SmallVector<Stmt*, 8> Statements;
6792   for (auto *B : S->body()) {
6793     StmtResult Result = getDerived().TransformStmt(
6794         B, IsStmtExpr && B == ExprResult ? SDK_StmtExprResult : SDK_Discarded);
6795 
6796     if (Result.isInvalid()) {
6797       // Immediately fail if this was a DeclStmt, since it's very
6798       // likely that this will cause problems for future statements.
6799       if (isa<DeclStmt>(B))
6800         return StmtError();
6801 
6802       // Otherwise, just keep processing substatements and fail later.
6803       SubStmtInvalid = true;
6804       continue;
6805     }
6806 
6807     SubStmtChanged = SubStmtChanged || Result.get() != B;
6808     Statements.push_back(Result.getAs<Stmt>());
6809   }
6810 
6811   if (SubStmtInvalid)
6812     return StmtError();
6813 
6814   if (!getDerived().AlwaysRebuild() &&
6815       !SubStmtChanged)
6816     return S;
6817 
6818   return getDerived().RebuildCompoundStmt(S->getLBracLoc(),
6819                                           Statements,
6820                                           S->getRBracLoc(),
6821                                           IsStmtExpr);
6822 }
6823 
6824 template<typename Derived>
6825 StmtResult
6826 TreeTransform<Derived>::TransformCaseStmt(CaseStmt *S) {
6827   ExprResult LHS, RHS;
6828   {
6829     EnterExpressionEvaluationContext Unevaluated(
6830         SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
6831 
6832     // Transform the left-hand case value.
6833     LHS = getDerived().TransformExpr(S->getLHS());
6834     LHS = SemaRef.ActOnCaseExpr(S->getCaseLoc(), LHS);
6835     if (LHS.isInvalid())
6836       return StmtError();
6837 
6838     // Transform the right-hand case value (for the GNU case-range extension).
6839     RHS = getDerived().TransformExpr(S->getRHS());
6840     RHS = SemaRef.ActOnCaseExpr(S->getCaseLoc(), RHS);
6841     if (RHS.isInvalid())
6842       return StmtError();
6843   }
6844 
6845   // Build the case statement.
6846   // Case statements are always rebuilt so that they will attached to their
6847   // transformed switch statement.
6848   StmtResult Case = getDerived().RebuildCaseStmt(S->getCaseLoc(),
6849                                                        LHS.get(),
6850                                                        S->getEllipsisLoc(),
6851                                                        RHS.get(),
6852                                                        S->getColonLoc());
6853   if (Case.isInvalid())
6854     return StmtError();
6855 
6856   // Transform the statement following the case
6857   StmtResult SubStmt =
6858       getDerived().TransformStmt(S->getSubStmt());
6859   if (SubStmt.isInvalid())
6860     return StmtError();
6861 
6862   // Attach the body to the case statement
6863   return getDerived().RebuildCaseStmtBody(Case.get(), SubStmt.get());
6864 }
6865 
6866 template <typename Derived>
6867 StmtResult TreeTransform<Derived>::TransformDefaultStmt(DefaultStmt *S) {
6868   // Transform the statement following the default case
6869   StmtResult SubStmt =
6870       getDerived().TransformStmt(S->getSubStmt());
6871   if (SubStmt.isInvalid())
6872     return StmtError();
6873 
6874   // Default statements are always rebuilt
6875   return getDerived().RebuildDefaultStmt(S->getDefaultLoc(), S->getColonLoc(),
6876                                          SubStmt.get());
6877 }
6878 
6879 template<typename Derived>
6880 StmtResult
6881 TreeTransform<Derived>::TransformLabelStmt(LabelStmt *S, StmtDiscardKind SDK) {
6882   StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt(), SDK);
6883   if (SubStmt.isInvalid())
6884     return StmtError();
6885 
6886   Decl *LD = getDerived().TransformDecl(S->getDecl()->getLocation(),
6887                                         S->getDecl());
6888   if (!LD)
6889     return StmtError();
6890 
6891   // If we're transforming "in-place" (we're not creating new local
6892   // declarations), assume we're replacing the old label statement
6893   // and clear out the reference to it.
6894   if (LD == S->getDecl())
6895     S->getDecl()->setStmt(nullptr);
6896 
6897   // FIXME: Pass the real colon location in.
6898   return getDerived().RebuildLabelStmt(S->getIdentLoc(),
6899                                        cast<LabelDecl>(LD), SourceLocation(),
6900                                        SubStmt.get());
6901 }
6902 
6903 template <typename Derived>
6904 const Attr *TreeTransform<Derived>::TransformAttr(const Attr *R) {
6905   if (!R)
6906     return R;
6907 
6908   switch (R->getKind()) {
6909 // Transform attributes with a pragma spelling by calling TransformXXXAttr.
6910 #define ATTR(X)
6911 #define PRAGMA_SPELLING_ATTR(X)                                                \
6912   case attr::X:                                                                \
6913     return getDerived().Transform##X##Attr(cast<X##Attr>(R));
6914 #include "clang/Basic/AttrList.inc"
6915   default:
6916     return R;
6917   }
6918 }
6919 
6920 template <typename Derived>
6921 StmtResult
6922 TreeTransform<Derived>::TransformAttributedStmt(AttributedStmt *S,
6923                                                 StmtDiscardKind SDK) {
6924   bool AttrsChanged = false;
6925   SmallVector<const Attr *, 1> Attrs;
6926 
6927   // Visit attributes and keep track if any are transformed.
6928   for (const auto *I : S->getAttrs()) {
6929     const Attr *R = getDerived().TransformAttr(I);
6930     AttrsChanged |= (I != R);
6931     Attrs.push_back(R);
6932   }
6933 
6934   StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt(), SDK);
6935   if (SubStmt.isInvalid())
6936     return StmtError();
6937 
6938   if (SubStmt.get() == S->getSubStmt() && !AttrsChanged)
6939     return S;
6940 
6941   return getDerived().RebuildAttributedStmt(S->getAttrLoc(), Attrs,
6942                                             SubStmt.get());
6943 }
6944 
6945 template<typename Derived>
6946 StmtResult
6947 TreeTransform<Derived>::TransformIfStmt(IfStmt *S) {
6948   // Transform the initialization statement
6949   StmtResult Init = getDerived().TransformStmt(S->getInit());
6950   if (Init.isInvalid())
6951     return StmtError();
6952 
6953   // Transform the condition
6954   Sema::ConditionResult Cond = getDerived().TransformCondition(
6955       S->getIfLoc(), S->getConditionVariable(), S->getCond(),
6956       S->isConstexpr() ? Sema::ConditionKind::ConstexprIf
6957                        : Sema::ConditionKind::Boolean);
6958   if (Cond.isInvalid())
6959     return StmtError();
6960 
6961   // If this is a constexpr if, determine which arm we should instantiate.
6962   llvm::Optional<bool> ConstexprConditionValue;
6963   if (S->isConstexpr())
6964     ConstexprConditionValue = Cond.getKnownValue();
6965 
6966   // Transform the "then" branch.
6967   StmtResult Then;
6968   if (!ConstexprConditionValue || *ConstexprConditionValue) {
6969     Then = getDerived().TransformStmt(S->getThen());
6970     if (Then.isInvalid())
6971       return StmtError();
6972   } else {
6973     Then = new (getSema().Context) NullStmt(S->getThen()->getBeginLoc());
6974   }
6975 
6976   // Transform the "else" branch.
6977   StmtResult Else;
6978   if (!ConstexprConditionValue || !*ConstexprConditionValue) {
6979     Else = getDerived().TransformStmt(S->getElse());
6980     if (Else.isInvalid())
6981       return StmtError();
6982   }
6983 
6984   if (!getDerived().AlwaysRebuild() &&
6985       Init.get() == S->getInit() &&
6986       Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) &&
6987       Then.get() == S->getThen() &&
6988       Else.get() == S->getElse())
6989     return S;
6990 
6991   return getDerived().RebuildIfStmt(S->getIfLoc(), S->isConstexpr(), Cond,
6992                                     Init.get(), Then.get(), S->getElseLoc(),
6993                                     Else.get());
6994 }
6995 
6996 template<typename Derived>
6997 StmtResult
6998 TreeTransform<Derived>::TransformSwitchStmt(SwitchStmt *S) {
6999   // Transform the initialization statement
7000   StmtResult Init = getDerived().TransformStmt(S->getInit());
7001   if (Init.isInvalid())
7002     return StmtError();
7003 
7004   // Transform the condition.
7005   Sema::ConditionResult Cond = getDerived().TransformCondition(
7006       S->getSwitchLoc(), S->getConditionVariable(), S->getCond(),
7007       Sema::ConditionKind::Switch);
7008   if (Cond.isInvalid())
7009     return StmtError();
7010 
7011   // Rebuild the switch statement.
7012   StmtResult Switch
7013     = getDerived().RebuildSwitchStmtStart(S->getSwitchLoc(), Init.get(), Cond);
7014   if (Switch.isInvalid())
7015     return StmtError();
7016 
7017   // Transform the body of the switch statement.
7018   StmtResult Body = getDerived().TransformStmt(S->getBody());
7019   if (Body.isInvalid())
7020     return StmtError();
7021 
7022   // Complete the switch statement.
7023   return getDerived().RebuildSwitchStmtBody(S->getSwitchLoc(), Switch.get(),
7024                                             Body.get());
7025 }
7026 
7027 template<typename Derived>
7028 StmtResult
7029 TreeTransform<Derived>::TransformWhileStmt(WhileStmt *S) {
7030   // Transform the condition
7031   Sema::ConditionResult Cond = getDerived().TransformCondition(
7032       S->getWhileLoc(), S->getConditionVariable(), S->getCond(),
7033       Sema::ConditionKind::Boolean);
7034   if (Cond.isInvalid())
7035     return StmtError();
7036 
7037   // Transform the body
7038   StmtResult Body = getDerived().TransformStmt(S->getBody());
7039   if (Body.isInvalid())
7040     return StmtError();
7041 
7042   if (!getDerived().AlwaysRebuild() &&
7043       Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) &&
7044       Body.get() == S->getBody())
7045     return Owned(S);
7046 
7047   return getDerived().RebuildWhileStmt(S->getWhileLoc(), Cond, Body.get());
7048 }
7049 
7050 template<typename Derived>
7051 StmtResult
7052 TreeTransform<Derived>::TransformDoStmt(DoStmt *S) {
7053   // Transform the body
7054   StmtResult Body = getDerived().TransformStmt(S->getBody());
7055   if (Body.isInvalid())
7056     return StmtError();
7057 
7058   // Transform the condition
7059   ExprResult Cond = getDerived().TransformExpr(S->getCond());
7060   if (Cond.isInvalid())
7061     return StmtError();
7062 
7063   if (!getDerived().AlwaysRebuild() &&
7064       Cond.get() == S->getCond() &&
7065       Body.get() == S->getBody())
7066     return S;
7067 
7068   return getDerived().RebuildDoStmt(S->getDoLoc(), Body.get(), S->getWhileLoc(),
7069                                     /*FIXME:*/S->getWhileLoc(), Cond.get(),
7070                                     S->getRParenLoc());
7071 }
7072 
7073 template<typename Derived>
7074 StmtResult
7075 TreeTransform<Derived>::TransformForStmt(ForStmt *S) {
7076   if (getSema().getLangOpts().OpenMP)
7077     getSema().startOpenMPLoop();
7078 
7079   // Transform the initialization statement
7080   StmtResult Init = getDerived().TransformStmt(S->getInit());
7081   if (Init.isInvalid())
7082     return StmtError();
7083 
7084   // In OpenMP loop region loop control variable must be captured and be
7085   // private. Perform analysis of first part (if any).
7086   if (getSema().getLangOpts().OpenMP && Init.isUsable())
7087     getSema().ActOnOpenMPLoopInitialization(S->getForLoc(), Init.get());
7088 
7089   // Transform the condition
7090   Sema::ConditionResult Cond = getDerived().TransformCondition(
7091       S->getForLoc(), S->getConditionVariable(), S->getCond(),
7092       Sema::ConditionKind::Boolean);
7093   if (Cond.isInvalid())
7094     return StmtError();
7095 
7096   // Transform the increment
7097   ExprResult Inc = getDerived().TransformExpr(S->getInc());
7098   if (Inc.isInvalid())
7099     return StmtError();
7100 
7101   Sema::FullExprArg FullInc(getSema().MakeFullDiscardedValueExpr(Inc.get()));
7102   if (S->getInc() && !FullInc.get())
7103     return StmtError();
7104 
7105   // Transform the body
7106   StmtResult Body = getDerived().TransformStmt(S->getBody());
7107   if (Body.isInvalid())
7108     return StmtError();
7109 
7110   if (!getDerived().AlwaysRebuild() &&
7111       Init.get() == S->getInit() &&
7112       Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) &&
7113       Inc.get() == S->getInc() &&
7114       Body.get() == S->getBody())
7115     return S;
7116 
7117   return getDerived().RebuildForStmt(S->getForLoc(), S->getLParenLoc(),
7118                                      Init.get(), Cond, FullInc,
7119                                      S->getRParenLoc(), Body.get());
7120 }
7121 
7122 template<typename Derived>
7123 StmtResult
7124 TreeTransform<Derived>::TransformGotoStmt(GotoStmt *S) {
7125   Decl *LD = getDerived().TransformDecl(S->getLabel()->getLocation(),
7126                                         S->getLabel());
7127   if (!LD)
7128     return StmtError();
7129 
7130   // Goto statements must always be rebuilt, to resolve the label.
7131   return getDerived().RebuildGotoStmt(S->getGotoLoc(), S->getLabelLoc(),
7132                                       cast<LabelDecl>(LD));
7133 }
7134 
7135 template<typename Derived>
7136 StmtResult
7137 TreeTransform<Derived>::TransformIndirectGotoStmt(IndirectGotoStmt *S) {
7138   ExprResult Target = getDerived().TransformExpr(S->getTarget());
7139   if (Target.isInvalid())
7140     return StmtError();
7141   Target = SemaRef.MaybeCreateExprWithCleanups(Target.get());
7142 
7143   if (!getDerived().AlwaysRebuild() &&
7144       Target.get() == S->getTarget())
7145     return S;
7146 
7147   return getDerived().RebuildIndirectGotoStmt(S->getGotoLoc(), S->getStarLoc(),
7148                                               Target.get());
7149 }
7150 
7151 template<typename Derived>
7152 StmtResult
7153 TreeTransform<Derived>::TransformContinueStmt(ContinueStmt *S) {
7154   return S;
7155 }
7156 
7157 template<typename Derived>
7158 StmtResult
7159 TreeTransform<Derived>::TransformBreakStmt(BreakStmt *S) {
7160   return S;
7161 }
7162 
7163 template<typename Derived>
7164 StmtResult
7165 TreeTransform<Derived>::TransformReturnStmt(ReturnStmt *S) {
7166   ExprResult Result = getDerived().TransformInitializer(S->getRetValue(),
7167                                                         /*NotCopyInit*/false);
7168   if (Result.isInvalid())
7169     return StmtError();
7170 
7171   // FIXME: We always rebuild the return statement because there is no way
7172   // to tell whether the return type of the function has changed.
7173   return getDerived().RebuildReturnStmt(S->getReturnLoc(), Result.get());
7174 }
7175 
7176 template<typename Derived>
7177 StmtResult
7178 TreeTransform<Derived>::TransformDeclStmt(DeclStmt *S) {
7179   bool DeclChanged = false;
7180   SmallVector<Decl *, 4> Decls;
7181   for (auto *D : S->decls()) {
7182     Decl *Transformed = getDerived().TransformDefinition(D->getLocation(), D);
7183     if (!Transformed)
7184       return StmtError();
7185 
7186     if (Transformed != D)
7187       DeclChanged = true;
7188 
7189     Decls.push_back(Transformed);
7190   }
7191 
7192   if (!getDerived().AlwaysRebuild() && !DeclChanged)
7193     return S;
7194 
7195   return getDerived().RebuildDeclStmt(Decls, S->getBeginLoc(), S->getEndLoc());
7196 }
7197 
7198 template<typename Derived>
7199 StmtResult
7200 TreeTransform<Derived>::TransformGCCAsmStmt(GCCAsmStmt *S) {
7201 
7202   SmallVector<Expr*, 8> Constraints;
7203   SmallVector<Expr*, 8> Exprs;
7204   SmallVector<IdentifierInfo *, 4> Names;
7205 
7206   ExprResult AsmString;
7207   SmallVector<Expr*, 8> Clobbers;
7208 
7209   bool ExprsChanged = false;
7210 
7211   // Go through the outputs.
7212   for (unsigned I = 0, E = S->getNumOutputs(); I != E; ++I) {
7213     Names.push_back(S->getOutputIdentifier(I));
7214 
7215     // No need to transform the constraint literal.
7216     Constraints.push_back(S->getOutputConstraintLiteral(I));
7217 
7218     // Transform the output expr.
7219     Expr *OutputExpr = S->getOutputExpr(I);
7220     ExprResult Result = getDerived().TransformExpr(OutputExpr);
7221     if (Result.isInvalid())
7222       return StmtError();
7223 
7224     ExprsChanged |= Result.get() != OutputExpr;
7225 
7226     Exprs.push_back(Result.get());
7227   }
7228 
7229   // Go through the inputs.
7230   for (unsigned I = 0, E = S->getNumInputs(); I != E; ++I) {
7231     Names.push_back(S->getInputIdentifier(I));
7232 
7233     // No need to transform the constraint literal.
7234     Constraints.push_back(S->getInputConstraintLiteral(I));
7235 
7236     // Transform the input expr.
7237     Expr *InputExpr = S->getInputExpr(I);
7238     ExprResult Result = getDerived().TransformExpr(InputExpr);
7239     if (Result.isInvalid())
7240       return StmtError();
7241 
7242     ExprsChanged |= Result.get() != InputExpr;
7243 
7244     Exprs.push_back(Result.get());
7245   }
7246 
7247   // Go through the Labels.
7248   for (unsigned I = 0, E = S->getNumLabels(); I != E; ++I) {
7249     Names.push_back(S->getLabelIdentifier(I));
7250 
7251     ExprResult Result = getDerived().TransformExpr(S->getLabelExpr(I));
7252     if (Result.isInvalid())
7253       return StmtError();
7254     ExprsChanged |= Result.get() != S->getLabelExpr(I);
7255     Exprs.push_back(Result.get());
7256   }
7257   if (!getDerived().AlwaysRebuild() && !ExprsChanged)
7258     return S;
7259 
7260   // Go through the clobbers.
7261   for (unsigned I = 0, E = S->getNumClobbers(); I != E; ++I)
7262     Clobbers.push_back(S->getClobberStringLiteral(I));
7263 
7264   // No need to transform the asm string literal.
7265   AsmString = S->getAsmString();
7266   return getDerived().RebuildGCCAsmStmt(S->getAsmLoc(), S->isSimple(),
7267                                         S->isVolatile(), S->getNumOutputs(),
7268                                         S->getNumInputs(), Names.data(),
7269                                         Constraints, Exprs, AsmString.get(),
7270                                         Clobbers, S->getNumLabels(),
7271                                         S->getRParenLoc());
7272 }
7273 
7274 template<typename Derived>
7275 StmtResult
7276 TreeTransform<Derived>::TransformMSAsmStmt(MSAsmStmt *S) {
7277   ArrayRef<Token> AsmToks =
7278     llvm::makeArrayRef(S->getAsmToks(), S->getNumAsmToks());
7279 
7280   bool HadError = false, HadChange = false;
7281 
7282   ArrayRef<Expr*> SrcExprs = S->getAllExprs();
7283   SmallVector<Expr*, 8> TransformedExprs;
7284   TransformedExprs.reserve(SrcExprs.size());
7285   for (unsigned i = 0, e = SrcExprs.size(); i != e; ++i) {
7286     ExprResult Result = getDerived().TransformExpr(SrcExprs[i]);
7287     if (!Result.isUsable()) {
7288       HadError = true;
7289     } else {
7290       HadChange |= (Result.get() != SrcExprs[i]);
7291       TransformedExprs.push_back(Result.get());
7292     }
7293   }
7294 
7295   if (HadError) return StmtError();
7296   if (!HadChange && !getDerived().AlwaysRebuild())
7297     return Owned(S);
7298 
7299   return getDerived().RebuildMSAsmStmt(S->getAsmLoc(), S->getLBraceLoc(),
7300                                        AsmToks, S->getAsmString(),
7301                                        S->getNumOutputs(), S->getNumInputs(),
7302                                        S->getAllConstraints(), S->getClobbers(),
7303                                        TransformedExprs, S->getEndLoc());
7304 }
7305 
7306 // C++ Coroutines TS
7307 
7308 template<typename Derived>
7309 StmtResult
7310 TreeTransform<Derived>::TransformCoroutineBodyStmt(CoroutineBodyStmt *S) {
7311   auto *ScopeInfo = SemaRef.getCurFunction();
7312   auto *FD = cast<FunctionDecl>(SemaRef.CurContext);
7313   assert(FD && ScopeInfo && !ScopeInfo->CoroutinePromise &&
7314          ScopeInfo->NeedsCoroutineSuspends &&
7315          ScopeInfo->CoroutineSuspends.first == nullptr &&
7316          ScopeInfo->CoroutineSuspends.second == nullptr &&
7317          "expected clean scope info");
7318 
7319   // Set that we have (possibly-invalid) suspend points before we do anything
7320   // that may fail.
7321   ScopeInfo->setNeedsCoroutineSuspends(false);
7322 
7323   // We re-build the coroutine promise object (and the coroutine parameters its
7324   // type and constructor depend on) based on the types used in our current
7325   // function. We must do so, and set it on the current FunctionScopeInfo,
7326   // before attempting to transform the other parts of the coroutine body
7327   // statement, such as the implicit suspend statements (because those
7328   // statements reference the FunctionScopeInfo::CoroutinePromise).
7329   if (!SemaRef.buildCoroutineParameterMoves(FD->getLocation()))
7330     return StmtError();
7331   auto *Promise = SemaRef.buildCoroutinePromise(FD->getLocation());
7332   if (!Promise)
7333     return StmtError();
7334   getDerived().transformedLocalDecl(S->getPromiseDecl(), {Promise});
7335   ScopeInfo->CoroutinePromise = Promise;
7336 
7337   // Transform the implicit coroutine statements constructed using dependent
7338   // types during the previous parse: initial and final suspensions, the return
7339   // object, and others. We also transform the coroutine function's body.
7340   StmtResult InitSuspend = getDerived().TransformStmt(S->getInitSuspendStmt());
7341   if (InitSuspend.isInvalid())
7342     return StmtError();
7343   StmtResult FinalSuspend =
7344       getDerived().TransformStmt(S->getFinalSuspendStmt());
7345   if (FinalSuspend.isInvalid())
7346     return StmtError();
7347   ScopeInfo->setCoroutineSuspends(InitSuspend.get(), FinalSuspend.get());
7348   assert(isa<Expr>(InitSuspend.get()) && isa<Expr>(FinalSuspend.get()));
7349 
7350   StmtResult BodyRes = getDerived().TransformStmt(S->getBody());
7351   if (BodyRes.isInvalid())
7352     return StmtError();
7353 
7354   CoroutineStmtBuilder Builder(SemaRef, *FD, *ScopeInfo, BodyRes.get());
7355   if (Builder.isInvalid())
7356     return StmtError();
7357 
7358   Expr *ReturnObject = S->getReturnValueInit();
7359   assert(ReturnObject && "the return object is expected to be valid");
7360   ExprResult Res = getDerived().TransformInitializer(ReturnObject,
7361                                                      /*NoCopyInit*/ false);
7362   if (Res.isInvalid())
7363     return StmtError();
7364   Builder.ReturnValue = Res.get();
7365 
7366   // If during the previous parse the coroutine still had a dependent promise
7367   // statement, we may need to build some implicit coroutine statements
7368   // (such as exception and fallthrough handlers) for the first time.
7369   if (S->hasDependentPromiseType()) {
7370     // We can only build these statements, however, if the current promise type
7371     // is not dependent.
7372     if (!Promise->getType()->isDependentType()) {
7373       assert(!S->getFallthroughHandler() && !S->getExceptionHandler() &&
7374              !S->getReturnStmtOnAllocFailure() && !S->getDeallocate() &&
7375              "these nodes should not have been built yet");
7376       if (!Builder.buildDependentStatements())
7377         return StmtError();
7378     }
7379   } else {
7380     if (auto *OnFallthrough = S->getFallthroughHandler()) {
7381       StmtResult Res = getDerived().TransformStmt(OnFallthrough);
7382       if (Res.isInvalid())
7383         return StmtError();
7384       Builder.OnFallthrough = Res.get();
7385     }
7386 
7387     if (auto *OnException = S->getExceptionHandler()) {
7388       StmtResult Res = getDerived().TransformStmt(OnException);
7389       if (Res.isInvalid())
7390         return StmtError();
7391       Builder.OnException = Res.get();
7392     }
7393 
7394     if (auto *OnAllocFailure = S->getReturnStmtOnAllocFailure()) {
7395       StmtResult Res = getDerived().TransformStmt(OnAllocFailure);
7396       if (Res.isInvalid())
7397         return StmtError();
7398       Builder.ReturnStmtOnAllocFailure = Res.get();
7399     }
7400 
7401     // Transform any additional statements we may have already built
7402     assert(S->getAllocate() && S->getDeallocate() &&
7403            "allocation and deallocation calls must already be built");
7404     ExprResult AllocRes = getDerived().TransformExpr(S->getAllocate());
7405     if (AllocRes.isInvalid())
7406       return StmtError();
7407     Builder.Allocate = AllocRes.get();
7408 
7409     ExprResult DeallocRes = getDerived().TransformExpr(S->getDeallocate());
7410     if (DeallocRes.isInvalid())
7411       return StmtError();
7412     Builder.Deallocate = DeallocRes.get();
7413 
7414     assert(S->getResultDecl() && "ResultDecl must already be built");
7415     StmtResult ResultDecl = getDerived().TransformStmt(S->getResultDecl());
7416     if (ResultDecl.isInvalid())
7417       return StmtError();
7418     Builder.ResultDecl = ResultDecl.get();
7419 
7420     if (auto *ReturnStmt = S->getReturnStmt()) {
7421       StmtResult Res = getDerived().TransformStmt(ReturnStmt);
7422       if (Res.isInvalid())
7423         return StmtError();
7424       Builder.ReturnStmt = Res.get();
7425     }
7426   }
7427 
7428   return getDerived().RebuildCoroutineBodyStmt(Builder);
7429 }
7430 
7431 template<typename Derived>
7432 StmtResult
7433 TreeTransform<Derived>::TransformCoreturnStmt(CoreturnStmt *S) {
7434   ExprResult Result = getDerived().TransformInitializer(S->getOperand(),
7435                                                         /*NotCopyInit*/false);
7436   if (Result.isInvalid())
7437     return StmtError();
7438 
7439   // Always rebuild; we don't know if this needs to be injected into a new
7440   // context or if the promise type has changed.
7441   return getDerived().RebuildCoreturnStmt(S->getKeywordLoc(), Result.get(),
7442                                           S->isImplicit());
7443 }
7444 
7445 template<typename Derived>
7446 ExprResult
7447 TreeTransform<Derived>::TransformCoawaitExpr(CoawaitExpr *E) {
7448   ExprResult Result = getDerived().TransformInitializer(E->getOperand(),
7449                                                         /*NotCopyInit*/false);
7450   if (Result.isInvalid())
7451     return ExprError();
7452 
7453   // Always rebuild; we don't know if this needs to be injected into a new
7454   // context or if the promise type has changed.
7455   return getDerived().RebuildCoawaitExpr(E->getKeywordLoc(), Result.get(),
7456                                          E->isImplicit());
7457 }
7458 
7459 template <typename Derived>
7460 ExprResult
7461 TreeTransform<Derived>::TransformDependentCoawaitExpr(DependentCoawaitExpr *E) {
7462   ExprResult OperandResult = getDerived().TransformInitializer(E->getOperand(),
7463                                                         /*NotCopyInit*/ false);
7464   if (OperandResult.isInvalid())
7465     return ExprError();
7466 
7467   ExprResult LookupResult = getDerived().TransformUnresolvedLookupExpr(
7468           E->getOperatorCoawaitLookup());
7469 
7470   if (LookupResult.isInvalid())
7471     return ExprError();
7472 
7473   // Always rebuild; we don't know if this needs to be injected into a new
7474   // context or if the promise type has changed.
7475   return getDerived().RebuildDependentCoawaitExpr(
7476       E->getKeywordLoc(), OperandResult.get(),
7477       cast<UnresolvedLookupExpr>(LookupResult.get()));
7478 }
7479 
7480 template<typename Derived>
7481 ExprResult
7482 TreeTransform<Derived>::TransformCoyieldExpr(CoyieldExpr *E) {
7483   ExprResult Result = getDerived().TransformInitializer(E->getOperand(),
7484                                                         /*NotCopyInit*/false);
7485   if (Result.isInvalid())
7486     return ExprError();
7487 
7488   // Always rebuild; we don't know if this needs to be injected into a new
7489   // context or if the promise type has changed.
7490   return getDerived().RebuildCoyieldExpr(E->getKeywordLoc(), Result.get());
7491 }
7492 
7493 // Objective-C Statements.
7494 
7495 template<typename Derived>
7496 StmtResult
7497 TreeTransform<Derived>::TransformObjCAtTryStmt(ObjCAtTryStmt *S) {
7498   // Transform the body of the @try.
7499   StmtResult TryBody = getDerived().TransformStmt(S->getTryBody());
7500   if (TryBody.isInvalid())
7501     return StmtError();
7502 
7503   // Transform the @catch statements (if present).
7504   bool AnyCatchChanged = false;
7505   SmallVector<Stmt*, 8> CatchStmts;
7506   for (unsigned I = 0, N = S->getNumCatchStmts(); I != N; ++I) {
7507     StmtResult Catch = getDerived().TransformStmt(S->getCatchStmt(I));
7508     if (Catch.isInvalid())
7509       return StmtError();
7510     if (Catch.get() != S->getCatchStmt(I))
7511       AnyCatchChanged = true;
7512     CatchStmts.push_back(Catch.get());
7513   }
7514 
7515   // Transform the @finally statement (if present).
7516   StmtResult Finally;
7517   if (S->getFinallyStmt()) {
7518     Finally = getDerived().TransformStmt(S->getFinallyStmt());
7519     if (Finally.isInvalid())
7520       return StmtError();
7521   }
7522 
7523   // If nothing changed, just retain this statement.
7524   if (!getDerived().AlwaysRebuild() &&
7525       TryBody.get() == S->getTryBody() &&
7526       !AnyCatchChanged &&
7527       Finally.get() == S->getFinallyStmt())
7528     return S;
7529 
7530   // Build a new statement.
7531   return getDerived().RebuildObjCAtTryStmt(S->getAtTryLoc(), TryBody.get(),
7532                                            CatchStmts, Finally.get());
7533 }
7534 
7535 template<typename Derived>
7536 StmtResult
7537 TreeTransform<Derived>::TransformObjCAtCatchStmt(ObjCAtCatchStmt *S) {
7538   // Transform the @catch parameter, if there is one.
7539   VarDecl *Var = nullptr;
7540   if (VarDecl *FromVar = S->getCatchParamDecl()) {
7541     TypeSourceInfo *TSInfo = nullptr;
7542     if (FromVar->getTypeSourceInfo()) {
7543       TSInfo = getDerived().TransformType(FromVar->getTypeSourceInfo());
7544       if (!TSInfo)
7545         return StmtError();
7546     }
7547 
7548     QualType T;
7549     if (TSInfo)
7550       T = TSInfo->getType();
7551     else {
7552       T = getDerived().TransformType(FromVar->getType());
7553       if (T.isNull())
7554         return StmtError();
7555     }
7556 
7557     Var = getDerived().RebuildObjCExceptionDecl(FromVar, TSInfo, T);
7558     if (!Var)
7559       return StmtError();
7560   }
7561 
7562   StmtResult Body = getDerived().TransformStmt(S->getCatchBody());
7563   if (Body.isInvalid())
7564     return StmtError();
7565 
7566   return getDerived().RebuildObjCAtCatchStmt(S->getAtCatchLoc(),
7567                                              S->getRParenLoc(),
7568                                              Var, Body.get());
7569 }
7570 
7571 template<typename Derived>
7572 StmtResult
7573 TreeTransform<Derived>::TransformObjCAtFinallyStmt(ObjCAtFinallyStmt *S) {
7574   // Transform the body.
7575   StmtResult Body = getDerived().TransformStmt(S->getFinallyBody());
7576   if (Body.isInvalid())
7577     return StmtError();
7578 
7579   // If nothing changed, just retain this statement.
7580   if (!getDerived().AlwaysRebuild() &&
7581       Body.get() == S->getFinallyBody())
7582     return S;
7583 
7584   // Build a new statement.
7585   return getDerived().RebuildObjCAtFinallyStmt(S->getAtFinallyLoc(),
7586                                                Body.get());
7587 }
7588 
7589 template<typename Derived>
7590 StmtResult
7591 TreeTransform<Derived>::TransformObjCAtThrowStmt(ObjCAtThrowStmt *S) {
7592   ExprResult Operand;
7593   if (S->getThrowExpr()) {
7594     Operand = getDerived().TransformExpr(S->getThrowExpr());
7595     if (Operand.isInvalid())
7596       return StmtError();
7597   }
7598 
7599   if (!getDerived().AlwaysRebuild() &&
7600       Operand.get() == S->getThrowExpr())
7601     return S;
7602 
7603   return getDerived().RebuildObjCAtThrowStmt(S->getThrowLoc(), Operand.get());
7604 }
7605 
7606 template<typename Derived>
7607 StmtResult
7608 TreeTransform<Derived>::TransformObjCAtSynchronizedStmt(
7609                                                   ObjCAtSynchronizedStmt *S) {
7610   // Transform the object we are locking.
7611   ExprResult Object = getDerived().TransformExpr(S->getSynchExpr());
7612   if (Object.isInvalid())
7613     return StmtError();
7614   Object =
7615     getDerived().RebuildObjCAtSynchronizedOperand(S->getAtSynchronizedLoc(),
7616                                                   Object.get());
7617   if (Object.isInvalid())
7618     return StmtError();
7619 
7620   // Transform the body.
7621   StmtResult Body = getDerived().TransformStmt(S->getSynchBody());
7622   if (Body.isInvalid())
7623     return StmtError();
7624 
7625   // If nothing change, just retain the current statement.
7626   if (!getDerived().AlwaysRebuild() &&
7627       Object.get() == S->getSynchExpr() &&
7628       Body.get() == S->getSynchBody())
7629     return S;
7630 
7631   // Build a new statement.
7632   return getDerived().RebuildObjCAtSynchronizedStmt(S->getAtSynchronizedLoc(),
7633                                                     Object.get(), Body.get());
7634 }
7635 
7636 template<typename Derived>
7637 StmtResult
7638 TreeTransform<Derived>::TransformObjCAutoreleasePoolStmt(
7639                                               ObjCAutoreleasePoolStmt *S) {
7640   // Transform the body.
7641   StmtResult Body = getDerived().TransformStmt(S->getSubStmt());
7642   if (Body.isInvalid())
7643     return StmtError();
7644 
7645   // If nothing changed, just retain this statement.
7646   if (!getDerived().AlwaysRebuild() &&
7647       Body.get() == S->getSubStmt())
7648     return S;
7649 
7650   // Build a new statement.
7651   return getDerived().RebuildObjCAutoreleasePoolStmt(
7652                         S->getAtLoc(), Body.get());
7653 }
7654 
7655 template<typename Derived>
7656 StmtResult
7657 TreeTransform<Derived>::TransformObjCForCollectionStmt(
7658                                                   ObjCForCollectionStmt *S) {
7659   // Transform the element statement.
7660   StmtResult Element =
7661       getDerived().TransformStmt(S->getElement(), SDK_NotDiscarded);
7662   if (Element.isInvalid())
7663     return StmtError();
7664 
7665   // Transform the collection expression.
7666   ExprResult Collection = getDerived().TransformExpr(S->getCollection());
7667   if (Collection.isInvalid())
7668     return StmtError();
7669 
7670   // Transform the body.
7671   StmtResult Body = getDerived().TransformStmt(S->getBody());
7672   if (Body.isInvalid())
7673     return StmtError();
7674 
7675   // If nothing changed, just retain this statement.
7676   if (!getDerived().AlwaysRebuild() &&
7677       Element.get() == S->getElement() &&
7678       Collection.get() == S->getCollection() &&
7679       Body.get() == S->getBody())
7680     return S;
7681 
7682   // Build a new statement.
7683   return getDerived().RebuildObjCForCollectionStmt(S->getForLoc(),
7684                                                    Element.get(),
7685                                                    Collection.get(),
7686                                                    S->getRParenLoc(),
7687                                                    Body.get());
7688 }
7689 
7690 template <typename Derived>
7691 StmtResult TreeTransform<Derived>::TransformCXXCatchStmt(CXXCatchStmt *S) {
7692   // Transform the exception declaration, if any.
7693   VarDecl *Var = nullptr;
7694   if (VarDecl *ExceptionDecl = S->getExceptionDecl()) {
7695     TypeSourceInfo *T =
7696         getDerived().TransformType(ExceptionDecl->getTypeSourceInfo());
7697     if (!T)
7698       return StmtError();
7699 
7700     Var = getDerived().RebuildExceptionDecl(
7701         ExceptionDecl, T, ExceptionDecl->getInnerLocStart(),
7702         ExceptionDecl->getLocation(), ExceptionDecl->getIdentifier());
7703     if (!Var || Var->isInvalidDecl())
7704       return StmtError();
7705   }
7706 
7707   // Transform the actual exception handler.
7708   StmtResult Handler = getDerived().TransformStmt(S->getHandlerBlock());
7709   if (Handler.isInvalid())
7710     return StmtError();
7711 
7712   if (!getDerived().AlwaysRebuild() && !Var &&
7713       Handler.get() == S->getHandlerBlock())
7714     return S;
7715 
7716   return getDerived().RebuildCXXCatchStmt(S->getCatchLoc(), Var, Handler.get());
7717 }
7718 
7719 template <typename Derived>
7720 StmtResult TreeTransform<Derived>::TransformCXXTryStmt(CXXTryStmt *S) {
7721   // Transform the try block itself.
7722   StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock());
7723   if (TryBlock.isInvalid())
7724     return StmtError();
7725 
7726   // Transform the handlers.
7727   bool HandlerChanged = false;
7728   SmallVector<Stmt *, 8> Handlers;
7729   for (unsigned I = 0, N = S->getNumHandlers(); I != N; ++I) {
7730     StmtResult Handler = getDerived().TransformCXXCatchStmt(S->getHandler(I));
7731     if (Handler.isInvalid())
7732       return StmtError();
7733 
7734     HandlerChanged = HandlerChanged || Handler.get() != S->getHandler(I);
7735     Handlers.push_back(Handler.getAs<Stmt>());
7736   }
7737 
7738   if (!getDerived().AlwaysRebuild() && TryBlock.get() == S->getTryBlock() &&
7739       !HandlerChanged)
7740     return S;
7741 
7742   return getDerived().RebuildCXXTryStmt(S->getTryLoc(), TryBlock.get(),
7743                                         Handlers);
7744 }
7745 
7746 template<typename Derived>
7747 StmtResult
7748 TreeTransform<Derived>::TransformCXXForRangeStmt(CXXForRangeStmt *S) {
7749   StmtResult Init =
7750       S->getInit() ? getDerived().TransformStmt(S->getInit()) : StmtResult();
7751   if (Init.isInvalid())
7752     return StmtError();
7753 
7754   StmtResult Range = getDerived().TransformStmt(S->getRangeStmt());
7755   if (Range.isInvalid())
7756     return StmtError();
7757 
7758   StmtResult Begin = getDerived().TransformStmt(S->getBeginStmt());
7759   if (Begin.isInvalid())
7760     return StmtError();
7761   StmtResult End = getDerived().TransformStmt(S->getEndStmt());
7762   if (End.isInvalid())
7763     return StmtError();
7764 
7765   ExprResult Cond = getDerived().TransformExpr(S->getCond());
7766   if (Cond.isInvalid())
7767     return StmtError();
7768   if (Cond.get())
7769     Cond = SemaRef.CheckBooleanCondition(S->getColonLoc(), Cond.get());
7770   if (Cond.isInvalid())
7771     return StmtError();
7772   if (Cond.get())
7773     Cond = SemaRef.MaybeCreateExprWithCleanups(Cond.get());
7774 
7775   ExprResult Inc = getDerived().TransformExpr(S->getInc());
7776   if (Inc.isInvalid())
7777     return StmtError();
7778   if (Inc.get())
7779     Inc = SemaRef.MaybeCreateExprWithCleanups(Inc.get());
7780 
7781   StmtResult LoopVar = getDerived().TransformStmt(S->getLoopVarStmt());
7782   if (LoopVar.isInvalid())
7783     return StmtError();
7784 
7785   StmtResult NewStmt = S;
7786   if (getDerived().AlwaysRebuild() ||
7787       Init.get() != S->getInit() ||
7788       Range.get() != S->getRangeStmt() ||
7789       Begin.get() != S->getBeginStmt() ||
7790       End.get() != S->getEndStmt() ||
7791       Cond.get() != S->getCond() ||
7792       Inc.get() != S->getInc() ||
7793       LoopVar.get() != S->getLoopVarStmt()) {
7794     NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(),
7795                                                   S->getCoawaitLoc(), Init.get(),
7796                                                   S->getColonLoc(), Range.get(),
7797                                                   Begin.get(), End.get(),
7798                                                   Cond.get(),
7799                                                   Inc.get(), LoopVar.get(),
7800                                                   S->getRParenLoc());
7801     if (NewStmt.isInvalid())
7802       return StmtError();
7803   }
7804 
7805   StmtResult Body = getDerived().TransformStmt(S->getBody());
7806   if (Body.isInvalid())
7807     return StmtError();
7808 
7809   // Body has changed but we didn't rebuild the for-range statement. Rebuild
7810   // it now so we have a new statement to attach the body to.
7811   if (Body.get() != S->getBody() && NewStmt.get() == S) {
7812     NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(),
7813                                                   S->getCoawaitLoc(), Init.get(),
7814                                                   S->getColonLoc(), Range.get(),
7815                                                   Begin.get(), End.get(),
7816                                                   Cond.get(),
7817                                                   Inc.get(), LoopVar.get(),
7818                                                   S->getRParenLoc());
7819     if (NewStmt.isInvalid())
7820       return StmtError();
7821   }
7822 
7823   if (NewStmt.get() == S)
7824     return S;
7825 
7826   return FinishCXXForRangeStmt(NewStmt.get(), Body.get());
7827 }
7828 
7829 template<typename Derived>
7830 StmtResult
7831 TreeTransform<Derived>::TransformMSDependentExistsStmt(
7832                                                     MSDependentExistsStmt *S) {
7833   // Transform the nested-name-specifier, if any.
7834   NestedNameSpecifierLoc QualifierLoc;
7835   if (S->getQualifierLoc()) {
7836     QualifierLoc
7837       = getDerived().TransformNestedNameSpecifierLoc(S->getQualifierLoc());
7838     if (!QualifierLoc)
7839       return StmtError();
7840   }
7841 
7842   // Transform the declaration name.
7843   DeclarationNameInfo NameInfo = S->getNameInfo();
7844   if (NameInfo.getName()) {
7845     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
7846     if (!NameInfo.getName())
7847       return StmtError();
7848   }
7849 
7850   // Check whether anything changed.
7851   if (!getDerived().AlwaysRebuild() &&
7852       QualifierLoc == S->getQualifierLoc() &&
7853       NameInfo.getName() == S->getNameInfo().getName())
7854     return S;
7855 
7856   // Determine whether this name exists, if we can.
7857   CXXScopeSpec SS;
7858   SS.Adopt(QualifierLoc);
7859   bool Dependent = false;
7860   switch (getSema().CheckMicrosoftIfExistsSymbol(/*S=*/nullptr, SS, NameInfo)) {
7861   case Sema::IER_Exists:
7862     if (S->isIfExists())
7863       break;
7864 
7865     return new (getSema().Context) NullStmt(S->getKeywordLoc());
7866 
7867   case Sema::IER_DoesNotExist:
7868     if (S->isIfNotExists())
7869       break;
7870 
7871     return new (getSema().Context) NullStmt(S->getKeywordLoc());
7872 
7873   case Sema::IER_Dependent:
7874     Dependent = true;
7875     break;
7876 
7877   case Sema::IER_Error:
7878     return StmtError();
7879   }
7880 
7881   // We need to continue with the instantiation, so do so now.
7882   StmtResult SubStmt = getDerived().TransformCompoundStmt(S->getSubStmt());
7883   if (SubStmt.isInvalid())
7884     return StmtError();
7885 
7886   // If we have resolved the name, just transform to the substatement.
7887   if (!Dependent)
7888     return SubStmt;
7889 
7890   // The name is still dependent, so build a dependent expression again.
7891   return getDerived().RebuildMSDependentExistsStmt(S->getKeywordLoc(),
7892                                                    S->isIfExists(),
7893                                                    QualifierLoc,
7894                                                    NameInfo,
7895                                                    SubStmt.get());
7896 }
7897 
7898 template<typename Derived>
7899 ExprResult
7900 TreeTransform<Derived>::TransformMSPropertyRefExpr(MSPropertyRefExpr *E) {
7901   NestedNameSpecifierLoc QualifierLoc;
7902   if (E->getQualifierLoc()) {
7903     QualifierLoc
7904     = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
7905     if (!QualifierLoc)
7906       return ExprError();
7907   }
7908 
7909   MSPropertyDecl *PD = cast_or_null<MSPropertyDecl>(
7910     getDerived().TransformDecl(E->getMemberLoc(), E->getPropertyDecl()));
7911   if (!PD)
7912     return ExprError();
7913 
7914   ExprResult Base = getDerived().TransformExpr(E->getBaseExpr());
7915   if (Base.isInvalid())
7916     return ExprError();
7917 
7918   return new (SemaRef.getASTContext())
7919       MSPropertyRefExpr(Base.get(), PD, E->isArrow(),
7920                         SemaRef.getASTContext().PseudoObjectTy, VK_LValue,
7921                         QualifierLoc, E->getMemberLoc());
7922 }
7923 
7924 template <typename Derived>
7925 ExprResult TreeTransform<Derived>::TransformMSPropertySubscriptExpr(
7926     MSPropertySubscriptExpr *E) {
7927   auto BaseRes = getDerived().TransformExpr(E->getBase());
7928   if (BaseRes.isInvalid())
7929     return ExprError();
7930   auto IdxRes = getDerived().TransformExpr(E->getIdx());
7931   if (IdxRes.isInvalid())
7932     return ExprError();
7933 
7934   if (!getDerived().AlwaysRebuild() &&
7935       BaseRes.get() == E->getBase() &&
7936       IdxRes.get() == E->getIdx())
7937     return E;
7938 
7939   return getDerived().RebuildArraySubscriptExpr(
7940       BaseRes.get(), SourceLocation(), IdxRes.get(), E->getRBracketLoc());
7941 }
7942 
7943 template <typename Derived>
7944 StmtResult TreeTransform<Derived>::TransformSEHTryStmt(SEHTryStmt *S) {
7945   StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock());
7946   if (TryBlock.isInvalid())
7947     return StmtError();
7948 
7949   StmtResult Handler = getDerived().TransformSEHHandler(S->getHandler());
7950   if (Handler.isInvalid())
7951     return StmtError();
7952 
7953   if (!getDerived().AlwaysRebuild() && TryBlock.get() == S->getTryBlock() &&
7954       Handler.get() == S->getHandler())
7955     return S;
7956 
7957   return getDerived().RebuildSEHTryStmt(S->getIsCXXTry(), S->getTryLoc(),
7958                                         TryBlock.get(), Handler.get());
7959 }
7960 
7961 template <typename Derived>
7962 StmtResult TreeTransform<Derived>::TransformSEHFinallyStmt(SEHFinallyStmt *S) {
7963   StmtResult Block = getDerived().TransformCompoundStmt(S->getBlock());
7964   if (Block.isInvalid())
7965     return StmtError();
7966 
7967   return getDerived().RebuildSEHFinallyStmt(S->getFinallyLoc(), Block.get());
7968 }
7969 
7970 template <typename Derived>
7971 StmtResult TreeTransform<Derived>::TransformSEHExceptStmt(SEHExceptStmt *S) {
7972   ExprResult FilterExpr = getDerived().TransformExpr(S->getFilterExpr());
7973   if (FilterExpr.isInvalid())
7974     return StmtError();
7975 
7976   StmtResult Block = getDerived().TransformCompoundStmt(S->getBlock());
7977   if (Block.isInvalid())
7978     return StmtError();
7979 
7980   return getDerived().RebuildSEHExceptStmt(S->getExceptLoc(), FilterExpr.get(),
7981                                            Block.get());
7982 }
7983 
7984 template <typename Derived>
7985 StmtResult TreeTransform<Derived>::TransformSEHHandler(Stmt *Handler) {
7986   if (isa<SEHFinallyStmt>(Handler))
7987     return getDerived().TransformSEHFinallyStmt(cast<SEHFinallyStmt>(Handler));
7988   else
7989     return getDerived().TransformSEHExceptStmt(cast<SEHExceptStmt>(Handler));
7990 }
7991 
7992 template<typename Derived>
7993 StmtResult
7994 TreeTransform<Derived>::TransformSEHLeaveStmt(SEHLeaveStmt *S) {
7995   return S;
7996 }
7997 
7998 //===----------------------------------------------------------------------===//
7999 // OpenMP directive transformation
8000 //===----------------------------------------------------------------------===//
8001 template <typename Derived>
8002 StmtResult TreeTransform<Derived>::TransformOMPExecutableDirective(
8003     OMPExecutableDirective *D) {
8004 
8005   // Transform the clauses
8006   llvm::SmallVector<OMPClause *, 16> TClauses;
8007   ArrayRef<OMPClause *> Clauses = D->clauses();
8008   TClauses.reserve(Clauses.size());
8009   for (ArrayRef<OMPClause *>::iterator I = Clauses.begin(), E = Clauses.end();
8010        I != E; ++I) {
8011     if (*I) {
8012       getDerived().getSema().StartOpenMPClause((*I)->getClauseKind());
8013       OMPClause *Clause = getDerived().TransformOMPClause(*I);
8014       getDerived().getSema().EndOpenMPClause();
8015       if (Clause)
8016         TClauses.push_back(Clause);
8017     } else {
8018       TClauses.push_back(nullptr);
8019     }
8020   }
8021   StmtResult AssociatedStmt;
8022   if (D->hasAssociatedStmt() && D->getAssociatedStmt()) {
8023     getDerived().getSema().ActOnOpenMPRegionStart(D->getDirectiveKind(),
8024                                                   /*CurScope=*/nullptr);
8025     StmtResult Body;
8026     {
8027       Sema::CompoundScopeRAII CompoundScope(getSema());
8028       Stmt *CS = D->getInnermostCapturedStmt()->getCapturedStmt();
8029       Body = getDerived().TransformStmt(CS);
8030     }
8031     AssociatedStmt =
8032         getDerived().getSema().ActOnOpenMPRegionEnd(Body, TClauses);
8033     if (AssociatedStmt.isInvalid()) {
8034       return StmtError();
8035     }
8036   }
8037   if (TClauses.size() != Clauses.size()) {
8038     return StmtError();
8039   }
8040 
8041   // Transform directive name for 'omp critical' directive.
8042   DeclarationNameInfo DirName;
8043   if (D->getDirectiveKind() == OMPD_critical) {
8044     DirName = cast<OMPCriticalDirective>(D)->getDirectiveName();
8045     DirName = getDerived().TransformDeclarationNameInfo(DirName);
8046   }
8047   OpenMPDirectiveKind CancelRegion = OMPD_unknown;
8048   if (D->getDirectiveKind() == OMPD_cancellation_point) {
8049     CancelRegion = cast<OMPCancellationPointDirective>(D)->getCancelRegion();
8050   } else if (D->getDirectiveKind() == OMPD_cancel) {
8051     CancelRegion = cast<OMPCancelDirective>(D)->getCancelRegion();
8052   }
8053 
8054   return getDerived().RebuildOMPExecutableDirective(
8055       D->getDirectiveKind(), DirName, CancelRegion, TClauses,
8056       AssociatedStmt.get(), D->getBeginLoc(), D->getEndLoc());
8057 }
8058 
8059 template <typename Derived>
8060 StmtResult
8061 TreeTransform<Derived>::TransformOMPParallelDirective(OMPParallelDirective *D) {
8062   DeclarationNameInfo DirName;
8063   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel, DirName, nullptr,
8064                                              D->getBeginLoc());
8065   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8066   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8067   return Res;
8068 }
8069 
8070 template <typename Derived>
8071 StmtResult
8072 TreeTransform<Derived>::TransformOMPSimdDirective(OMPSimdDirective *D) {
8073   DeclarationNameInfo DirName;
8074   getDerived().getSema().StartOpenMPDSABlock(OMPD_simd, DirName, nullptr,
8075                                              D->getBeginLoc());
8076   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8077   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8078   return Res;
8079 }
8080 
8081 template <typename Derived>
8082 StmtResult
8083 TreeTransform<Derived>::TransformOMPForDirective(OMPForDirective *D) {
8084   DeclarationNameInfo DirName;
8085   getDerived().getSema().StartOpenMPDSABlock(OMPD_for, DirName, nullptr,
8086                                              D->getBeginLoc());
8087   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8088   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8089   return Res;
8090 }
8091 
8092 template <typename Derived>
8093 StmtResult
8094 TreeTransform<Derived>::TransformOMPForSimdDirective(OMPForSimdDirective *D) {
8095   DeclarationNameInfo DirName;
8096   getDerived().getSema().StartOpenMPDSABlock(OMPD_for_simd, DirName, nullptr,
8097                                              D->getBeginLoc());
8098   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8099   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8100   return Res;
8101 }
8102 
8103 template <typename Derived>
8104 StmtResult
8105 TreeTransform<Derived>::TransformOMPSectionsDirective(OMPSectionsDirective *D) {
8106   DeclarationNameInfo DirName;
8107   getDerived().getSema().StartOpenMPDSABlock(OMPD_sections, DirName, nullptr,
8108                                              D->getBeginLoc());
8109   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8110   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8111   return Res;
8112 }
8113 
8114 template <typename Derived>
8115 StmtResult
8116 TreeTransform<Derived>::TransformOMPSectionDirective(OMPSectionDirective *D) {
8117   DeclarationNameInfo DirName;
8118   getDerived().getSema().StartOpenMPDSABlock(OMPD_section, DirName, nullptr,
8119                                              D->getBeginLoc());
8120   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8121   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8122   return Res;
8123 }
8124 
8125 template <typename Derived>
8126 StmtResult
8127 TreeTransform<Derived>::TransformOMPSingleDirective(OMPSingleDirective *D) {
8128   DeclarationNameInfo DirName;
8129   getDerived().getSema().StartOpenMPDSABlock(OMPD_single, DirName, nullptr,
8130                                              D->getBeginLoc());
8131   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8132   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8133   return Res;
8134 }
8135 
8136 template <typename Derived>
8137 StmtResult
8138 TreeTransform<Derived>::TransformOMPMasterDirective(OMPMasterDirective *D) {
8139   DeclarationNameInfo DirName;
8140   getDerived().getSema().StartOpenMPDSABlock(OMPD_master, DirName, nullptr,
8141                                              D->getBeginLoc());
8142   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8143   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8144   return Res;
8145 }
8146 
8147 template <typename Derived>
8148 StmtResult
8149 TreeTransform<Derived>::TransformOMPCriticalDirective(OMPCriticalDirective *D) {
8150   getDerived().getSema().StartOpenMPDSABlock(
8151       OMPD_critical, D->getDirectiveName(), nullptr, D->getBeginLoc());
8152   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8153   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8154   return Res;
8155 }
8156 
8157 template <typename Derived>
8158 StmtResult TreeTransform<Derived>::TransformOMPParallelForDirective(
8159     OMPParallelForDirective *D) {
8160   DeclarationNameInfo DirName;
8161   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_for, DirName,
8162                                              nullptr, D->getBeginLoc());
8163   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8164   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8165   return Res;
8166 }
8167 
8168 template <typename Derived>
8169 StmtResult TreeTransform<Derived>::TransformOMPParallelForSimdDirective(
8170     OMPParallelForSimdDirective *D) {
8171   DeclarationNameInfo DirName;
8172   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_for_simd, DirName,
8173                                              nullptr, D->getBeginLoc());
8174   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8175   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8176   return Res;
8177 }
8178 
8179 template <typename Derived>
8180 StmtResult TreeTransform<Derived>::TransformOMPParallelMasterDirective(
8181     OMPParallelMasterDirective *D) {
8182   DeclarationNameInfo DirName;
8183   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_master, DirName,
8184                                              nullptr, D->getBeginLoc());
8185   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8186   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8187   return Res;
8188 }
8189 
8190 template <typename Derived>
8191 StmtResult TreeTransform<Derived>::TransformOMPParallelSectionsDirective(
8192     OMPParallelSectionsDirective *D) {
8193   DeclarationNameInfo DirName;
8194   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_sections, DirName,
8195                                              nullptr, D->getBeginLoc());
8196   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8197   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8198   return Res;
8199 }
8200 
8201 template <typename Derived>
8202 StmtResult
8203 TreeTransform<Derived>::TransformOMPTaskDirective(OMPTaskDirective *D) {
8204   DeclarationNameInfo DirName;
8205   getDerived().getSema().StartOpenMPDSABlock(OMPD_task, DirName, nullptr,
8206                                              D->getBeginLoc());
8207   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8208   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8209   return Res;
8210 }
8211 
8212 template <typename Derived>
8213 StmtResult TreeTransform<Derived>::TransformOMPTaskyieldDirective(
8214     OMPTaskyieldDirective *D) {
8215   DeclarationNameInfo DirName;
8216   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskyield, DirName, nullptr,
8217                                              D->getBeginLoc());
8218   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8219   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8220   return Res;
8221 }
8222 
8223 template <typename Derived>
8224 StmtResult
8225 TreeTransform<Derived>::TransformOMPBarrierDirective(OMPBarrierDirective *D) {
8226   DeclarationNameInfo DirName;
8227   getDerived().getSema().StartOpenMPDSABlock(OMPD_barrier, DirName, nullptr,
8228                                              D->getBeginLoc());
8229   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8230   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8231   return Res;
8232 }
8233 
8234 template <typename Derived>
8235 StmtResult
8236 TreeTransform<Derived>::TransformOMPTaskwaitDirective(OMPTaskwaitDirective *D) {
8237   DeclarationNameInfo DirName;
8238   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskwait, DirName, nullptr,
8239                                              D->getBeginLoc());
8240   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8241   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8242   return Res;
8243 }
8244 
8245 template <typename Derived>
8246 StmtResult TreeTransform<Derived>::TransformOMPTaskgroupDirective(
8247     OMPTaskgroupDirective *D) {
8248   DeclarationNameInfo DirName;
8249   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskgroup, DirName, nullptr,
8250                                              D->getBeginLoc());
8251   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8252   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8253   return Res;
8254 }
8255 
8256 template <typename Derived>
8257 StmtResult
8258 TreeTransform<Derived>::TransformOMPFlushDirective(OMPFlushDirective *D) {
8259   DeclarationNameInfo DirName;
8260   getDerived().getSema().StartOpenMPDSABlock(OMPD_flush, DirName, nullptr,
8261                                              D->getBeginLoc());
8262   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8263   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8264   return Res;
8265 }
8266 
8267 template <typename Derived>
8268 StmtResult
8269 TreeTransform<Derived>::TransformOMPOrderedDirective(OMPOrderedDirective *D) {
8270   DeclarationNameInfo DirName;
8271   getDerived().getSema().StartOpenMPDSABlock(OMPD_ordered, DirName, nullptr,
8272                                              D->getBeginLoc());
8273   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8274   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8275   return Res;
8276 }
8277 
8278 template <typename Derived>
8279 StmtResult
8280 TreeTransform<Derived>::TransformOMPAtomicDirective(OMPAtomicDirective *D) {
8281   DeclarationNameInfo DirName;
8282   getDerived().getSema().StartOpenMPDSABlock(OMPD_atomic, DirName, nullptr,
8283                                              D->getBeginLoc());
8284   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8285   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8286   return Res;
8287 }
8288 
8289 template <typename Derived>
8290 StmtResult
8291 TreeTransform<Derived>::TransformOMPTargetDirective(OMPTargetDirective *D) {
8292   DeclarationNameInfo DirName;
8293   getDerived().getSema().StartOpenMPDSABlock(OMPD_target, DirName, nullptr,
8294                                              D->getBeginLoc());
8295   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8296   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8297   return Res;
8298 }
8299 
8300 template <typename Derived>
8301 StmtResult TreeTransform<Derived>::TransformOMPTargetDataDirective(
8302     OMPTargetDataDirective *D) {
8303   DeclarationNameInfo DirName;
8304   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_data, DirName, nullptr,
8305                                              D->getBeginLoc());
8306   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8307   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8308   return Res;
8309 }
8310 
8311 template <typename Derived>
8312 StmtResult TreeTransform<Derived>::TransformOMPTargetEnterDataDirective(
8313     OMPTargetEnterDataDirective *D) {
8314   DeclarationNameInfo DirName;
8315   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_enter_data, DirName,
8316                                              nullptr, D->getBeginLoc());
8317   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8318   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8319   return Res;
8320 }
8321 
8322 template <typename Derived>
8323 StmtResult TreeTransform<Derived>::TransformOMPTargetExitDataDirective(
8324     OMPTargetExitDataDirective *D) {
8325   DeclarationNameInfo DirName;
8326   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_exit_data, DirName,
8327                                              nullptr, D->getBeginLoc());
8328   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8329   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8330   return Res;
8331 }
8332 
8333 template <typename Derived>
8334 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelDirective(
8335     OMPTargetParallelDirective *D) {
8336   DeclarationNameInfo DirName;
8337   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel, DirName,
8338                                              nullptr, D->getBeginLoc());
8339   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8340   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8341   return Res;
8342 }
8343 
8344 template <typename Derived>
8345 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelForDirective(
8346     OMPTargetParallelForDirective *D) {
8347   DeclarationNameInfo DirName;
8348   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel_for, DirName,
8349                                              nullptr, D->getBeginLoc());
8350   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8351   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8352   return Res;
8353 }
8354 
8355 template <typename Derived>
8356 StmtResult TreeTransform<Derived>::TransformOMPTargetUpdateDirective(
8357     OMPTargetUpdateDirective *D) {
8358   DeclarationNameInfo DirName;
8359   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_update, DirName,
8360                                              nullptr, D->getBeginLoc());
8361   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8362   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8363   return Res;
8364 }
8365 
8366 template <typename Derived>
8367 StmtResult
8368 TreeTransform<Derived>::TransformOMPTeamsDirective(OMPTeamsDirective *D) {
8369   DeclarationNameInfo DirName;
8370   getDerived().getSema().StartOpenMPDSABlock(OMPD_teams, DirName, nullptr,
8371                                              D->getBeginLoc());
8372   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8373   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8374   return Res;
8375 }
8376 
8377 template <typename Derived>
8378 StmtResult TreeTransform<Derived>::TransformOMPCancellationPointDirective(
8379     OMPCancellationPointDirective *D) {
8380   DeclarationNameInfo DirName;
8381   getDerived().getSema().StartOpenMPDSABlock(OMPD_cancellation_point, DirName,
8382                                              nullptr, D->getBeginLoc());
8383   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8384   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8385   return Res;
8386 }
8387 
8388 template <typename Derived>
8389 StmtResult
8390 TreeTransform<Derived>::TransformOMPCancelDirective(OMPCancelDirective *D) {
8391   DeclarationNameInfo DirName;
8392   getDerived().getSema().StartOpenMPDSABlock(OMPD_cancel, DirName, nullptr,
8393                                              D->getBeginLoc());
8394   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8395   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8396   return Res;
8397 }
8398 
8399 template <typename Derived>
8400 StmtResult
8401 TreeTransform<Derived>::TransformOMPTaskLoopDirective(OMPTaskLoopDirective *D) {
8402   DeclarationNameInfo DirName;
8403   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskloop, DirName, nullptr,
8404                                              D->getBeginLoc());
8405   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8406   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8407   return Res;
8408 }
8409 
8410 template <typename Derived>
8411 StmtResult TreeTransform<Derived>::TransformOMPTaskLoopSimdDirective(
8412     OMPTaskLoopSimdDirective *D) {
8413   DeclarationNameInfo DirName;
8414   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskloop_simd, DirName,
8415                                              nullptr, D->getBeginLoc());
8416   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8417   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8418   return Res;
8419 }
8420 
8421 template <typename Derived>
8422 StmtResult TreeTransform<Derived>::TransformOMPMasterTaskLoopDirective(
8423     OMPMasterTaskLoopDirective *D) {
8424   DeclarationNameInfo DirName;
8425   getDerived().getSema().StartOpenMPDSABlock(OMPD_master_taskloop, DirName,
8426                                              nullptr, D->getBeginLoc());
8427   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8428   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8429   return Res;
8430 }
8431 
8432 template <typename Derived>
8433 StmtResult TreeTransform<Derived>::TransformOMPMasterTaskLoopSimdDirective(
8434     OMPMasterTaskLoopSimdDirective *D) {
8435   DeclarationNameInfo DirName;
8436   getDerived().getSema().StartOpenMPDSABlock(OMPD_master_taskloop_simd, DirName,
8437                                              nullptr, D->getBeginLoc());
8438   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8439   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8440   return Res;
8441 }
8442 
8443 template <typename Derived>
8444 StmtResult TreeTransform<Derived>::TransformOMPParallelMasterTaskLoopDirective(
8445     OMPParallelMasterTaskLoopDirective *D) {
8446   DeclarationNameInfo DirName;
8447   getDerived().getSema().StartOpenMPDSABlock(
8448       OMPD_parallel_master_taskloop, DirName, nullptr, D->getBeginLoc());
8449   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8450   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8451   return Res;
8452 }
8453 
8454 template <typename Derived>
8455 StmtResult
8456 TreeTransform<Derived>::TransformOMPParallelMasterTaskLoopSimdDirective(
8457     OMPParallelMasterTaskLoopSimdDirective *D) {
8458   DeclarationNameInfo DirName;
8459   getDerived().getSema().StartOpenMPDSABlock(
8460       OMPD_parallel_master_taskloop_simd, DirName, nullptr, D->getBeginLoc());
8461   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8462   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8463   return Res;
8464 }
8465 
8466 template <typename Derived>
8467 StmtResult TreeTransform<Derived>::TransformOMPDistributeDirective(
8468     OMPDistributeDirective *D) {
8469   DeclarationNameInfo DirName;
8470   getDerived().getSema().StartOpenMPDSABlock(OMPD_distribute, DirName, nullptr,
8471                                              D->getBeginLoc());
8472   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8473   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8474   return Res;
8475 }
8476 
8477 template <typename Derived>
8478 StmtResult TreeTransform<Derived>::TransformOMPDistributeParallelForDirective(
8479     OMPDistributeParallelForDirective *D) {
8480   DeclarationNameInfo DirName;
8481   getDerived().getSema().StartOpenMPDSABlock(
8482       OMPD_distribute_parallel_for, DirName, nullptr, D->getBeginLoc());
8483   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8484   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8485   return Res;
8486 }
8487 
8488 template <typename Derived>
8489 StmtResult
8490 TreeTransform<Derived>::TransformOMPDistributeParallelForSimdDirective(
8491     OMPDistributeParallelForSimdDirective *D) {
8492   DeclarationNameInfo DirName;
8493   getDerived().getSema().StartOpenMPDSABlock(
8494       OMPD_distribute_parallel_for_simd, DirName, nullptr, D->getBeginLoc());
8495   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8496   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8497   return Res;
8498 }
8499 
8500 template <typename Derived>
8501 StmtResult TreeTransform<Derived>::TransformOMPDistributeSimdDirective(
8502     OMPDistributeSimdDirective *D) {
8503   DeclarationNameInfo DirName;
8504   getDerived().getSema().StartOpenMPDSABlock(OMPD_distribute_simd, DirName,
8505                                              nullptr, D->getBeginLoc());
8506   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8507   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8508   return Res;
8509 }
8510 
8511 template <typename Derived>
8512 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelForSimdDirective(
8513     OMPTargetParallelForSimdDirective *D) {
8514   DeclarationNameInfo DirName;
8515   getDerived().getSema().StartOpenMPDSABlock(
8516       OMPD_target_parallel_for_simd, DirName, nullptr, D->getBeginLoc());
8517   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8518   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8519   return Res;
8520 }
8521 
8522 template <typename Derived>
8523 StmtResult TreeTransform<Derived>::TransformOMPTargetSimdDirective(
8524     OMPTargetSimdDirective *D) {
8525   DeclarationNameInfo DirName;
8526   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_simd, DirName, nullptr,
8527                                              D->getBeginLoc());
8528   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8529   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8530   return Res;
8531 }
8532 
8533 template <typename Derived>
8534 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeDirective(
8535     OMPTeamsDistributeDirective *D) {
8536   DeclarationNameInfo DirName;
8537   getDerived().getSema().StartOpenMPDSABlock(OMPD_teams_distribute, DirName,
8538                                              nullptr, D->getBeginLoc());
8539   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8540   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8541   return Res;
8542 }
8543 
8544 template <typename Derived>
8545 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeSimdDirective(
8546     OMPTeamsDistributeSimdDirective *D) {
8547   DeclarationNameInfo DirName;
8548   getDerived().getSema().StartOpenMPDSABlock(
8549       OMPD_teams_distribute_simd, DirName, nullptr, D->getBeginLoc());
8550   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8551   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8552   return Res;
8553 }
8554 
8555 template <typename Derived>
8556 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeParallelForSimdDirective(
8557     OMPTeamsDistributeParallelForSimdDirective *D) {
8558   DeclarationNameInfo DirName;
8559   getDerived().getSema().StartOpenMPDSABlock(
8560       OMPD_teams_distribute_parallel_for_simd, DirName, nullptr,
8561       D->getBeginLoc());
8562   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8563   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8564   return Res;
8565 }
8566 
8567 template <typename Derived>
8568 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeParallelForDirective(
8569     OMPTeamsDistributeParallelForDirective *D) {
8570   DeclarationNameInfo DirName;
8571   getDerived().getSema().StartOpenMPDSABlock(
8572       OMPD_teams_distribute_parallel_for, DirName, nullptr, D->getBeginLoc());
8573   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8574   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8575   return Res;
8576 }
8577 
8578 template <typename Derived>
8579 StmtResult TreeTransform<Derived>::TransformOMPTargetTeamsDirective(
8580     OMPTargetTeamsDirective *D) {
8581   DeclarationNameInfo DirName;
8582   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_teams, DirName,
8583                                              nullptr, D->getBeginLoc());
8584   auto Res = getDerived().TransformOMPExecutableDirective(D);
8585   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8586   return Res;
8587 }
8588 
8589 template <typename Derived>
8590 StmtResult TreeTransform<Derived>::TransformOMPTargetTeamsDistributeDirective(
8591     OMPTargetTeamsDistributeDirective *D) {
8592   DeclarationNameInfo DirName;
8593   getDerived().getSema().StartOpenMPDSABlock(
8594       OMPD_target_teams_distribute, DirName, nullptr, D->getBeginLoc());
8595   auto Res = getDerived().TransformOMPExecutableDirective(D);
8596   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8597   return Res;
8598 }
8599 
8600 template <typename Derived>
8601 StmtResult
8602 TreeTransform<Derived>::TransformOMPTargetTeamsDistributeParallelForDirective(
8603     OMPTargetTeamsDistributeParallelForDirective *D) {
8604   DeclarationNameInfo DirName;
8605   getDerived().getSema().StartOpenMPDSABlock(
8606       OMPD_target_teams_distribute_parallel_for, DirName, nullptr,
8607       D->getBeginLoc());
8608   auto Res = getDerived().TransformOMPExecutableDirective(D);
8609   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8610   return Res;
8611 }
8612 
8613 template <typename Derived>
8614 StmtResult TreeTransform<Derived>::
8615     TransformOMPTargetTeamsDistributeParallelForSimdDirective(
8616         OMPTargetTeamsDistributeParallelForSimdDirective *D) {
8617   DeclarationNameInfo DirName;
8618   getDerived().getSema().StartOpenMPDSABlock(
8619       OMPD_target_teams_distribute_parallel_for_simd, DirName, nullptr,
8620       D->getBeginLoc());
8621   auto Res = getDerived().TransformOMPExecutableDirective(D);
8622   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8623   return Res;
8624 }
8625 
8626 template <typename Derived>
8627 StmtResult
8628 TreeTransform<Derived>::TransformOMPTargetTeamsDistributeSimdDirective(
8629     OMPTargetTeamsDistributeSimdDirective *D) {
8630   DeclarationNameInfo DirName;
8631   getDerived().getSema().StartOpenMPDSABlock(
8632       OMPD_target_teams_distribute_simd, DirName, nullptr, D->getBeginLoc());
8633   auto Res = getDerived().TransformOMPExecutableDirective(D);
8634   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8635   return Res;
8636 }
8637 
8638 
8639 //===----------------------------------------------------------------------===//
8640 // OpenMP clause transformation
8641 //===----------------------------------------------------------------------===//
8642 template <typename Derived>
8643 OMPClause *TreeTransform<Derived>::TransformOMPIfClause(OMPIfClause *C) {
8644   ExprResult Cond = getDerived().TransformExpr(C->getCondition());
8645   if (Cond.isInvalid())
8646     return nullptr;
8647   return getDerived().RebuildOMPIfClause(
8648       C->getNameModifier(), Cond.get(), C->getBeginLoc(), C->getLParenLoc(),
8649       C->getNameModifierLoc(), C->getColonLoc(), C->getEndLoc());
8650 }
8651 
8652 template <typename Derived>
8653 OMPClause *TreeTransform<Derived>::TransformOMPFinalClause(OMPFinalClause *C) {
8654   ExprResult Cond = getDerived().TransformExpr(C->getCondition());
8655   if (Cond.isInvalid())
8656     return nullptr;
8657   return getDerived().RebuildOMPFinalClause(Cond.get(), C->getBeginLoc(),
8658                                             C->getLParenLoc(), C->getEndLoc());
8659 }
8660 
8661 template <typename Derived>
8662 OMPClause *
8663 TreeTransform<Derived>::TransformOMPNumThreadsClause(OMPNumThreadsClause *C) {
8664   ExprResult NumThreads = getDerived().TransformExpr(C->getNumThreads());
8665   if (NumThreads.isInvalid())
8666     return nullptr;
8667   return getDerived().RebuildOMPNumThreadsClause(
8668       NumThreads.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
8669 }
8670 
8671 template <typename Derived>
8672 OMPClause *
8673 TreeTransform<Derived>::TransformOMPSafelenClause(OMPSafelenClause *C) {
8674   ExprResult E = getDerived().TransformExpr(C->getSafelen());
8675   if (E.isInvalid())
8676     return nullptr;
8677   return getDerived().RebuildOMPSafelenClause(
8678       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
8679 }
8680 
8681 template <typename Derived>
8682 OMPClause *
8683 TreeTransform<Derived>::TransformOMPAllocatorClause(OMPAllocatorClause *C) {
8684   ExprResult E = getDerived().TransformExpr(C->getAllocator());
8685   if (E.isInvalid())
8686     return nullptr;
8687   return getDerived().RebuildOMPAllocatorClause(
8688       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
8689 }
8690 
8691 template <typename Derived>
8692 OMPClause *
8693 TreeTransform<Derived>::TransformOMPSimdlenClause(OMPSimdlenClause *C) {
8694   ExprResult E = getDerived().TransformExpr(C->getSimdlen());
8695   if (E.isInvalid())
8696     return nullptr;
8697   return getDerived().RebuildOMPSimdlenClause(
8698       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
8699 }
8700 
8701 template <typename Derived>
8702 OMPClause *
8703 TreeTransform<Derived>::TransformOMPCollapseClause(OMPCollapseClause *C) {
8704   ExprResult E = getDerived().TransformExpr(C->getNumForLoops());
8705   if (E.isInvalid())
8706     return nullptr;
8707   return getDerived().RebuildOMPCollapseClause(
8708       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
8709 }
8710 
8711 template <typename Derived>
8712 OMPClause *
8713 TreeTransform<Derived>::TransformOMPDefaultClause(OMPDefaultClause *C) {
8714   return getDerived().RebuildOMPDefaultClause(
8715       C->getDefaultKind(), C->getDefaultKindKwLoc(), C->getBeginLoc(),
8716       C->getLParenLoc(), C->getEndLoc());
8717 }
8718 
8719 template <typename Derived>
8720 OMPClause *
8721 TreeTransform<Derived>::TransformOMPProcBindClause(OMPProcBindClause *C) {
8722   return getDerived().RebuildOMPProcBindClause(
8723       C->getProcBindKind(), C->getProcBindKindKwLoc(), C->getBeginLoc(),
8724       C->getLParenLoc(), C->getEndLoc());
8725 }
8726 
8727 template <typename Derived>
8728 OMPClause *
8729 TreeTransform<Derived>::TransformOMPScheduleClause(OMPScheduleClause *C) {
8730   ExprResult E = getDerived().TransformExpr(C->getChunkSize());
8731   if (E.isInvalid())
8732     return nullptr;
8733   return getDerived().RebuildOMPScheduleClause(
8734       C->getFirstScheduleModifier(), C->getSecondScheduleModifier(),
8735       C->getScheduleKind(), E.get(), C->getBeginLoc(), C->getLParenLoc(),
8736       C->getFirstScheduleModifierLoc(), C->getSecondScheduleModifierLoc(),
8737       C->getScheduleKindLoc(), C->getCommaLoc(), C->getEndLoc());
8738 }
8739 
8740 template <typename Derived>
8741 OMPClause *
8742 TreeTransform<Derived>::TransformOMPOrderedClause(OMPOrderedClause *C) {
8743   ExprResult E;
8744   if (auto *Num = C->getNumForLoops()) {
8745     E = getDerived().TransformExpr(Num);
8746     if (E.isInvalid())
8747       return nullptr;
8748   }
8749   return getDerived().RebuildOMPOrderedClause(C->getBeginLoc(), C->getEndLoc(),
8750                                               C->getLParenLoc(), E.get());
8751 }
8752 
8753 template <typename Derived>
8754 OMPClause *
8755 TreeTransform<Derived>::TransformOMPNowaitClause(OMPNowaitClause *C) {
8756   // No need to rebuild this clause, no template-dependent parameters.
8757   return C;
8758 }
8759 
8760 template <typename Derived>
8761 OMPClause *
8762 TreeTransform<Derived>::TransformOMPUntiedClause(OMPUntiedClause *C) {
8763   // No need to rebuild this clause, no template-dependent parameters.
8764   return C;
8765 }
8766 
8767 template <typename Derived>
8768 OMPClause *
8769 TreeTransform<Derived>::TransformOMPMergeableClause(OMPMergeableClause *C) {
8770   // No need to rebuild this clause, no template-dependent parameters.
8771   return C;
8772 }
8773 
8774 template <typename Derived>
8775 OMPClause *TreeTransform<Derived>::TransformOMPReadClause(OMPReadClause *C) {
8776   // No need to rebuild this clause, no template-dependent parameters.
8777   return C;
8778 }
8779 
8780 template <typename Derived>
8781 OMPClause *TreeTransform<Derived>::TransformOMPWriteClause(OMPWriteClause *C) {
8782   // No need to rebuild this clause, no template-dependent parameters.
8783   return C;
8784 }
8785 
8786 template <typename Derived>
8787 OMPClause *
8788 TreeTransform<Derived>::TransformOMPUpdateClause(OMPUpdateClause *C) {
8789   // No need to rebuild this clause, no template-dependent parameters.
8790   return C;
8791 }
8792 
8793 template <typename Derived>
8794 OMPClause *
8795 TreeTransform<Derived>::TransformOMPCaptureClause(OMPCaptureClause *C) {
8796   // No need to rebuild this clause, no template-dependent parameters.
8797   return C;
8798 }
8799 
8800 template <typename Derived>
8801 OMPClause *
8802 TreeTransform<Derived>::TransformOMPSeqCstClause(OMPSeqCstClause *C) {
8803   // No need to rebuild this clause, no template-dependent parameters.
8804   return C;
8805 }
8806 
8807 template <typename Derived>
8808 OMPClause *
8809 TreeTransform<Derived>::TransformOMPAcqRelClause(OMPAcqRelClause *C) {
8810   // No need to rebuild this clause, no template-dependent parameters.
8811   return C;
8812 }
8813 
8814 template <typename Derived>
8815 OMPClause *
8816 TreeTransform<Derived>::TransformOMPAcquireClause(OMPAcquireClause *C) {
8817   // No need to rebuild this clause, no template-dependent parameters.
8818   return C;
8819 }
8820 
8821 template <typename Derived>
8822 OMPClause *
8823 TreeTransform<Derived>::TransformOMPReleaseClause(OMPReleaseClause *C) {
8824   // No need to rebuild this clause, no template-dependent parameters.
8825   return C;
8826 }
8827 
8828 template <typename Derived>
8829 OMPClause *
8830 TreeTransform<Derived>::TransformOMPRelaxedClause(OMPRelaxedClause *C) {
8831   // No need to rebuild this clause, no template-dependent parameters.
8832   return C;
8833 }
8834 
8835 template <typename Derived>
8836 OMPClause *
8837 TreeTransform<Derived>::TransformOMPThreadsClause(OMPThreadsClause *C) {
8838   // No need to rebuild this clause, no template-dependent parameters.
8839   return C;
8840 }
8841 
8842 template <typename Derived>
8843 OMPClause *TreeTransform<Derived>::TransformOMPSIMDClause(OMPSIMDClause *C) {
8844   // No need to rebuild this clause, no template-dependent parameters.
8845   return C;
8846 }
8847 
8848 template <typename Derived>
8849 OMPClause *
8850 TreeTransform<Derived>::TransformOMPNogroupClause(OMPNogroupClause *C) {
8851   // No need to rebuild this clause, no template-dependent parameters.
8852   return C;
8853 }
8854 
8855 template <typename Derived>
8856 OMPClause *TreeTransform<Derived>::TransformOMPUnifiedAddressClause(
8857     OMPUnifiedAddressClause *C) {
8858   llvm_unreachable("unified_address clause cannot appear in dependent context");
8859 }
8860 
8861 template <typename Derived>
8862 OMPClause *TreeTransform<Derived>::TransformOMPUnifiedSharedMemoryClause(
8863     OMPUnifiedSharedMemoryClause *C) {
8864   llvm_unreachable(
8865       "unified_shared_memory clause cannot appear in dependent context");
8866 }
8867 
8868 template <typename Derived>
8869 OMPClause *TreeTransform<Derived>::TransformOMPReverseOffloadClause(
8870     OMPReverseOffloadClause *C) {
8871   llvm_unreachable("reverse_offload clause cannot appear in dependent context");
8872 }
8873 
8874 template <typename Derived>
8875 OMPClause *TreeTransform<Derived>::TransformOMPDynamicAllocatorsClause(
8876     OMPDynamicAllocatorsClause *C) {
8877   llvm_unreachable(
8878       "dynamic_allocators clause cannot appear in dependent context");
8879 }
8880 
8881 template <typename Derived>
8882 OMPClause *TreeTransform<Derived>::TransformOMPAtomicDefaultMemOrderClause(
8883     OMPAtomicDefaultMemOrderClause *C) {
8884   llvm_unreachable(
8885       "atomic_default_mem_order clause cannot appear in dependent context");
8886 }
8887 
8888 template <typename Derived>
8889 OMPClause *
8890 TreeTransform<Derived>::TransformOMPPrivateClause(OMPPrivateClause *C) {
8891   llvm::SmallVector<Expr *, 16> Vars;
8892   Vars.reserve(C->varlist_size());
8893   for (auto *VE : C->varlists()) {
8894     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8895     if (EVar.isInvalid())
8896       return nullptr;
8897     Vars.push_back(EVar.get());
8898   }
8899   return getDerived().RebuildOMPPrivateClause(
8900       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
8901 }
8902 
8903 template <typename Derived>
8904 OMPClause *TreeTransform<Derived>::TransformOMPFirstprivateClause(
8905     OMPFirstprivateClause *C) {
8906   llvm::SmallVector<Expr *, 16> Vars;
8907   Vars.reserve(C->varlist_size());
8908   for (auto *VE : C->varlists()) {
8909     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8910     if (EVar.isInvalid())
8911       return nullptr;
8912     Vars.push_back(EVar.get());
8913   }
8914   return getDerived().RebuildOMPFirstprivateClause(
8915       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
8916 }
8917 
8918 template <typename Derived>
8919 OMPClause *
8920 TreeTransform<Derived>::TransformOMPLastprivateClause(OMPLastprivateClause *C) {
8921   llvm::SmallVector<Expr *, 16> Vars;
8922   Vars.reserve(C->varlist_size());
8923   for (auto *VE : C->varlists()) {
8924     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8925     if (EVar.isInvalid())
8926       return nullptr;
8927     Vars.push_back(EVar.get());
8928   }
8929   return getDerived().RebuildOMPLastprivateClause(
8930       Vars, C->getKind(), C->getKindLoc(), C->getColonLoc(), C->getBeginLoc(),
8931       C->getLParenLoc(), C->getEndLoc());
8932 }
8933 
8934 template <typename Derived>
8935 OMPClause *
8936 TreeTransform<Derived>::TransformOMPSharedClause(OMPSharedClause *C) {
8937   llvm::SmallVector<Expr *, 16> Vars;
8938   Vars.reserve(C->varlist_size());
8939   for (auto *VE : C->varlists()) {
8940     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8941     if (EVar.isInvalid())
8942       return nullptr;
8943     Vars.push_back(EVar.get());
8944   }
8945   return getDerived().RebuildOMPSharedClause(Vars, C->getBeginLoc(),
8946                                              C->getLParenLoc(), C->getEndLoc());
8947 }
8948 
8949 template <typename Derived>
8950 OMPClause *
8951 TreeTransform<Derived>::TransformOMPReductionClause(OMPReductionClause *C) {
8952   llvm::SmallVector<Expr *, 16> Vars;
8953   Vars.reserve(C->varlist_size());
8954   for (auto *VE : C->varlists()) {
8955     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8956     if (EVar.isInvalid())
8957       return nullptr;
8958     Vars.push_back(EVar.get());
8959   }
8960   CXXScopeSpec ReductionIdScopeSpec;
8961   ReductionIdScopeSpec.Adopt(C->getQualifierLoc());
8962 
8963   DeclarationNameInfo NameInfo = C->getNameInfo();
8964   if (NameInfo.getName()) {
8965     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
8966     if (!NameInfo.getName())
8967       return nullptr;
8968   }
8969   // Build a list of all UDR decls with the same names ranged by the Scopes.
8970   // The Scope boundary is a duplication of the previous decl.
8971   llvm::SmallVector<Expr *, 16> UnresolvedReductions;
8972   for (auto *E : C->reduction_ops()) {
8973     // Transform all the decls.
8974     if (E) {
8975       auto *ULE = cast<UnresolvedLookupExpr>(E);
8976       UnresolvedSet<8> Decls;
8977       for (auto *D : ULE->decls()) {
8978         NamedDecl *InstD =
8979             cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D));
8980         Decls.addDecl(InstD, InstD->getAccess());
8981       }
8982       UnresolvedReductions.push_back(
8983        UnresolvedLookupExpr::Create(
8984           SemaRef.Context, /*NamingClass=*/nullptr,
8985           ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context),
8986           NameInfo, /*ADL=*/true, ULE->isOverloaded(),
8987           Decls.begin(), Decls.end()));
8988     } else
8989       UnresolvedReductions.push_back(nullptr);
8990   }
8991   return getDerived().RebuildOMPReductionClause(
8992       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(),
8993       C->getEndLoc(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions);
8994 }
8995 
8996 template <typename Derived>
8997 OMPClause *TreeTransform<Derived>::TransformOMPTaskReductionClause(
8998     OMPTaskReductionClause *C) {
8999   llvm::SmallVector<Expr *, 16> Vars;
9000   Vars.reserve(C->varlist_size());
9001   for (auto *VE : C->varlists()) {
9002     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9003     if (EVar.isInvalid())
9004       return nullptr;
9005     Vars.push_back(EVar.get());
9006   }
9007   CXXScopeSpec ReductionIdScopeSpec;
9008   ReductionIdScopeSpec.Adopt(C->getQualifierLoc());
9009 
9010   DeclarationNameInfo NameInfo = C->getNameInfo();
9011   if (NameInfo.getName()) {
9012     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
9013     if (!NameInfo.getName())
9014       return nullptr;
9015   }
9016   // Build a list of all UDR decls with the same names ranged by the Scopes.
9017   // The Scope boundary is a duplication of the previous decl.
9018   llvm::SmallVector<Expr *, 16> UnresolvedReductions;
9019   for (auto *E : C->reduction_ops()) {
9020     // Transform all the decls.
9021     if (E) {
9022       auto *ULE = cast<UnresolvedLookupExpr>(E);
9023       UnresolvedSet<8> Decls;
9024       for (auto *D : ULE->decls()) {
9025         NamedDecl *InstD =
9026             cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D));
9027         Decls.addDecl(InstD, InstD->getAccess());
9028       }
9029       UnresolvedReductions.push_back(UnresolvedLookupExpr::Create(
9030           SemaRef.Context, /*NamingClass=*/nullptr,
9031           ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), NameInfo,
9032           /*ADL=*/true, ULE->isOverloaded(), Decls.begin(), Decls.end()));
9033     } else
9034       UnresolvedReductions.push_back(nullptr);
9035   }
9036   return getDerived().RebuildOMPTaskReductionClause(
9037       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(),
9038       C->getEndLoc(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions);
9039 }
9040 
9041 template <typename Derived>
9042 OMPClause *
9043 TreeTransform<Derived>::TransformOMPInReductionClause(OMPInReductionClause *C) {
9044   llvm::SmallVector<Expr *, 16> Vars;
9045   Vars.reserve(C->varlist_size());
9046   for (auto *VE : C->varlists()) {
9047     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9048     if (EVar.isInvalid())
9049       return nullptr;
9050     Vars.push_back(EVar.get());
9051   }
9052   CXXScopeSpec ReductionIdScopeSpec;
9053   ReductionIdScopeSpec.Adopt(C->getQualifierLoc());
9054 
9055   DeclarationNameInfo NameInfo = C->getNameInfo();
9056   if (NameInfo.getName()) {
9057     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
9058     if (!NameInfo.getName())
9059       return nullptr;
9060   }
9061   // Build a list of all UDR decls with the same names ranged by the Scopes.
9062   // The Scope boundary is a duplication of the previous decl.
9063   llvm::SmallVector<Expr *, 16> UnresolvedReductions;
9064   for (auto *E : C->reduction_ops()) {
9065     // Transform all the decls.
9066     if (E) {
9067       auto *ULE = cast<UnresolvedLookupExpr>(E);
9068       UnresolvedSet<8> Decls;
9069       for (auto *D : ULE->decls()) {
9070         NamedDecl *InstD =
9071             cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D));
9072         Decls.addDecl(InstD, InstD->getAccess());
9073       }
9074       UnresolvedReductions.push_back(UnresolvedLookupExpr::Create(
9075           SemaRef.Context, /*NamingClass=*/nullptr,
9076           ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), NameInfo,
9077           /*ADL=*/true, ULE->isOverloaded(), Decls.begin(), Decls.end()));
9078     } else
9079       UnresolvedReductions.push_back(nullptr);
9080   }
9081   return getDerived().RebuildOMPInReductionClause(
9082       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(),
9083       C->getEndLoc(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions);
9084 }
9085 
9086 template <typename Derived>
9087 OMPClause *
9088 TreeTransform<Derived>::TransformOMPLinearClause(OMPLinearClause *C) {
9089   llvm::SmallVector<Expr *, 16> Vars;
9090   Vars.reserve(C->varlist_size());
9091   for (auto *VE : C->varlists()) {
9092     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9093     if (EVar.isInvalid())
9094       return nullptr;
9095     Vars.push_back(EVar.get());
9096   }
9097   ExprResult Step = getDerived().TransformExpr(C->getStep());
9098   if (Step.isInvalid())
9099     return nullptr;
9100   return getDerived().RebuildOMPLinearClause(
9101       Vars, Step.get(), C->getBeginLoc(), C->getLParenLoc(), C->getModifier(),
9102       C->getModifierLoc(), C->getColonLoc(), C->getEndLoc());
9103 }
9104 
9105 template <typename Derived>
9106 OMPClause *
9107 TreeTransform<Derived>::TransformOMPAlignedClause(OMPAlignedClause *C) {
9108   llvm::SmallVector<Expr *, 16> Vars;
9109   Vars.reserve(C->varlist_size());
9110   for (auto *VE : C->varlists()) {
9111     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9112     if (EVar.isInvalid())
9113       return nullptr;
9114     Vars.push_back(EVar.get());
9115   }
9116   ExprResult Alignment = getDerived().TransformExpr(C->getAlignment());
9117   if (Alignment.isInvalid())
9118     return nullptr;
9119   return getDerived().RebuildOMPAlignedClause(
9120       Vars, Alignment.get(), C->getBeginLoc(), C->getLParenLoc(),
9121       C->getColonLoc(), C->getEndLoc());
9122 }
9123 
9124 template <typename Derived>
9125 OMPClause *
9126 TreeTransform<Derived>::TransformOMPCopyinClause(OMPCopyinClause *C) {
9127   llvm::SmallVector<Expr *, 16> Vars;
9128   Vars.reserve(C->varlist_size());
9129   for (auto *VE : C->varlists()) {
9130     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9131     if (EVar.isInvalid())
9132       return nullptr;
9133     Vars.push_back(EVar.get());
9134   }
9135   return getDerived().RebuildOMPCopyinClause(Vars, C->getBeginLoc(),
9136                                              C->getLParenLoc(), C->getEndLoc());
9137 }
9138 
9139 template <typename Derived>
9140 OMPClause *
9141 TreeTransform<Derived>::TransformOMPCopyprivateClause(OMPCopyprivateClause *C) {
9142   llvm::SmallVector<Expr *, 16> Vars;
9143   Vars.reserve(C->varlist_size());
9144   for (auto *VE : C->varlists()) {
9145     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9146     if (EVar.isInvalid())
9147       return nullptr;
9148     Vars.push_back(EVar.get());
9149   }
9150   return getDerived().RebuildOMPCopyprivateClause(
9151       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9152 }
9153 
9154 template <typename Derived>
9155 OMPClause *TreeTransform<Derived>::TransformOMPFlushClause(OMPFlushClause *C) {
9156   llvm::SmallVector<Expr *, 16> Vars;
9157   Vars.reserve(C->varlist_size());
9158   for (auto *VE : C->varlists()) {
9159     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9160     if (EVar.isInvalid())
9161       return nullptr;
9162     Vars.push_back(EVar.get());
9163   }
9164   return getDerived().RebuildOMPFlushClause(Vars, C->getBeginLoc(),
9165                                             C->getLParenLoc(), C->getEndLoc());
9166 }
9167 
9168 template <typename Derived>
9169 OMPClause *
9170 TreeTransform<Derived>::TransformOMPDependClause(OMPDependClause *C) {
9171   llvm::SmallVector<Expr *, 16> Vars;
9172   Vars.reserve(C->varlist_size());
9173   for (auto *VE : C->varlists()) {
9174     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9175     if (EVar.isInvalid())
9176       return nullptr;
9177     Vars.push_back(EVar.get());
9178   }
9179   return getDerived().RebuildOMPDependClause(
9180       C->getDependencyKind(), C->getDependencyLoc(), C->getColonLoc(), Vars,
9181       C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9182 }
9183 
9184 template <typename Derived>
9185 OMPClause *
9186 TreeTransform<Derived>::TransformOMPDeviceClause(OMPDeviceClause *C) {
9187   ExprResult E = getDerived().TransformExpr(C->getDevice());
9188   if (E.isInvalid())
9189     return nullptr;
9190   return getDerived().RebuildOMPDeviceClause(E.get(), C->getBeginLoc(),
9191                                              C->getLParenLoc(), C->getEndLoc());
9192 }
9193 
9194 template <typename Derived, class T>
9195 bool transformOMPMappableExprListClause(
9196     TreeTransform<Derived> &TT, OMPMappableExprListClause<T> *C,
9197     llvm::SmallVectorImpl<Expr *> &Vars, CXXScopeSpec &MapperIdScopeSpec,
9198     DeclarationNameInfo &MapperIdInfo,
9199     llvm::SmallVectorImpl<Expr *> &UnresolvedMappers) {
9200   // Transform expressions in the list.
9201   Vars.reserve(C->varlist_size());
9202   for (auto *VE : C->varlists()) {
9203     ExprResult EVar = TT.getDerived().TransformExpr(cast<Expr>(VE));
9204     if (EVar.isInvalid())
9205       return true;
9206     Vars.push_back(EVar.get());
9207   }
9208   // Transform mapper scope specifier and identifier.
9209   NestedNameSpecifierLoc QualifierLoc;
9210   if (C->getMapperQualifierLoc()) {
9211     QualifierLoc = TT.getDerived().TransformNestedNameSpecifierLoc(
9212         C->getMapperQualifierLoc());
9213     if (!QualifierLoc)
9214       return true;
9215   }
9216   MapperIdScopeSpec.Adopt(QualifierLoc);
9217   MapperIdInfo = C->getMapperIdInfo();
9218   if (MapperIdInfo.getName()) {
9219     MapperIdInfo = TT.getDerived().TransformDeclarationNameInfo(MapperIdInfo);
9220     if (!MapperIdInfo.getName())
9221       return true;
9222   }
9223   // Build a list of all candidate OMPDeclareMapperDecls, which is provided by
9224   // the previous user-defined mapper lookup in dependent environment.
9225   for (auto *E : C->mapperlists()) {
9226     // Transform all the decls.
9227     if (E) {
9228       auto *ULE = cast<UnresolvedLookupExpr>(E);
9229       UnresolvedSet<8> Decls;
9230       for (auto *D : ULE->decls()) {
9231         NamedDecl *InstD =
9232             cast<NamedDecl>(TT.getDerived().TransformDecl(E->getExprLoc(), D));
9233         Decls.addDecl(InstD, InstD->getAccess());
9234       }
9235       UnresolvedMappers.push_back(UnresolvedLookupExpr::Create(
9236           TT.getSema().Context, /*NamingClass=*/nullptr,
9237           MapperIdScopeSpec.getWithLocInContext(TT.getSema().Context),
9238           MapperIdInfo, /*ADL=*/true, ULE->isOverloaded(), Decls.begin(),
9239           Decls.end()));
9240     } else {
9241       UnresolvedMappers.push_back(nullptr);
9242     }
9243   }
9244   return false;
9245 }
9246 
9247 template <typename Derived>
9248 OMPClause *TreeTransform<Derived>::TransformOMPMapClause(OMPMapClause *C) {
9249   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9250   llvm::SmallVector<Expr *, 16> Vars;
9251   CXXScopeSpec MapperIdScopeSpec;
9252   DeclarationNameInfo MapperIdInfo;
9253   llvm::SmallVector<Expr *, 16> UnresolvedMappers;
9254   if (transformOMPMappableExprListClause<Derived, OMPMapClause>(
9255           *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers))
9256     return nullptr;
9257   return getDerived().RebuildOMPMapClause(
9258       C->getMapTypeModifiers(), C->getMapTypeModifiersLoc(), MapperIdScopeSpec,
9259       MapperIdInfo, C->getMapType(), C->isImplicitMapType(), C->getMapLoc(),
9260       C->getColonLoc(), Vars, Locs, UnresolvedMappers);
9261 }
9262 
9263 template <typename Derived>
9264 OMPClause *
9265 TreeTransform<Derived>::TransformOMPAllocateClause(OMPAllocateClause *C) {
9266   Expr *Allocator = C->getAllocator();
9267   if (Allocator) {
9268     ExprResult AllocatorRes = getDerived().TransformExpr(Allocator);
9269     if (AllocatorRes.isInvalid())
9270       return nullptr;
9271     Allocator = AllocatorRes.get();
9272   }
9273   llvm::SmallVector<Expr *, 16> Vars;
9274   Vars.reserve(C->varlist_size());
9275   for (auto *VE : C->varlists()) {
9276     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9277     if (EVar.isInvalid())
9278       return nullptr;
9279     Vars.push_back(EVar.get());
9280   }
9281   return getDerived().RebuildOMPAllocateClause(
9282       Allocator, Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(),
9283       C->getEndLoc());
9284 }
9285 
9286 template <typename Derived>
9287 OMPClause *
9288 TreeTransform<Derived>::TransformOMPNumTeamsClause(OMPNumTeamsClause *C) {
9289   ExprResult E = getDerived().TransformExpr(C->getNumTeams());
9290   if (E.isInvalid())
9291     return nullptr;
9292   return getDerived().RebuildOMPNumTeamsClause(
9293       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9294 }
9295 
9296 template <typename Derived>
9297 OMPClause *
9298 TreeTransform<Derived>::TransformOMPThreadLimitClause(OMPThreadLimitClause *C) {
9299   ExprResult E = getDerived().TransformExpr(C->getThreadLimit());
9300   if (E.isInvalid())
9301     return nullptr;
9302   return getDerived().RebuildOMPThreadLimitClause(
9303       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9304 }
9305 
9306 template <typename Derived>
9307 OMPClause *
9308 TreeTransform<Derived>::TransformOMPPriorityClause(OMPPriorityClause *C) {
9309   ExprResult E = getDerived().TransformExpr(C->getPriority());
9310   if (E.isInvalid())
9311     return nullptr;
9312   return getDerived().RebuildOMPPriorityClause(
9313       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9314 }
9315 
9316 template <typename Derived>
9317 OMPClause *
9318 TreeTransform<Derived>::TransformOMPGrainsizeClause(OMPGrainsizeClause *C) {
9319   ExprResult E = getDerived().TransformExpr(C->getGrainsize());
9320   if (E.isInvalid())
9321     return nullptr;
9322   return getDerived().RebuildOMPGrainsizeClause(
9323       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9324 }
9325 
9326 template <typename Derived>
9327 OMPClause *
9328 TreeTransform<Derived>::TransformOMPNumTasksClause(OMPNumTasksClause *C) {
9329   ExprResult E = getDerived().TransformExpr(C->getNumTasks());
9330   if (E.isInvalid())
9331     return nullptr;
9332   return getDerived().RebuildOMPNumTasksClause(
9333       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9334 }
9335 
9336 template <typename Derived>
9337 OMPClause *TreeTransform<Derived>::TransformOMPHintClause(OMPHintClause *C) {
9338   ExprResult E = getDerived().TransformExpr(C->getHint());
9339   if (E.isInvalid())
9340     return nullptr;
9341   return getDerived().RebuildOMPHintClause(E.get(), C->getBeginLoc(),
9342                                            C->getLParenLoc(), C->getEndLoc());
9343 }
9344 
9345 template <typename Derived>
9346 OMPClause *TreeTransform<Derived>::TransformOMPDistScheduleClause(
9347     OMPDistScheduleClause *C) {
9348   ExprResult E = getDerived().TransformExpr(C->getChunkSize());
9349   if (E.isInvalid())
9350     return nullptr;
9351   return getDerived().RebuildOMPDistScheduleClause(
9352       C->getDistScheduleKind(), E.get(), C->getBeginLoc(), C->getLParenLoc(),
9353       C->getDistScheduleKindLoc(), C->getCommaLoc(), C->getEndLoc());
9354 }
9355 
9356 template <typename Derived>
9357 OMPClause *
9358 TreeTransform<Derived>::TransformOMPDefaultmapClause(OMPDefaultmapClause *C) {
9359   // Rebuild Defaultmap Clause since we need to invoke the checking of
9360   // defaultmap(none:variable-category) after template initialization.
9361   return getDerived().RebuildOMPDefaultmapClause(C->getDefaultmapModifier(),
9362                                                  C->getDefaultmapKind(),
9363                                                  C->getBeginLoc(),
9364                                                  C->getLParenLoc(),
9365                                                  C->getDefaultmapModifierLoc(),
9366                                                  C->getDefaultmapKindLoc(),
9367                                                  C->getEndLoc());
9368 }
9369 
9370 template <typename Derived>
9371 OMPClause *TreeTransform<Derived>::TransformOMPToClause(OMPToClause *C) {
9372   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9373   llvm::SmallVector<Expr *, 16> Vars;
9374   CXXScopeSpec MapperIdScopeSpec;
9375   DeclarationNameInfo MapperIdInfo;
9376   llvm::SmallVector<Expr *, 16> UnresolvedMappers;
9377   if (transformOMPMappableExprListClause<Derived, OMPToClause>(
9378           *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers))
9379     return nullptr;
9380   return getDerived().RebuildOMPToClause(Vars, MapperIdScopeSpec, MapperIdInfo,
9381                                          Locs, UnresolvedMappers);
9382 }
9383 
9384 template <typename Derived>
9385 OMPClause *TreeTransform<Derived>::TransformOMPFromClause(OMPFromClause *C) {
9386   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9387   llvm::SmallVector<Expr *, 16> Vars;
9388   CXXScopeSpec MapperIdScopeSpec;
9389   DeclarationNameInfo MapperIdInfo;
9390   llvm::SmallVector<Expr *, 16> UnresolvedMappers;
9391   if (transformOMPMappableExprListClause<Derived, OMPFromClause>(
9392           *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers))
9393     return nullptr;
9394   return getDerived().RebuildOMPFromClause(
9395       Vars, MapperIdScopeSpec, MapperIdInfo, Locs, UnresolvedMappers);
9396 }
9397 
9398 template <typename Derived>
9399 OMPClause *TreeTransform<Derived>::TransformOMPUseDevicePtrClause(
9400     OMPUseDevicePtrClause *C) {
9401   llvm::SmallVector<Expr *, 16> Vars;
9402   Vars.reserve(C->varlist_size());
9403   for (auto *VE : C->varlists()) {
9404     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9405     if (EVar.isInvalid())
9406       return nullptr;
9407     Vars.push_back(EVar.get());
9408   }
9409   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9410   return getDerived().RebuildOMPUseDevicePtrClause(Vars, Locs);
9411 }
9412 
9413 template <typename Derived>
9414 OMPClause *
9415 TreeTransform<Derived>::TransformOMPIsDevicePtrClause(OMPIsDevicePtrClause *C) {
9416   llvm::SmallVector<Expr *, 16> Vars;
9417   Vars.reserve(C->varlist_size());
9418   for (auto *VE : C->varlists()) {
9419     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9420     if (EVar.isInvalid())
9421       return nullptr;
9422     Vars.push_back(EVar.get());
9423   }
9424   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9425   return getDerived().RebuildOMPIsDevicePtrClause(Vars, Locs);
9426 }
9427 
9428 template <typename Derived>
9429 OMPClause *
9430 TreeTransform<Derived>::TransformOMPNontemporalClause(OMPNontemporalClause *C) {
9431   llvm::SmallVector<Expr *, 16> Vars;
9432   Vars.reserve(C->varlist_size());
9433   for (auto *VE : C->varlists()) {
9434     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9435     if (EVar.isInvalid())
9436       return nullptr;
9437     Vars.push_back(EVar.get());
9438   }
9439   return getDerived().RebuildOMPNontemporalClause(
9440       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9441 }
9442 
9443 template <typename Derived>
9444 OMPClause *
9445 TreeTransform<Derived>::TransformOMPOrderClause(OMPOrderClause *C) {
9446   return getDerived().RebuildOMPOrderClause(C->getKind(), C->getKindKwLoc(),
9447                                             C->getBeginLoc(), C->getLParenLoc(),
9448                                             C->getEndLoc());
9449 }
9450 
9451 //===----------------------------------------------------------------------===//
9452 // Expression transformation
9453 //===----------------------------------------------------------------------===//
9454 template<typename Derived>
9455 ExprResult
9456 TreeTransform<Derived>::TransformConstantExpr(ConstantExpr *E) {
9457   return TransformExpr(E->getSubExpr());
9458 }
9459 
9460 template<typename Derived>
9461 ExprResult
9462 TreeTransform<Derived>::TransformPredefinedExpr(PredefinedExpr *E) {
9463   if (!E->isTypeDependent())
9464     return E;
9465 
9466   return getDerived().RebuildPredefinedExpr(E->getLocation(),
9467                                             E->getIdentKind());
9468 }
9469 
9470 template<typename Derived>
9471 ExprResult
9472 TreeTransform<Derived>::TransformDeclRefExpr(DeclRefExpr *E) {
9473   NestedNameSpecifierLoc QualifierLoc;
9474   if (E->getQualifierLoc()) {
9475     QualifierLoc
9476       = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
9477     if (!QualifierLoc)
9478       return ExprError();
9479   }
9480 
9481   ValueDecl *ND
9482     = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getLocation(),
9483                                                          E->getDecl()));
9484   if (!ND)
9485     return ExprError();
9486 
9487   NamedDecl *Found = ND;
9488   if (E->getFoundDecl() != E->getDecl()) {
9489     Found = cast_or_null<NamedDecl>(
9490         getDerived().TransformDecl(E->getLocation(), E->getFoundDecl()));
9491     if (!Found)
9492       return ExprError();
9493   }
9494 
9495   DeclarationNameInfo NameInfo = E->getNameInfo();
9496   if (NameInfo.getName()) {
9497     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
9498     if (!NameInfo.getName())
9499       return ExprError();
9500   }
9501 
9502   if (!getDerived().AlwaysRebuild() &&
9503       QualifierLoc == E->getQualifierLoc() &&
9504       ND == E->getDecl() &&
9505       Found == E->getFoundDecl() &&
9506       NameInfo.getName() == E->getDecl()->getDeclName() &&
9507       !E->hasExplicitTemplateArgs()) {
9508 
9509     // Mark it referenced in the new context regardless.
9510     // FIXME: this is a bit instantiation-specific.
9511     SemaRef.MarkDeclRefReferenced(E);
9512 
9513     return E;
9514   }
9515 
9516   TemplateArgumentListInfo TransArgs, *TemplateArgs = nullptr;
9517   if (E->hasExplicitTemplateArgs()) {
9518     TemplateArgs = &TransArgs;
9519     TransArgs.setLAngleLoc(E->getLAngleLoc());
9520     TransArgs.setRAngleLoc(E->getRAngleLoc());
9521     if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
9522                                                 E->getNumTemplateArgs(),
9523                                                 TransArgs))
9524       return ExprError();
9525   }
9526 
9527   return getDerived().RebuildDeclRefExpr(QualifierLoc, ND, NameInfo,
9528                                          Found, TemplateArgs);
9529 }
9530 
9531 template<typename Derived>
9532 ExprResult
9533 TreeTransform<Derived>::TransformIntegerLiteral(IntegerLiteral *E) {
9534   return E;
9535 }
9536 
9537 template <typename Derived>
9538 ExprResult TreeTransform<Derived>::TransformFixedPointLiteral(
9539     FixedPointLiteral *E) {
9540   return E;
9541 }
9542 
9543 template<typename Derived>
9544 ExprResult
9545 TreeTransform<Derived>::TransformFloatingLiteral(FloatingLiteral *E) {
9546   return E;
9547 }
9548 
9549 template<typename Derived>
9550 ExprResult
9551 TreeTransform<Derived>::TransformImaginaryLiteral(ImaginaryLiteral *E) {
9552   return E;
9553 }
9554 
9555 template<typename Derived>
9556 ExprResult
9557 TreeTransform<Derived>::TransformStringLiteral(StringLiteral *E) {
9558   return E;
9559 }
9560 
9561 template<typename Derived>
9562 ExprResult
9563 TreeTransform<Derived>::TransformCharacterLiteral(CharacterLiteral *E) {
9564   return E;
9565 }
9566 
9567 template<typename Derived>
9568 ExprResult
9569 TreeTransform<Derived>::TransformUserDefinedLiteral(UserDefinedLiteral *E) {
9570   if (FunctionDecl *FD = E->getDirectCallee())
9571     SemaRef.MarkFunctionReferenced(E->getBeginLoc(), FD);
9572   return SemaRef.MaybeBindToTemporary(E);
9573 }
9574 
9575 template<typename Derived>
9576 ExprResult
9577 TreeTransform<Derived>::TransformGenericSelectionExpr(GenericSelectionExpr *E) {
9578   ExprResult ControllingExpr =
9579     getDerived().TransformExpr(E->getControllingExpr());
9580   if (ControllingExpr.isInvalid())
9581     return ExprError();
9582 
9583   SmallVector<Expr *, 4> AssocExprs;
9584   SmallVector<TypeSourceInfo *, 4> AssocTypes;
9585   for (const GenericSelectionExpr::Association Assoc : E->associations()) {
9586     TypeSourceInfo *TSI = Assoc.getTypeSourceInfo();
9587     if (TSI) {
9588       TypeSourceInfo *AssocType = getDerived().TransformType(TSI);
9589       if (!AssocType)
9590         return ExprError();
9591       AssocTypes.push_back(AssocType);
9592     } else {
9593       AssocTypes.push_back(nullptr);
9594     }
9595 
9596     ExprResult AssocExpr =
9597         getDerived().TransformExpr(Assoc.getAssociationExpr());
9598     if (AssocExpr.isInvalid())
9599       return ExprError();
9600     AssocExprs.push_back(AssocExpr.get());
9601   }
9602 
9603   return getDerived().RebuildGenericSelectionExpr(E->getGenericLoc(),
9604                                                   E->getDefaultLoc(),
9605                                                   E->getRParenLoc(),
9606                                                   ControllingExpr.get(),
9607                                                   AssocTypes,
9608                                                   AssocExprs);
9609 }
9610 
9611 template<typename Derived>
9612 ExprResult
9613 TreeTransform<Derived>::TransformParenExpr(ParenExpr *E) {
9614   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
9615   if (SubExpr.isInvalid())
9616     return ExprError();
9617 
9618   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr())
9619     return E;
9620 
9621   return getDerived().RebuildParenExpr(SubExpr.get(), E->getLParen(),
9622                                        E->getRParen());
9623 }
9624 
9625 /// The operand of a unary address-of operator has special rules: it's
9626 /// allowed to refer to a non-static member of a class even if there's no 'this'
9627 /// object available.
9628 template<typename Derived>
9629 ExprResult
9630 TreeTransform<Derived>::TransformAddressOfOperand(Expr *E) {
9631   if (DependentScopeDeclRefExpr *DRE = dyn_cast<DependentScopeDeclRefExpr>(E))
9632     return getDerived().TransformDependentScopeDeclRefExpr(DRE, true, nullptr);
9633   else
9634     return getDerived().TransformExpr(E);
9635 }
9636 
9637 template<typename Derived>
9638 ExprResult
9639 TreeTransform<Derived>::TransformUnaryOperator(UnaryOperator *E) {
9640   ExprResult SubExpr;
9641   if (E->getOpcode() == UO_AddrOf)
9642     SubExpr = TransformAddressOfOperand(E->getSubExpr());
9643   else
9644     SubExpr = TransformExpr(E->getSubExpr());
9645   if (SubExpr.isInvalid())
9646     return ExprError();
9647 
9648   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr())
9649     return E;
9650 
9651   return getDerived().RebuildUnaryOperator(E->getOperatorLoc(),
9652                                            E->getOpcode(),
9653                                            SubExpr.get());
9654 }
9655 
9656 template<typename Derived>
9657 ExprResult
9658 TreeTransform<Derived>::TransformOffsetOfExpr(OffsetOfExpr *E) {
9659   // Transform the type.
9660   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo());
9661   if (!Type)
9662     return ExprError();
9663 
9664   // Transform all of the components into components similar to what the
9665   // parser uses.
9666   // FIXME: It would be slightly more efficient in the non-dependent case to
9667   // just map FieldDecls, rather than requiring the rebuilder to look for
9668   // the fields again. However, __builtin_offsetof is rare enough in
9669   // template code that we don't care.
9670   bool ExprChanged = false;
9671   typedef Sema::OffsetOfComponent Component;
9672   SmallVector<Component, 4> Components;
9673   for (unsigned I = 0, N = E->getNumComponents(); I != N; ++I) {
9674     const OffsetOfNode &ON = E->getComponent(I);
9675     Component Comp;
9676     Comp.isBrackets = true;
9677     Comp.LocStart = ON.getSourceRange().getBegin();
9678     Comp.LocEnd = ON.getSourceRange().getEnd();
9679     switch (ON.getKind()) {
9680     case OffsetOfNode::Array: {
9681       Expr *FromIndex = E->getIndexExpr(ON.getArrayExprIndex());
9682       ExprResult Index = getDerived().TransformExpr(FromIndex);
9683       if (Index.isInvalid())
9684         return ExprError();
9685 
9686       ExprChanged = ExprChanged || Index.get() != FromIndex;
9687       Comp.isBrackets = true;
9688       Comp.U.E = Index.get();
9689       break;
9690     }
9691 
9692     case OffsetOfNode::Field:
9693     case OffsetOfNode::Identifier:
9694       Comp.isBrackets = false;
9695       Comp.U.IdentInfo = ON.getFieldName();
9696       if (!Comp.U.IdentInfo)
9697         continue;
9698 
9699       break;
9700 
9701     case OffsetOfNode::Base:
9702       // Will be recomputed during the rebuild.
9703       continue;
9704     }
9705 
9706     Components.push_back(Comp);
9707   }
9708 
9709   // If nothing changed, retain the existing expression.
9710   if (!getDerived().AlwaysRebuild() &&
9711       Type == E->getTypeSourceInfo() &&
9712       !ExprChanged)
9713     return E;
9714 
9715   // Build a new offsetof expression.
9716   return getDerived().RebuildOffsetOfExpr(E->getOperatorLoc(), Type,
9717                                           Components, E->getRParenLoc());
9718 }
9719 
9720 template<typename Derived>
9721 ExprResult
9722 TreeTransform<Derived>::TransformOpaqueValueExpr(OpaqueValueExpr *E) {
9723   assert((!E->getSourceExpr() || getDerived().AlreadyTransformed(E->getType())) &&
9724          "opaque value expression requires transformation");
9725   return E;
9726 }
9727 
9728 template<typename Derived>
9729 ExprResult
9730 TreeTransform<Derived>::TransformTypoExpr(TypoExpr *E) {
9731   return E;
9732 }
9733 
9734 template<typename Derived>
9735 ExprResult
9736 TreeTransform<Derived>::TransformPseudoObjectExpr(PseudoObjectExpr *E) {
9737   // Rebuild the syntactic form.  The original syntactic form has
9738   // opaque-value expressions in it, so strip those away and rebuild
9739   // the result.  This is a really awful way of doing this, but the
9740   // better solution (rebuilding the semantic expressions and
9741   // rebinding OVEs as necessary) doesn't work; we'd need
9742   // TreeTransform to not strip away implicit conversions.
9743   Expr *newSyntacticForm = SemaRef.recreateSyntacticForm(E);
9744   ExprResult result = getDerived().TransformExpr(newSyntacticForm);
9745   if (result.isInvalid()) return ExprError();
9746 
9747   // If that gives us a pseudo-object result back, the pseudo-object
9748   // expression must have been an lvalue-to-rvalue conversion which we
9749   // should reapply.
9750   if (result.get()->hasPlaceholderType(BuiltinType::PseudoObject))
9751     result = SemaRef.checkPseudoObjectRValue(result.get());
9752 
9753   return result;
9754 }
9755 
9756 template<typename Derived>
9757 ExprResult
9758 TreeTransform<Derived>::TransformUnaryExprOrTypeTraitExpr(
9759                                                 UnaryExprOrTypeTraitExpr *E) {
9760   if (E->isArgumentType()) {
9761     TypeSourceInfo *OldT = E->getArgumentTypeInfo();
9762 
9763     TypeSourceInfo *NewT = getDerived().TransformType(OldT);
9764     if (!NewT)
9765       return ExprError();
9766 
9767     if (!getDerived().AlwaysRebuild() && OldT == NewT)
9768       return E;
9769 
9770     return getDerived().RebuildUnaryExprOrTypeTrait(NewT, E->getOperatorLoc(),
9771                                                     E->getKind(),
9772                                                     E->getSourceRange());
9773   }
9774 
9775   // C++0x [expr.sizeof]p1:
9776   //   The operand is either an expression, which is an unevaluated operand
9777   //   [...]
9778   EnterExpressionEvaluationContext Unevaluated(
9779       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated,
9780       Sema::ReuseLambdaContextDecl);
9781 
9782   // Try to recover if we have something like sizeof(T::X) where X is a type.
9783   // Notably, there must be *exactly* one set of parens if X is a type.
9784   TypeSourceInfo *RecoveryTSI = nullptr;
9785   ExprResult SubExpr;
9786   auto *PE = dyn_cast<ParenExpr>(E->getArgumentExpr());
9787   if (auto *DRE =
9788           PE ? dyn_cast<DependentScopeDeclRefExpr>(PE->getSubExpr()) : nullptr)
9789     SubExpr = getDerived().TransformParenDependentScopeDeclRefExpr(
9790         PE, DRE, false, &RecoveryTSI);
9791   else
9792     SubExpr = getDerived().TransformExpr(E->getArgumentExpr());
9793 
9794   if (RecoveryTSI) {
9795     return getDerived().RebuildUnaryExprOrTypeTrait(
9796         RecoveryTSI, E->getOperatorLoc(), E->getKind(), E->getSourceRange());
9797   } else if (SubExpr.isInvalid())
9798     return ExprError();
9799 
9800   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getArgumentExpr())
9801     return E;
9802 
9803   return getDerived().RebuildUnaryExprOrTypeTrait(SubExpr.get(),
9804                                                   E->getOperatorLoc(),
9805                                                   E->getKind(),
9806                                                   E->getSourceRange());
9807 }
9808 
9809 template<typename Derived>
9810 ExprResult
9811 TreeTransform<Derived>::TransformArraySubscriptExpr(ArraySubscriptExpr *E) {
9812   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
9813   if (LHS.isInvalid())
9814     return ExprError();
9815 
9816   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
9817   if (RHS.isInvalid())
9818     return ExprError();
9819 
9820 
9821   if (!getDerived().AlwaysRebuild() &&
9822       LHS.get() == E->getLHS() &&
9823       RHS.get() == E->getRHS())
9824     return E;
9825 
9826   return getDerived().RebuildArraySubscriptExpr(
9827       LHS.get(),
9828       /*FIXME:*/ E->getLHS()->getBeginLoc(), RHS.get(), E->getRBracketLoc());
9829 }
9830 
9831 template <typename Derived>
9832 ExprResult
9833 TreeTransform<Derived>::TransformOMPArraySectionExpr(OMPArraySectionExpr *E) {
9834   ExprResult Base = getDerived().TransformExpr(E->getBase());
9835   if (Base.isInvalid())
9836     return ExprError();
9837 
9838   ExprResult LowerBound;
9839   if (E->getLowerBound()) {
9840     LowerBound = getDerived().TransformExpr(E->getLowerBound());
9841     if (LowerBound.isInvalid())
9842       return ExprError();
9843   }
9844 
9845   ExprResult Length;
9846   if (E->getLength()) {
9847     Length = getDerived().TransformExpr(E->getLength());
9848     if (Length.isInvalid())
9849       return ExprError();
9850   }
9851 
9852   if (!getDerived().AlwaysRebuild() && Base.get() == E->getBase() &&
9853       LowerBound.get() == E->getLowerBound() && Length.get() == E->getLength())
9854     return E;
9855 
9856   return getDerived().RebuildOMPArraySectionExpr(
9857       Base.get(), E->getBase()->getEndLoc(), LowerBound.get(), E->getColonLoc(),
9858       Length.get(), E->getRBracketLoc());
9859 }
9860 
9861 template<typename Derived>
9862 ExprResult
9863 TreeTransform<Derived>::TransformCallExpr(CallExpr *E) {
9864   // Transform the callee.
9865   ExprResult Callee = getDerived().TransformExpr(E->getCallee());
9866   if (Callee.isInvalid())
9867     return ExprError();
9868 
9869   // Transform arguments.
9870   bool ArgChanged = false;
9871   SmallVector<Expr*, 8> Args;
9872   if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
9873                                   &ArgChanged))
9874     return ExprError();
9875 
9876   if (!getDerived().AlwaysRebuild() &&
9877       Callee.get() == E->getCallee() &&
9878       !ArgChanged)
9879     return SemaRef.MaybeBindToTemporary(E);
9880 
9881   // FIXME: Wrong source location information for the '('.
9882   SourceLocation FakeLParenLoc
9883     = ((Expr *)Callee.get())->getSourceRange().getBegin();
9884   return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc,
9885                                       Args,
9886                                       E->getRParenLoc());
9887 }
9888 
9889 template<typename Derived>
9890 ExprResult
9891 TreeTransform<Derived>::TransformMemberExpr(MemberExpr *E) {
9892   ExprResult Base = getDerived().TransformExpr(E->getBase());
9893   if (Base.isInvalid())
9894     return ExprError();
9895 
9896   NestedNameSpecifierLoc QualifierLoc;
9897   if (E->hasQualifier()) {
9898     QualifierLoc
9899       = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
9900 
9901     if (!QualifierLoc)
9902       return ExprError();
9903   }
9904   SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc();
9905 
9906   ValueDecl *Member
9907     = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getMemberLoc(),
9908                                                          E->getMemberDecl()));
9909   if (!Member)
9910     return ExprError();
9911 
9912   NamedDecl *FoundDecl = E->getFoundDecl();
9913   if (FoundDecl == E->getMemberDecl()) {
9914     FoundDecl = Member;
9915   } else {
9916     FoundDecl = cast_or_null<NamedDecl>(
9917                    getDerived().TransformDecl(E->getMemberLoc(), FoundDecl));
9918     if (!FoundDecl)
9919       return ExprError();
9920   }
9921 
9922   if (!getDerived().AlwaysRebuild() &&
9923       Base.get() == E->getBase() &&
9924       QualifierLoc == E->getQualifierLoc() &&
9925       Member == E->getMemberDecl() &&
9926       FoundDecl == E->getFoundDecl() &&
9927       !E->hasExplicitTemplateArgs()) {
9928 
9929     // Mark it referenced in the new context regardless.
9930     // FIXME: this is a bit instantiation-specific.
9931     SemaRef.MarkMemberReferenced(E);
9932 
9933     return E;
9934   }
9935 
9936   TemplateArgumentListInfo TransArgs;
9937   if (E->hasExplicitTemplateArgs()) {
9938     TransArgs.setLAngleLoc(E->getLAngleLoc());
9939     TransArgs.setRAngleLoc(E->getRAngleLoc());
9940     if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
9941                                                 E->getNumTemplateArgs(),
9942                                                 TransArgs))
9943       return ExprError();
9944   }
9945 
9946   // FIXME: Bogus source location for the operator
9947   SourceLocation FakeOperatorLoc =
9948       SemaRef.getLocForEndOfToken(E->getBase()->getSourceRange().getEnd());
9949 
9950   // FIXME: to do this check properly, we will need to preserve the
9951   // first-qualifier-in-scope here, just in case we had a dependent
9952   // base (and therefore couldn't do the check) and a
9953   // nested-name-qualifier (and therefore could do the lookup).
9954   NamedDecl *FirstQualifierInScope = nullptr;
9955   DeclarationNameInfo MemberNameInfo = E->getMemberNameInfo();
9956   if (MemberNameInfo.getName()) {
9957     MemberNameInfo = getDerived().TransformDeclarationNameInfo(MemberNameInfo);
9958     if (!MemberNameInfo.getName())
9959       return ExprError();
9960   }
9961 
9962   return getDerived().RebuildMemberExpr(Base.get(), FakeOperatorLoc,
9963                                         E->isArrow(),
9964                                         QualifierLoc,
9965                                         TemplateKWLoc,
9966                                         MemberNameInfo,
9967                                         Member,
9968                                         FoundDecl,
9969                                         (E->hasExplicitTemplateArgs()
9970                                            ? &TransArgs : nullptr),
9971                                         FirstQualifierInScope);
9972 }
9973 
9974 template<typename Derived>
9975 ExprResult
9976 TreeTransform<Derived>::TransformBinaryOperator(BinaryOperator *E) {
9977   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
9978   if (LHS.isInvalid())
9979     return ExprError();
9980 
9981   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
9982   if (RHS.isInvalid())
9983     return ExprError();
9984 
9985   if (!getDerived().AlwaysRebuild() &&
9986       LHS.get() == E->getLHS() &&
9987       RHS.get() == E->getRHS())
9988     return E;
9989 
9990   Sema::FPFeaturesStateRAII FPFeaturesState(getSema());
9991   getSema().FPFeatures = E->getFPFeatures();
9992 
9993   return getDerived().RebuildBinaryOperator(E->getOperatorLoc(), E->getOpcode(),
9994                                             LHS.get(), RHS.get());
9995 }
9996 
9997 template <typename Derived>
9998 ExprResult TreeTransform<Derived>::TransformCXXRewrittenBinaryOperator(
9999     CXXRewrittenBinaryOperator *E) {
10000   CXXRewrittenBinaryOperator::DecomposedForm Decomp = E->getDecomposedForm();
10001 
10002   ExprResult LHS = getDerived().TransformExpr(const_cast<Expr*>(Decomp.LHS));
10003   if (LHS.isInvalid())
10004     return ExprError();
10005 
10006   ExprResult RHS = getDerived().TransformExpr(const_cast<Expr*>(Decomp.RHS));
10007   if (RHS.isInvalid())
10008     return ExprError();
10009 
10010   if (!getDerived().AlwaysRebuild() &&
10011       LHS.get() == Decomp.LHS &&
10012       RHS.get() == Decomp.RHS)
10013     return E;
10014 
10015   // Extract the already-resolved callee declarations so that we can restrict
10016   // ourselves to using them as the unqualified lookup results when rebuilding.
10017   UnresolvedSet<2> UnqualLookups;
10018   Expr *PossibleBinOps[] = {E->getSemanticForm(),
10019                             const_cast<Expr *>(Decomp.InnerBinOp)};
10020   for (Expr *PossibleBinOp : PossibleBinOps) {
10021     auto *Op = dyn_cast<CXXOperatorCallExpr>(PossibleBinOp->IgnoreImplicit());
10022     if (!Op)
10023       continue;
10024     auto *Callee = dyn_cast<DeclRefExpr>(Op->getCallee()->IgnoreImplicit());
10025     if (!Callee || isa<CXXMethodDecl>(Callee->getDecl()))
10026       continue;
10027 
10028     // Transform the callee in case we built a call to a local extern
10029     // declaration.
10030     NamedDecl *Found = cast_or_null<NamedDecl>(getDerived().TransformDecl(
10031         E->getOperatorLoc(), Callee->getFoundDecl()));
10032     if (!Found)
10033       return ExprError();
10034     UnqualLookups.addDecl(Found);
10035   }
10036 
10037   return getDerived().RebuildCXXRewrittenBinaryOperator(
10038       E->getOperatorLoc(), Decomp.Opcode, UnqualLookups, LHS.get(), RHS.get());
10039 }
10040 
10041 template<typename Derived>
10042 ExprResult
10043 TreeTransform<Derived>::TransformCompoundAssignOperator(
10044                                                       CompoundAssignOperator *E) {
10045   return getDerived().TransformBinaryOperator(E);
10046 }
10047 
10048 template<typename Derived>
10049 ExprResult TreeTransform<Derived>::
10050 TransformBinaryConditionalOperator(BinaryConditionalOperator *e) {
10051   // Just rebuild the common and RHS expressions and see whether we
10052   // get any changes.
10053 
10054   ExprResult commonExpr = getDerived().TransformExpr(e->getCommon());
10055   if (commonExpr.isInvalid())
10056     return ExprError();
10057 
10058   ExprResult rhs = getDerived().TransformExpr(e->getFalseExpr());
10059   if (rhs.isInvalid())
10060     return ExprError();
10061 
10062   if (!getDerived().AlwaysRebuild() &&
10063       commonExpr.get() == e->getCommon() &&
10064       rhs.get() == e->getFalseExpr())
10065     return e;
10066 
10067   return getDerived().RebuildConditionalOperator(commonExpr.get(),
10068                                                  e->getQuestionLoc(),
10069                                                  nullptr,
10070                                                  e->getColonLoc(),
10071                                                  rhs.get());
10072 }
10073 
10074 template<typename Derived>
10075 ExprResult
10076 TreeTransform<Derived>::TransformConditionalOperator(ConditionalOperator *E) {
10077   ExprResult Cond = getDerived().TransformExpr(E->getCond());
10078   if (Cond.isInvalid())
10079     return ExprError();
10080 
10081   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
10082   if (LHS.isInvalid())
10083     return ExprError();
10084 
10085   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
10086   if (RHS.isInvalid())
10087     return ExprError();
10088 
10089   if (!getDerived().AlwaysRebuild() &&
10090       Cond.get() == E->getCond() &&
10091       LHS.get() == E->getLHS() &&
10092       RHS.get() == E->getRHS())
10093     return E;
10094 
10095   return getDerived().RebuildConditionalOperator(Cond.get(),
10096                                                  E->getQuestionLoc(),
10097                                                  LHS.get(),
10098                                                  E->getColonLoc(),
10099                                                  RHS.get());
10100 }
10101 
10102 template<typename Derived>
10103 ExprResult
10104 TreeTransform<Derived>::TransformImplicitCastExpr(ImplicitCastExpr *E) {
10105   // Implicit casts are eliminated during transformation, since they
10106   // will be recomputed by semantic analysis after transformation.
10107   return getDerived().TransformExpr(E->getSubExprAsWritten());
10108 }
10109 
10110 template<typename Derived>
10111 ExprResult
10112 TreeTransform<Derived>::TransformCStyleCastExpr(CStyleCastExpr *E) {
10113   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten());
10114   if (!Type)
10115     return ExprError();
10116 
10117   ExprResult SubExpr
10118     = getDerived().TransformExpr(E->getSubExprAsWritten());
10119   if (SubExpr.isInvalid())
10120     return ExprError();
10121 
10122   if (!getDerived().AlwaysRebuild() &&
10123       Type == E->getTypeInfoAsWritten() &&
10124       SubExpr.get() == E->getSubExpr())
10125     return E;
10126 
10127   return getDerived().RebuildCStyleCastExpr(E->getLParenLoc(),
10128                                             Type,
10129                                             E->getRParenLoc(),
10130                                             SubExpr.get());
10131 }
10132 
10133 template<typename Derived>
10134 ExprResult
10135 TreeTransform<Derived>::TransformCompoundLiteralExpr(CompoundLiteralExpr *E) {
10136   TypeSourceInfo *OldT = E->getTypeSourceInfo();
10137   TypeSourceInfo *NewT = getDerived().TransformType(OldT);
10138   if (!NewT)
10139     return ExprError();
10140 
10141   ExprResult Init = getDerived().TransformExpr(E->getInitializer());
10142   if (Init.isInvalid())
10143     return ExprError();
10144 
10145   if (!getDerived().AlwaysRebuild() &&
10146       OldT == NewT &&
10147       Init.get() == E->getInitializer())
10148     return SemaRef.MaybeBindToTemporary(E);
10149 
10150   // Note: the expression type doesn't necessarily match the
10151   // type-as-written, but that's okay, because it should always be
10152   // derivable from the initializer.
10153 
10154   return getDerived().RebuildCompoundLiteralExpr(
10155       E->getLParenLoc(), NewT,
10156       /*FIXME:*/ E->getInitializer()->getEndLoc(), Init.get());
10157 }
10158 
10159 template<typename Derived>
10160 ExprResult
10161 TreeTransform<Derived>::TransformExtVectorElementExpr(ExtVectorElementExpr *E) {
10162   ExprResult Base = getDerived().TransformExpr(E->getBase());
10163   if (Base.isInvalid())
10164     return ExprError();
10165 
10166   if (!getDerived().AlwaysRebuild() &&
10167       Base.get() == E->getBase())
10168     return E;
10169 
10170   // FIXME: Bad source location
10171   SourceLocation FakeOperatorLoc =
10172       SemaRef.getLocForEndOfToken(E->getBase()->getEndLoc());
10173   return getDerived().RebuildExtVectorElementExpr(Base.get(), FakeOperatorLoc,
10174                                                   E->getAccessorLoc(),
10175                                                   E->getAccessor());
10176 }
10177 
10178 template<typename Derived>
10179 ExprResult
10180 TreeTransform<Derived>::TransformInitListExpr(InitListExpr *E) {
10181   if (InitListExpr *Syntactic = E->getSyntacticForm())
10182     E = Syntactic;
10183 
10184   bool InitChanged = false;
10185 
10186   EnterExpressionEvaluationContext Context(
10187       getSema(), EnterExpressionEvaluationContext::InitList);
10188 
10189   SmallVector<Expr*, 4> Inits;
10190   if (getDerived().TransformExprs(E->getInits(), E->getNumInits(), false,
10191                                   Inits, &InitChanged))
10192     return ExprError();
10193 
10194   if (!getDerived().AlwaysRebuild() && !InitChanged) {
10195     // FIXME: Attempt to reuse the existing syntactic form of the InitListExpr
10196     // in some cases. We can't reuse it in general, because the syntactic and
10197     // semantic forms are linked, and we can't know that semantic form will
10198     // match even if the syntactic form does.
10199   }
10200 
10201   return getDerived().RebuildInitList(E->getLBraceLoc(), Inits,
10202                                       E->getRBraceLoc());
10203 }
10204 
10205 template<typename Derived>
10206 ExprResult
10207 TreeTransform<Derived>::TransformDesignatedInitExpr(DesignatedInitExpr *E) {
10208   Designation Desig;
10209 
10210   // transform the initializer value
10211   ExprResult Init = getDerived().TransformExpr(E->getInit());
10212   if (Init.isInvalid())
10213     return ExprError();
10214 
10215   // transform the designators.
10216   SmallVector<Expr*, 4> ArrayExprs;
10217   bool ExprChanged = false;
10218   for (const DesignatedInitExpr::Designator &D : E->designators()) {
10219     if (D.isFieldDesignator()) {
10220       Desig.AddDesignator(Designator::getField(D.getFieldName(),
10221                                                D.getDotLoc(),
10222                                                D.getFieldLoc()));
10223       if (D.getField()) {
10224         FieldDecl *Field = cast_or_null<FieldDecl>(
10225             getDerived().TransformDecl(D.getFieldLoc(), D.getField()));
10226         if (Field != D.getField())
10227           // Rebuild the expression when the transformed FieldDecl is
10228           // different to the already assigned FieldDecl.
10229           ExprChanged = true;
10230       } else {
10231         // Ensure that the designator expression is rebuilt when there isn't
10232         // a resolved FieldDecl in the designator as we don't want to assign
10233         // a FieldDecl to a pattern designator that will be instantiated again.
10234         ExprChanged = true;
10235       }
10236       continue;
10237     }
10238 
10239     if (D.isArrayDesignator()) {
10240       ExprResult Index = getDerived().TransformExpr(E->getArrayIndex(D));
10241       if (Index.isInvalid())
10242         return ExprError();
10243 
10244       Desig.AddDesignator(
10245           Designator::getArray(Index.get(), D.getLBracketLoc()));
10246 
10247       ExprChanged = ExprChanged || Init.get() != E->getArrayIndex(D);
10248       ArrayExprs.push_back(Index.get());
10249       continue;
10250     }
10251 
10252     assert(D.isArrayRangeDesignator() && "New kind of designator?");
10253     ExprResult Start
10254       = getDerived().TransformExpr(E->getArrayRangeStart(D));
10255     if (Start.isInvalid())
10256       return ExprError();
10257 
10258     ExprResult End = getDerived().TransformExpr(E->getArrayRangeEnd(D));
10259     if (End.isInvalid())
10260       return ExprError();
10261 
10262     Desig.AddDesignator(Designator::getArrayRange(Start.get(),
10263                                                   End.get(),
10264                                                   D.getLBracketLoc(),
10265                                                   D.getEllipsisLoc()));
10266 
10267     ExprChanged = ExprChanged || Start.get() != E->getArrayRangeStart(D) ||
10268                   End.get() != E->getArrayRangeEnd(D);
10269 
10270     ArrayExprs.push_back(Start.get());
10271     ArrayExprs.push_back(End.get());
10272   }
10273 
10274   if (!getDerived().AlwaysRebuild() &&
10275       Init.get() == E->getInit() &&
10276       !ExprChanged)
10277     return E;
10278 
10279   return getDerived().RebuildDesignatedInitExpr(Desig, ArrayExprs,
10280                                                 E->getEqualOrColonLoc(),
10281                                                 E->usesGNUSyntax(), Init.get());
10282 }
10283 
10284 // Seems that if TransformInitListExpr() only works on the syntactic form of an
10285 // InitListExpr, then a DesignatedInitUpdateExpr is not encountered.
10286 template<typename Derived>
10287 ExprResult
10288 TreeTransform<Derived>::TransformDesignatedInitUpdateExpr(
10289     DesignatedInitUpdateExpr *E) {
10290   llvm_unreachable("Unexpected DesignatedInitUpdateExpr in syntactic form of "
10291                    "initializer");
10292   return ExprError();
10293 }
10294 
10295 template<typename Derived>
10296 ExprResult
10297 TreeTransform<Derived>::TransformNoInitExpr(
10298     NoInitExpr *E) {
10299   llvm_unreachable("Unexpected NoInitExpr in syntactic form of initializer");
10300   return ExprError();
10301 }
10302 
10303 template<typename Derived>
10304 ExprResult
10305 TreeTransform<Derived>::TransformArrayInitLoopExpr(ArrayInitLoopExpr *E) {
10306   llvm_unreachable("Unexpected ArrayInitLoopExpr outside of initializer");
10307   return ExprError();
10308 }
10309 
10310 template<typename Derived>
10311 ExprResult
10312 TreeTransform<Derived>::TransformArrayInitIndexExpr(ArrayInitIndexExpr *E) {
10313   llvm_unreachable("Unexpected ArrayInitIndexExpr outside of initializer");
10314   return ExprError();
10315 }
10316 
10317 template<typename Derived>
10318 ExprResult
10319 TreeTransform<Derived>::TransformImplicitValueInitExpr(
10320                                                      ImplicitValueInitExpr *E) {
10321   TemporaryBase Rebase(*this, E->getBeginLoc(), DeclarationName());
10322 
10323   // FIXME: Will we ever have proper type location here? Will we actually
10324   // need to transform the type?
10325   QualType T = getDerived().TransformType(E->getType());
10326   if (T.isNull())
10327     return ExprError();
10328 
10329   if (!getDerived().AlwaysRebuild() &&
10330       T == E->getType())
10331     return E;
10332 
10333   return getDerived().RebuildImplicitValueInitExpr(T);
10334 }
10335 
10336 template<typename Derived>
10337 ExprResult
10338 TreeTransform<Derived>::TransformVAArgExpr(VAArgExpr *E) {
10339   TypeSourceInfo *TInfo = getDerived().TransformType(E->getWrittenTypeInfo());
10340   if (!TInfo)
10341     return ExprError();
10342 
10343   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
10344   if (SubExpr.isInvalid())
10345     return ExprError();
10346 
10347   if (!getDerived().AlwaysRebuild() &&
10348       TInfo == E->getWrittenTypeInfo() &&
10349       SubExpr.get() == E->getSubExpr())
10350     return E;
10351 
10352   return getDerived().RebuildVAArgExpr(E->getBuiltinLoc(), SubExpr.get(),
10353                                        TInfo, E->getRParenLoc());
10354 }
10355 
10356 template<typename Derived>
10357 ExprResult
10358 TreeTransform<Derived>::TransformParenListExpr(ParenListExpr *E) {
10359   bool ArgumentChanged = false;
10360   SmallVector<Expr*, 4> Inits;
10361   if (TransformExprs(E->getExprs(), E->getNumExprs(), true, Inits,
10362                      &ArgumentChanged))
10363     return ExprError();
10364 
10365   return getDerived().RebuildParenListExpr(E->getLParenLoc(),
10366                                            Inits,
10367                                            E->getRParenLoc());
10368 }
10369 
10370 /// Transform an address-of-label expression.
10371 ///
10372 /// By default, the transformation of an address-of-label expression always
10373 /// rebuilds the expression, so that the label identifier can be resolved to
10374 /// the corresponding label statement by semantic analysis.
10375 template<typename Derived>
10376 ExprResult
10377 TreeTransform<Derived>::TransformAddrLabelExpr(AddrLabelExpr *E) {
10378   Decl *LD = getDerived().TransformDecl(E->getLabel()->getLocation(),
10379                                         E->getLabel());
10380   if (!LD)
10381     return ExprError();
10382 
10383   return getDerived().RebuildAddrLabelExpr(E->getAmpAmpLoc(), E->getLabelLoc(),
10384                                            cast<LabelDecl>(LD));
10385 }
10386 
10387 template<typename Derived>
10388 ExprResult
10389 TreeTransform<Derived>::TransformStmtExpr(StmtExpr *E) {
10390   SemaRef.ActOnStartStmtExpr();
10391   StmtResult SubStmt
10392     = getDerived().TransformCompoundStmt(E->getSubStmt(), true);
10393   if (SubStmt.isInvalid()) {
10394     SemaRef.ActOnStmtExprError();
10395     return ExprError();
10396   }
10397 
10398   if (!getDerived().AlwaysRebuild() &&
10399       SubStmt.get() == E->getSubStmt()) {
10400     // Calling this an 'error' is unintuitive, but it does the right thing.
10401     SemaRef.ActOnStmtExprError();
10402     return SemaRef.MaybeBindToTemporary(E);
10403   }
10404 
10405   return getDerived().RebuildStmtExpr(E->getLParenLoc(),
10406                                       SubStmt.get(),
10407                                       E->getRParenLoc());
10408 }
10409 
10410 template<typename Derived>
10411 ExprResult
10412 TreeTransform<Derived>::TransformChooseExpr(ChooseExpr *E) {
10413   ExprResult Cond = getDerived().TransformExpr(E->getCond());
10414   if (Cond.isInvalid())
10415     return ExprError();
10416 
10417   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
10418   if (LHS.isInvalid())
10419     return ExprError();
10420 
10421   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
10422   if (RHS.isInvalid())
10423     return ExprError();
10424 
10425   if (!getDerived().AlwaysRebuild() &&
10426       Cond.get() == E->getCond() &&
10427       LHS.get() == E->getLHS() &&
10428       RHS.get() == E->getRHS())
10429     return E;
10430 
10431   return getDerived().RebuildChooseExpr(E->getBuiltinLoc(),
10432                                         Cond.get(), LHS.get(), RHS.get(),
10433                                         E->getRParenLoc());
10434 }
10435 
10436 template<typename Derived>
10437 ExprResult
10438 TreeTransform<Derived>::TransformGNUNullExpr(GNUNullExpr *E) {
10439   return E;
10440 }
10441 
10442 template<typename Derived>
10443 ExprResult
10444 TreeTransform<Derived>::TransformCXXOperatorCallExpr(CXXOperatorCallExpr *E) {
10445   switch (E->getOperator()) {
10446   case OO_New:
10447   case OO_Delete:
10448   case OO_Array_New:
10449   case OO_Array_Delete:
10450     llvm_unreachable("new and delete operators cannot use CXXOperatorCallExpr");
10451 
10452   case OO_Call: {
10453     // This is a call to an object's operator().
10454     assert(E->getNumArgs() >= 1 && "Object call is missing arguments");
10455 
10456     // Transform the object itself.
10457     ExprResult Object = getDerived().TransformExpr(E->getArg(0));
10458     if (Object.isInvalid())
10459       return ExprError();
10460 
10461     // FIXME: Poor location information
10462     SourceLocation FakeLParenLoc = SemaRef.getLocForEndOfToken(
10463         static_cast<Expr *>(Object.get())->getEndLoc());
10464 
10465     // Transform the call arguments.
10466     SmallVector<Expr*, 8> Args;
10467     if (getDerived().TransformExprs(E->getArgs() + 1, E->getNumArgs() - 1, true,
10468                                     Args))
10469       return ExprError();
10470 
10471     return getDerived().RebuildCallExpr(Object.get(), FakeLParenLoc, Args,
10472                                         E->getEndLoc());
10473   }
10474 
10475 #define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly) \
10476   case OO_##Name:
10477 #define OVERLOADED_OPERATOR_MULTI(Name,Spelling,Unary,Binary,MemberOnly)
10478 #include "clang/Basic/OperatorKinds.def"
10479   case OO_Subscript:
10480     // Handled below.
10481     break;
10482 
10483   case OO_Conditional:
10484     llvm_unreachable("conditional operator is not actually overloadable");
10485 
10486   case OO_None:
10487   case NUM_OVERLOADED_OPERATORS:
10488     llvm_unreachable("not an overloaded operator?");
10489   }
10490 
10491   ExprResult Callee = getDerived().TransformExpr(E->getCallee());
10492   if (Callee.isInvalid())
10493     return ExprError();
10494 
10495   ExprResult First;
10496   if (E->getOperator() == OO_Amp)
10497     First = getDerived().TransformAddressOfOperand(E->getArg(0));
10498   else
10499     First = getDerived().TransformExpr(E->getArg(0));
10500   if (First.isInvalid())
10501     return ExprError();
10502 
10503   ExprResult Second;
10504   if (E->getNumArgs() == 2) {
10505     Second = getDerived().TransformExpr(E->getArg(1));
10506     if (Second.isInvalid())
10507       return ExprError();
10508   }
10509 
10510   if (!getDerived().AlwaysRebuild() &&
10511       Callee.get() == E->getCallee() &&
10512       First.get() == E->getArg(0) &&
10513       (E->getNumArgs() != 2 || Second.get() == E->getArg(1)))
10514     return SemaRef.MaybeBindToTemporary(E);
10515 
10516   Sema::FPFeaturesStateRAII FPFeaturesState(getSema());
10517   getSema().FPFeatures = E->getFPFeatures();
10518 
10519   return getDerived().RebuildCXXOperatorCallExpr(E->getOperator(),
10520                                                  E->getOperatorLoc(),
10521                                                  Callee.get(),
10522                                                  First.get(),
10523                                                  Second.get());
10524 }
10525 
10526 template<typename Derived>
10527 ExprResult
10528 TreeTransform<Derived>::TransformCXXMemberCallExpr(CXXMemberCallExpr *E) {
10529   return getDerived().TransformCallExpr(E);
10530 }
10531 
10532 template <typename Derived>
10533 ExprResult TreeTransform<Derived>::TransformSourceLocExpr(SourceLocExpr *E) {
10534   bool NeedRebuildFunc = E->getIdentKind() == SourceLocExpr::Function &&
10535                          getSema().CurContext != E->getParentContext();
10536 
10537   if (!getDerived().AlwaysRebuild() && !NeedRebuildFunc)
10538     return E;
10539 
10540   return getDerived().RebuildSourceLocExpr(E->getIdentKind(), E->getBeginLoc(),
10541                                            E->getEndLoc(),
10542                                            getSema().CurContext);
10543 }
10544 
10545 template<typename Derived>
10546 ExprResult
10547 TreeTransform<Derived>::TransformCUDAKernelCallExpr(CUDAKernelCallExpr *E) {
10548   // Transform the callee.
10549   ExprResult Callee = getDerived().TransformExpr(E->getCallee());
10550   if (Callee.isInvalid())
10551     return ExprError();
10552 
10553   // Transform exec config.
10554   ExprResult EC = getDerived().TransformCallExpr(E->getConfig());
10555   if (EC.isInvalid())
10556     return ExprError();
10557 
10558   // Transform arguments.
10559   bool ArgChanged = false;
10560   SmallVector<Expr*, 8> Args;
10561   if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
10562                                   &ArgChanged))
10563     return ExprError();
10564 
10565   if (!getDerived().AlwaysRebuild() &&
10566       Callee.get() == E->getCallee() &&
10567       !ArgChanged)
10568     return SemaRef.MaybeBindToTemporary(E);
10569 
10570   // FIXME: Wrong source location information for the '('.
10571   SourceLocation FakeLParenLoc
10572     = ((Expr *)Callee.get())->getSourceRange().getBegin();
10573   return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc,
10574                                       Args,
10575                                       E->getRParenLoc(), EC.get());
10576 }
10577 
10578 template<typename Derived>
10579 ExprResult
10580 TreeTransform<Derived>::TransformCXXNamedCastExpr(CXXNamedCastExpr *E) {
10581   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten());
10582   if (!Type)
10583     return ExprError();
10584 
10585   ExprResult SubExpr
10586     = getDerived().TransformExpr(E->getSubExprAsWritten());
10587   if (SubExpr.isInvalid())
10588     return ExprError();
10589 
10590   if (!getDerived().AlwaysRebuild() &&
10591       Type == E->getTypeInfoAsWritten() &&
10592       SubExpr.get() == E->getSubExpr())
10593     return E;
10594   return getDerived().RebuildCXXNamedCastExpr(
10595       E->getOperatorLoc(), E->getStmtClass(), E->getAngleBrackets().getBegin(),
10596       Type, E->getAngleBrackets().getEnd(),
10597       // FIXME. this should be '(' location
10598       E->getAngleBrackets().getEnd(), SubExpr.get(), E->getRParenLoc());
10599 }
10600 
10601 template<typename Derived>
10602 ExprResult
10603 TreeTransform<Derived>::TransformBuiltinBitCastExpr(BuiltinBitCastExpr *BCE) {
10604   TypeSourceInfo *TSI =
10605       getDerived().TransformType(BCE->getTypeInfoAsWritten());
10606   if (!TSI)
10607     return ExprError();
10608 
10609   ExprResult Sub = getDerived().TransformExpr(BCE->getSubExpr());
10610   if (Sub.isInvalid())
10611     return ExprError();
10612 
10613   return getDerived().RebuildBuiltinBitCastExpr(BCE->getBeginLoc(), TSI,
10614                                                 Sub.get(), BCE->getEndLoc());
10615 }
10616 
10617 template<typename Derived>
10618 ExprResult
10619 TreeTransform<Derived>::TransformCXXStaticCastExpr(CXXStaticCastExpr *E) {
10620   return getDerived().TransformCXXNamedCastExpr(E);
10621 }
10622 
10623 template<typename Derived>
10624 ExprResult
10625 TreeTransform<Derived>::TransformCXXDynamicCastExpr(CXXDynamicCastExpr *E) {
10626   return getDerived().TransformCXXNamedCastExpr(E);
10627 }
10628 
10629 template<typename Derived>
10630 ExprResult
10631 TreeTransform<Derived>::TransformCXXReinterpretCastExpr(
10632                                                       CXXReinterpretCastExpr *E) {
10633   return getDerived().TransformCXXNamedCastExpr(E);
10634 }
10635 
10636 template<typename Derived>
10637 ExprResult
10638 TreeTransform<Derived>::TransformCXXConstCastExpr(CXXConstCastExpr *E) {
10639   return getDerived().TransformCXXNamedCastExpr(E);
10640 }
10641 
10642 template<typename Derived>
10643 ExprResult
10644 TreeTransform<Derived>::TransformCXXFunctionalCastExpr(
10645                                                      CXXFunctionalCastExpr *E) {
10646   TypeSourceInfo *Type =
10647       getDerived().TransformTypeWithDeducedTST(E->getTypeInfoAsWritten());
10648   if (!Type)
10649     return ExprError();
10650 
10651   ExprResult SubExpr
10652     = getDerived().TransformExpr(E->getSubExprAsWritten());
10653   if (SubExpr.isInvalid())
10654     return ExprError();
10655 
10656   if (!getDerived().AlwaysRebuild() &&
10657       Type == E->getTypeInfoAsWritten() &&
10658       SubExpr.get() == E->getSubExpr())
10659     return E;
10660 
10661   return getDerived().RebuildCXXFunctionalCastExpr(Type,
10662                                                    E->getLParenLoc(),
10663                                                    SubExpr.get(),
10664                                                    E->getRParenLoc(),
10665                                                    E->isListInitialization());
10666 }
10667 
10668 template<typename Derived>
10669 ExprResult
10670 TreeTransform<Derived>::TransformCXXTypeidExpr(CXXTypeidExpr *E) {
10671   if (E->isTypeOperand()) {
10672     TypeSourceInfo *TInfo
10673       = getDerived().TransformType(E->getTypeOperandSourceInfo());
10674     if (!TInfo)
10675       return ExprError();
10676 
10677     if (!getDerived().AlwaysRebuild() &&
10678         TInfo == E->getTypeOperandSourceInfo())
10679       return E;
10680 
10681     return getDerived().RebuildCXXTypeidExpr(E->getType(), E->getBeginLoc(),
10682                                              TInfo, E->getEndLoc());
10683   }
10684 
10685   // We don't know whether the subexpression is potentially evaluated until
10686   // after we perform semantic analysis.  We speculatively assume it is
10687   // unevaluated; it will get fixed later if the subexpression is in fact
10688   // potentially evaluated.
10689   EnterExpressionEvaluationContext Unevaluated(
10690       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated,
10691       Sema::ReuseLambdaContextDecl);
10692 
10693   ExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand());
10694   if (SubExpr.isInvalid())
10695     return ExprError();
10696 
10697   if (!getDerived().AlwaysRebuild() &&
10698       SubExpr.get() == E->getExprOperand())
10699     return E;
10700 
10701   return getDerived().RebuildCXXTypeidExpr(E->getType(), E->getBeginLoc(),
10702                                            SubExpr.get(), E->getEndLoc());
10703 }
10704 
10705 template<typename Derived>
10706 ExprResult
10707 TreeTransform<Derived>::TransformCXXUuidofExpr(CXXUuidofExpr *E) {
10708   if (E->isTypeOperand()) {
10709     TypeSourceInfo *TInfo
10710       = getDerived().TransformType(E->getTypeOperandSourceInfo());
10711     if (!TInfo)
10712       return ExprError();
10713 
10714     if (!getDerived().AlwaysRebuild() &&
10715         TInfo == E->getTypeOperandSourceInfo())
10716       return E;
10717 
10718     return getDerived().RebuildCXXUuidofExpr(E->getType(), E->getBeginLoc(),
10719                                              TInfo, E->getEndLoc());
10720   }
10721 
10722   EnterExpressionEvaluationContext Unevaluated(
10723       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
10724 
10725   ExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand());
10726   if (SubExpr.isInvalid())
10727     return ExprError();
10728 
10729   if (!getDerived().AlwaysRebuild() &&
10730       SubExpr.get() == E->getExprOperand())
10731     return E;
10732 
10733   return getDerived().RebuildCXXUuidofExpr(E->getType(), E->getBeginLoc(),
10734                                            SubExpr.get(), E->getEndLoc());
10735 }
10736 
10737 template<typename Derived>
10738 ExprResult
10739 TreeTransform<Derived>::TransformCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) {
10740   return E;
10741 }
10742 
10743 template<typename Derived>
10744 ExprResult
10745 TreeTransform<Derived>::TransformCXXNullPtrLiteralExpr(
10746                                                      CXXNullPtrLiteralExpr *E) {
10747   return E;
10748 }
10749 
10750 template<typename Derived>
10751 ExprResult
10752 TreeTransform<Derived>::TransformCXXThisExpr(CXXThisExpr *E) {
10753   QualType T = getSema().getCurrentThisType();
10754 
10755   if (!getDerived().AlwaysRebuild() && T == E->getType()) {
10756     // Mark it referenced in the new context regardless.
10757     // FIXME: this is a bit instantiation-specific.
10758     getSema().MarkThisReferenced(E);
10759     return E;
10760   }
10761 
10762   return getDerived().RebuildCXXThisExpr(E->getBeginLoc(), T, E->isImplicit());
10763 }
10764 
10765 template<typename Derived>
10766 ExprResult
10767 TreeTransform<Derived>::TransformCXXThrowExpr(CXXThrowExpr *E) {
10768   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
10769   if (SubExpr.isInvalid())
10770     return ExprError();
10771 
10772   if (!getDerived().AlwaysRebuild() &&
10773       SubExpr.get() == E->getSubExpr())
10774     return E;
10775 
10776   return getDerived().RebuildCXXThrowExpr(E->getThrowLoc(), SubExpr.get(),
10777                                           E->isThrownVariableInScope());
10778 }
10779 
10780 template<typename Derived>
10781 ExprResult
10782 TreeTransform<Derived>::TransformCXXDefaultArgExpr(CXXDefaultArgExpr *E) {
10783   ParmVarDecl *Param = cast_or_null<ParmVarDecl>(
10784       getDerived().TransformDecl(E->getBeginLoc(), E->getParam()));
10785   if (!Param)
10786     return ExprError();
10787 
10788   if (!getDerived().AlwaysRebuild() && Param == E->getParam() &&
10789       E->getUsedContext() == SemaRef.CurContext)
10790     return E;
10791 
10792   return getDerived().RebuildCXXDefaultArgExpr(E->getUsedLocation(), Param);
10793 }
10794 
10795 template<typename Derived>
10796 ExprResult
10797 TreeTransform<Derived>::TransformCXXDefaultInitExpr(CXXDefaultInitExpr *E) {
10798   FieldDecl *Field = cast_or_null<FieldDecl>(
10799       getDerived().TransformDecl(E->getBeginLoc(), E->getField()));
10800   if (!Field)
10801     return ExprError();
10802 
10803   if (!getDerived().AlwaysRebuild() && Field == E->getField() &&
10804       E->getUsedContext() == SemaRef.CurContext)
10805     return E;
10806 
10807   return getDerived().RebuildCXXDefaultInitExpr(E->getExprLoc(), Field);
10808 }
10809 
10810 template<typename Derived>
10811 ExprResult
10812 TreeTransform<Derived>::TransformCXXScalarValueInitExpr(
10813                                                     CXXScalarValueInitExpr *E) {
10814   TypeSourceInfo *T = getDerived().TransformType(E->getTypeSourceInfo());
10815   if (!T)
10816     return ExprError();
10817 
10818   if (!getDerived().AlwaysRebuild() &&
10819       T == E->getTypeSourceInfo())
10820     return E;
10821 
10822   return getDerived().RebuildCXXScalarValueInitExpr(T,
10823                                           /*FIXME:*/T->getTypeLoc().getEndLoc(),
10824                                                     E->getRParenLoc());
10825 }
10826 
10827 template<typename Derived>
10828 ExprResult
10829 TreeTransform<Derived>::TransformCXXNewExpr(CXXNewExpr *E) {
10830   // Transform the type that we're allocating
10831   TypeSourceInfo *AllocTypeInfo =
10832       getDerived().TransformTypeWithDeducedTST(E->getAllocatedTypeSourceInfo());
10833   if (!AllocTypeInfo)
10834     return ExprError();
10835 
10836   // Transform the size of the array we're allocating (if any).
10837   Optional<Expr *> ArraySize;
10838   if (Optional<Expr *> OldArraySize = E->getArraySize()) {
10839     ExprResult NewArraySize;
10840     if (*OldArraySize) {
10841       NewArraySize = getDerived().TransformExpr(*OldArraySize);
10842       if (NewArraySize.isInvalid())
10843         return ExprError();
10844     }
10845     ArraySize = NewArraySize.get();
10846   }
10847 
10848   // Transform the placement arguments (if any).
10849   bool ArgumentChanged = false;
10850   SmallVector<Expr*, 8> PlacementArgs;
10851   if (getDerived().TransformExprs(E->getPlacementArgs(),
10852                                   E->getNumPlacementArgs(), true,
10853                                   PlacementArgs, &ArgumentChanged))
10854     return ExprError();
10855 
10856   // Transform the initializer (if any).
10857   Expr *OldInit = E->getInitializer();
10858   ExprResult NewInit;
10859   if (OldInit)
10860     NewInit = getDerived().TransformInitializer(OldInit, true);
10861   if (NewInit.isInvalid())
10862     return ExprError();
10863 
10864   // Transform new operator and delete operator.
10865   FunctionDecl *OperatorNew = nullptr;
10866   if (E->getOperatorNew()) {
10867     OperatorNew = cast_or_null<FunctionDecl>(
10868         getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorNew()));
10869     if (!OperatorNew)
10870       return ExprError();
10871   }
10872 
10873   FunctionDecl *OperatorDelete = nullptr;
10874   if (E->getOperatorDelete()) {
10875     OperatorDelete = cast_or_null<FunctionDecl>(
10876         getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorDelete()));
10877     if (!OperatorDelete)
10878       return ExprError();
10879   }
10880 
10881   if (!getDerived().AlwaysRebuild() &&
10882       AllocTypeInfo == E->getAllocatedTypeSourceInfo() &&
10883       ArraySize == E->getArraySize() &&
10884       NewInit.get() == OldInit &&
10885       OperatorNew == E->getOperatorNew() &&
10886       OperatorDelete == E->getOperatorDelete() &&
10887       !ArgumentChanged) {
10888     // Mark any declarations we need as referenced.
10889     // FIXME: instantiation-specific.
10890     if (OperatorNew)
10891       SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorNew);
10892     if (OperatorDelete)
10893       SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorDelete);
10894 
10895     if (E->isArray() && !E->getAllocatedType()->isDependentType()) {
10896       QualType ElementType
10897         = SemaRef.Context.getBaseElementType(E->getAllocatedType());
10898       if (const RecordType *RecordT = ElementType->getAs<RecordType>()) {
10899         CXXRecordDecl *Record = cast<CXXRecordDecl>(RecordT->getDecl());
10900         if (CXXDestructorDecl *Destructor = SemaRef.LookupDestructor(Record)) {
10901           SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Destructor);
10902         }
10903       }
10904     }
10905 
10906     return E;
10907   }
10908 
10909   QualType AllocType = AllocTypeInfo->getType();
10910   if (!ArraySize) {
10911     // If no array size was specified, but the new expression was
10912     // instantiated with an array type (e.g., "new T" where T is
10913     // instantiated with "int[4]"), extract the outer bound from the
10914     // array type as our array size. We do this with constant and
10915     // dependently-sized array types.
10916     const ArrayType *ArrayT = SemaRef.Context.getAsArrayType(AllocType);
10917     if (!ArrayT) {
10918       // Do nothing
10919     } else if (const ConstantArrayType *ConsArrayT
10920                                      = dyn_cast<ConstantArrayType>(ArrayT)) {
10921       ArraySize = IntegerLiteral::Create(SemaRef.Context, ConsArrayT->getSize(),
10922                                          SemaRef.Context.getSizeType(),
10923                                          /*FIXME:*/ E->getBeginLoc());
10924       AllocType = ConsArrayT->getElementType();
10925     } else if (const DependentSizedArrayType *DepArrayT
10926                               = dyn_cast<DependentSizedArrayType>(ArrayT)) {
10927       if (DepArrayT->getSizeExpr()) {
10928         ArraySize = DepArrayT->getSizeExpr();
10929         AllocType = DepArrayT->getElementType();
10930       }
10931     }
10932   }
10933 
10934   return getDerived().RebuildCXXNewExpr(
10935       E->getBeginLoc(), E->isGlobalNew(),
10936       /*FIXME:*/ E->getBeginLoc(), PlacementArgs,
10937       /*FIXME:*/ E->getBeginLoc(), E->getTypeIdParens(), AllocType,
10938       AllocTypeInfo, ArraySize, E->getDirectInitRange(), NewInit.get());
10939 }
10940 
10941 template<typename Derived>
10942 ExprResult
10943 TreeTransform<Derived>::TransformCXXDeleteExpr(CXXDeleteExpr *E) {
10944   ExprResult Operand = getDerived().TransformExpr(E->getArgument());
10945   if (Operand.isInvalid())
10946     return ExprError();
10947 
10948   // Transform the delete operator, if known.
10949   FunctionDecl *OperatorDelete = nullptr;
10950   if (E->getOperatorDelete()) {
10951     OperatorDelete = cast_or_null<FunctionDecl>(
10952         getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorDelete()));
10953     if (!OperatorDelete)
10954       return ExprError();
10955   }
10956 
10957   if (!getDerived().AlwaysRebuild() &&
10958       Operand.get() == E->getArgument() &&
10959       OperatorDelete == E->getOperatorDelete()) {
10960     // Mark any declarations we need as referenced.
10961     // FIXME: instantiation-specific.
10962     if (OperatorDelete)
10963       SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorDelete);
10964 
10965     if (!E->getArgument()->isTypeDependent()) {
10966       QualType Destroyed = SemaRef.Context.getBaseElementType(
10967                                                          E->getDestroyedType());
10968       if (const RecordType *DestroyedRec = Destroyed->getAs<RecordType>()) {
10969         CXXRecordDecl *Record = cast<CXXRecordDecl>(DestroyedRec->getDecl());
10970         SemaRef.MarkFunctionReferenced(E->getBeginLoc(),
10971                                        SemaRef.LookupDestructor(Record));
10972       }
10973     }
10974 
10975     return E;
10976   }
10977 
10978   return getDerived().RebuildCXXDeleteExpr(
10979       E->getBeginLoc(), E->isGlobalDelete(), E->isArrayForm(), Operand.get());
10980 }
10981 
10982 template<typename Derived>
10983 ExprResult
10984 TreeTransform<Derived>::TransformCXXPseudoDestructorExpr(
10985                                                      CXXPseudoDestructorExpr *E) {
10986   ExprResult Base = getDerived().TransformExpr(E->getBase());
10987   if (Base.isInvalid())
10988     return ExprError();
10989 
10990   ParsedType ObjectTypePtr;
10991   bool MayBePseudoDestructor = false;
10992   Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(),
10993                                               E->getOperatorLoc(),
10994                                         E->isArrow()? tok::arrow : tok::period,
10995                                               ObjectTypePtr,
10996                                               MayBePseudoDestructor);
10997   if (Base.isInvalid())
10998     return ExprError();
10999 
11000   QualType ObjectType = ObjectTypePtr.get();
11001   NestedNameSpecifierLoc QualifierLoc = E->getQualifierLoc();
11002   if (QualifierLoc) {
11003     QualifierLoc
11004       = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc, ObjectType);
11005     if (!QualifierLoc)
11006       return ExprError();
11007   }
11008   CXXScopeSpec SS;
11009   SS.Adopt(QualifierLoc);
11010 
11011   PseudoDestructorTypeStorage Destroyed;
11012   if (E->getDestroyedTypeInfo()) {
11013     TypeSourceInfo *DestroyedTypeInfo
11014       = getDerived().TransformTypeInObjectScope(E->getDestroyedTypeInfo(),
11015                                                 ObjectType, nullptr, SS);
11016     if (!DestroyedTypeInfo)
11017       return ExprError();
11018     Destroyed = DestroyedTypeInfo;
11019   } else if (!ObjectType.isNull() && ObjectType->isDependentType()) {
11020     // We aren't likely to be able to resolve the identifier down to a type
11021     // now anyway, so just retain the identifier.
11022     Destroyed = PseudoDestructorTypeStorage(E->getDestroyedTypeIdentifier(),
11023                                             E->getDestroyedTypeLoc());
11024   } else {
11025     // Look for a destructor known with the given name.
11026     ParsedType T = SemaRef.getDestructorName(E->getTildeLoc(),
11027                                               *E->getDestroyedTypeIdentifier(),
11028                                                 E->getDestroyedTypeLoc(),
11029                                                 /*Scope=*/nullptr,
11030                                                 SS, ObjectTypePtr,
11031                                                 false);
11032     if (!T)
11033       return ExprError();
11034 
11035     Destroyed
11036       = SemaRef.Context.getTrivialTypeSourceInfo(SemaRef.GetTypeFromParser(T),
11037                                                  E->getDestroyedTypeLoc());
11038   }
11039 
11040   TypeSourceInfo *ScopeTypeInfo = nullptr;
11041   if (E->getScopeTypeInfo()) {
11042     CXXScopeSpec EmptySS;
11043     ScopeTypeInfo = getDerived().TransformTypeInObjectScope(
11044                       E->getScopeTypeInfo(), ObjectType, nullptr, EmptySS);
11045     if (!ScopeTypeInfo)
11046       return ExprError();
11047   }
11048 
11049   return getDerived().RebuildCXXPseudoDestructorExpr(Base.get(),
11050                                                      E->getOperatorLoc(),
11051                                                      E->isArrow(),
11052                                                      SS,
11053                                                      ScopeTypeInfo,
11054                                                      E->getColonColonLoc(),
11055                                                      E->getTildeLoc(),
11056                                                      Destroyed);
11057 }
11058 
11059 template <typename Derived>
11060 bool TreeTransform<Derived>::TransformOverloadExprDecls(OverloadExpr *Old,
11061                                                         bool RequiresADL,
11062                                                         LookupResult &R) {
11063   // Transform all the decls.
11064   bool AllEmptyPacks = true;
11065   for (auto *OldD : Old->decls()) {
11066     Decl *InstD = getDerived().TransformDecl(Old->getNameLoc(), OldD);
11067     if (!InstD) {
11068       // Silently ignore these if a UsingShadowDecl instantiated to nothing.
11069       // This can happen because of dependent hiding.
11070       if (isa<UsingShadowDecl>(OldD))
11071         continue;
11072       else {
11073         R.clear();
11074         return true;
11075       }
11076     }
11077 
11078     // Expand using pack declarations.
11079     NamedDecl *SingleDecl = cast<NamedDecl>(InstD);
11080     ArrayRef<NamedDecl*> Decls = SingleDecl;
11081     if (auto *UPD = dyn_cast<UsingPackDecl>(InstD))
11082       Decls = UPD->expansions();
11083 
11084     // Expand using declarations.
11085     for (auto *D : Decls) {
11086       if (auto *UD = dyn_cast<UsingDecl>(D)) {
11087         for (auto *SD : UD->shadows())
11088           R.addDecl(SD);
11089       } else {
11090         R.addDecl(D);
11091       }
11092     }
11093 
11094     AllEmptyPacks &= Decls.empty();
11095   };
11096 
11097   // C++ [temp.res]/8.4.2:
11098   //   The program is ill-formed, no diagnostic required, if [...] lookup for
11099   //   a name in the template definition found a using-declaration, but the
11100   //   lookup in the corresponding scope in the instantiation odoes not find
11101   //   any declarations because the using-declaration was a pack expansion and
11102   //   the corresponding pack is empty
11103   if (AllEmptyPacks && !RequiresADL) {
11104     getSema().Diag(Old->getNameLoc(), diag::err_using_pack_expansion_empty)
11105         << isa<UnresolvedMemberExpr>(Old) << Old->getName();
11106     return true;
11107   }
11108 
11109   // Resolve a kind, but don't do any further analysis.  If it's
11110   // ambiguous, the callee needs to deal with it.
11111   R.resolveKind();
11112   return false;
11113 }
11114 
11115 template<typename Derived>
11116 ExprResult
11117 TreeTransform<Derived>::TransformUnresolvedLookupExpr(
11118                                                   UnresolvedLookupExpr *Old) {
11119   LookupResult R(SemaRef, Old->getName(), Old->getNameLoc(),
11120                  Sema::LookupOrdinaryName);
11121 
11122   // Transform the declaration set.
11123   if (TransformOverloadExprDecls(Old, Old->requiresADL(), R))
11124     return ExprError();
11125 
11126   // Rebuild the nested-name qualifier, if present.
11127   CXXScopeSpec SS;
11128   if (Old->getQualifierLoc()) {
11129     NestedNameSpecifierLoc QualifierLoc
11130       = getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc());
11131     if (!QualifierLoc)
11132       return ExprError();
11133 
11134     SS.Adopt(QualifierLoc);
11135   }
11136 
11137   if (Old->getNamingClass()) {
11138     CXXRecordDecl *NamingClass
11139       = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl(
11140                                                             Old->getNameLoc(),
11141                                                         Old->getNamingClass()));
11142     if (!NamingClass) {
11143       R.clear();
11144       return ExprError();
11145     }
11146 
11147     R.setNamingClass(NamingClass);
11148   }
11149 
11150   SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc();
11151 
11152   // If we have neither explicit template arguments, nor the template keyword,
11153   // it's a normal declaration name or member reference.
11154   if (!Old->hasExplicitTemplateArgs() && !TemplateKWLoc.isValid()) {
11155     NamedDecl *D = R.getAsSingle<NamedDecl>();
11156     // In a C++11 unevaluated context, an UnresolvedLookupExpr might refer to an
11157     // instance member. In other contexts, BuildPossibleImplicitMemberExpr will
11158     // give a good diagnostic.
11159     if (D && D->isCXXInstanceMember()) {
11160       return SemaRef.BuildPossibleImplicitMemberExpr(SS, TemplateKWLoc, R,
11161                                                      /*TemplateArgs=*/nullptr,
11162                                                      /*Scope=*/nullptr);
11163     }
11164 
11165     return getDerived().RebuildDeclarationNameExpr(SS, R, Old->requiresADL());
11166   }
11167 
11168   // If we have template arguments, rebuild them, then rebuild the
11169   // templateid expression.
11170   TemplateArgumentListInfo TransArgs(Old->getLAngleLoc(), Old->getRAngleLoc());
11171   if (Old->hasExplicitTemplateArgs() &&
11172       getDerived().TransformTemplateArguments(Old->getTemplateArgs(),
11173                                               Old->getNumTemplateArgs(),
11174                                               TransArgs)) {
11175     R.clear();
11176     return ExprError();
11177   }
11178 
11179   return getDerived().RebuildTemplateIdExpr(SS, TemplateKWLoc, R,
11180                                             Old->requiresADL(), &TransArgs);
11181 }
11182 
11183 template<typename Derived>
11184 ExprResult
11185 TreeTransform<Derived>::TransformTypeTraitExpr(TypeTraitExpr *E) {
11186   bool ArgChanged = false;
11187   SmallVector<TypeSourceInfo *, 4> Args;
11188   for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) {
11189     TypeSourceInfo *From = E->getArg(I);
11190     TypeLoc FromTL = From->getTypeLoc();
11191     if (!FromTL.getAs<PackExpansionTypeLoc>()) {
11192       TypeLocBuilder TLB;
11193       TLB.reserve(FromTL.getFullDataSize());
11194       QualType To = getDerived().TransformType(TLB, FromTL);
11195       if (To.isNull())
11196         return ExprError();
11197 
11198       if (To == From->getType())
11199         Args.push_back(From);
11200       else {
11201         Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
11202         ArgChanged = true;
11203       }
11204       continue;
11205     }
11206 
11207     ArgChanged = true;
11208 
11209     // We have a pack expansion. Instantiate it.
11210     PackExpansionTypeLoc ExpansionTL = FromTL.castAs<PackExpansionTypeLoc>();
11211     TypeLoc PatternTL = ExpansionTL.getPatternLoc();
11212     SmallVector<UnexpandedParameterPack, 2> Unexpanded;
11213     SemaRef.collectUnexpandedParameterPacks(PatternTL, Unexpanded);
11214 
11215     // Determine whether the set of unexpanded parameter packs can and should
11216     // be expanded.
11217     bool Expand = true;
11218     bool RetainExpansion = false;
11219     Optional<unsigned> OrigNumExpansions =
11220         ExpansionTL.getTypePtr()->getNumExpansions();
11221     Optional<unsigned> NumExpansions = OrigNumExpansions;
11222     if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(),
11223                                              PatternTL.getSourceRange(),
11224                                              Unexpanded,
11225                                              Expand, RetainExpansion,
11226                                              NumExpansions))
11227       return ExprError();
11228 
11229     if (!Expand) {
11230       // The transform has determined that we should perform a simple
11231       // transformation on the pack expansion, producing another pack
11232       // expansion.
11233       Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
11234 
11235       TypeLocBuilder TLB;
11236       TLB.reserve(From->getTypeLoc().getFullDataSize());
11237 
11238       QualType To = getDerived().TransformType(TLB, PatternTL);
11239       if (To.isNull())
11240         return ExprError();
11241 
11242       To = getDerived().RebuildPackExpansionType(To,
11243                                                  PatternTL.getSourceRange(),
11244                                                  ExpansionTL.getEllipsisLoc(),
11245                                                  NumExpansions);
11246       if (To.isNull())
11247         return ExprError();
11248 
11249       PackExpansionTypeLoc ToExpansionTL
11250         = TLB.push<PackExpansionTypeLoc>(To);
11251       ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc());
11252       Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
11253       continue;
11254     }
11255 
11256     // Expand the pack expansion by substituting for each argument in the
11257     // pack(s).
11258     for (unsigned I = 0; I != *NumExpansions; ++I) {
11259       Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(SemaRef, I);
11260       TypeLocBuilder TLB;
11261       TLB.reserve(PatternTL.getFullDataSize());
11262       QualType To = getDerived().TransformType(TLB, PatternTL);
11263       if (To.isNull())
11264         return ExprError();
11265 
11266       if (To->containsUnexpandedParameterPack()) {
11267         To = getDerived().RebuildPackExpansionType(To,
11268                                                    PatternTL.getSourceRange(),
11269                                                    ExpansionTL.getEllipsisLoc(),
11270                                                    NumExpansions);
11271         if (To.isNull())
11272           return ExprError();
11273 
11274         PackExpansionTypeLoc ToExpansionTL
11275           = TLB.push<PackExpansionTypeLoc>(To);
11276         ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc());
11277       }
11278 
11279       Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
11280     }
11281 
11282     if (!RetainExpansion)
11283       continue;
11284 
11285     // If we're supposed to retain a pack expansion, do so by temporarily
11286     // forgetting the partially-substituted parameter pack.
11287     ForgetPartiallySubstitutedPackRAII Forget(getDerived());
11288 
11289     TypeLocBuilder TLB;
11290     TLB.reserve(From->getTypeLoc().getFullDataSize());
11291 
11292     QualType To = getDerived().TransformType(TLB, PatternTL);
11293     if (To.isNull())
11294       return ExprError();
11295 
11296     To = getDerived().RebuildPackExpansionType(To,
11297                                                PatternTL.getSourceRange(),
11298                                                ExpansionTL.getEllipsisLoc(),
11299                                                NumExpansions);
11300     if (To.isNull())
11301       return ExprError();
11302 
11303     PackExpansionTypeLoc ToExpansionTL
11304       = TLB.push<PackExpansionTypeLoc>(To);
11305     ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc());
11306     Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
11307   }
11308 
11309   if (!getDerived().AlwaysRebuild() && !ArgChanged)
11310     return E;
11311 
11312   return getDerived().RebuildTypeTrait(E->getTrait(), E->getBeginLoc(), Args,
11313                                        E->getEndLoc());
11314 }
11315 
11316 template<typename Derived>
11317 ExprResult
11318 TreeTransform<Derived>::TransformConceptSpecializationExpr(
11319                                                  ConceptSpecializationExpr *E) {
11320   const ASTTemplateArgumentListInfo *Old = E->getTemplateArgsAsWritten();
11321   TemplateArgumentListInfo TransArgs(Old->LAngleLoc, Old->RAngleLoc);
11322   if (getDerived().TransformTemplateArguments(Old->getTemplateArgs(),
11323                                               Old->NumTemplateArgs, TransArgs))
11324     return ExprError();
11325 
11326   return getDerived().RebuildConceptSpecializationExpr(
11327       E->getNestedNameSpecifierLoc(), E->getTemplateKWLoc(),
11328       E->getConceptNameInfo(), E->getFoundDecl(), E->getNamedConcept(),
11329       &TransArgs);
11330 }
11331 
11332 template<typename Derived>
11333 ExprResult
11334 TreeTransform<Derived>::TransformRequiresExpr(RequiresExpr *E) {
11335   SmallVector<ParmVarDecl*, 4> TransParams;
11336   SmallVector<QualType, 4> TransParamTypes;
11337   Sema::ExtParameterInfoBuilder ExtParamInfos;
11338 
11339   // C++2a [expr.prim.req]p2
11340   // Expressions appearing within a requirement-body are unevaluated operands.
11341   EnterExpressionEvaluationContext Ctx(
11342       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
11343 
11344   RequiresExprBodyDecl *Body = RequiresExprBodyDecl::Create(
11345       getSema().Context, E->getBody()->getDeclContext(),
11346       E->getBody()->getBeginLoc());
11347 
11348   Sema::ContextRAII SavedContext(getSema(), Body, /*NewThisContext*/false);
11349 
11350   if (getDerived().TransformFunctionTypeParams(E->getRequiresKWLoc(),
11351                                                E->getLocalParameters(),
11352                                                /*ParamTypes=*/nullptr,
11353                                                /*ParamInfos=*/nullptr,
11354                                                TransParamTypes, &TransParams,
11355                                                ExtParamInfos))
11356     return ExprError();
11357 
11358   for (ParmVarDecl *Param : TransParams)
11359     Param->setDeclContext(Body);
11360 
11361   SmallVector<concepts::Requirement *, 4> TransReqs;
11362   if (getDerived().TransformRequiresExprRequirements(E->getRequirements(),
11363                                                      TransReqs))
11364     return ExprError();
11365 
11366   for (concepts::Requirement *Req : TransReqs) {
11367     if (auto *ER = dyn_cast<concepts::ExprRequirement>(Req)) {
11368       if (ER->getReturnTypeRequirement().isTypeConstraint()) {
11369         ER->getReturnTypeRequirement()
11370                 .getTypeConstraintTemplateParameterList()->getParam(0)
11371                 ->setDeclContext(Body);
11372       }
11373     }
11374   }
11375 
11376   return getDerived().RebuildRequiresExpr(E->getRequiresKWLoc(), Body,
11377                                           TransParams, TransReqs,
11378                                           E->getRBraceLoc());
11379 }
11380 
11381 template<typename Derived>
11382 bool TreeTransform<Derived>::TransformRequiresExprRequirements(
11383     ArrayRef<concepts::Requirement *> Reqs,
11384     SmallVectorImpl<concepts::Requirement *> &Transformed) {
11385   for (concepts::Requirement *Req : Reqs) {
11386     concepts::Requirement *TransReq = nullptr;
11387     if (auto *TypeReq = dyn_cast<concepts::TypeRequirement>(Req))
11388       TransReq = getDerived().TransformTypeRequirement(TypeReq);
11389     else if (auto *ExprReq = dyn_cast<concepts::ExprRequirement>(Req))
11390       TransReq = getDerived().TransformExprRequirement(ExprReq);
11391     else
11392       TransReq = getDerived().TransformNestedRequirement(
11393                      cast<concepts::NestedRequirement>(Req));
11394     if (!TransReq)
11395       return true;
11396     Transformed.push_back(TransReq);
11397   }
11398   return false;
11399 }
11400 
11401 template<typename Derived>
11402 concepts::TypeRequirement *
11403 TreeTransform<Derived>::TransformTypeRequirement(
11404     concepts::TypeRequirement *Req) {
11405   if (Req->isSubstitutionFailure()) {
11406     if (getDerived().AlwaysRebuild())
11407       return getDerived().RebuildTypeRequirement(
11408               Req->getSubstitutionDiagnostic());
11409     return Req;
11410   }
11411   TypeSourceInfo *TransType = getDerived().TransformType(Req->getType());
11412   if (!TransType)
11413     return nullptr;
11414   return getDerived().RebuildTypeRequirement(TransType);
11415 }
11416 
11417 template<typename Derived>
11418 concepts::ExprRequirement *
11419 TreeTransform<Derived>::TransformExprRequirement(concepts::ExprRequirement *Req) {
11420   llvm::PointerUnion<Expr *, concepts::Requirement::SubstitutionDiagnostic *> TransExpr;
11421   if (Req->isExprSubstitutionFailure())
11422     TransExpr = Req->getExprSubstitutionDiagnostic();
11423   else {
11424     ExprResult TransExprRes = getDerived().TransformExpr(Req->getExpr());
11425     if (TransExprRes.isInvalid())
11426       return nullptr;
11427     TransExpr = TransExprRes.get();
11428   }
11429 
11430   llvm::Optional<concepts::ExprRequirement::ReturnTypeRequirement> TransRetReq;
11431   const auto &RetReq = Req->getReturnTypeRequirement();
11432   if (RetReq.isEmpty())
11433     TransRetReq.emplace();
11434   else if (RetReq.isSubstitutionFailure())
11435     TransRetReq.emplace(RetReq.getSubstitutionDiagnostic());
11436   else if (RetReq.isTypeConstraint()) {
11437     TemplateParameterList *OrigTPL =
11438         RetReq.getTypeConstraintTemplateParameterList();
11439     TemplateParameterList *TPL =
11440         getDerived().TransformTemplateParameterList(OrigTPL);
11441     if (!TPL)
11442       return nullptr;
11443     TransRetReq.emplace(TPL);
11444   }
11445   assert(TransRetReq.hasValue() &&
11446          "All code paths leading here must set TransRetReq");
11447   if (Expr *E = TransExpr.dyn_cast<Expr *>())
11448     return getDerived().RebuildExprRequirement(E, Req->isSimple(),
11449                                                Req->getNoexceptLoc(),
11450                                                std::move(*TransRetReq));
11451   return getDerived().RebuildExprRequirement(
11452       TransExpr.get<concepts::Requirement::SubstitutionDiagnostic *>(),
11453       Req->isSimple(), Req->getNoexceptLoc(), std::move(*TransRetReq));
11454 }
11455 
11456 template<typename Derived>
11457 concepts::NestedRequirement *
11458 TreeTransform<Derived>::TransformNestedRequirement(
11459     concepts::NestedRequirement *Req) {
11460   if (Req->isSubstitutionFailure()) {
11461     if (getDerived().AlwaysRebuild())
11462       return getDerived().RebuildNestedRequirement(
11463           Req->getSubstitutionDiagnostic());
11464     return Req;
11465   }
11466   ExprResult TransConstraint =
11467       getDerived().TransformExpr(Req->getConstraintExpr());
11468   if (TransConstraint.isInvalid())
11469     return nullptr;
11470   return getDerived().RebuildNestedRequirement(TransConstraint.get());
11471 }
11472 
11473 template<typename Derived>
11474 ExprResult
11475 TreeTransform<Derived>::TransformArrayTypeTraitExpr(ArrayTypeTraitExpr *E) {
11476   TypeSourceInfo *T = getDerived().TransformType(E->getQueriedTypeSourceInfo());
11477   if (!T)
11478     return ExprError();
11479 
11480   if (!getDerived().AlwaysRebuild() &&
11481       T == E->getQueriedTypeSourceInfo())
11482     return E;
11483 
11484   ExprResult SubExpr;
11485   {
11486     EnterExpressionEvaluationContext Unevaluated(
11487         SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
11488     SubExpr = getDerived().TransformExpr(E->getDimensionExpression());
11489     if (SubExpr.isInvalid())
11490       return ExprError();
11491 
11492     if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getDimensionExpression())
11493       return E;
11494   }
11495 
11496   return getDerived().RebuildArrayTypeTrait(E->getTrait(), E->getBeginLoc(), T,
11497                                             SubExpr.get(), E->getEndLoc());
11498 }
11499 
11500 template<typename Derived>
11501 ExprResult
11502 TreeTransform<Derived>::TransformExpressionTraitExpr(ExpressionTraitExpr *E) {
11503   ExprResult SubExpr;
11504   {
11505     EnterExpressionEvaluationContext Unevaluated(
11506         SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
11507     SubExpr = getDerived().TransformExpr(E->getQueriedExpression());
11508     if (SubExpr.isInvalid())
11509       return ExprError();
11510 
11511     if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getQueriedExpression())
11512       return E;
11513   }
11514 
11515   return getDerived().RebuildExpressionTrait(E->getTrait(), E->getBeginLoc(),
11516                                              SubExpr.get(), E->getEndLoc());
11517 }
11518 
11519 template <typename Derived>
11520 ExprResult TreeTransform<Derived>::TransformParenDependentScopeDeclRefExpr(
11521     ParenExpr *PE, DependentScopeDeclRefExpr *DRE, bool AddrTaken,
11522     TypeSourceInfo **RecoveryTSI) {
11523   ExprResult NewDRE = getDerived().TransformDependentScopeDeclRefExpr(
11524       DRE, AddrTaken, RecoveryTSI);
11525 
11526   // Propagate both errors and recovered types, which return ExprEmpty.
11527   if (!NewDRE.isUsable())
11528     return NewDRE;
11529 
11530   // We got an expr, wrap it up in parens.
11531   if (!getDerived().AlwaysRebuild() && NewDRE.get() == DRE)
11532     return PE;
11533   return getDerived().RebuildParenExpr(NewDRE.get(), PE->getLParen(),
11534                                        PE->getRParen());
11535 }
11536 
11537 template <typename Derived>
11538 ExprResult TreeTransform<Derived>::TransformDependentScopeDeclRefExpr(
11539     DependentScopeDeclRefExpr *E) {
11540   return TransformDependentScopeDeclRefExpr(E, /*IsAddressOfOperand=*/false,
11541                                             nullptr);
11542 }
11543 
11544 template<typename Derived>
11545 ExprResult
11546 TreeTransform<Derived>::TransformDependentScopeDeclRefExpr(
11547                                                DependentScopeDeclRefExpr *E,
11548                                                bool IsAddressOfOperand,
11549                                                TypeSourceInfo **RecoveryTSI) {
11550   assert(E->getQualifierLoc());
11551   NestedNameSpecifierLoc QualifierLoc
11552   = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
11553   if (!QualifierLoc)
11554     return ExprError();
11555   SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc();
11556 
11557   // TODO: If this is a conversion-function-id, verify that the
11558   // destination type name (if present) resolves the same way after
11559   // instantiation as it did in the local scope.
11560 
11561   DeclarationNameInfo NameInfo
11562     = getDerived().TransformDeclarationNameInfo(E->getNameInfo());
11563   if (!NameInfo.getName())
11564     return ExprError();
11565 
11566   if (!E->hasExplicitTemplateArgs()) {
11567     if (!getDerived().AlwaysRebuild() &&
11568         QualifierLoc == E->getQualifierLoc() &&
11569         // Note: it is sufficient to compare the Name component of NameInfo:
11570         // if name has not changed, DNLoc has not changed either.
11571         NameInfo.getName() == E->getDeclName())
11572       return E;
11573 
11574     return getDerived().RebuildDependentScopeDeclRefExpr(
11575         QualifierLoc, TemplateKWLoc, NameInfo, /*TemplateArgs=*/nullptr,
11576         IsAddressOfOperand, RecoveryTSI);
11577   }
11578 
11579   TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc());
11580   if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
11581                                               E->getNumTemplateArgs(),
11582                                               TransArgs))
11583     return ExprError();
11584 
11585   return getDerived().RebuildDependentScopeDeclRefExpr(
11586       QualifierLoc, TemplateKWLoc, NameInfo, &TransArgs, IsAddressOfOperand,
11587       RecoveryTSI);
11588 }
11589 
11590 template<typename Derived>
11591 ExprResult
11592 TreeTransform<Derived>::TransformCXXConstructExpr(CXXConstructExpr *E) {
11593   // CXXConstructExprs other than for list-initialization and
11594   // CXXTemporaryObjectExpr are always implicit, so when we have
11595   // a 1-argument construction we just transform that argument.
11596   if ((E->getNumArgs() == 1 ||
11597        (E->getNumArgs() > 1 && getDerived().DropCallArgument(E->getArg(1)))) &&
11598       (!getDerived().DropCallArgument(E->getArg(0))) &&
11599       !E->isListInitialization())
11600     return getDerived().TransformExpr(E->getArg(0));
11601 
11602   TemporaryBase Rebase(*this, /*FIXME*/ E->getBeginLoc(), DeclarationName());
11603 
11604   QualType T = getDerived().TransformType(E->getType());
11605   if (T.isNull())
11606     return ExprError();
11607 
11608   CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>(
11609       getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor()));
11610   if (!Constructor)
11611     return ExprError();
11612 
11613   bool ArgumentChanged = false;
11614   SmallVector<Expr*, 8> Args;
11615   {
11616     EnterExpressionEvaluationContext Context(
11617         getSema(), EnterExpressionEvaluationContext::InitList,
11618         E->isListInitialization());
11619     if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
11620                                     &ArgumentChanged))
11621       return ExprError();
11622   }
11623 
11624   if (!getDerived().AlwaysRebuild() &&
11625       T == E->getType() &&
11626       Constructor == E->getConstructor() &&
11627       !ArgumentChanged) {
11628     // Mark the constructor as referenced.
11629     // FIXME: Instantiation-specific
11630     SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor);
11631     return E;
11632   }
11633 
11634   return getDerived().RebuildCXXConstructExpr(
11635       T, /*FIXME:*/ E->getBeginLoc(), Constructor, E->isElidable(), Args,
11636       E->hadMultipleCandidates(), E->isListInitialization(),
11637       E->isStdInitListInitialization(), E->requiresZeroInitialization(),
11638       E->getConstructionKind(), E->getParenOrBraceRange());
11639 }
11640 
11641 template<typename Derived>
11642 ExprResult TreeTransform<Derived>::TransformCXXInheritedCtorInitExpr(
11643     CXXInheritedCtorInitExpr *E) {
11644   QualType T = getDerived().TransformType(E->getType());
11645   if (T.isNull())
11646     return ExprError();
11647 
11648   CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>(
11649       getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor()));
11650   if (!Constructor)
11651     return ExprError();
11652 
11653   if (!getDerived().AlwaysRebuild() &&
11654       T == E->getType() &&
11655       Constructor == E->getConstructor()) {
11656     // Mark the constructor as referenced.
11657     // FIXME: Instantiation-specific
11658     SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor);
11659     return E;
11660   }
11661 
11662   return getDerived().RebuildCXXInheritedCtorInitExpr(
11663       T, E->getLocation(), Constructor,
11664       E->constructsVBase(), E->inheritedFromVBase());
11665 }
11666 
11667 /// Transform a C++ temporary-binding expression.
11668 ///
11669 /// Since CXXBindTemporaryExpr nodes are implicitly generated, we just
11670 /// transform the subexpression and return that.
11671 template<typename Derived>
11672 ExprResult
11673 TreeTransform<Derived>::TransformCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) {
11674   return getDerived().TransformExpr(E->getSubExpr());
11675 }
11676 
11677 /// Transform a C++ expression that contains cleanups that should
11678 /// be run after the expression is evaluated.
11679 ///
11680 /// Since ExprWithCleanups nodes are implicitly generated, we
11681 /// just transform the subexpression and return that.
11682 template<typename Derived>
11683 ExprResult
11684 TreeTransform<Derived>::TransformExprWithCleanups(ExprWithCleanups *E) {
11685   return getDerived().TransformExpr(E->getSubExpr());
11686 }
11687 
11688 template<typename Derived>
11689 ExprResult
11690 TreeTransform<Derived>::TransformCXXTemporaryObjectExpr(
11691                                                     CXXTemporaryObjectExpr *E) {
11692   TypeSourceInfo *T =
11693       getDerived().TransformTypeWithDeducedTST(E->getTypeSourceInfo());
11694   if (!T)
11695     return ExprError();
11696 
11697   CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>(
11698       getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor()));
11699   if (!Constructor)
11700     return ExprError();
11701 
11702   bool ArgumentChanged = false;
11703   SmallVector<Expr*, 8> Args;
11704   Args.reserve(E->getNumArgs());
11705   {
11706     EnterExpressionEvaluationContext Context(
11707         getSema(), EnterExpressionEvaluationContext::InitList,
11708         E->isListInitialization());
11709     if (TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
11710                        &ArgumentChanged))
11711       return ExprError();
11712   }
11713 
11714   if (!getDerived().AlwaysRebuild() &&
11715       T == E->getTypeSourceInfo() &&
11716       Constructor == E->getConstructor() &&
11717       !ArgumentChanged) {
11718     // FIXME: Instantiation-specific
11719     SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor);
11720     return SemaRef.MaybeBindToTemporary(E);
11721   }
11722 
11723   // FIXME: We should just pass E->isListInitialization(), but we're not
11724   // prepared to handle list-initialization without a child InitListExpr.
11725   SourceLocation LParenLoc = T->getTypeLoc().getEndLoc();
11726   return getDerived().RebuildCXXTemporaryObjectExpr(
11727       T, LParenLoc, Args, E->getEndLoc(),
11728       /*ListInitialization=*/LParenLoc.isInvalid());
11729 }
11730 
11731 template<typename Derived>
11732 ExprResult
11733 TreeTransform<Derived>::TransformLambdaExpr(LambdaExpr *E) {
11734   // Transform any init-capture expressions before entering the scope of the
11735   // lambda body, because they are not semantically within that scope.
11736   typedef std::pair<ExprResult, QualType> InitCaptureInfoTy;
11737   struct TransformedInitCapture {
11738     // The location of the ... if the result is retaining a pack expansion.
11739     SourceLocation EllipsisLoc;
11740     // Zero or more expansions of the init-capture.
11741     SmallVector<InitCaptureInfoTy, 4> Expansions;
11742   };
11743   SmallVector<TransformedInitCapture, 4> InitCaptures;
11744   InitCaptures.resize(E->explicit_capture_end() - E->explicit_capture_begin());
11745   for (LambdaExpr::capture_iterator C = E->capture_begin(),
11746                                     CEnd = E->capture_end();
11747        C != CEnd; ++C) {
11748     if (!E->isInitCapture(C))
11749       continue;
11750 
11751     TransformedInitCapture &Result = InitCaptures[C - E->capture_begin()];
11752     VarDecl *OldVD = C->getCapturedVar();
11753 
11754     auto SubstInitCapture = [&](SourceLocation EllipsisLoc,
11755                                 Optional<unsigned> NumExpansions) {
11756       ExprResult NewExprInitResult = getDerived().TransformInitializer(
11757           OldVD->getInit(), OldVD->getInitStyle() == VarDecl::CallInit);
11758 
11759       if (NewExprInitResult.isInvalid()) {
11760         Result.Expansions.push_back(InitCaptureInfoTy(ExprError(), QualType()));
11761         return;
11762       }
11763       Expr *NewExprInit = NewExprInitResult.get();
11764 
11765       QualType NewInitCaptureType =
11766           getSema().buildLambdaInitCaptureInitialization(
11767               C->getLocation(), OldVD->getType()->isReferenceType(),
11768               EllipsisLoc, NumExpansions, OldVD->getIdentifier(),
11769               C->getCapturedVar()->getInitStyle() != VarDecl::CInit,
11770               NewExprInit);
11771       Result.Expansions.push_back(
11772           InitCaptureInfoTy(NewExprInit, NewInitCaptureType));
11773     };
11774 
11775     // If this is an init-capture pack, consider expanding the pack now.
11776     if (OldVD->isParameterPack()) {
11777       PackExpansionTypeLoc ExpansionTL = OldVD->getTypeSourceInfo()
11778                                              ->getTypeLoc()
11779                                              .castAs<PackExpansionTypeLoc>();
11780       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
11781       SemaRef.collectUnexpandedParameterPacks(OldVD->getInit(), Unexpanded);
11782 
11783       // Determine whether the set of unexpanded parameter packs can and should
11784       // be expanded.
11785       bool Expand = true;
11786       bool RetainExpansion = false;
11787       Optional<unsigned> OrigNumExpansions =
11788           ExpansionTL.getTypePtr()->getNumExpansions();
11789       Optional<unsigned> NumExpansions = OrigNumExpansions;
11790       if (getDerived().TryExpandParameterPacks(
11791               ExpansionTL.getEllipsisLoc(),
11792               OldVD->getInit()->getSourceRange(), Unexpanded, Expand,
11793               RetainExpansion, NumExpansions))
11794         return ExprError();
11795       if (Expand) {
11796         for (unsigned I = 0; I != *NumExpansions; ++I) {
11797           Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
11798           SubstInitCapture(SourceLocation(), None);
11799         }
11800       }
11801       if (!Expand || RetainExpansion) {
11802         ForgetPartiallySubstitutedPackRAII Forget(getDerived());
11803         SubstInitCapture(ExpansionTL.getEllipsisLoc(), NumExpansions);
11804         Result.EllipsisLoc = ExpansionTL.getEllipsisLoc();
11805       }
11806     } else {
11807       SubstInitCapture(SourceLocation(), None);
11808     }
11809   }
11810 
11811   LambdaScopeInfo *LSI = getSema().PushLambdaScope();
11812   Sema::FunctionScopeRAII FuncScopeCleanup(getSema());
11813 
11814   // Transform the template parameters, and add them to the current
11815   // instantiation scope. The null case is handled correctly.
11816   auto TPL = getDerived().TransformTemplateParameterList(
11817       E->getTemplateParameterList());
11818   LSI->GLTemplateParameterList = TPL;
11819 
11820   // Transform the type of the original lambda's call operator.
11821   // The transformation MUST be done in the CurrentInstantiationScope since
11822   // it introduces a mapping of the original to the newly created
11823   // transformed parameters.
11824   TypeSourceInfo *NewCallOpTSI = nullptr;
11825   {
11826     TypeSourceInfo *OldCallOpTSI = E->getCallOperator()->getTypeSourceInfo();
11827     FunctionProtoTypeLoc OldCallOpFPTL =
11828         OldCallOpTSI->getTypeLoc().getAs<FunctionProtoTypeLoc>();
11829 
11830     TypeLocBuilder NewCallOpTLBuilder;
11831     SmallVector<QualType, 4> ExceptionStorage;
11832     TreeTransform *This = this; // Work around gcc.gnu.org/PR56135.
11833     QualType NewCallOpType = TransformFunctionProtoType(
11834         NewCallOpTLBuilder, OldCallOpFPTL, nullptr, Qualifiers(),
11835         [&](FunctionProtoType::ExceptionSpecInfo &ESI, bool &Changed) {
11836           return This->TransformExceptionSpec(OldCallOpFPTL.getBeginLoc(), ESI,
11837                                               ExceptionStorage, Changed);
11838         });
11839     if (NewCallOpType.isNull())
11840       return ExprError();
11841     NewCallOpTSI = NewCallOpTLBuilder.getTypeSourceInfo(getSema().Context,
11842                                                         NewCallOpType);
11843   }
11844 
11845   // Transform the trailing requires clause
11846   ExprResult NewTrailingRequiresClause;
11847   if (Expr *TRC = E->getCallOperator()->getTrailingRequiresClause())
11848     // FIXME: Concepts: Substitution into requires clause should only happen
11849     //                  when checking satisfaction.
11850     NewTrailingRequiresClause = getDerived().TransformExpr(TRC);
11851 
11852   // Create the local class that will describe the lambda.
11853   CXXRecordDecl *OldClass = E->getLambdaClass();
11854   CXXRecordDecl *Class
11855     = getSema().createLambdaClosureType(E->getIntroducerRange(),
11856                                         NewCallOpTSI,
11857                                         /*KnownDependent=*/false,
11858                                         E->getCaptureDefault());
11859   getDerived().transformedLocalDecl(OldClass, {Class});
11860 
11861   Optional<std::tuple<unsigned, bool, Decl *>> Mangling;
11862   if (getDerived().ReplacingOriginal())
11863     Mangling = std::make_tuple(OldClass->getLambdaManglingNumber(),
11864                                OldClass->hasKnownLambdaInternalLinkage(),
11865                                OldClass->getLambdaContextDecl());
11866 
11867   // Build the call operator.
11868   CXXMethodDecl *NewCallOperator = getSema().startLambdaDefinition(
11869       Class, E->getIntroducerRange(), NewCallOpTSI,
11870       E->getCallOperator()->getEndLoc(),
11871       NewCallOpTSI->getTypeLoc().castAs<FunctionProtoTypeLoc>().getParams(),
11872       E->getCallOperator()->getConstexprKind(),
11873       NewTrailingRequiresClause.get());
11874 
11875   LSI->CallOperator = NewCallOperator;
11876 
11877   for (unsigned I = 0, NumParams = NewCallOperator->getNumParams();
11878        I != NumParams; ++I) {
11879     auto *P = NewCallOperator->getParamDecl(I);
11880     if (P->hasUninstantiatedDefaultArg()) {
11881       EnterExpressionEvaluationContext Eval(
11882           getSema(),
11883           Sema::ExpressionEvaluationContext::PotentiallyEvaluatedIfUsed, P);
11884       ExprResult R = getDerived().TransformExpr(
11885           E->getCallOperator()->getParamDecl(I)->getDefaultArg());
11886       P->setDefaultArg(R.get());
11887     }
11888   }
11889 
11890   getDerived().transformAttrs(E->getCallOperator(), NewCallOperator);
11891   getDerived().transformedLocalDecl(E->getCallOperator(), {NewCallOperator});
11892 
11893   // Number the lambda for linkage purposes if necessary.
11894   getSema().handleLambdaNumbering(Class, NewCallOperator, Mangling);
11895 
11896   // Introduce the context of the call operator.
11897   Sema::ContextRAII SavedContext(getSema(), NewCallOperator,
11898                                  /*NewThisContext*/false);
11899 
11900   // Enter the scope of the lambda.
11901   getSema().buildLambdaScope(LSI, NewCallOperator,
11902                              E->getIntroducerRange(),
11903                              E->getCaptureDefault(),
11904                              E->getCaptureDefaultLoc(),
11905                              E->hasExplicitParameters(),
11906                              E->hasExplicitResultType(),
11907                              E->isMutable());
11908 
11909   bool Invalid = false;
11910 
11911   // Transform captures.
11912   for (LambdaExpr::capture_iterator C = E->capture_begin(),
11913                                  CEnd = E->capture_end();
11914        C != CEnd; ++C) {
11915     // When we hit the first implicit capture, tell Sema that we've finished
11916     // the list of explicit captures.
11917     if (C->isImplicit())
11918       break;
11919 
11920     // Capturing 'this' is trivial.
11921     if (C->capturesThis()) {
11922       getSema().CheckCXXThisCapture(C->getLocation(), C->isExplicit(),
11923                                     /*BuildAndDiagnose*/ true, nullptr,
11924                                     C->getCaptureKind() == LCK_StarThis);
11925       continue;
11926     }
11927     // Captured expression will be recaptured during captured variables
11928     // rebuilding.
11929     if (C->capturesVLAType())
11930       continue;
11931 
11932     // Rebuild init-captures, including the implied field declaration.
11933     if (E->isInitCapture(C)) {
11934       TransformedInitCapture &NewC = InitCaptures[C - E->capture_begin()];
11935 
11936       VarDecl *OldVD = C->getCapturedVar();
11937       llvm::SmallVector<Decl*, 4> NewVDs;
11938 
11939       for (InitCaptureInfoTy &Info : NewC.Expansions) {
11940         ExprResult Init = Info.first;
11941         QualType InitQualType = Info.second;
11942         if (Init.isInvalid() || InitQualType.isNull()) {
11943           Invalid = true;
11944           break;
11945         }
11946         VarDecl *NewVD = getSema().createLambdaInitCaptureVarDecl(
11947             OldVD->getLocation(), InitQualType, NewC.EllipsisLoc,
11948             OldVD->getIdentifier(), OldVD->getInitStyle(), Init.get());
11949         if (!NewVD) {
11950           Invalid = true;
11951           break;
11952         }
11953         NewVDs.push_back(NewVD);
11954         getSema().addInitCapture(LSI, NewVD);
11955       }
11956 
11957       if (Invalid)
11958         break;
11959 
11960       getDerived().transformedLocalDecl(OldVD, NewVDs);
11961       continue;
11962     }
11963 
11964     assert(C->capturesVariable() && "unexpected kind of lambda capture");
11965 
11966     // Determine the capture kind for Sema.
11967     Sema::TryCaptureKind Kind
11968       = C->isImplicit()? Sema::TryCapture_Implicit
11969                        : C->getCaptureKind() == LCK_ByCopy
11970                            ? Sema::TryCapture_ExplicitByVal
11971                            : Sema::TryCapture_ExplicitByRef;
11972     SourceLocation EllipsisLoc;
11973     if (C->isPackExpansion()) {
11974       UnexpandedParameterPack Unexpanded(C->getCapturedVar(), C->getLocation());
11975       bool ShouldExpand = false;
11976       bool RetainExpansion = false;
11977       Optional<unsigned> NumExpansions;
11978       if (getDerived().TryExpandParameterPacks(C->getEllipsisLoc(),
11979                                                C->getLocation(),
11980                                                Unexpanded,
11981                                                ShouldExpand, RetainExpansion,
11982                                                NumExpansions)) {
11983         Invalid = true;
11984         continue;
11985       }
11986 
11987       if (ShouldExpand) {
11988         // The transform has determined that we should perform an expansion;
11989         // transform and capture each of the arguments.
11990         // expansion of the pattern. Do so.
11991         VarDecl *Pack = C->getCapturedVar();
11992         for (unsigned I = 0; I != *NumExpansions; ++I) {
11993           Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
11994           VarDecl *CapturedVar
11995             = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(),
11996                                                                Pack));
11997           if (!CapturedVar) {
11998             Invalid = true;
11999             continue;
12000           }
12001 
12002           // Capture the transformed variable.
12003           getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind);
12004         }
12005 
12006         // FIXME: Retain a pack expansion if RetainExpansion is true.
12007 
12008         continue;
12009       }
12010 
12011       EllipsisLoc = C->getEllipsisLoc();
12012     }
12013 
12014     // Transform the captured variable.
12015     VarDecl *CapturedVar
12016       = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(),
12017                                                          C->getCapturedVar()));
12018     if (!CapturedVar || CapturedVar->isInvalidDecl()) {
12019       Invalid = true;
12020       continue;
12021     }
12022 
12023     // Capture the transformed variable.
12024     getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind,
12025                                  EllipsisLoc);
12026   }
12027   getSema().finishLambdaExplicitCaptures(LSI);
12028 
12029   // FIXME: Sema's lambda-building mechanism expects us to push an expression
12030   // evaluation context even if we're not transforming the function body.
12031   getSema().PushExpressionEvaluationContext(
12032       Sema::ExpressionEvaluationContext::PotentiallyEvaluated);
12033 
12034   // Instantiate the body of the lambda expression.
12035   StmtResult Body =
12036       Invalid ? StmtError() : getDerived().TransformLambdaBody(E, E->getBody());
12037 
12038   // ActOnLambda* will pop the function scope for us.
12039   FuncScopeCleanup.disable();
12040 
12041   if (Body.isInvalid()) {
12042     SavedContext.pop();
12043     getSema().ActOnLambdaError(E->getBeginLoc(), /*CurScope=*/nullptr,
12044                                /*IsInstantiation=*/true);
12045     return ExprError();
12046   }
12047 
12048   // Copy the LSI before ActOnFinishFunctionBody removes it.
12049   // FIXME: This is dumb. Store the lambda information somewhere that outlives
12050   // the call operator.
12051   auto LSICopy = *LSI;
12052   getSema().ActOnFinishFunctionBody(NewCallOperator, Body.get(),
12053                                     /*IsInstantiation*/ true);
12054   SavedContext.pop();
12055 
12056   return getSema().BuildLambdaExpr(E->getBeginLoc(), Body.get()->getEndLoc(),
12057                                    &LSICopy);
12058 }
12059 
12060 template<typename Derived>
12061 StmtResult
12062 TreeTransform<Derived>::TransformLambdaBody(LambdaExpr *E, Stmt *S) {
12063   return TransformStmt(S);
12064 }
12065 
12066 template<typename Derived>
12067 StmtResult
12068 TreeTransform<Derived>::SkipLambdaBody(LambdaExpr *E, Stmt *S) {
12069   // Transform captures.
12070   for (LambdaExpr::capture_iterator C = E->capture_begin(),
12071                                  CEnd = E->capture_end();
12072        C != CEnd; ++C) {
12073     // When we hit the first implicit capture, tell Sema that we've finished
12074     // the list of explicit captures.
12075     if (!C->isImplicit())
12076       continue;
12077 
12078     // Capturing 'this' is trivial.
12079     if (C->capturesThis()) {
12080       getSema().CheckCXXThisCapture(C->getLocation(), C->isExplicit(),
12081                                     /*BuildAndDiagnose*/ true, nullptr,
12082                                     C->getCaptureKind() == LCK_StarThis);
12083       continue;
12084     }
12085     // Captured expression will be recaptured during captured variables
12086     // rebuilding.
12087     if (C->capturesVLAType())
12088       continue;
12089 
12090     assert(C->capturesVariable() && "unexpected kind of lambda capture");
12091     assert(!E->isInitCapture(C) && "implicit init-capture?");
12092 
12093     // Transform the captured variable.
12094     VarDecl *CapturedVar = cast_or_null<VarDecl>(
12095         getDerived().TransformDecl(C->getLocation(), C->getCapturedVar()));
12096     if (!CapturedVar || CapturedVar->isInvalidDecl())
12097       return StmtError();
12098 
12099     // Capture the transformed variable.
12100     getSema().tryCaptureVariable(CapturedVar, C->getLocation());
12101   }
12102 
12103   return S;
12104 }
12105 
12106 template<typename Derived>
12107 ExprResult
12108 TreeTransform<Derived>::TransformCXXUnresolvedConstructExpr(
12109                                                   CXXUnresolvedConstructExpr *E) {
12110   TypeSourceInfo *T =
12111       getDerived().TransformTypeWithDeducedTST(E->getTypeSourceInfo());
12112   if (!T)
12113     return ExprError();
12114 
12115   bool ArgumentChanged = false;
12116   SmallVector<Expr*, 8> Args;
12117   Args.reserve(E->arg_size());
12118   {
12119     EnterExpressionEvaluationContext Context(
12120         getSema(), EnterExpressionEvaluationContext::InitList,
12121         E->isListInitialization());
12122     if (getDerived().TransformExprs(E->arg_begin(), E->arg_size(), true, Args,
12123                                     &ArgumentChanged))
12124       return ExprError();
12125   }
12126 
12127   if (!getDerived().AlwaysRebuild() &&
12128       T == E->getTypeSourceInfo() &&
12129       !ArgumentChanged)
12130     return E;
12131 
12132   // FIXME: we're faking the locations of the commas
12133   return getDerived().RebuildCXXUnresolvedConstructExpr(
12134       T, E->getLParenLoc(), Args, E->getRParenLoc(), E->isListInitialization());
12135 }
12136 
12137 template<typename Derived>
12138 ExprResult
12139 TreeTransform<Derived>::TransformCXXDependentScopeMemberExpr(
12140                                              CXXDependentScopeMemberExpr *E) {
12141   // Transform the base of the expression.
12142   ExprResult Base((Expr*) nullptr);
12143   Expr *OldBase;
12144   QualType BaseType;
12145   QualType ObjectType;
12146   if (!E->isImplicitAccess()) {
12147     OldBase = E->getBase();
12148     Base = getDerived().TransformExpr(OldBase);
12149     if (Base.isInvalid())
12150       return ExprError();
12151 
12152     // Start the member reference and compute the object's type.
12153     ParsedType ObjectTy;
12154     bool MayBePseudoDestructor = false;
12155     Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(),
12156                                                 E->getOperatorLoc(),
12157                                       E->isArrow()? tok::arrow : tok::period,
12158                                                 ObjectTy,
12159                                                 MayBePseudoDestructor);
12160     if (Base.isInvalid())
12161       return ExprError();
12162 
12163     ObjectType = ObjectTy.get();
12164     BaseType = ((Expr*) Base.get())->getType();
12165   } else {
12166     OldBase = nullptr;
12167     BaseType = getDerived().TransformType(E->getBaseType());
12168     ObjectType = BaseType->castAs<PointerType>()->getPointeeType();
12169   }
12170 
12171   // Transform the first part of the nested-name-specifier that qualifies
12172   // the member name.
12173   NamedDecl *FirstQualifierInScope
12174     = getDerived().TransformFirstQualifierInScope(
12175                                             E->getFirstQualifierFoundInScope(),
12176                                             E->getQualifierLoc().getBeginLoc());
12177 
12178   NestedNameSpecifierLoc QualifierLoc;
12179   if (E->getQualifier()) {
12180     QualifierLoc
12181       = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc(),
12182                                                      ObjectType,
12183                                                      FirstQualifierInScope);
12184     if (!QualifierLoc)
12185       return ExprError();
12186   }
12187 
12188   SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc();
12189 
12190   // TODO: If this is a conversion-function-id, verify that the
12191   // destination type name (if present) resolves the same way after
12192   // instantiation as it did in the local scope.
12193 
12194   DeclarationNameInfo NameInfo
12195     = getDerived().TransformDeclarationNameInfo(E->getMemberNameInfo());
12196   if (!NameInfo.getName())
12197     return ExprError();
12198 
12199   if (!E->hasExplicitTemplateArgs()) {
12200     // This is a reference to a member without an explicitly-specified
12201     // template argument list. Optimize for this common case.
12202     if (!getDerived().AlwaysRebuild() &&
12203         Base.get() == OldBase &&
12204         BaseType == E->getBaseType() &&
12205         QualifierLoc == E->getQualifierLoc() &&
12206         NameInfo.getName() == E->getMember() &&
12207         FirstQualifierInScope == E->getFirstQualifierFoundInScope())
12208       return E;
12209 
12210     return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(),
12211                                                        BaseType,
12212                                                        E->isArrow(),
12213                                                        E->getOperatorLoc(),
12214                                                        QualifierLoc,
12215                                                        TemplateKWLoc,
12216                                                        FirstQualifierInScope,
12217                                                        NameInfo,
12218                                                        /*TemplateArgs*/nullptr);
12219   }
12220 
12221   TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc());
12222   if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
12223                                               E->getNumTemplateArgs(),
12224                                               TransArgs))
12225     return ExprError();
12226 
12227   return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(),
12228                                                      BaseType,
12229                                                      E->isArrow(),
12230                                                      E->getOperatorLoc(),
12231                                                      QualifierLoc,
12232                                                      TemplateKWLoc,
12233                                                      FirstQualifierInScope,
12234                                                      NameInfo,
12235                                                      &TransArgs);
12236 }
12237 
12238 template<typename Derived>
12239 ExprResult
12240 TreeTransform<Derived>::TransformUnresolvedMemberExpr(UnresolvedMemberExpr *Old) {
12241   // Transform the base of the expression.
12242   ExprResult Base((Expr*) nullptr);
12243   QualType BaseType;
12244   if (!Old->isImplicitAccess()) {
12245     Base = getDerived().TransformExpr(Old->getBase());
12246     if (Base.isInvalid())
12247       return ExprError();
12248     Base = getSema().PerformMemberExprBaseConversion(Base.get(),
12249                                                      Old->isArrow());
12250     if (Base.isInvalid())
12251       return ExprError();
12252     BaseType = Base.get()->getType();
12253   } else {
12254     BaseType = getDerived().TransformType(Old->getBaseType());
12255   }
12256 
12257   NestedNameSpecifierLoc QualifierLoc;
12258   if (Old->getQualifierLoc()) {
12259     QualifierLoc
12260     = getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc());
12261     if (!QualifierLoc)
12262       return ExprError();
12263   }
12264 
12265   SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc();
12266 
12267   LookupResult R(SemaRef, Old->getMemberNameInfo(),
12268                  Sema::LookupOrdinaryName);
12269 
12270   // Transform the declaration set.
12271   if (TransformOverloadExprDecls(Old, /*RequiresADL*/false, R))
12272     return ExprError();
12273 
12274   // Determine the naming class.
12275   if (Old->getNamingClass()) {
12276     CXXRecordDecl *NamingClass
12277       = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl(
12278                                                           Old->getMemberLoc(),
12279                                                         Old->getNamingClass()));
12280     if (!NamingClass)
12281       return ExprError();
12282 
12283     R.setNamingClass(NamingClass);
12284   }
12285 
12286   TemplateArgumentListInfo TransArgs;
12287   if (Old->hasExplicitTemplateArgs()) {
12288     TransArgs.setLAngleLoc(Old->getLAngleLoc());
12289     TransArgs.setRAngleLoc(Old->getRAngleLoc());
12290     if (getDerived().TransformTemplateArguments(Old->getTemplateArgs(),
12291                                                 Old->getNumTemplateArgs(),
12292                                                 TransArgs))
12293       return ExprError();
12294   }
12295 
12296   // FIXME: to do this check properly, we will need to preserve the
12297   // first-qualifier-in-scope here, just in case we had a dependent
12298   // base (and therefore couldn't do the check) and a
12299   // nested-name-qualifier (and therefore could do the lookup).
12300   NamedDecl *FirstQualifierInScope = nullptr;
12301 
12302   return getDerived().RebuildUnresolvedMemberExpr(Base.get(),
12303                                                   BaseType,
12304                                                   Old->getOperatorLoc(),
12305                                                   Old->isArrow(),
12306                                                   QualifierLoc,
12307                                                   TemplateKWLoc,
12308                                                   FirstQualifierInScope,
12309                                                   R,
12310                                               (Old->hasExplicitTemplateArgs()
12311                                                   ? &TransArgs : nullptr));
12312 }
12313 
12314 template<typename Derived>
12315 ExprResult
12316 TreeTransform<Derived>::TransformCXXNoexceptExpr(CXXNoexceptExpr *E) {
12317   EnterExpressionEvaluationContext Unevaluated(
12318       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
12319   ExprResult SubExpr = getDerived().TransformExpr(E->getOperand());
12320   if (SubExpr.isInvalid())
12321     return ExprError();
12322 
12323   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getOperand())
12324     return E;
12325 
12326   return getDerived().RebuildCXXNoexceptExpr(E->getSourceRange(),SubExpr.get());
12327 }
12328 
12329 template<typename Derived>
12330 ExprResult
12331 TreeTransform<Derived>::TransformPackExpansionExpr(PackExpansionExpr *E) {
12332   ExprResult Pattern = getDerived().TransformExpr(E->getPattern());
12333   if (Pattern.isInvalid())
12334     return ExprError();
12335 
12336   if (!getDerived().AlwaysRebuild() && Pattern.get() == E->getPattern())
12337     return E;
12338 
12339   return getDerived().RebuildPackExpansion(Pattern.get(), E->getEllipsisLoc(),
12340                                            E->getNumExpansions());
12341 }
12342 
12343 template<typename Derived>
12344 ExprResult
12345 TreeTransform<Derived>::TransformSizeOfPackExpr(SizeOfPackExpr *E) {
12346   // If E is not value-dependent, then nothing will change when we transform it.
12347   // Note: This is an instantiation-centric view.
12348   if (!E->isValueDependent())
12349     return E;
12350 
12351   EnterExpressionEvaluationContext Unevaluated(
12352       getSema(), Sema::ExpressionEvaluationContext::Unevaluated);
12353 
12354   ArrayRef<TemplateArgument> PackArgs;
12355   TemplateArgument ArgStorage;
12356 
12357   // Find the argument list to transform.
12358   if (E->isPartiallySubstituted()) {
12359     PackArgs = E->getPartialArguments();
12360   } else if (E->isValueDependent()) {
12361     UnexpandedParameterPack Unexpanded(E->getPack(), E->getPackLoc());
12362     bool ShouldExpand = false;
12363     bool RetainExpansion = false;
12364     Optional<unsigned> NumExpansions;
12365     if (getDerived().TryExpandParameterPacks(E->getOperatorLoc(), E->getPackLoc(),
12366                                              Unexpanded,
12367                                              ShouldExpand, RetainExpansion,
12368                                              NumExpansions))
12369       return ExprError();
12370 
12371     // If we need to expand the pack, build a template argument from it and
12372     // expand that.
12373     if (ShouldExpand) {
12374       auto *Pack = E->getPack();
12375       if (auto *TTPD = dyn_cast<TemplateTypeParmDecl>(Pack)) {
12376         ArgStorage = getSema().Context.getPackExpansionType(
12377             getSema().Context.getTypeDeclType(TTPD), None);
12378       } else if (auto *TTPD = dyn_cast<TemplateTemplateParmDecl>(Pack)) {
12379         ArgStorage = TemplateArgument(TemplateName(TTPD), None);
12380       } else {
12381         auto *VD = cast<ValueDecl>(Pack);
12382         ExprResult DRE = getSema().BuildDeclRefExpr(
12383             VD, VD->getType().getNonLValueExprType(getSema().Context),
12384             VD->getType()->isReferenceType() ? VK_LValue : VK_RValue,
12385             E->getPackLoc());
12386         if (DRE.isInvalid())
12387           return ExprError();
12388         ArgStorage = new (getSema().Context) PackExpansionExpr(
12389             getSema().Context.DependentTy, DRE.get(), E->getPackLoc(), None);
12390       }
12391       PackArgs = ArgStorage;
12392     }
12393   }
12394 
12395   // If we're not expanding the pack, just transform the decl.
12396   if (!PackArgs.size()) {
12397     auto *Pack = cast_or_null<NamedDecl>(
12398         getDerived().TransformDecl(E->getPackLoc(), E->getPack()));
12399     if (!Pack)
12400       return ExprError();
12401     return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), Pack,
12402                                               E->getPackLoc(),
12403                                               E->getRParenLoc(), None, None);
12404   }
12405 
12406   // Try to compute the result without performing a partial substitution.
12407   Optional<unsigned> Result = 0;
12408   for (const TemplateArgument &Arg : PackArgs) {
12409     if (!Arg.isPackExpansion()) {
12410       Result = *Result + 1;
12411       continue;
12412     }
12413 
12414     TemplateArgumentLoc ArgLoc;
12415     InventTemplateArgumentLoc(Arg, ArgLoc);
12416 
12417     // Find the pattern of the pack expansion.
12418     SourceLocation Ellipsis;
12419     Optional<unsigned> OrigNumExpansions;
12420     TemplateArgumentLoc Pattern =
12421         getSema().getTemplateArgumentPackExpansionPattern(ArgLoc, Ellipsis,
12422                                                           OrigNumExpansions);
12423 
12424     // Substitute under the pack expansion. Do not expand the pack (yet).
12425     TemplateArgumentLoc OutPattern;
12426     Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
12427     if (getDerived().TransformTemplateArgument(Pattern, OutPattern,
12428                                                /*Uneval*/ true))
12429       return true;
12430 
12431     // See if we can determine the number of arguments from the result.
12432     Optional<unsigned> NumExpansions =
12433         getSema().getFullyPackExpandedSize(OutPattern.getArgument());
12434     if (!NumExpansions) {
12435       // No: we must be in an alias template expansion, and we're going to need
12436       // to actually expand the packs.
12437       Result = None;
12438       break;
12439     }
12440 
12441     Result = *Result + *NumExpansions;
12442   }
12443 
12444   // Common case: we could determine the number of expansions without
12445   // substituting.
12446   if (Result)
12447     return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(),
12448                                               E->getPackLoc(),
12449                                               E->getRParenLoc(), *Result, None);
12450 
12451   TemplateArgumentListInfo TransformedPackArgs(E->getPackLoc(),
12452                                                E->getPackLoc());
12453   {
12454     TemporaryBase Rebase(*this, E->getPackLoc(), getBaseEntity());
12455     typedef TemplateArgumentLocInventIterator<
12456         Derived, const TemplateArgument*> PackLocIterator;
12457     if (TransformTemplateArguments(PackLocIterator(*this, PackArgs.begin()),
12458                                    PackLocIterator(*this, PackArgs.end()),
12459                                    TransformedPackArgs, /*Uneval*/true))
12460       return ExprError();
12461   }
12462 
12463   // Check whether we managed to fully-expand the pack.
12464   // FIXME: Is it possible for us to do so and not hit the early exit path?
12465   SmallVector<TemplateArgument, 8> Args;
12466   bool PartialSubstitution = false;
12467   for (auto &Loc : TransformedPackArgs.arguments()) {
12468     Args.push_back(Loc.getArgument());
12469     if (Loc.getArgument().isPackExpansion())
12470       PartialSubstitution = true;
12471   }
12472 
12473   if (PartialSubstitution)
12474     return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(),
12475                                               E->getPackLoc(),
12476                                               E->getRParenLoc(), None, Args);
12477 
12478   return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(),
12479                                             E->getPackLoc(), E->getRParenLoc(),
12480                                             Args.size(), None);
12481 }
12482 
12483 template<typename Derived>
12484 ExprResult
12485 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmPackExpr(
12486                                           SubstNonTypeTemplateParmPackExpr *E) {
12487   // Default behavior is to do nothing with this transformation.
12488   return E;
12489 }
12490 
12491 template<typename Derived>
12492 ExprResult
12493 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmExpr(
12494                                           SubstNonTypeTemplateParmExpr *E) {
12495   // Default behavior is to do nothing with this transformation.
12496   return E;
12497 }
12498 
12499 template<typename Derived>
12500 ExprResult
12501 TreeTransform<Derived>::TransformFunctionParmPackExpr(FunctionParmPackExpr *E) {
12502   // Default behavior is to do nothing with this transformation.
12503   return E;
12504 }
12505 
12506 template<typename Derived>
12507 ExprResult
12508 TreeTransform<Derived>::TransformMaterializeTemporaryExpr(
12509                                                   MaterializeTemporaryExpr *E) {
12510   return getDerived().TransformExpr(E->getSubExpr());
12511 }
12512 
12513 template<typename Derived>
12514 ExprResult
12515 TreeTransform<Derived>::TransformCXXFoldExpr(CXXFoldExpr *E) {
12516   Expr *Pattern = E->getPattern();
12517 
12518   SmallVector<UnexpandedParameterPack, 2> Unexpanded;
12519   getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
12520   assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
12521 
12522   // Determine whether the set of unexpanded parameter packs can and should
12523   // be expanded.
12524   bool Expand = true;
12525   bool RetainExpansion = false;
12526   Optional<unsigned> OrigNumExpansions = E->getNumExpansions(),
12527                      NumExpansions = OrigNumExpansions;
12528   if (getDerived().TryExpandParameterPacks(E->getEllipsisLoc(),
12529                                            Pattern->getSourceRange(),
12530                                            Unexpanded,
12531                                            Expand, RetainExpansion,
12532                                            NumExpansions))
12533     return true;
12534 
12535   if (!Expand) {
12536     // Do not expand any packs here, just transform and rebuild a fold
12537     // expression.
12538     Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
12539 
12540     ExprResult LHS =
12541         E->getLHS() ? getDerived().TransformExpr(E->getLHS()) : ExprResult();
12542     if (LHS.isInvalid())
12543       return true;
12544 
12545     ExprResult RHS =
12546         E->getRHS() ? getDerived().TransformExpr(E->getRHS()) : ExprResult();
12547     if (RHS.isInvalid())
12548       return true;
12549 
12550     if (!getDerived().AlwaysRebuild() &&
12551         LHS.get() == E->getLHS() && RHS.get() == E->getRHS())
12552       return E;
12553 
12554     return getDerived().RebuildCXXFoldExpr(
12555         E->getBeginLoc(), LHS.get(), E->getOperator(), E->getEllipsisLoc(),
12556         RHS.get(), E->getEndLoc(), NumExpansions);
12557   }
12558 
12559   // The transform has determined that we should perform an elementwise
12560   // expansion of the pattern. Do so.
12561   ExprResult Result = getDerived().TransformExpr(E->getInit());
12562   if (Result.isInvalid())
12563     return true;
12564   bool LeftFold = E->isLeftFold();
12565 
12566   // If we're retaining an expansion for a right fold, it is the innermost
12567   // component and takes the init (if any).
12568   if (!LeftFold && RetainExpansion) {
12569     ForgetPartiallySubstitutedPackRAII Forget(getDerived());
12570 
12571     ExprResult Out = getDerived().TransformExpr(Pattern);
12572     if (Out.isInvalid())
12573       return true;
12574 
12575     Result = getDerived().RebuildCXXFoldExpr(
12576         E->getBeginLoc(), Out.get(), E->getOperator(), E->getEllipsisLoc(),
12577         Result.get(), E->getEndLoc(), OrigNumExpansions);
12578     if (Result.isInvalid())
12579       return true;
12580   }
12581 
12582   for (unsigned I = 0; I != *NumExpansions; ++I) {
12583     Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(
12584         getSema(), LeftFold ? I : *NumExpansions - I - 1);
12585     ExprResult Out = getDerived().TransformExpr(Pattern);
12586     if (Out.isInvalid())
12587       return true;
12588 
12589     if (Out.get()->containsUnexpandedParameterPack()) {
12590       // We still have a pack; retain a pack expansion for this slice.
12591       Result = getDerived().RebuildCXXFoldExpr(
12592           E->getBeginLoc(), LeftFold ? Result.get() : Out.get(),
12593           E->getOperator(), E->getEllipsisLoc(),
12594           LeftFold ? Out.get() : Result.get(), E->getEndLoc(),
12595           OrigNumExpansions);
12596     } else if (Result.isUsable()) {
12597       // We've got down to a single element; build a binary operator.
12598       Result = getDerived().RebuildBinaryOperator(
12599           E->getEllipsisLoc(), E->getOperator(),
12600           LeftFold ? Result.get() : Out.get(),
12601           LeftFold ? Out.get() : Result.get());
12602     } else
12603       Result = Out;
12604 
12605     if (Result.isInvalid())
12606       return true;
12607   }
12608 
12609   // If we're retaining an expansion for a left fold, it is the outermost
12610   // component and takes the complete expansion so far as its init (if any).
12611   if (LeftFold && RetainExpansion) {
12612     ForgetPartiallySubstitutedPackRAII Forget(getDerived());
12613 
12614     ExprResult Out = getDerived().TransformExpr(Pattern);
12615     if (Out.isInvalid())
12616       return true;
12617 
12618     Result = getDerived().RebuildCXXFoldExpr(
12619         E->getBeginLoc(), Result.get(), E->getOperator(), E->getEllipsisLoc(),
12620         Out.get(), E->getEndLoc(), OrigNumExpansions);
12621     if (Result.isInvalid())
12622       return true;
12623   }
12624 
12625   // If we had no init and an empty pack, and we're not retaining an expansion,
12626   // then produce a fallback value or error.
12627   if (Result.isUnset())
12628     return getDerived().RebuildEmptyCXXFoldExpr(E->getEllipsisLoc(),
12629                                                 E->getOperator());
12630 
12631   return Result;
12632 }
12633 
12634 template<typename Derived>
12635 ExprResult
12636 TreeTransform<Derived>::TransformCXXStdInitializerListExpr(
12637     CXXStdInitializerListExpr *E) {
12638   return getDerived().TransformExpr(E->getSubExpr());
12639 }
12640 
12641 template<typename Derived>
12642 ExprResult
12643 TreeTransform<Derived>::TransformObjCStringLiteral(ObjCStringLiteral *E) {
12644   return SemaRef.MaybeBindToTemporary(E);
12645 }
12646 
12647 template<typename Derived>
12648 ExprResult
12649 TreeTransform<Derived>::TransformObjCBoolLiteralExpr(ObjCBoolLiteralExpr *E) {
12650   return E;
12651 }
12652 
12653 template<typename Derived>
12654 ExprResult
12655 TreeTransform<Derived>::TransformObjCBoxedExpr(ObjCBoxedExpr *E) {
12656   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
12657   if (SubExpr.isInvalid())
12658     return ExprError();
12659 
12660   if (!getDerived().AlwaysRebuild() &&
12661       SubExpr.get() == E->getSubExpr())
12662     return E;
12663 
12664   return getDerived().RebuildObjCBoxedExpr(E->getSourceRange(), SubExpr.get());
12665 }
12666 
12667 template<typename Derived>
12668 ExprResult
12669 TreeTransform<Derived>::TransformObjCArrayLiteral(ObjCArrayLiteral *E) {
12670   // Transform each of the elements.
12671   SmallVector<Expr *, 8> Elements;
12672   bool ArgChanged = false;
12673   if (getDerived().TransformExprs(E->getElements(), E->getNumElements(),
12674                                   /*IsCall=*/false, Elements, &ArgChanged))
12675     return ExprError();
12676 
12677   if (!getDerived().AlwaysRebuild() && !ArgChanged)
12678     return SemaRef.MaybeBindToTemporary(E);
12679 
12680   return getDerived().RebuildObjCArrayLiteral(E->getSourceRange(),
12681                                               Elements.data(),
12682                                               Elements.size());
12683 }
12684 
12685 template<typename Derived>
12686 ExprResult
12687 TreeTransform<Derived>::TransformObjCDictionaryLiteral(
12688                                                     ObjCDictionaryLiteral *E) {
12689   // Transform each of the elements.
12690   SmallVector<ObjCDictionaryElement, 8> Elements;
12691   bool ArgChanged = false;
12692   for (unsigned I = 0, N = E->getNumElements(); I != N; ++I) {
12693     ObjCDictionaryElement OrigElement = E->getKeyValueElement(I);
12694 
12695     if (OrigElement.isPackExpansion()) {
12696       // This key/value element is a pack expansion.
12697       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
12698       getSema().collectUnexpandedParameterPacks(OrigElement.Key, Unexpanded);
12699       getSema().collectUnexpandedParameterPacks(OrigElement.Value, Unexpanded);
12700       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
12701 
12702       // Determine whether the set of unexpanded parameter packs can
12703       // and should be expanded.
12704       bool Expand = true;
12705       bool RetainExpansion = false;
12706       Optional<unsigned> OrigNumExpansions = OrigElement.NumExpansions;
12707       Optional<unsigned> NumExpansions = OrigNumExpansions;
12708       SourceRange PatternRange(OrigElement.Key->getBeginLoc(),
12709                                OrigElement.Value->getEndLoc());
12710       if (getDerived().TryExpandParameterPacks(OrigElement.EllipsisLoc,
12711                                                PatternRange, Unexpanded, Expand,
12712                                                RetainExpansion, NumExpansions))
12713         return ExprError();
12714 
12715       if (!Expand) {
12716         // The transform has determined that we should perform a simple
12717         // transformation on the pack expansion, producing another pack
12718         // expansion.
12719         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
12720         ExprResult Key = getDerived().TransformExpr(OrigElement.Key);
12721         if (Key.isInvalid())
12722           return ExprError();
12723 
12724         if (Key.get() != OrigElement.Key)
12725           ArgChanged = true;
12726 
12727         ExprResult Value = getDerived().TransformExpr(OrigElement.Value);
12728         if (Value.isInvalid())
12729           return ExprError();
12730 
12731         if (Value.get() != OrigElement.Value)
12732           ArgChanged = true;
12733 
12734         ObjCDictionaryElement Expansion = {
12735           Key.get(), Value.get(), OrigElement.EllipsisLoc, NumExpansions
12736         };
12737         Elements.push_back(Expansion);
12738         continue;
12739       }
12740 
12741       // Record right away that the argument was changed.  This needs
12742       // to happen even if the array expands to nothing.
12743       ArgChanged = true;
12744 
12745       // The transform has determined that we should perform an elementwise
12746       // expansion of the pattern. Do so.
12747       for (unsigned I = 0; I != *NumExpansions; ++I) {
12748         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
12749         ExprResult Key = getDerived().TransformExpr(OrigElement.Key);
12750         if (Key.isInvalid())
12751           return ExprError();
12752 
12753         ExprResult Value = getDerived().TransformExpr(OrigElement.Value);
12754         if (Value.isInvalid())
12755           return ExprError();
12756 
12757         ObjCDictionaryElement Element = {
12758           Key.get(), Value.get(), SourceLocation(), NumExpansions
12759         };
12760 
12761         // If any unexpanded parameter packs remain, we still have a
12762         // pack expansion.
12763         // FIXME: Can this really happen?
12764         if (Key.get()->containsUnexpandedParameterPack() ||
12765             Value.get()->containsUnexpandedParameterPack())
12766           Element.EllipsisLoc = OrigElement.EllipsisLoc;
12767 
12768         Elements.push_back(Element);
12769       }
12770 
12771       // FIXME: Retain a pack expansion if RetainExpansion is true.
12772 
12773       // We've finished with this pack expansion.
12774       continue;
12775     }
12776 
12777     // Transform and check key.
12778     ExprResult Key = getDerived().TransformExpr(OrigElement.Key);
12779     if (Key.isInvalid())
12780       return ExprError();
12781 
12782     if (Key.get() != OrigElement.Key)
12783       ArgChanged = true;
12784 
12785     // Transform and check value.
12786     ExprResult Value
12787       = getDerived().TransformExpr(OrigElement.Value);
12788     if (Value.isInvalid())
12789       return ExprError();
12790 
12791     if (Value.get() != OrigElement.Value)
12792       ArgChanged = true;
12793 
12794     ObjCDictionaryElement Element = {
12795       Key.get(), Value.get(), SourceLocation(), None
12796     };
12797     Elements.push_back(Element);
12798   }
12799 
12800   if (!getDerived().AlwaysRebuild() && !ArgChanged)
12801     return SemaRef.MaybeBindToTemporary(E);
12802 
12803   return getDerived().RebuildObjCDictionaryLiteral(E->getSourceRange(),
12804                                                    Elements);
12805 }
12806 
12807 template<typename Derived>
12808 ExprResult
12809 TreeTransform<Derived>::TransformObjCEncodeExpr(ObjCEncodeExpr *E) {
12810   TypeSourceInfo *EncodedTypeInfo
12811     = getDerived().TransformType(E->getEncodedTypeSourceInfo());
12812   if (!EncodedTypeInfo)
12813     return ExprError();
12814 
12815   if (!getDerived().AlwaysRebuild() &&
12816       EncodedTypeInfo == E->getEncodedTypeSourceInfo())
12817     return E;
12818 
12819   return getDerived().RebuildObjCEncodeExpr(E->getAtLoc(),
12820                                             EncodedTypeInfo,
12821                                             E->getRParenLoc());
12822 }
12823 
12824 template<typename Derived>
12825 ExprResult TreeTransform<Derived>::
12826 TransformObjCIndirectCopyRestoreExpr(ObjCIndirectCopyRestoreExpr *E) {
12827   // This is a kind of implicit conversion, and it needs to get dropped
12828   // and recomputed for the same general reasons that ImplicitCastExprs
12829   // do, as well a more specific one: this expression is only valid when
12830   // it appears *immediately* as an argument expression.
12831   return getDerived().TransformExpr(E->getSubExpr());
12832 }
12833 
12834 template<typename Derived>
12835 ExprResult TreeTransform<Derived>::
12836 TransformObjCBridgedCastExpr(ObjCBridgedCastExpr *E) {
12837   TypeSourceInfo *TSInfo
12838     = getDerived().TransformType(E->getTypeInfoAsWritten());
12839   if (!TSInfo)
12840     return ExprError();
12841 
12842   ExprResult Result = getDerived().TransformExpr(E->getSubExpr());
12843   if (Result.isInvalid())
12844     return ExprError();
12845 
12846   if (!getDerived().AlwaysRebuild() &&
12847       TSInfo == E->getTypeInfoAsWritten() &&
12848       Result.get() == E->getSubExpr())
12849     return E;
12850 
12851   return SemaRef.BuildObjCBridgedCast(E->getLParenLoc(), E->getBridgeKind(),
12852                                       E->getBridgeKeywordLoc(), TSInfo,
12853                                       Result.get());
12854 }
12855 
12856 template <typename Derived>
12857 ExprResult TreeTransform<Derived>::TransformObjCAvailabilityCheckExpr(
12858     ObjCAvailabilityCheckExpr *E) {
12859   return E;
12860 }
12861 
12862 template<typename Derived>
12863 ExprResult
12864 TreeTransform<Derived>::TransformObjCMessageExpr(ObjCMessageExpr *E) {
12865   // Transform arguments.
12866   bool ArgChanged = false;
12867   SmallVector<Expr*, 8> Args;
12868   Args.reserve(E->getNumArgs());
12869   if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), false, Args,
12870                                   &ArgChanged))
12871     return ExprError();
12872 
12873   if (E->getReceiverKind() == ObjCMessageExpr::Class) {
12874     // Class message: transform the receiver type.
12875     TypeSourceInfo *ReceiverTypeInfo
12876       = getDerived().TransformType(E->getClassReceiverTypeInfo());
12877     if (!ReceiverTypeInfo)
12878       return ExprError();
12879 
12880     // If nothing changed, just retain the existing message send.
12881     if (!getDerived().AlwaysRebuild() &&
12882         ReceiverTypeInfo == E->getClassReceiverTypeInfo() && !ArgChanged)
12883       return SemaRef.MaybeBindToTemporary(E);
12884 
12885     // Build a new class message send.
12886     SmallVector<SourceLocation, 16> SelLocs;
12887     E->getSelectorLocs(SelLocs);
12888     return getDerived().RebuildObjCMessageExpr(ReceiverTypeInfo,
12889                                                E->getSelector(),
12890                                                SelLocs,
12891                                                E->getMethodDecl(),
12892                                                E->getLeftLoc(),
12893                                                Args,
12894                                                E->getRightLoc());
12895   }
12896   else if (E->getReceiverKind() == ObjCMessageExpr::SuperClass ||
12897            E->getReceiverKind() == ObjCMessageExpr::SuperInstance) {
12898     if (!E->getMethodDecl())
12899       return ExprError();
12900 
12901     // Build a new class message send to 'super'.
12902     SmallVector<SourceLocation, 16> SelLocs;
12903     E->getSelectorLocs(SelLocs);
12904     return getDerived().RebuildObjCMessageExpr(E->getSuperLoc(),
12905                                                E->getSelector(),
12906                                                SelLocs,
12907                                                E->getReceiverType(),
12908                                                E->getMethodDecl(),
12909                                                E->getLeftLoc(),
12910                                                Args,
12911                                                E->getRightLoc());
12912   }
12913 
12914   // Instance message: transform the receiver
12915   assert(E->getReceiverKind() == ObjCMessageExpr::Instance &&
12916          "Only class and instance messages may be instantiated");
12917   ExprResult Receiver
12918     = getDerived().TransformExpr(E->getInstanceReceiver());
12919   if (Receiver.isInvalid())
12920     return ExprError();
12921 
12922   // If nothing changed, just retain the existing message send.
12923   if (!getDerived().AlwaysRebuild() &&
12924       Receiver.get() == E->getInstanceReceiver() && !ArgChanged)
12925     return SemaRef.MaybeBindToTemporary(E);
12926 
12927   // Build a new instance message send.
12928   SmallVector<SourceLocation, 16> SelLocs;
12929   E->getSelectorLocs(SelLocs);
12930   return getDerived().RebuildObjCMessageExpr(Receiver.get(),
12931                                              E->getSelector(),
12932                                              SelLocs,
12933                                              E->getMethodDecl(),
12934                                              E->getLeftLoc(),
12935                                              Args,
12936                                              E->getRightLoc());
12937 }
12938 
12939 template<typename Derived>
12940 ExprResult
12941 TreeTransform<Derived>::TransformObjCSelectorExpr(ObjCSelectorExpr *E) {
12942   return E;
12943 }
12944 
12945 template<typename Derived>
12946 ExprResult
12947 TreeTransform<Derived>::TransformObjCProtocolExpr(ObjCProtocolExpr *E) {
12948   return E;
12949 }
12950 
12951 template<typename Derived>
12952 ExprResult
12953 TreeTransform<Derived>::TransformObjCIvarRefExpr(ObjCIvarRefExpr *E) {
12954   // Transform the base expression.
12955   ExprResult Base = getDerived().TransformExpr(E->getBase());
12956   if (Base.isInvalid())
12957     return ExprError();
12958 
12959   // We don't need to transform the ivar; it will never change.
12960 
12961   // If nothing changed, just retain the existing expression.
12962   if (!getDerived().AlwaysRebuild() &&
12963       Base.get() == E->getBase())
12964     return E;
12965 
12966   return getDerived().RebuildObjCIvarRefExpr(Base.get(), E->getDecl(),
12967                                              E->getLocation(),
12968                                              E->isArrow(), E->isFreeIvar());
12969 }
12970 
12971 template<typename Derived>
12972 ExprResult
12973 TreeTransform<Derived>::TransformObjCPropertyRefExpr(ObjCPropertyRefExpr *E) {
12974   // 'super' and types never change. Property never changes. Just
12975   // retain the existing expression.
12976   if (!E->isObjectReceiver())
12977     return E;
12978 
12979   // Transform the base expression.
12980   ExprResult Base = getDerived().TransformExpr(E->getBase());
12981   if (Base.isInvalid())
12982     return ExprError();
12983 
12984   // We don't need to transform the property; it will never change.
12985 
12986   // If nothing changed, just retain the existing expression.
12987   if (!getDerived().AlwaysRebuild() &&
12988       Base.get() == E->getBase())
12989     return E;
12990 
12991   if (E->isExplicitProperty())
12992     return getDerived().RebuildObjCPropertyRefExpr(Base.get(),
12993                                                    E->getExplicitProperty(),
12994                                                    E->getLocation());
12995 
12996   return getDerived().RebuildObjCPropertyRefExpr(Base.get(),
12997                                                  SemaRef.Context.PseudoObjectTy,
12998                                                  E->getImplicitPropertyGetter(),
12999                                                  E->getImplicitPropertySetter(),
13000                                                  E->getLocation());
13001 }
13002 
13003 template<typename Derived>
13004 ExprResult
13005 TreeTransform<Derived>::TransformObjCSubscriptRefExpr(ObjCSubscriptRefExpr *E) {
13006   // Transform the base expression.
13007   ExprResult Base = getDerived().TransformExpr(E->getBaseExpr());
13008   if (Base.isInvalid())
13009     return ExprError();
13010 
13011   // Transform the key expression.
13012   ExprResult Key = getDerived().TransformExpr(E->getKeyExpr());
13013   if (Key.isInvalid())
13014     return ExprError();
13015 
13016   // If nothing changed, just retain the existing expression.
13017   if (!getDerived().AlwaysRebuild() &&
13018       Key.get() == E->getKeyExpr() && Base.get() == E->getBaseExpr())
13019     return E;
13020 
13021   return getDerived().RebuildObjCSubscriptRefExpr(E->getRBracket(),
13022                                                   Base.get(), Key.get(),
13023                                                   E->getAtIndexMethodDecl(),
13024                                                   E->setAtIndexMethodDecl());
13025 }
13026 
13027 template<typename Derived>
13028 ExprResult
13029 TreeTransform<Derived>::TransformObjCIsaExpr(ObjCIsaExpr *E) {
13030   // Transform the base expression.
13031   ExprResult Base = getDerived().TransformExpr(E->getBase());
13032   if (Base.isInvalid())
13033     return ExprError();
13034 
13035   // If nothing changed, just retain the existing expression.
13036   if (!getDerived().AlwaysRebuild() &&
13037       Base.get() == E->getBase())
13038     return E;
13039 
13040   return getDerived().RebuildObjCIsaExpr(Base.get(), E->getIsaMemberLoc(),
13041                                          E->getOpLoc(),
13042                                          E->isArrow());
13043 }
13044 
13045 template<typename Derived>
13046 ExprResult
13047 TreeTransform<Derived>::TransformShuffleVectorExpr(ShuffleVectorExpr *E) {
13048   bool ArgumentChanged = false;
13049   SmallVector<Expr*, 8> SubExprs;
13050   SubExprs.reserve(E->getNumSubExprs());
13051   if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false,
13052                                   SubExprs, &ArgumentChanged))
13053     return ExprError();
13054 
13055   if (!getDerived().AlwaysRebuild() &&
13056       !ArgumentChanged)
13057     return E;
13058 
13059   return getDerived().RebuildShuffleVectorExpr(E->getBuiltinLoc(),
13060                                                SubExprs,
13061                                                E->getRParenLoc());
13062 }
13063 
13064 template<typename Derived>
13065 ExprResult
13066 TreeTransform<Derived>::TransformConvertVectorExpr(ConvertVectorExpr *E) {
13067   ExprResult SrcExpr = getDerived().TransformExpr(E->getSrcExpr());
13068   if (SrcExpr.isInvalid())
13069     return ExprError();
13070 
13071   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo());
13072   if (!Type)
13073     return ExprError();
13074 
13075   if (!getDerived().AlwaysRebuild() &&
13076       Type == E->getTypeSourceInfo() &&
13077       SrcExpr.get() == E->getSrcExpr())
13078     return E;
13079 
13080   return getDerived().RebuildConvertVectorExpr(E->getBuiltinLoc(),
13081                                                SrcExpr.get(), Type,
13082                                                E->getRParenLoc());
13083 }
13084 
13085 template<typename Derived>
13086 ExprResult
13087 TreeTransform<Derived>::TransformBlockExpr(BlockExpr *E) {
13088   BlockDecl *oldBlock = E->getBlockDecl();
13089 
13090   SemaRef.ActOnBlockStart(E->getCaretLocation(), /*Scope=*/nullptr);
13091   BlockScopeInfo *blockScope = SemaRef.getCurBlock();
13092 
13093   blockScope->TheDecl->setIsVariadic(oldBlock->isVariadic());
13094   blockScope->TheDecl->setBlockMissingReturnType(
13095                          oldBlock->blockMissingReturnType());
13096 
13097   SmallVector<ParmVarDecl*, 4> params;
13098   SmallVector<QualType, 4> paramTypes;
13099 
13100   const FunctionProtoType *exprFunctionType = E->getFunctionType();
13101 
13102   // Parameter substitution.
13103   Sema::ExtParameterInfoBuilder extParamInfos;
13104   if (getDerived().TransformFunctionTypeParams(
13105           E->getCaretLocation(), oldBlock->parameters(), nullptr,
13106           exprFunctionType->getExtParameterInfosOrNull(), paramTypes, &params,
13107           extParamInfos)) {
13108     getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr);
13109     return ExprError();
13110   }
13111 
13112   QualType exprResultType =
13113       getDerived().TransformType(exprFunctionType->getReturnType());
13114 
13115   auto epi = exprFunctionType->getExtProtoInfo();
13116   epi.ExtParameterInfos = extParamInfos.getPointerOrNull(paramTypes.size());
13117 
13118   QualType functionType =
13119     getDerived().RebuildFunctionProtoType(exprResultType, paramTypes, epi);
13120   blockScope->FunctionType = functionType;
13121 
13122   // Set the parameters on the block decl.
13123   if (!params.empty())
13124     blockScope->TheDecl->setParams(params);
13125 
13126   if (!oldBlock->blockMissingReturnType()) {
13127     blockScope->HasImplicitReturnType = false;
13128     blockScope->ReturnType = exprResultType;
13129   }
13130 
13131   // Transform the body
13132   StmtResult body = getDerived().TransformStmt(E->getBody());
13133   if (body.isInvalid()) {
13134     getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr);
13135     return ExprError();
13136   }
13137 
13138 #ifndef NDEBUG
13139   // In builds with assertions, make sure that we captured everything we
13140   // captured before.
13141   if (!SemaRef.getDiagnostics().hasErrorOccurred()) {
13142     for (const auto &I : oldBlock->captures()) {
13143       VarDecl *oldCapture = I.getVariable();
13144 
13145       // Ignore parameter packs.
13146       if (oldCapture->isParameterPack())
13147         continue;
13148 
13149       VarDecl *newCapture =
13150         cast<VarDecl>(getDerived().TransformDecl(E->getCaretLocation(),
13151                                                  oldCapture));
13152       assert(blockScope->CaptureMap.count(newCapture));
13153     }
13154     assert(oldBlock->capturesCXXThis() == blockScope->isCXXThisCaptured());
13155   }
13156 #endif
13157 
13158   return SemaRef.ActOnBlockStmtExpr(E->getCaretLocation(), body.get(),
13159                                     /*Scope=*/nullptr);
13160 }
13161 
13162 template<typename Derived>
13163 ExprResult
13164 TreeTransform<Derived>::TransformAsTypeExpr(AsTypeExpr *E) {
13165   llvm_unreachable("Cannot transform asType expressions yet");
13166 }
13167 
13168 template<typename Derived>
13169 ExprResult
13170 TreeTransform<Derived>::TransformAtomicExpr(AtomicExpr *E) {
13171   bool ArgumentChanged = false;
13172   SmallVector<Expr*, 8> SubExprs;
13173   SubExprs.reserve(E->getNumSubExprs());
13174   if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false,
13175                                   SubExprs, &ArgumentChanged))
13176     return ExprError();
13177 
13178   if (!getDerived().AlwaysRebuild() &&
13179       !ArgumentChanged)
13180     return E;
13181 
13182   return getDerived().RebuildAtomicExpr(E->getBuiltinLoc(), SubExprs,
13183                                         E->getOp(), E->getRParenLoc());
13184 }
13185 
13186 //===----------------------------------------------------------------------===//
13187 // Type reconstruction
13188 //===----------------------------------------------------------------------===//
13189 
13190 template<typename Derived>
13191 QualType TreeTransform<Derived>::RebuildPointerType(QualType PointeeType,
13192                                                     SourceLocation Star) {
13193   return SemaRef.BuildPointerType(PointeeType, Star,
13194                                   getDerived().getBaseEntity());
13195 }
13196 
13197 template<typename Derived>
13198 QualType TreeTransform<Derived>::RebuildBlockPointerType(QualType PointeeType,
13199                                                          SourceLocation Star) {
13200   return SemaRef.BuildBlockPointerType(PointeeType, Star,
13201                                        getDerived().getBaseEntity());
13202 }
13203 
13204 template<typename Derived>
13205 QualType
13206 TreeTransform<Derived>::RebuildReferenceType(QualType ReferentType,
13207                                              bool WrittenAsLValue,
13208                                              SourceLocation Sigil) {
13209   return SemaRef.BuildReferenceType(ReferentType, WrittenAsLValue,
13210                                     Sigil, getDerived().getBaseEntity());
13211 }
13212 
13213 template<typename Derived>
13214 QualType
13215 TreeTransform<Derived>::RebuildMemberPointerType(QualType PointeeType,
13216                                                  QualType ClassType,
13217                                                  SourceLocation Sigil) {
13218   return SemaRef.BuildMemberPointerType(PointeeType, ClassType, Sigil,
13219                                         getDerived().getBaseEntity());
13220 }
13221 
13222 template<typename Derived>
13223 QualType TreeTransform<Derived>::RebuildObjCTypeParamType(
13224            const ObjCTypeParamDecl *Decl,
13225            SourceLocation ProtocolLAngleLoc,
13226            ArrayRef<ObjCProtocolDecl *> Protocols,
13227            ArrayRef<SourceLocation> ProtocolLocs,
13228            SourceLocation ProtocolRAngleLoc) {
13229   return SemaRef.BuildObjCTypeParamType(Decl,
13230                                         ProtocolLAngleLoc, Protocols,
13231                                         ProtocolLocs, ProtocolRAngleLoc,
13232                                         /*FailOnError=*/true);
13233 }
13234 
13235 template<typename Derived>
13236 QualType TreeTransform<Derived>::RebuildObjCObjectType(
13237            QualType BaseType,
13238            SourceLocation Loc,
13239            SourceLocation TypeArgsLAngleLoc,
13240            ArrayRef<TypeSourceInfo *> TypeArgs,
13241            SourceLocation TypeArgsRAngleLoc,
13242            SourceLocation ProtocolLAngleLoc,
13243            ArrayRef<ObjCProtocolDecl *> Protocols,
13244            ArrayRef<SourceLocation> ProtocolLocs,
13245            SourceLocation ProtocolRAngleLoc) {
13246   return SemaRef.BuildObjCObjectType(BaseType, Loc, TypeArgsLAngleLoc,
13247                                      TypeArgs, TypeArgsRAngleLoc,
13248                                      ProtocolLAngleLoc, Protocols, ProtocolLocs,
13249                                      ProtocolRAngleLoc,
13250                                      /*FailOnError=*/true);
13251 }
13252 
13253 template<typename Derived>
13254 QualType TreeTransform<Derived>::RebuildObjCObjectPointerType(
13255            QualType PointeeType,
13256            SourceLocation Star) {
13257   return SemaRef.Context.getObjCObjectPointerType(PointeeType);
13258 }
13259 
13260 template<typename Derived>
13261 QualType
13262 TreeTransform<Derived>::RebuildArrayType(QualType ElementType,
13263                                          ArrayType::ArraySizeModifier SizeMod,
13264                                          const llvm::APInt *Size,
13265                                          Expr *SizeExpr,
13266                                          unsigned IndexTypeQuals,
13267                                          SourceRange BracketsRange) {
13268   if (SizeExpr || !Size)
13269     return SemaRef.BuildArrayType(ElementType, SizeMod, SizeExpr,
13270                                   IndexTypeQuals, BracketsRange,
13271                                   getDerived().getBaseEntity());
13272 
13273   QualType Types[] = {
13274     SemaRef.Context.UnsignedCharTy, SemaRef.Context.UnsignedShortTy,
13275     SemaRef.Context.UnsignedIntTy, SemaRef.Context.UnsignedLongTy,
13276     SemaRef.Context.UnsignedLongLongTy, SemaRef.Context.UnsignedInt128Ty
13277   };
13278   const unsigned NumTypes = llvm::array_lengthof(Types);
13279   QualType SizeType;
13280   for (unsigned I = 0; I != NumTypes; ++I)
13281     if (Size->getBitWidth() == SemaRef.Context.getIntWidth(Types[I])) {
13282       SizeType = Types[I];
13283       break;
13284     }
13285 
13286   // Note that we can return a VariableArrayType here in the case where
13287   // the element type was a dependent VariableArrayType.
13288   IntegerLiteral *ArraySize
13289       = IntegerLiteral::Create(SemaRef.Context, *Size, SizeType,
13290                                /*FIXME*/BracketsRange.getBegin());
13291   return SemaRef.BuildArrayType(ElementType, SizeMod, ArraySize,
13292                                 IndexTypeQuals, BracketsRange,
13293                                 getDerived().getBaseEntity());
13294 }
13295 
13296 template<typename Derived>
13297 QualType
13298 TreeTransform<Derived>::RebuildConstantArrayType(QualType ElementType,
13299                                                  ArrayType::ArraySizeModifier SizeMod,
13300                                                  const llvm::APInt &Size,
13301                                                  Expr *SizeExpr,
13302                                                  unsigned IndexTypeQuals,
13303                                                  SourceRange BracketsRange) {
13304   return getDerived().RebuildArrayType(ElementType, SizeMod, &Size, SizeExpr,
13305                                         IndexTypeQuals, BracketsRange);
13306 }
13307 
13308 template<typename Derived>
13309 QualType
13310 TreeTransform<Derived>::RebuildIncompleteArrayType(QualType ElementType,
13311                                           ArrayType::ArraySizeModifier SizeMod,
13312                                                  unsigned IndexTypeQuals,
13313                                                    SourceRange BracketsRange) {
13314   return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr, nullptr,
13315                                        IndexTypeQuals, BracketsRange);
13316 }
13317 
13318 template<typename Derived>
13319 QualType
13320 TreeTransform<Derived>::RebuildVariableArrayType(QualType ElementType,
13321                                           ArrayType::ArraySizeModifier SizeMod,
13322                                                  Expr *SizeExpr,
13323                                                  unsigned IndexTypeQuals,
13324                                                  SourceRange BracketsRange) {
13325   return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr,
13326                                        SizeExpr,
13327                                        IndexTypeQuals, BracketsRange);
13328 }
13329 
13330 template<typename Derived>
13331 QualType
13332 TreeTransform<Derived>::RebuildDependentSizedArrayType(QualType ElementType,
13333                                           ArrayType::ArraySizeModifier SizeMod,
13334                                                        Expr *SizeExpr,
13335                                                        unsigned IndexTypeQuals,
13336                                                    SourceRange BracketsRange) {
13337   return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr,
13338                                        SizeExpr,
13339                                        IndexTypeQuals, BracketsRange);
13340 }
13341 
13342 template <typename Derived>
13343 QualType TreeTransform<Derived>::RebuildDependentAddressSpaceType(
13344     QualType PointeeType, Expr *AddrSpaceExpr, SourceLocation AttributeLoc) {
13345   return SemaRef.BuildAddressSpaceAttr(PointeeType, AddrSpaceExpr,
13346                                           AttributeLoc);
13347 }
13348 
13349 template <typename Derived>
13350 QualType
13351 TreeTransform<Derived>::RebuildVectorType(QualType ElementType,
13352                                           unsigned NumElements,
13353                                           VectorType::VectorKind VecKind) {
13354   // FIXME: semantic checking!
13355   return SemaRef.Context.getVectorType(ElementType, NumElements, VecKind);
13356 }
13357 
13358 template <typename Derived>
13359 QualType TreeTransform<Derived>::RebuildDependentVectorType(
13360     QualType ElementType, Expr *SizeExpr, SourceLocation AttributeLoc,
13361     VectorType::VectorKind VecKind) {
13362   return SemaRef.BuildVectorType(ElementType, SizeExpr, AttributeLoc);
13363 }
13364 
13365 template<typename Derived>
13366 QualType TreeTransform<Derived>::RebuildExtVectorType(QualType ElementType,
13367                                                       unsigned NumElements,
13368                                                  SourceLocation AttributeLoc) {
13369   llvm::APInt numElements(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy),
13370                           NumElements, true);
13371   IntegerLiteral *VectorSize
13372     = IntegerLiteral::Create(SemaRef.Context, numElements, SemaRef.Context.IntTy,
13373                              AttributeLoc);
13374   return SemaRef.BuildExtVectorType(ElementType, VectorSize, AttributeLoc);
13375 }
13376 
13377 template<typename Derived>
13378 QualType
13379 TreeTransform<Derived>::RebuildDependentSizedExtVectorType(QualType ElementType,
13380                                                            Expr *SizeExpr,
13381                                                   SourceLocation AttributeLoc) {
13382   return SemaRef.BuildExtVectorType(ElementType, SizeExpr, AttributeLoc);
13383 }
13384 
13385 template<typename Derived>
13386 QualType TreeTransform<Derived>::RebuildFunctionProtoType(
13387     QualType T,
13388     MutableArrayRef<QualType> ParamTypes,
13389     const FunctionProtoType::ExtProtoInfo &EPI) {
13390   return SemaRef.BuildFunctionType(T, ParamTypes,
13391                                    getDerived().getBaseLocation(),
13392                                    getDerived().getBaseEntity(),
13393                                    EPI);
13394 }
13395 
13396 template<typename Derived>
13397 QualType TreeTransform<Derived>::RebuildFunctionNoProtoType(QualType T) {
13398   return SemaRef.Context.getFunctionNoProtoType(T);
13399 }
13400 
13401 template<typename Derived>
13402 QualType TreeTransform<Derived>::RebuildUnresolvedUsingType(SourceLocation Loc,
13403                                                             Decl *D) {
13404   assert(D && "no decl found");
13405   if (D->isInvalidDecl()) return QualType();
13406 
13407   // FIXME: Doesn't account for ObjCInterfaceDecl!
13408   TypeDecl *Ty;
13409   if (auto *UPD = dyn_cast<UsingPackDecl>(D)) {
13410     // A valid resolved using typename pack expansion decl can have multiple
13411     // UsingDecls, but they must each have exactly one type, and it must be
13412     // the same type in every case. But we must have at least one expansion!
13413     if (UPD->expansions().empty()) {
13414       getSema().Diag(Loc, diag::err_using_pack_expansion_empty)
13415           << UPD->isCXXClassMember() << UPD;
13416       return QualType();
13417     }
13418 
13419     // We might still have some unresolved types. Try to pick a resolved type
13420     // if we can. The final instantiation will check that the remaining
13421     // unresolved types instantiate to the type we pick.
13422     QualType FallbackT;
13423     QualType T;
13424     for (auto *E : UPD->expansions()) {
13425       QualType ThisT = RebuildUnresolvedUsingType(Loc, E);
13426       if (ThisT.isNull())
13427         continue;
13428       else if (ThisT->getAs<UnresolvedUsingType>())
13429         FallbackT = ThisT;
13430       else if (T.isNull())
13431         T = ThisT;
13432       else
13433         assert(getSema().Context.hasSameType(ThisT, T) &&
13434                "mismatched resolved types in using pack expansion");
13435     }
13436     return T.isNull() ? FallbackT : T;
13437   } else if (auto *Using = dyn_cast<UsingDecl>(D)) {
13438     assert(Using->hasTypename() &&
13439            "UnresolvedUsingTypenameDecl transformed to non-typename using");
13440 
13441     // A valid resolved using typename decl points to exactly one type decl.
13442     assert(++Using->shadow_begin() == Using->shadow_end());
13443     Ty = cast<TypeDecl>((*Using->shadow_begin())->getTargetDecl());
13444   } else {
13445     assert(isa<UnresolvedUsingTypenameDecl>(D) &&
13446            "UnresolvedUsingTypenameDecl transformed to non-using decl");
13447     Ty = cast<UnresolvedUsingTypenameDecl>(D);
13448   }
13449 
13450   return SemaRef.Context.getTypeDeclType(Ty);
13451 }
13452 
13453 template<typename Derived>
13454 QualType TreeTransform<Derived>::RebuildTypeOfExprType(Expr *E,
13455                                                        SourceLocation Loc) {
13456   return SemaRef.BuildTypeofExprType(E, Loc);
13457 }
13458 
13459 template<typename Derived>
13460 QualType TreeTransform<Derived>::RebuildTypeOfType(QualType Underlying) {
13461   return SemaRef.Context.getTypeOfType(Underlying);
13462 }
13463 
13464 template<typename Derived>
13465 QualType TreeTransform<Derived>::RebuildDecltypeType(Expr *E,
13466                                                      SourceLocation Loc) {
13467   return SemaRef.BuildDecltypeType(E, Loc);
13468 }
13469 
13470 template<typename Derived>
13471 QualType TreeTransform<Derived>::RebuildUnaryTransformType(QualType BaseType,
13472                                             UnaryTransformType::UTTKind UKind,
13473                                             SourceLocation Loc) {
13474   return SemaRef.BuildUnaryTransformType(BaseType, UKind, Loc);
13475 }
13476 
13477 template<typename Derived>
13478 QualType TreeTransform<Derived>::RebuildTemplateSpecializationType(
13479                                                       TemplateName Template,
13480                                              SourceLocation TemplateNameLoc,
13481                                      TemplateArgumentListInfo &TemplateArgs) {
13482   return SemaRef.CheckTemplateIdType(Template, TemplateNameLoc, TemplateArgs);
13483 }
13484 
13485 template<typename Derived>
13486 QualType TreeTransform<Derived>::RebuildAtomicType(QualType ValueType,
13487                                                    SourceLocation KWLoc) {
13488   return SemaRef.BuildAtomicType(ValueType, KWLoc);
13489 }
13490 
13491 template<typename Derived>
13492 QualType TreeTransform<Derived>::RebuildPipeType(QualType ValueType,
13493                                                  SourceLocation KWLoc,
13494                                                  bool isReadPipe) {
13495   return isReadPipe ? SemaRef.BuildReadPipeType(ValueType, KWLoc)
13496                     : SemaRef.BuildWritePipeType(ValueType, KWLoc);
13497 }
13498 
13499 template<typename Derived>
13500 TemplateName
13501 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS,
13502                                             bool TemplateKW,
13503                                             TemplateDecl *Template) {
13504   return SemaRef.Context.getQualifiedTemplateName(SS.getScopeRep(), TemplateKW,
13505                                                   Template);
13506 }
13507 
13508 template<typename Derived>
13509 TemplateName
13510 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS,
13511                                             SourceLocation TemplateKWLoc,
13512                                             const IdentifierInfo &Name,
13513                                             SourceLocation NameLoc,
13514                                             QualType ObjectType,
13515                                             NamedDecl *FirstQualifierInScope,
13516                                             bool AllowInjectedClassName) {
13517   UnqualifiedId TemplateName;
13518   TemplateName.setIdentifier(&Name, NameLoc);
13519   Sema::TemplateTy Template;
13520   getSema().ActOnDependentTemplateName(/*Scope=*/nullptr,
13521                                        SS, TemplateKWLoc, TemplateName,
13522                                        ParsedType::make(ObjectType),
13523                                        /*EnteringContext=*/false,
13524                                        Template, AllowInjectedClassName);
13525   return Template.get();
13526 }
13527 
13528 template<typename Derived>
13529 TemplateName
13530 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS,
13531                                             SourceLocation TemplateKWLoc,
13532                                             OverloadedOperatorKind Operator,
13533                                             SourceLocation NameLoc,
13534                                             QualType ObjectType,
13535                                             bool AllowInjectedClassName) {
13536   UnqualifiedId Name;
13537   // FIXME: Bogus location information.
13538   SourceLocation SymbolLocations[3] = { NameLoc, NameLoc, NameLoc };
13539   Name.setOperatorFunctionId(NameLoc, Operator, SymbolLocations);
13540   Sema::TemplateTy Template;
13541   getSema().ActOnDependentTemplateName(/*Scope=*/nullptr,
13542                                        SS, TemplateKWLoc, Name,
13543                                        ParsedType::make(ObjectType),
13544                                        /*EnteringContext=*/false,
13545                                        Template, AllowInjectedClassName);
13546   return Template.get();
13547 }
13548 
13549 template<typename Derived>
13550 ExprResult
13551 TreeTransform<Derived>::RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op,
13552                                                    SourceLocation OpLoc,
13553                                                    Expr *OrigCallee,
13554                                                    Expr *First,
13555                                                    Expr *Second) {
13556   Expr *Callee = OrigCallee->IgnoreParenCasts();
13557   bool isPostIncDec = Second && (Op == OO_PlusPlus || Op == OO_MinusMinus);
13558 
13559   if (First->getObjectKind() == OK_ObjCProperty) {
13560     BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op);
13561     if (BinaryOperator::isAssignmentOp(Opc))
13562       return SemaRef.checkPseudoObjectAssignment(/*Scope=*/nullptr, OpLoc, Opc,
13563                                                  First, Second);
13564     ExprResult Result = SemaRef.CheckPlaceholderExpr(First);
13565     if (Result.isInvalid())
13566       return ExprError();
13567     First = Result.get();
13568   }
13569 
13570   if (Second && Second->getObjectKind() == OK_ObjCProperty) {
13571     ExprResult Result = SemaRef.CheckPlaceholderExpr(Second);
13572     if (Result.isInvalid())
13573       return ExprError();
13574     Second = Result.get();
13575   }
13576 
13577   // Determine whether this should be a builtin operation.
13578   if (Op == OO_Subscript) {
13579     if (!First->getType()->isOverloadableType() &&
13580         !Second->getType()->isOverloadableType())
13581       return getSema().CreateBuiltinArraySubscriptExpr(
13582           First, Callee->getBeginLoc(), Second, OpLoc);
13583   } else if (Op == OO_Arrow) {
13584     // -> is never a builtin operation.
13585     return SemaRef.BuildOverloadedArrowExpr(nullptr, First, OpLoc);
13586   } else if (Second == nullptr || isPostIncDec) {
13587     if (!First->getType()->isOverloadableType() ||
13588         (Op == OO_Amp && getSema().isQualifiedMemberAccess(First))) {
13589       // The argument is not of overloadable type, or this is an expression
13590       // of the form &Class::member, so try to create a built-in unary
13591       // operation.
13592       UnaryOperatorKind Opc
13593         = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec);
13594 
13595       return getSema().CreateBuiltinUnaryOp(OpLoc, Opc, First);
13596     }
13597   } else {
13598     if (!First->getType()->isOverloadableType() &&
13599         !Second->getType()->isOverloadableType()) {
13600       // Neither of the arguments is an overloadable type, so try to
13601       // create a built-in binary operation.
13602       BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op);
13603       ExprResult Result
13604         = SemaRef.CreateBuiltinBinOp(OpLoc, Opc, First, Second);
13605       if (Result.isInvalid())
13606         return ExprError();
13607 
13608       return Result;
13609     }
13610   }
13611 
13612   // Compute the transformed set of functions (and function templates) to be
13613   // used during overload resolution.
13614   UnresolvedSet<16> Functions;
13615   bool RequiresADL;
13616 
13617   if (UnresolvedLookupExpr *ULE = dyn_cast<UnresolvedLookupExpr>(Callee)) {
13618     Functions.append(ULE->decls_begin(), ULE->decls_end());
13619     // If the overload could not be resolved in the template definition
13620     // (because we had a dependent argument), ADL is performed as part of
13621     // template instantiation.
13622     RequiresADL = ULE->requiresADL();
13623   } else {
13624     // If we've resolved this to a particular non-member function, just call
13625     // that function. If we resolved it to a member function,
13626     // CreateOverloaded* will find that function for us.
13627     NamedDecl *ND = cast<DeclRefExpr>(Callee)->getDecl();
13628     if (!isa<CXXMethodDecl>(ND))
13629       Functions.addDecl(ND);
13630     RequiresADL = false;
13631   }
13632 
13633   // Add any functions found via argument-dependent lookup.
13634   Expr *Args[2] = { First, Second };
13635   unsigned NumArgs = 1 + (Second != nullptr);
13636 
13637   // Create the overloaded operator invocation for unary operators.
13638   if (NumArgs == 1 || isPostIncDec) {
13639     UnaryOperatorKind Opc
13640       = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec);
13641     return SemaRef.CreateOverloadedUnaryOp(OpLoc, Opc, Functions, First,
13642                                            RequiresADL);
13643   }
13644 
13645   if (Op == OO_Subscript) {
13646     SourceLocation LBrace;
13647     SourceLocation RBrace;
13648 
13649     if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Callee)) {
13650         DeclarationNameLoc NameLoc = DRE->getNameInfo().getInfo();
13651         LBrace = SourceLocation::getFromRawEncoding(
13652                     NameLoc.CXXOperatorName.BeginOpNameLoc);
13653         RBrace = SourceLocation::getFromRawEncoding(
13654                     NameLoc.CXXOperatorName.EndOpNameLoc);
13655     } else {
13656       LBrace = Callee->getBeginLoc();
13657       RBrace = OpLoc;
13658     }
13659 
13660     return SemaRef.CreateOverloadedArraySubscriptExpr(LBrace, RBrace,
13661                                                       First, Second);
13662   }
13663 
13664   // Create the overloaded operator invocation for binary operators.
13665   BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op);
13666   ExprResult Result = SemaRef.CreateOverloadedBinOp(
13667       OpLoc, Opc, Functions, Args[0], Args[1], RequiresADL);
13668   if (Result.isInvalid())
13669     return ExprError();
13670 
13671   return Result;
13672 }
13673 
13674 template<typename Derived>
13675 ExprResult
13676 TreeTransform<Derived>::RebuildCXXPseudoDestructorExpr(Expr *Base,
13677                                                      SourceLocation OperatorLoc,
13678                                                        bool isArrow,
13679                                                        CXXScopeSpec &SS,
13680                                                      TypeSourceInfo *ScopeType,
13681                                                        SourceLocation CCLoc,
13682                                                        SourceLocation TildeLoc,
13683                                         PseudoDestructorTypeStorage Destroyed) {
13684   QualType BaseType = Base->getType();
13685   if (Base->isTypeDependent() || Destroyed.getIdentifier() ||
13686       (!isArrow && !BaseType->getAs<RecordType>()) ||
13687       (isArrow && BaseType->getAs<PointerType>() &&
13688        !BaseType->castAs<PointerType>()->getPointeeType()
13689                                               ->template getAs<RecordType>())){
13690     // This pseudo-destructor expression is still a pseudo-destructor.
13691     return SemaRef.BuildPseudoDestructorExpr(
13692         Base, OperatorLoc, isArrow ? tok::arrow : tok::period, SS, ScopeType,
13693         CCLoc, TildeLoc, Destroyed);
13694   }
13695 
13696   TypeSourceInfo *DestroyedType = Destroyed.getTypeSourceInfo();
13697   DeclarationName Name(SemaRef.Context.DeclarationNames.getCXXDestructorName(
13698                  SemaRef.Context.getCanonicalType(DestroyedType->getType())));
13699   DeclarationNameInfo NameInfo(Name, Destroyed.getLocation());
13700   NameInfo.setNamedTypeInfo(DestroyedType);
13701 
13702   // The scope type is now known to be a valid nested name specifier
13703   // component. Tack it on to the end of the nested name specifier.
13704   if (ScopeType) {
13705     if (!ScopeType->getType()->getAs<TagType>()) {
13706       getSema().Diag(ScopeType->getTypeLoc().getBeginLoc(),
13707                      diag::err_expected_class_or_namespace)
13708           << ScopeType->getType() << getSema().getLangOpts().CPlusPlus;
13709       return ExprError();
13710     }
13711     SS.Extend(SemaRef.Context, SourceLocation(), ScopeType->getTypeLoc(),
13712               CCLoc);
13713   }
13714 
13715   SourceLocation TemplateKWLoc; // FIXME: retrieve it from caller.
13716   return getSema().BuildMemberReferenceExpr(Base, BaseType,
13717                                             OperatorLoc, isArrow,
13718                                             SS, TemplateKWLoc,
13719                                             /*FIXME: FirstQualifier*/ nullptr,
13720                                             NameInfo,
13721                                             /*TemplateArgs*/ nullptr,
13722                                             /*S*/nullptr);
13723 }
13724 
13725 template<typename Derived>
13726 StmtResult
13727 TreeTransform<Derived>::TransformCapturedStmt(CapturedStmt *S) {
13728   SourceLocation Loc = S->getBeginLoc();
13729   CapturedDecl *CD = S->getCapturedDecl();
13730   unsigned NumParams = CD->getNumParams();
13731   unsigned ContextParamPos = CD->getContextParamPosition();
13732   SmallVector<Sema::CapturedParamNameType, 4> Params;
13733   for (unsigned I = 0; I < NumParams; ++I) {
13734     if (I != ContextParamPos) {
13735       Params.push_back(
13736              std::make_pair(
13737                   CD->getParam(I)->getName(),
13738                   getDerived().TransformType(CD->getParam(I)->getType())));
13739     } else {
13740       Params.push_back(std::make_pair(StringRef(), QualType()));
13741     }
13742   }
13743   getSema().ActOnCapturedRegionStart(Loc, /*CurScope*/nullptr,
13744                                      S->getCapturedRegionKind(), Params);
13745   StmtResult Body;
13746   {
13747     Sema::CompoundScopeRAII CompoundScope(getSema());
13748     Body = getDerived().TransformStmt(S->getCapturedStmt());
13749   }
13750 
13751   if (Body.isInvalid()) {
13752     getSema().ActOnCapturedRegionError();
13753     return StmtError();
13754   }
13755 
13756   return getSema().ActOnCapturedRegionEnd(Body.get());
13757 }
13758 
13759 } // end namespace clang
13760 
13761 #endif // LLVM_CLANG_LIB_SEMA_TREETRANSFORM_H
13762