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(DefaultKind Kind, SourceLocation KindKwLoc,
1606                                      SourceLocation StartLoc,
1607                                      SourceLocation LParenLoc,
1608                                      SourceLocation EndLoc) {
1609     return getSema().ActOnOpenMPDefaultClause(Kind, KindKwLoc,
1610                                               StartLoc, LParenLoc, EndLoc);
1611   }
1612 
1613   /// Build a new OpenMP 'proc_bind' clause.
1614   ///
1615   /// By default, performs semantic analysis to build the new OpenMP clause.
1616   /// Subclasses may override this routine to provide different behavior.
1617   OMPClause *RebuildOMPProcBindClause(ProcBindKind Kind,
1618                                       SourceLocation KindKwLoc,
1619                                       SourceLocation StartLoc,
1620                                       SourceLocation LParenLoc,
1621                                       SourceLocation EndLoc) {
1622     return getSema().ActOnOpenMPProcBindClause(Kind, KindKwLoc,
1623                                                StartLoc, LParenLoc, EndLoc);
1624   }
1625 
1626   /// Build a new OpenMP 'schedule' clause.
1627   ///
1628   /// By default, performs semantic analysis to build the new OpenMP clause.
1629   /// Subclasses may override this routine to provide different behavior.
1630   OMPClause *RebuildOMPScheduleClause(
1631       OpenMPScheduleClauseModifier M1, OpenMPScheduleClauseModifier M2,
1632       OpenMPScheduleClauseKind Kind, Expr *ChunkSize, SourceLocation StartLoc,
1633       SourceLocation LParenLoc, SourceLocation M1Loc, SourceLocation M2Loc,
1634       SourceLocation KindLoc, SourceLocation CommaLoc, SourceLocation EndLoc) {
1635     return getSema().ActOnOpenMPScheduleClause(
1636         M1, M2, Kind, ChunkSize, StartLoc, LParenLoc, M1Loc, M2Loc, KindLoc,
1637         CommaLoc, EndLoc);
1638   }
1639 
1640   /// Build a new OpenMP 'ordered' clause.
1641   ///
1642   /// By default, performs semantic analysis to build the new OpenMP clause.
1643   /// Subclasses may override this routine to provide different behavior.
1644   OMPClause *RebuildOMPOrderedClause(SourceLocation StartLoc,
1645                                      SourceLocation EndLoc,
1646                                      SourceLocation LParenLoc, Expr *Num) {
1647     return getSema().ActOnOpenMPOrderedClause(StartLoc, EndLoc, LParenLoc, Num);
1648   }
1649 
1650   /// Build a new OpenMP 'private' clause.
1651   ///
1652   /// By default, performs semantic analysis to build the new OpenMP clause.
1653   /// Subclasses may override this routine to provide different behavior.
1654   OMPClause *RebuildOMPPrivateClause(ArrayRef<Expr *> VarList,
1655                                      SourceLocation StartLoc,
1656                                      SourceLocation LParenLoc,
1657                                      SourceLocation EndLoc) {
1658     return getSema().ActOnOpenMPPrivateClause(VarList, StartLoc, LParenLoc,
1659                                               EndLoc);
1660   }
1661 
1662   /// Build a new OpenMP 'firstprivate' clause.
1663   ///
1664   /// By default, performs semantic analysis to build the new OpenMP clause.
1665   /// Subclasses may override this routine to provide different behavior.
1666   OMPClause *RebuildOMPFirstprivateClause(ArrayRef<Expr *> VarList,
1667                                           SourceLocation StartLoc,
1668                                           SourceLocation LParenLoc,
1669                                           SourceLocation EndLoc) {
1670     return getSema().ActOnOpenMPFirstprivateClause(VarList, StartLoc, LParenLoc,
1671                                                    EndLoc);
1672   }
1673 
1674   /// Build a new OpenMP 'lastprivate' clause.
1675   ///
1676   /// By default, performs semantic analysis to build the new OpenMP clause.
1677   /// Subclasses may override this routine to provide different behavior.
1678   OMPClause *RebuildOMPLastprivateClause(ArrayRef<Expr *> VarList,
1679                                          OpenMPLastprivateModifier LPKind,
1680                                          SourceLocation LPKindLoc,
1681                                          SourceLocation ColonLoc,
1682                                          SourceLocation StartLoc,
1683                                          SourceLocation LParenLoc,
1684                                          SourceLocation EndLoc) {
1685     return getSema().ActOnOpenMPLastprivateClause(
1686         VarList, LPKind, LPKindLoc, ColonLoc, StartLoc, LParenLoc, EndLoc);
1687   }
1688 
1689   /// Build a new OpenMP 'shared' clause.
1690   ///
1691   /// By default, performs semantic analysis to build the new OpenMP clause.
1692   /// Subclasses may override this routine to provide different behavior.
1693   OMPClause *RebuildOMPSharedClause(ArrayRef<Expr *> VarList,
1694                                     SourceLocation StartLoc,
1695                                     SourceLocation LParenLoc,
1696                                     SourceLocation EndLoc) {
1697     return getSema().ActOnOpenMPSharedClause(VarList, StartLoc, LParenLoc,
1698                                              EndLoc);
1699   }
1700 
1701   /// Build a new OpenMP 'reduction' clause.
1702   ///
1703   /// By default, performs semantic analysis to build the new statement.
1704   /// Subclasses may override this routine to provide different behavior.
1705   OMPClause *RebuildOMPReductionClause(ArrayRef<Expr *> VarList,
1706                                        SourceLocation StartLoc,
1707                                        SourceLocation LParenLoc,
1708                                        SourceLocation ColonLoc,
1709                                        SourceLocation EndLoc,
1710                                        CXXScopeSpec &ReductionIdScopeSpec,
1711                                        const DeclarationNameInfo &ReductionId,
1712                                        ArrayRef<Expr *> UnresolvedReductions) {
1713     return getSema().ActOnOpenMPReductionClause(
1714         VarList, StartLoc, LParenLoc, ColonLoc, EndLoc, ReductionIdScopeSpec,
1715         ReductionId, UnresolvedReductions);
1716   }
1717 
1718   /// Build a new OpenMP 'task_reduction' clause.
1719   ///
1720   /// By default, performs semantic analysis to build the new statement.
1721   /// Subclasses may override this routine to provide different behavior.
1722   OMPClause *RebuildOMPTaskReductionClause(
1723       ArrayRef<Expr *> VarList, SourceLocation StartLoc,
1724       SourceLocation LParenLoc, SourceLocation ColonLoc, SourceLocation EndLoc,
1725       CXXScopeSpec &ReductionIdScopeSpec,
1726       const DeclarationNameInfo &ReductionId,
1727       ArrayRef<Expr *> UnresolvedReductions) {
1728     return getSema().ActOnOpenMPTaskReductionClause(
1729         VarList, StartLoc, LParenLoc, ColonLoc, EndLoc, ReductionIdScopeSpec,
1730         ReductionId, UnresolvedReductions);
1731   }
1732 
1733   /// Build a new OpenMP 'in_reduction' clause.
1734   ///
1735   /// By default, performs semantic analysis to build the new statement.
1736   /// Subclasses may override this routine to provide different behavior.
1737   OMPClause *
1738   RebuildOMPInReductionClause(ArrayRef<Expr *> VarList, SourceLocation StartLoc,
1739                               SourceLocation LParenLoc, SourceLocation ColonLoc,
1740                               SourceLocation EndLoc,
1741                               CXXScopeSpec &ReductionIdScopeSpec,
1742                               const DeclarationNameInfo &ReductionId,
1743                               ArrayRef<Expr *> UnresolvedReductions) {
1744     return getSema().ActOnOpenMPInReductionClause(
1745         VarList, StartLoc, LParenLoc, ColonLoc, EndLoc, ReductionIdScopeSpec,
1746         ReductionId, UnresolvedReductions);
1747   }
1748 
1749   /// Build a new OpenMP 'linear' clause.
1750   ///
1751   /// By default, performs semantic analysis to build the new OpenMP clause.
1752   /// Subclasses may override this routine to provide different behavior.
1753   OMPClause *RebuildOMPLinearClause(ArrayRef<Expr *> VarList, Expr *Step,
1754                                     SourceLocation StartLoc,
1755                                     SourceLocation LParenLoc,
1756                                     OpenMPLinearClauseKind Modifier,
1757                                     SourceLocation ModifierLoc,
1758                                     SourceLocation ColonLoc,
1759                                     SourceLocation EndLoc) {
1760     return getSema().ActOnOpenMPLinearClause(VarList, Step, StartLoc, LParenLoc,
1761                                              Modifier, ModifierLoc, ColonLoc,
1762                                              EndLoc);
1763   }
1764 
1765   /// Build a new OpenMP 'aligned' clause.
1766   ///
1767   /// By default, performs semantic analysis to build the new OpenMP clause.
1768   /// Subclasses may override this routine to provide different behavior.
1769   OMPClause *RebuildOMPAlignedClause(ArrayRef<Expr *> VarList, Expr *Alignment,
1770                                      SourceLocation StartLoc,
1771                                      SourceLocation LParenLoc,
1772                                      SourceLocation ColonLoc,
1773                                      SourceLocation EndLoc) {
1774     return getSema().ActOnOpenMPAlignedClause(VarList, Alignment, StartLoc,
1775                                               LParenLoc, ColonLoc, EndLoc);
1776   }
1777 
1778   /// Build a new OpenMP 'copyin' clause.
1779   ///
1780   /// By default, performs semantic analysis to build the new OpenMP clause.
1781   /// Subclasses may override this routine to provide different behavior.
1782   OMPClause *RebuildOMPCopyinClause(ArrayRef<Expr *> VarList,
1783                                     SourceLocation StartLoc,
1784                                     SourceLocation LParenLoc,
1785                                     SourceLocation EndLoc) {
1786     return getSema().ActOnOpenMPCopyinClause(VarList, StartLoc, LParenLoc,
1787                                              EndLoc);
1788   }
1789 
1790   /// Build a new OpenMP 'copyprivate' clause.
1791   ///
1792   /// By default, performs semantic analysis to build the new OpenMP clause.
1793   /// Subclasses may override this routine to provide different behavior.
1794   OMPClause *RebuildOMPCopyprivateClause(ArrayRef<Expr *> VarList,
1795                                          SourceLocation StartLoc,
1796                                          SourceLocation LParenLoc,
1797                                          SourceLocation EndLoc) {
1798     return getSema().ActOnOpenMPCopyprivateClause(VarList, StartLoc, LParenLoc,
1799                                                   EndLoc);
1800   }
1801 
1802   /// Build a new OpenMP 'flush' pseudo clause.
1803   ///
1804   /// By default, performs semantic analysis to build the new OpenMP clause.
1805   /// Subclasses may override this routine to provide different behavior.
1806   OMPClause *RebuildOMPFlushClause(ArrayRef<Expr *> VarList,
1807                                    SourceLocation StartLoc,
1808                                    SourceLocation LParenLoc,
1809                                    SourceLocation EndLoc) {
1810     return getSema().ActOnOpenMPFlushClause(VarList, StartLoc, LParenLoc,
1811                                             EndLoc);
1812   }
1813 
1814   /// Build a new OpenMP 'depobj' pseudo clause.
1815   ///
1816   /// By default, performs semantic analysis to build the new OpenMP clause.
1817   /// Subclasses may override this routine to provide different behavior.
1818   OMPClause *RebuildOMPDepobjClause(Expr *Depobj, SourceLocation StartLoc,
1819                                     SourceLocation LParenLoc,
1820                                     SourceLocation EndLoc) {
1821     return getSema().ActOnOpenMPDepobjClause(Depobj, StartLoc, LParenLoc,
1822                                              EndLoc);
1823   }
1824 
1825   /// Build a new OpenMP 'depend' pseudo clause.
1826   ///
1827   /// By default, performs semantic analysis to build the new OpenMP clause.
1828   /// Subclasses may override this routine to provide different behavior.
1829   OMPClause *
1830   RebuildOMPDependClause(OpenMPDependClauseKind DepKind, SourceLocation DepLoc,
1831                          SourceLocation ColonLoc, ArrayRef<Expr *> VarList,
1832                          SourceLocation StartLoc, SourceLocation LParenLoc,
1833                          SourceLocation EndLoc) {
1834     return getSema().ActOnOpenMPDependClause(DepKind, DepLoc, ColonLoc, VarList,
1835                                              StartLoc, LParenLoc, EndLoc);
1836   }
1837 
1838   /// Build a new OpenMP 'device' clause.
1839   ///
1840   /// By default, performs semantic analysis to build the new statement.
1841   /// Subclasses may override this routine to provide different behavior.
1842   OMPClause *RebuildOMPDeviceClause(Expr *Device, SourceLocation StartLoc,
1843                                     SourceLocation LParenLoc,
1844                                     SourceLocation EndLoc) {
1845     return getSema().ActOnOpenMPDeviceClause(Device, StartLoc, LParenLoc,
1846                                              EndLoc);
1847   }
1848 
1849   /// Build a new OpenMP 'map' clause.
1850   ///
1851   /// By default, performs semantic analysis to build the new OpenMP clause.
1852   /// Subclasses may override this routine to provide different behavior.
1853   OMPClause *RebuildOMPMapClause(
1854       ArrayRef<OpenMPMapModifierKind> MapTypeModifiers,
1855       ArrayRef<SourceLocation> MapTypeModifiersLoc,
1856       CXXScopeSpec MapperIdScopeSpec, DeclarationNameInfo MapperId,
1857       OpenMPMapClauseKind MapType, bool IsMapTypeImplicit,
1858       SourceLocation MapLoc, SourceLocation ColonLoc, ArrayRef<Expr *> VarList,
1859       const OMPVarListLocTy &Locs, ArrayRef<Expr *> UnresolvedMappers) {
1860     return getSema().ActOnOpenMPMapClause(MapTypeModifiers, MapTypeModifiersLoc,
1861                                           MapperIdScopeSpec, MapperId, MapType,
1862                                           IsMapTypeImplicit, MapLoc, ColonLoc,
1863                                           VarList, Locs, UnresolvedMappers);
1864   }
1865 
1866   /// Build a new OpenMP 'allocate' clause.
1867   ///
1868   /// By default, performs semantic analysis to build the new OpenMP clause.
1869   /// Subclasses may override this routine to provide different behavior.
1870   OMPClause *RebuildOMPAllocateClause(Expr *Allocate, ArrayRef<Expr *> VarList,
1871                                       SourceLocation StartLoc,
1872                                       SourceLocation LParenLoc,
1873                                       SourceLocation ColonLoc,
1874                                       SourceLocation EndLoc) {
1875     return getSema().ActOnOpenMPAllocateClause(Allocate, VarList, StartLoc,
1876                                                LParenLoc, ColonLoc, EndLoc);
1877   }
1878 
1879   /// Build a new OpenMP 'num_teams' clause.
1880   ///
1881   /// By default, performs semantic analysis to build the new statement.
1882   /// Subclasses may override this routine to provide different behavior.
1883   OMPClause *RebuildOMPNumTeamsClause(Expr *NumTeams, SourceLocation StartLoc,
1884                                       SourceLocation LParenLoc,
1885                                       SourceLocation EndLoc) {
1886     return getSema().ActOnOpenMPNumTeamsClause(NumTeams, StartLoc, LParenLoc,
1887                                                EndLoc);
1888   }
1889 
1890   /// Build a new OpenMP 'thread_limit' clause.
1891   ///
1892   /// By default, performs semantic analysis to build the new statement.
1893   /// Subclasses may override this routine to provide different behavior.
1894   OMPClause *RebuildOMPThreadLimitClause(Expr *ThreadLimit,
1895                                          SourceLocation StartLoc,
1896                                          SourceLocation LParenLoc,
1897                                          SourceLocation EndLoc) {
1898     return getSema().ActOnOpenMPThreadLimitClause(ThreadLimit, StartLoc,
1899                                                   LParenLoc, EndLoc);
1900   }
1901 
1902   /// Build a new OpenMP 'priority' clause.
1903   ///
1904   /// By default, performs semantic analysis to build the new statement.
1905   /// Subclasses may override this routine to provide different behavior.
1906   OMPClause *RebuildOMPPriorityClause(Expr *Priority, SourceLocation StartLoc,
1907                                       SourceLocation LParenLoc,
1908                                       SourceLocation EndLoc) {
1909     return getSema().ActOnOpenMPPriorityClause(Priority, StartLoc, LParenLoc,
1910                                                EndLoc);
1911   }
1912 
1913   /// Build a new OpenMP 'grainsize' clause.
1914   ///
1915   /// By default, performs semantic analysis to build the new statement.
1916   /// Subclasses may override this routine to provide different behavior.
1917   OMPClause *RebuildOMPGrainsizeClause(Expr *Grainsize, SourceLocation StartLoc,
1918                                        SourceLocation LParenLoc,
1919                                        SourceLocation EndLoc) {
1920     return getSema().ActOnOpenMPGrainsizeClause(Grainsize, StartLoc, LParenLoc,
1921                                                 EndLoc);
1922   }
1923 
1924   /// Build a new OpenMP 'num_tasks' clause.
1925   ///
1926   /// By default, performs semantic analysis to build the new statement.
1927   /// Subclasses may override this routine to provide different behavior.
1928   OMPClause *RebuildOMPNumTasksClause(Expr *NumTasks, SourceLocation StartLoc,
1929                                       SourceLocation LParenLoc,
1930                                       SourceLocation EndLoc) {
1931     return getSema().ActOnOpenMPNumTasksClause(NumTasks, StartLoc, LParenLoc,
1932                                                EndLoc);
1933   }
1934 
1935   /// Build a new OpenMP 'hint' clause.
1936   ///
1937   /// By default, performs semantic analysis to build the new statement.
1938   /// Subclasses may override this routine to provide different behavior.
1939   OMPClause *RebuildOMPHintClause(Expr *Hint, SourceLocation StartLoc,
1940                                   SourceLocation LParenLoc,
1941                                   SourceLocation EndLoc) {
1942     return getSema().ActOnOpenMPHintClause(Hint, StartLoc, LParenLoc, EndLoc);
1943   }
1944 
1945   /// Build a new OpenMP 'dist_schedule' clause.
1946   ///
1947   /// By default, performs semantic analysis to build the new OpenMP clause.
1948   /// Subclasses may override this routine to provide different behavior.
1949   OMPClause *
1950   RebuildOMPDistScheduleClause(OpenMPDistScheduleClauseKind Kind,
1951                                Expr *ChunkSize, SourceLocation StartLoc,
1952                                SourceLocation LParenLoc, SourceLocation KindLoc,
1953                                SourceLocation CommaLoc, SourceLocation EndLoc) {
1954     return getSema().ActOnOpenMPDistScheduleClause(
1955         Kind, ChunkSize, StartLoc, LParenLoc, KindLoc, CommaLoc, EndLoc);
1956   }
1957 
1958   /// Build a new OpenMP 'to' clause.
1959   ///
1960   /// By default, performs semantic analysis to build the new statement.
1961   /// Subclasses may override this routine to provide different behavior.
1962   OMPClause *RebuildOMPToClause(ArrayRef<Expr *> VarList,
1963                                 CXXScopeSpec &MapperIdScopeSpec,
1964                                 DeclarationNameInfo &MapperId,
1965                                 const OMPVarListLocTy &Locs,
1966                                 ArrayRef<Expr *> UnresolvedMappers) {
1967     return getSema().ActOnOpenMPToClause(VarList, MapperIdScopeSpec, MapperId,
1968                                          Locs, UnresolvedMappers);
1969   }
1970 
1971   /// Build a new OpenMP 'from' clause.
1972   ///
1973   /// By default, performs semantic analysis to build the new statement.
1974   /// Subclasses may override this routine to provide different behavior.
1975   OMPClause *RebuildOMPFromClause(ArrayRef<Expr *> VarList,
1976                                   CXXScopeSpec &MapperIdScopeSpec,
1977                                   DeclarationNameInfo &MapperId,
1978                                   const OMPVarListLocTy &Locs,
1979                                   ArrayRef<Expr *> UnresolvedMappers) {
1980     return getSema().ActOnOpenMPFromClause(VarList, MapperIdScopeSpec, MapperId,
1981                                            Locs, UnresolvedMappers);
1982   }
1983 
1984   /// Build a new OpenMP 'use_device_ptr' clause.
1985   ///
1986   /// By default, performs semantic analysis to build the new OpenMP clause.
1987   /// Subclasses may override this routine to provide different behavior.
1988   OMPClause *RebuildOMPUseDevicePtrClause(ArrayRef<Expr *> VarList,
1989                                           const OMPVarListLocTy &Locs) {
1990     return getSema().ActOnOpenMPUseDevicePtrClause(VarList, Locs);
1991   }
1992 
1993   /// Build a new OpenMP 'is_device_ptr' clause.
1994   ///
1995   /// By default, performs semantic analysis to build the new OpenMP clause.
1996   /// Subclasses may override this routine to provide different behavior.
1997   OMPClause *RebuildOMPIsDevicePtrClause(ArrayRef<Expr *> VarList,
1998                                          const OMPVarListLocTy &Locs) {
1999     return getSema().ActOnOpenMPIsDevicePtrClause(VarList, Locs);
2000   }
2001 
2002   /// Build a new OpenMP 'defaultmap' clause.
2003   ///
2004   /// By default, performs semantic analysis to build the new OpenMP clause.
2005   /// Subclasses may override this routine to provide different behavior.
2006   OMPClause *RebuildOMPDefaultmapClause(OpenMPDefaultmapClauseModifier M,
2007                                         OpenMPDefaultmapClauseKind Kind,
2008                                         SourceLocation StartLoc,
2009                                         SourceLocation LParenLoc,
2010                                         SourceLocation MLoc,
2011                                         SourceLocation KindLoc,
2012                                         SourceLocation EndLoc) {
2013     return getSema().ActOnOpenMPDefaultmapClause(M, Kind, StartLoc, LParenLoc,
2014                                                  MLoc, KindLoc, EndLoc);
2015   }
2016 
2017   /// Build a new OpenMP 'nontemporal' clause.
2018   ///
2019   /// By default, performs semantic analysis to build the new OpenMP clause.
2020   /// Subclasses may override this routine to provide different behavior.
2021   OMPClause *RebuildOMPNontemporalClause(ArrayRef<Expr *> VarList,
2022                                          SourceLocation StartLoc,
2023                                          SourceLocation LParenLoc,
2024                                          SourceLocation EndLoc) {
2025     return getSema().ActOnOpenMPNontemporalClause(VarList, StartLoc, LParenLoc,
2026                                                   EndLoc);
2027   }
2028 
2029   /// Build a new OpenMP 'order' clause.
2030   ///
2031   /// By default, performs semantic analysis to build the new OpenMP clause.
2032   /// Subclasses may override this routine to provide different behavior.
2033   OMPClause *RebuildOMPOrderClause(OpenMPOrderClauseKind Kind,
2034                                    SourceLocation KindKwLoc,
2035                                    SourceLocation StartLoc,
2036                                    SourceLocation LParenLoc,
2037                                    SourceLocation EndLoc) {
2038     return getSema().ActOnOpenMPOrderClause(Kind, KindKwLoc, StartLoc,
2039                                             LParenLoc, EndLoc);
2040   }
2041 
2042   /// Rebuild the operand to an Objective-C \@synchronized statement.
2043   ///
2044   /// By default, performs semantic analysis to build the new statement.
2045   /// Subclasses may override this routine to provide different behavior.
2046   ExprResult RebuildObjCAtSynchronizedOperand(SourceLocation atLoc,
2047                                               Expr *object) {
2048     return getSema().ActOnObjCAtSynchronizedOperand(atLoc, object);
2049   }
2050 
2051   /// Build a new Objective-C \@synchronized statement.
2052   ///
2053   /// By default, performs semantic analysis to build the new statement.
2054   /// Subclasses may override this routine to provide different behavior.
2055   StmtResult RebuildObjCAtSynchronizedStmt(SourceLocation AtLoc,
2056                                            Expr *Object, Stmt *Body) {
2057     return getSema().ActOnObjCAtSynchronizedStmt(AtLoc, Object, Body);
2058   }
2059 
2060   /// Build a new Objective-C \@autoreleasepool statement.
2061   ///
2062   /// By default, performs semantic analysis to build the new statement.
2063   /// Subclasses may override this routine to provide different behavior.
2064   StmtResult RebuildObjCAutoreleasePoolStmt(SourceLocation AtLoc,
2065                                             Stmt *Body) {
2066     return getSema().ActOnObjCAutoreleasePoolStmt(AtLoc, Body);
2067   }
2068 
2069   /// Build a new Objective-C fast enumeration statement.
2070   ///
2071   /// By default, performs semantic analysis to build the new statement.
2072   /// Subclasses may override this routine to provide different behavior.
2073   StmtResult RebuildObjCForCollectionStmt(SourceLocation ForLoc,
2074                                           Stmt *Element,
2075                                           Expr *Collection,
2076                                           SourceLocation RParenLoc,
2077                                           Stmt *Body) {
2078     StmtResult ForEachStmt = getSema().ActOnObjCForCollectionStmt(ForLoc,
2079                                                 Element,
2080                                                 Collection,
2081                                                 RParenLoc);
2082     if (ForEachStmt.isInvalid())
2083       return StmtError();
2084 
2085     return getSema().FinishObjCForCollectionStmt(ForEachStmt.get(), Body);
2086   }
2087 
2088   /// Build a new C++ exception declaration.
2089   ///
2090   /// By default, performs semantic analysis to build the new decaration.
2091   /// Subclasses may override this routine to provide different behavior.
2092   VarDecl *RebuildExceptionDecl(VarDecl *ExceptionDecl,
2093                                 TypeSourceInfo *Declarator,
2094                                 SourceLocation StartLoc,
2095                                 SourceLocation IdLoc,
2096                                 IdentifierInfo *Id) {
2097     VarDecl *Var = getSema().BuildExceptionDeclaration(nullptr, Declarator,
2098                                                        StartLoc, IdLoc, Id);
2099     if (Var)
2100       getSema().CurContext->addDecl(Var);
2101     return Var;
2102   }
2103 
2104   /// Build a new C++ catch statement.
2105   ///
2106   /// By default, performs semantic analysis to build the new statement.
2107   /// Subclasses may override this routine to provide different behavior.
2108   StmtResult RebuildCXXCatchStmt(SourceLocation CatchLoc,
2109                                  VarDecl *ExceptionDecl,
2110                                  Stmt *Handler) {
2111     return Owned(new (getSema().Context) CXXCatchStmt(CatchLoc, ExceptionDecl,
2112                                                       Handler));
2113   }
2114 
2115   /// Build a new C++ try statement.
2116   ///
2117   /// By default, performs semantic analysis to build the new statement.
2118   /// Subclasses may override this routine to provide different behavior.
2119   StmtResult RebuildCXXTryStmt(SourceLocation TryLoc, Stmt *TryBlock,
2120                                ArrayRef<Stmt *> Handlers) {
2121     return getSema().ActOnCXXTryBlock(TryLoc, TryBlock, Handlers);
2122   }
2123 
2124   /// Build a new C++0x range-based for statement.
2125   ///
2126   /// By default, performs semantic analysis to build the new statement.
2127   /// Subclasses may override this routine to provide different behavior.
2128   StmtResult RebuildCXXForRangeStmt(SourceLocation ForLoc,
2129                                     SourceLocation CoawaitLoc, Stmt *Init,
2130                                     SourceLocation ColonLoc, Stmt *Range,
2131                                     Stmt *Begin, Stmt *End, Expr *Cond,
2132                                     Expr *Inc, Stmt *LoopVar,
2133                                     SourceLocation RParenLoc) {
2134     // If we've just learned that the range is actually an Objective-C
2135     // collection, treat this as an Objective-C fast enumeration loop.
2136     if (DeclStmt *RangeStmt = dyn_cast<DeclStmt>(Range)) {
2137       if (RangeStmt->isSingleDecl()) {
2138         if (VarDecl *RangeVar = dyn_cast<VarDecl>(RangeStmt->getSingleDecl())) {
2139           if (RangeVar->isInvalidDecl())
2140             return StmtError();
2141 
2142           Expr *RangeExpr = RangeVar->getInit();
2143           if (!RangeExpr->isTypeDependent() &&
2144               RangeExpr->getType()->isObjCObjectPointerType()) {
2145             // FIXME: Support init-statements in Objective-C++20 ranged for
2146             // statement.
2147             if (Init) {
2148               return SemaRef.Diag(Init->getBeginLoc(),
2149                                   diag::err_objc_for_range_init_stmt)
2150                          << Init->getSourceRange();
2151             }
2152             return getSema().ActOnObjCForCollectionStmt(ForLoc, LoopVar,
2153                                                         RangeExpr, RParenLoc);
2154           }
2155         }
2156       }
2157     }
2158 
2159     return getSema().BuildCXXForRangeStmt(ForLoc, CoawaitLoc, Init, ColonLoc,
2160                                           Range, Begin, End, Cond, Inc, LoopVar,
2161                                           RParenLoc, Sema::BFRK_Rebuild);
2162   }
2163 
2164   /// Build a new C++0x range-based for statement.
2165   ///
2166   /// By default, performs semantic analysis to build the new statement.
2167   /// Subclasses may override this routine to provide different behavior.
2168   StmtResult RebuildMSDependentExistsStmt(SourceLocation KeywordLoc,
2169                                           bool IsIfExists,
2170                                           NestedNameSpecifierLoc QualifierLoc,
2171                                           DeclarationNameInfo NameInfo,
2172                                           Stmt *Nested) {
2173     return getSema().BuildMSDependentExistsStmt(KeywordLoc, IsIfExists,
2174                                                 QualifierLoc, NameInfo, Nested);
2175   }
2176 
2177   /// Attach body to a C++0x range-based for statement.
2178   ///
2179   /// By default, performs semantic analysis to finish the new statement.
2180   /// Subclasses may override this routine to provide different behavior.
2181   StmtResult FinishCXXForRangeStmt(Stmt *ForRange, Stmt *Body) {
2182     return getSema().FinishCXXForRangeStmt(ForRange, Body);
2183   }
2184 
2185   StmtResult RebuildSEHTryStmt(bool IsCXXTry, SourceLocation TryLoc,
2186                                Stmt *TryBlock, Stmt *Handler) {
2187     return getSema().ActOnSEHTryBlock(IsCXXTry, TryLoc, TryBlock, Handler);
2188   }
2189 
2190   StmtResult RebuildSEHExceptStmt(SourceLocation Loc, Expr *FilterExpr,
2191                                   Stmt *Block) {
2192     return getSema().ActOnSEHExceptBlock(Loc, FilterExpr, Block);
2193   }
2194 
2195   StmtResult RebuildSEHFinallyStmt(SourceLocation Loc, Stmt *Block) {
2196     return SEHFinallyStmt::Create(getSema().getASTContext(), Loc, Block);
2197   }
2198 
2199   /// Build a new predefined expression.
2200   ///
2201   /// By default, performs semantic analysis to build the new expression.
2202   /// Subclasses may override this routine to provide different behavior.
2203   ExprResult RebuildPredefinedExpr(SourceLocation Loc,
2204                                    PredefinedExpr::IdentKind IK) {
2205     return getSema().BuildPredefinedExpr(Loc, IK);
2206   }
2207 
2208   /// Build a new expression that references a declaration.
2209   ///
2210   /// By default, performs semantic analysis to build the new expression.
2211   /// Subclasses may override this routine to provide different behavior.
2212   ExprResult RebuildDeclarationNameExpr(const CXXScopeSpec &SS,
2213                                         LookupResult &R,
2214                                         bool RequiresADL) {
2215     return getSema().BuildDeclarationNameExpr(SS, R, RequiresADL);
2216   }
2217 
2218 
2219   /// Build a new expression that references a declaration.
2220   ///
2221   /// By default, performs semantic analysis to build the new expression.
2222   /// Subclasses may override this routine to provide different behavior.
2223   ExprResult RebuildDeclRefExpr(NestedNameSpecifierLoc QualifierLoc,
2224                                 ValueDecl *VD,
2225                                 const DeclarationNameInfo &NameInfo,
2226                                 NamedDecl *Found,
2227                                 TemplateArgumentListInfo *TemplateArgs) {
2228     CXXScopeSpec SS;
2229     SS.Adopt(QualifierLoc);
2230     return getSema().BuildDeclarationNameExpr(SS, NameInfo, VD, Found,
2231                                               TemplateArgs);
2232   }
2233 
2234   /// Build a new expression in parentheses.
2235   ///
2236   /// By default, performs semantic analysis to build the new expression.
2237   /// Subclasses may override this routine to provide different behavior.
2238   ExprResult RebuildParenExpr(Expr *SubExpr, SourceLocation LParen,
2239                                     SourceLocation RParen) {
2240     return getSema().ActOnParenExpr(LParen, RParen, SubExpr);
2241   }
2242 
2243   /// Build a new pseudo-destructor expression.
2244   ///
2245   /// By default, performs semantic analysis to build the new expression.
2246   /// Subclasses may override this routine to provide different behavior.
2247   ExprResult RebuildCXXPseudoDestructorExpr(Expr *Base,
2248                                             SourceLocation OperatorLoc,
2249                                             bool isArrow,
2250                                             CXXScopeSpec &SS,
2251                                             TypeSourceInfo *ScopeType,
2252                                             SourceLocation CCLoc,
2253                                             SourceLocation TildeLoc,
2254                                         PseudoDestructorTypeStorage Destroyed);
2255 
2256   /// Build a new unary operator 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 RebuildUnaryOperator(SourceLocation OpLoc,
2261                                         UnaryOperatorKind Opc,
2262                                         Expr *SubExpr) {
2263     return getSema().BuildUnaryOp(/*Scope=*/nullptr, OpLoc, Opc, SubExpr);
2264   }
2265 
2266   /// Build a new builtin offsetof expression.
2267   ///
2268   /// By default, performs semantic analysis to build the new expression.
2269   /// Subclasses may override this routine to provide different behavior.
2270   ExprResult RebuildOffsetOfExpr(SourceLocation OperatorLoc,
2271                                  TypeSourceInfo *Type,
2272                                  ArrayRef<Sema::OffsetOfComponent> Components,
2273                                  SourceLocation RParenLoc) {
2274     return getSema().BuildBuiltinOffsetOf(OperatorLoc, Type, Components,
2275                                           RParenLoc);
2276   }
2277 
2278   /// Build a new sizeof, alignof or vec_step expression with a
2279   /// type argument.
2280   ///
2281   /// By default, performs semantic analysis to build the new expression.
2282   /// Subclasses may override this routine to provide different behavior.
2283   ExprResult RebuildUnaryExprOrTypeTrait(TypeSourceInfo *TInfo,
2284                                          SourceLocation OpLoc,
2285                                          UnaryExprOrTypeTrait ExprKind,
2286                                          SourceRange R) {
2287     return getSema().CreateUnaryExprOrTypeTraitExpr(TInfo, OpLoc, ExprKind, R);
2288   }
2289 
2290   /// Build a new sizeof, alignof or vec step expression with an
2291   /// expression argument.
2292   ///
2293   /// By default, performs semantic analysis to build the new expression.
2294   /// Subclasses may override this routine to provide different behavior.
2295   ExprResult RebuildUnaryExprOrTypeTrait(Expr *SubExpr, SourceLocation OpLoc,
2296                                          UnaryExprOrTypeTrait ExprKind,
2297                                          SourceRange R) {
2298     ExprResult Result
2299       = getSema().CreateUnaryExprOrTypeTraitExpr(SubExpr, OpLoc, ExprKind);
2300     if (Result.isInvalid())
2301       return ExprError();
2302 
2303     return Result;
2304   }
2305 
2306   /// Build a new array subscript expression.
2307   ///
2308   /// By default, performs semantic analysis to build the new expression.
2309   /// Subclasses may override this routine to provide different behavior.
2310   ExprResult RebuildArraySubscriptExpr(Expr *LHS,
2311                                              SourceLocation LBracketLoc,
2312                                              Expr *RHS,
2313                                              SourceLocation RBracketLoc) {
2314     return getSema().ActOnArraySubscriptExpr(/*Scope=*/nullptr, LHS,
2315                                              LBracketLoc, RHS,
2316                                              RBracketLoc);
2317   }
2318 
2319   /// Build a new array section expression.
2320   ///
2321   /// By default, performs semantic analysis to build the new expression.
2322   /// Subclasses may override this routine to provide different behavior.
2323   ExprResult RebuildOMPArraySectionExpr(Expr *Base, SourceLocation LBracketLoc,
2324                                         Expr *LowerBound,
2325                                         SourceLocation ColonLoc, Expr *Length,
2326                                         SourceLocation RBracketLoc) {
2327     return getSema().ActOnOMPArraySectionExpr(Base, LBracketLoc, LowerBound,
2328                                               ColonLoc, Length, RBracketLoc);
2329   }
2330 
2331   /// Build a new call expression.
2332   ///
2333   /// By default, performs semantic analysis to build the new expression.
2334   /// Subclasses may override this routine to provide different behavior.
2335   ExprResult RebuildCallExpr(Expr *Callee, SourceLocation LParenLoc,
2336                                    MultiExprArg Args,
2337                                    SourceLocation RParenLoc,
2338                                    Expr *ExecConfig = nullptr) {
2339     return getSema().BuildCallExpr(/*Scope=*/nullptr, Callee, LParenLoc, Args,
2340                                    RParenLoc, ExecConfig);
2341   }
2342 
2343   /// Build a new member access expression.
2344   ///
2345   /// By default, performs semantic analysis to build the new expression.
2346   /// Subclasses may override this routine to provide different behavior.
2347   ExprResult RebuildMemberExpr(Expr *Base, SourceLocation OpLoc,
2348                                bool isArrow,
2349                                NestedNameSpecifierLoc QualifierLoc,
2350                                SourceLocation TemplateKWLoc,
2351                                const DeclarationNameInfo &MemberNameInfo,
2352                                ValueDecl *Member,
2353                                NamedDecl *FoundDecl,
2354                         const TemplateArgumentListInfo *ExplicitTemplateArgs,
2355                                NamedDecl *FirstQualifierInScope) {
2356     ExprResult BaseResult = getSema().PerformMemberExprBaseConversion(Base,
2357                                                                       isArrow);
2358     if (!Member->getDeclName()) {
2359       // We have a reference to an unnamed field.  This is always the
2360       // base of an anonymous struct/union member access, i.e. the
2361       // field is always of record type.
2362       assert(Member->getType()->isRecordType() &&
2363              "unnamed member not of record type?");
2364 
2365       BaseResult =
2366         getSema().PerformObjectMemberConversion(BaseResult.get(),
2367                                                 QualifierLoc.getNestedNameSpecifier(),
2368                                                 FoundDecl, Member);
2369       if (BaseResult.isInvalid())
2370         return ExprError();
2371       Base = BaseResult.get();
2372 
2373       CXXScopeSpec EmptySS;
2374       return getSema().BuildFieldReferenceExpr(
2375           Base, isArrow, OpLoc, EmptySS, cast<FieldDecl>(Member),
2376           DeclAccessPair::make(FoundDecl, FoundDecl->getAccess()), MemberNameInfo);
2377     }
2378 
2379     CXXScopeSpec SS;
2380     SS.Adopt(QualifierLoc);
2381 
2382     Base = BaseResult.get();
2383     QualType BaseType = Base->getType();
2384 
2385     if (isArrow && !BaseType->isPointerType())
2386       return ExprError();
2387 
2388     // FIXME: this involves duplicating earlier analysis in a lot of
2389     // cases; we should avoid this when possible.
2390     LookupResult R(getSema(), MemberNameInfo, Sema::LookupMemberName);
2391     R.addDecl(FoundDecl);
2392     R.resolveKind();
2393 
2394     return getSema().BuildMemberReferenceExpr(Base, BaseType, OpLoc, isArrow,
2395                                               SS, TemplateKWLoc,
2396                                               FirstQualifierInScope,
2397                                               R, ExplicitTemplateArgs,
2398                                               /*S*/nullptr);
2399   }
2400 
2401   /// Build a new binary 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 RebuildBinaryOperator(SourceLocation OpLoc,
2406                                          BinaryOperatorKind Opc,
2407                                          Expr *LHS, Expr *RHS) {
2408     return getSema().BuildBinOp(/*Scope=*/nullptr, OpLoc, Opc, LHS, RHS);
2409   }
2410 
2411   /// Build a new rewritten operator expression.
2412   ///
2413   /// By default, performs semantic analysis to build the new expression.
2414   /// Subclasses may override this routine to provide different behavior.
2415   ExprResult RebuildCXXRewrittenBinaryOperator(
2416       SourceLocation OpLoc, BinaryOperatorKind Opcode,
2417       const UnresolvedSetImpl &UnqualLookups, Expr *LHS, Expr *RHS) {
2418     return getSema().CreateOverloadedBinOp(OpLoc, Opcode, UnqualLookups, LHS,
2419                                            RHS, /*RequiresADL*/false);
2420   }
2421 
2422   /// Build a new conditional operator expression.
2423   ///
2424   /// By default, performs semantic analysis to build the new expression.
2425   /// Subclasses may override this routine to provide different behavior.
2426   ExprResult RebuildConditionalOperator(Expr *Cond,
2427                                         SourceLocation QuestionLoc,
2428                                         Expr *LHS,
2429                                         SourceLocation ColonLoc,
2430                                         Expr *RHS) {
2431     return getSema().ActOnConditionalOp(QuestionLoc, ColonLoc, Cond,
2432                                         LHS, RHS);
2433   }
2434 
2435   /// Build a new C-style cast expression.
2436   ///
2437   /// By default, performs semantic analysis to build the new expression.
2438   /// Subclasses may override this routine to provide different behavior.
2439   ExprResult RebuildCStyleCastExpr(SourceLocation LParenLoc,
2440                                          TypeSourceInfo *TInfo,
2441                                          SourceLocation RParenLoc,
2442                                          Expr *SubExpr) {
2443     return getSema().BuildCStyleCastExpr(LParenLoc, TInfo, RParenLoc,
2444                                          SubExpr);
2445   }
2446 
2447   /// Build a new compound literal expression.
2448   ///
2449   /// By default, performs semantic analysis to build the new expression.
2450   /// Subclasses may override this routine to provide different behavior.
2451   ExprResult RebuildCompoundLiteralExpr(SourceLocation LParenLoc,
2452                                               TypeSourceInfo *TInfo,
2453                                               SourceLocation RParenLoc,
2454                                               Expr *Init) {
2455     return getSema().BuildCompoundLiteralExpr(LParenLoc, TInfo, RParenLoc,
2456                                               Init);
2457   }
2458 
2459   /// Build a new extended vector element access expression.
2460   ///
2461   /// By default, performs semantic analysis to build the new expression.
2462   /// Subclasses may override this routine to provide different behavior.
2463   ExprResult RebuildExtVectorElementExpr(Expr *Base,
2464                                                SourceLocation OpLoc,
2465                                                SourceLocation AccessorLoc,
2466                                                IdentifierInfo &Accessor) {
2467 
2468     CXXScopeSpec SS;
2469     DeclarationNameInfo NameInfo(&Accessor, AccessorLoc);
2470     return getSema().BuildMemberReferenceExpr(Base, Base->getType(),
2471                                               OpLoc, /*IsArrow*/ false,
2472                                               SS, SourceLocation(),
2473                                               /*FirstQualifierInScope*/ nullptr,
2474                                               NameInfo,
2475                                               /* TemplateArgs */ nullptr,
2476                                               /*S*/ nullptr);
2477   }
2478 
2479   /// Build a new initializer list 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 RebuildInitList(SourceLocation LBraceLoc,
2484                              MultiExprArg Inits,
2485                              SourceLocation RBraceLoc) {
2486     return SemaRef.BuildInitList(LBraceLoc, Inits, RBraceLoc);
2487   }
2488 
2489   /// Build a new designated initializer expression.
2490   ///
2491   /// By default, performs semantic analysis to build the new expression.
2492   /// Subclasses may override this routine to provide different behavior.
2493   ExprResult RebuildDesignatedInitExpr(Designation &Desig,
2494                                              MultiExprArg ArrayExprs,
2495                                              SourceLocation EqualOrColonLoc,
2496                                              bool GNUSyntax,
2497                                              Expr *Init) {
2498     ExprResult Result
2499       = SemaRef.ActOnDesignatedInitializer(Desig, EqualOrColonLoc, GNUSyntax,
2500                                            Init);
2501     if (Result.isInvalid())
2502       return ExprError();
2503 
2504     return Result;
2505   }
2506 
2507   /// Build a new value-initialized expression.
2508   ///
2509   /// By default, builds the implicit value initialization without performing
2510   /// any semantic analysis. Subclasses may override this routine to provide
2511   /// different behavior.
2512   ExprResult RebuildImplicitValueInitExpr(QualType T) {
2513     return new (SemaRef.Context) ImplicitValueInitExpr(T);
2514   }
2515 
2516   /// Build a new \c va_arg expression.
2517   ///
2518   /// By default, performs semantic analysis to build the new expression.
2519   /// Subclasses may override this routine to provide different behavior.
2520   ExprResult RebuildVAArgExpr(SourceLocation BuiltinLoc,
2521                                     Expr *SubExpr, TypeSourceInfo *TInfo,
2522                                     SourceLocation RParenLoc) {
2523     return getSema().BuildVAArgExpr(BuiltinLoc,
2524                                     SubExpr, TInfo,
2525                                     RParenLoc);
2526   }
2527 
2528   /// Build a new expression list in parentheses.
2529   ///
2530   /// By default, performs semantic analysis to build the new expression.
2531   /// Subclasses may override this routine to provide different behavior.
2532   ExprResult RebuildParenListExpr(SourceLocation LParenLoc,
2533                                   MultiExprArg SubExprs,
2534                                   SourceLocation RParenLoc) {
2535     return getSema().ActOnParenListExpr(LParenLoc, RParenLoc, SubExprs);
2536   }
2537 
2538   /// Build a new address-of-label expression.
2539   ///
2540   /// By default, performs semantic analysis, using the name of the label
2541   /// rather than attempting to map the label statement itself.
2542   /// Subclasses may override this routine to provide different behavior.
2543   ExprResult RebuildAddrLabelExpr(SourceLocation AmpAmpLoc,
2544                                   SourceLocation LabelLoc, LabelDecl *Label) {
2545     return getSema().ActOnAddrLabel(AmpAmpLoc, LabelLoc, Label);
2546   }
2547 
2548   /// Build a new GNU statement 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 RebuildStmtExpr(SourceLocation LParenLoc,
2553                                    Stmt *SubStmt,
2554                                    SourceLocation RParenLoc) {
2555     return getSema().ActOnStmtExpr(LParenLoc, SubStmt, RParenLoc);
2556   }
2557 
2558   /// Build a new __builtin_choose_expr expression.
2559   ///
2560   /// By default, performs semantic analysis to build the new expression.
2561   /// Subclasses may override this routine to provide different behavior.
2562   ExprResult RebuildChooseExpr(SourceLocation BuiltinLoc,
2563                                      Expr *Cond, Expr *LHS, Expr *RHS,
2564                                      SourceLocation RParenLoc) {
2565     return SemaRef.ActOnChooseExpr(BuiltinLoc,
2566                                    Cond, LHS, RHS,
2567                                    RParenLoc);
2568   }
2569 
2570   /// Build a new generic selection expression.
2571   ///
2572   /// By default, performs semantic analysis to build the new expression.
2573   /// Subclasses may override this routine to provide different behavior.
2574   ExprResult RebuildGenericSelectionExpr(SourceLocation KeyLoc,
2575                                          SourceLocation DefaultLoc,
2576                                          SourceLocation RParenLoc,
2577                                          Expr *ControllingExpr,
2578                                          ArrayRef<TypeSourceInfo *> Types,
2579                                          ArrayRef<Expr *> Exprs) {
2580     return getSema().CreateGenericSelectionExpr(KeyLoc, DefaultLoc, RParenLoc,
2581                                                 ControllingExpr, Types, Exprs);
2582   }
2583 
2584   /// Build a new overloaded operator call expression.
2585   ///
2586   /// By default, performs semantic analysis to build the new expression.
2587   /// The semantic analysis provides the behavior of template instantiation,
2588   /// copying with transformations that turn what looks like an overloaded
2589   /// operator call into a use of a builtin operator, performing
2590   /// argument-dependent lookup, etc. Subclasses may override this routine to
2591   /// provide different behavior.
2592   ExprResult RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op,
2593                                               SourceLocation OpLoc,
2594                                               Expr *Callee,
2595                                               Expr *First,
2596                                               Expr *Second);
2597 
2598   /// Build a new C++ "named" cast expression, such as static_cast or
2599   /// reinterpret_cast.
2600   ///
2601   /// By default, this routine dispatches to one of the more-specific routines
2602   /// for a particular named case, e.g., RebuildCXXStaticCastExpr().
2603   /// Subclasses may override this routine to provide different behavior.
2604   ExprResult RebuildCXXNamedCastExpr(SourceLocation OpLoc,
2605                                            Stmt::StmtClass Class,
2606                                            SourceLocation LAngleLoc,
2607                                            TypeSourceInfo *TInfo,
2608                                            SourceLocation RAngleLoc,
2609                                            SourceLocation LParenLoc,
2610                                            Expr *SubExpr,
2611                                            SourceLocation RParenLoc) {
2612     switch (Class) {
2613     case Stmt::CXXStaticCastExprClass:
2614       return getDerived().RebuildCXXStaticCastExpr(OpLoc, LAngleLoc, TInfo,
2615                                                    RAngleLoc, LParenLoc,
2616                                                    SubExpr, RParenLoc);
2617 
2618     case Stmt::CXXDynamicCastExprClass:
2619       return getDerived().RebuildCXXDynamicCastExpr(OpLoc, LAngleLoc, TInfo,
2620                                                     RAngleLoc, LParenLoc,
2621                                                     SubExpr, RParenLoc);
2622 
2623     case Stmt::CXXReinterpretCastExprClass:
2624       return getDerived().RebuildCXXReinterpretCastExpr(OpLoc, LAngleLoc, TInfo,
2625                                                         RAngleLoc, LParenLoc,
2626                                                         SubExpr,
2627                                                         RParenLoc);
2628 
2629     case Stmt::CXXConstCastExprClass:
2630       return getDerived().RebuildCXXConstCastExpr(OpLoc, LAngleLoc, TInfo,
2631                                                    RAngleLoc, LParenLoc,
2632                                                    SubExpr, RParenLoc);
2633 
2634     default:
2635       llvm_unreachable("Invalid C++ named cast");
2636     }
2637   }
2638 
2639   /// Build a new C++ static_cast expression.
2640   ///
2641   /// By default, performs semantic analysis to build the new expression.
2642   /// Subclasses may override this routine to provide different behavior.
2643   ExprResult RebuildCXXStaticCastExpr(SourceLocation OpLoc,
2644                                             SourceLocation LAngleLoc,
2645                                             TypeSourceInfo *TInfo,
2646                                             SourceLocation RAngleLoc,
2647                                             SourceLocation LParenLoc,
2648                                             Expr *SubExpr,
2649                                             SourceLocation RParenLoc) {
2650     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_static_cast,
2651                                        TInfo, SubExpr,
2652                                        SourceRange(LAngleLoc, RAngleLoc),
2653                                        SourceRange(LParenLoc, RParenLoc));
2654   }
2655 
2656   /// Build a new C++ dynamic_cast expression.
2657   ///
2658   /// By default, performs semantic analysis to build the new expression.
2659   /// Subclasses may override this routine to provide different behavior.
2660   ExprResult RebuildCXXDynamicCastExpr(SourceLocation OpLoc,
2661                                              SourceLocation LAngleLoc,
2662                                              TypeSourceInfo *TInfo,
2663                                              SourceLocation RAngleLoc,
2664                                              SourceLocation LParenLoc,
2665                                              Expr *SubExpr,
2666                                              SourceLocation RParenLoc) {
2667     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_dynamic_cast,
2668                                        TInfo, SubExpr,
2669                                        SourceRange(LAngleLoc, RAngleLoc),
2670                                        SourceRange(LParenLoc, RParenLoc));
2671   }
2672 
2673   /// Build a new C++ reinterpret_cast expression.
2674   ///
2675   /// By default, performs semantic analysis to build the new expression.
2676   /// Subclasses may override this routine to provide different behavior.
2677   ExprResult RebuildCXXReinterpretCastExpr(SourceLocation OpLoc,
2678                                                  SourceLocation LAngleLoc,
2679                                                  TypeSourceInfo *TInfo,
2680                                                  SourceLocation RAngleLoc,
2681                                                  SourceLocation LParenLoc,
2682                                                  Expr *SubExpr,
2683                                                  SourceLocation RParenLoc) {
2684     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_reinterpret_cast,
2685                                        TInfo, SubExpr,
2686                                        SourceRange(LAngleLoc, RAngleLoc),
2687                                        SourceRange(LParenLoc, RParenLoc));
2688   }
2689 
2690   /// Build a new C++ const_cast expression.
2691   ///
2692   /// By default, performs semantic analysis to build the new expression.
2693   /// Subclasses may override this routine to provide different behavior.
2694   ExprResult RebuildCXXConstCastExpr(SourceLocation OpLoc,
2695                                            SourceLocation LAngleLoc,
2696                                            TypeSourceInfo *TInfo,
2697                                            SourceLocation RAngleLoc,
2698                                            SourceLocation LParenLoc,
2699                                            Expr *SubExpr,
2700                                            SourceLocation RParenLoc) {
2701     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_const_cast,
2702                                        TInfo, SubExpr,
2703                                        SourceRange(LAngleLoc, RAngleLoc),
2704                                        SourceRange(LParenLoc, RParenLoc));
2705   }
2706 
2707   /// Build a new C++ functional-style cast expression.
2708   ///
2709   /// By default, performs semantic analysis to build the new expression.
2710   /// Subclasses may override this routine to provide different behavior.
2711   ExprResult RebuildCXXFunctionalCastExpr(TypeSourceInfo *TInfo,
2712                                           SourceLocation LParenLoc,
2713                                           Expr *Sub,
2714                                           SourceLocation RParenLoc,
2715                                           bool ListInitialization) {
2716     return getSema().BuildCXXTypeConstructExpr(TInfo, LParenLoc,
2717                                                MultiExprArg(&Sub, 1), RParenLoc,
2718                                                ListInitialization);
2719   }
2720 
2721   /// Build a new C++ __builtin_bit_cast 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 RebuildBuiltinBitCastExpr(SourceLocation KWLoc,
2726                                        TypeSourceInfo *TSI, Expr *Sub,
2727                                        SourceLocation RParenLoc) {
2728     return getSema().BuildBuiltinBitCastExpr(KWLoc, TSI, Sub, RParenLoc);
2729   }
2730 
2731   /// Build a new C++ typeid(type) expression.
2732   ///
2733   /// By default, performs semantic analysis to build the new expression.
2734   /// Subclasses may override this routine to provide different behavior.
2735   ExprResult RebuildCXXTypeidExpr(QualType TypeInfoType,
2736                                         SourceLocation TypeidLoc,
2737                                         TypeSourceInfo *Operand,
2738                                         SourceLocation RParenLoc) {
2739     return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand,
2740                                     RParenLoc);
2741   }
2742 
2743 
2744   /// Build a new C++ typeid(expr) expression.
2745   ///
2746   /// By default, performs semantic analysis to build the new expression.
2747   /// Subclasses may override this routine to provide different behavior.
2748   ExprResult RebuildCXXTypeidExpr(QualType TypeInfoType,
2749                                         SourceLocation TypeidLoc,
2750                                         Expr *Operand,
2751                                         SourceLocation RParenLoc) {
2752     return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand,
2753                                     RParenLoc);
2754   }
2755 
2756   /// Build a new C++ __uuidof(type) expression.
2757   ///
2758   /// By default, performs semantic analysis to build the new expression.
2759   /// Subclasses may override this routine to provide different behavior.
2760   ExprResult RebuildCXXUuidofExpr(QualType TypeInfoType,
2761                                         SourceLocation TypeidLoc,
2762                                         TypeSourceInfo *Operand,
2763                                         SourceLocation RParenLoc) {
2764     return getSema().BuildCXXUuidof(TypeInfoType, TypeidLoc, Operand,
2765                                     RParenLoc);
2766   }
2767 
2768   /// Build a new C++ __uuidof(expr) expression.
2769   ///
2770   /// By default, performs semantic analysis to build the new expression.
2771   /// Subclasses may override this routine to provide different behavior.
2772   ExprResult RebuildCXXUuidofExpr(QualType TypeInfoType,
2773                                         SourceLocation TypeidLoc,
2774                                         Expr *Operand,
2775                                         SourceLocation RParenLoc) {
2776     return getSema().BuildCXXUuidof(TypeInfoType, TypeidLoc, Operand,
2777                                     RParenLoc);
2778   }
2779 
2780   /// Build a new C++ "this" expression.
2781   ///
2782   /// By default, builds a new "this" expression without performing any
2783   /// semantic analysis. Subclasses may override this routine to provide
2784   /// different behavior.
2785   ExprResult RebuildCXXThisExpr(SourceLocation ThisLoc,
2786                                 QualType ThisType,
2787                                 bool isImplicit) {
2788     return getSema().BuildCXXThisExpr(ThisLoc, ThisType, isImplicit);
2789   }
2790 
2791   /// Build a new C++ throw expression.
2792   ///
2793   /// By default, performs semantic analysis to build the new expression.
2794   /// Subclasses may override this routine to provide different behavior.
2795   ExprResult RebuildCXXThrowExpr(SourceLocation ThrowLoc, Expr *Sub,
2796                                  bool IsThrownVariableInScope) {
2797     return getSema().BuildCXXThrow(ThrowLoc, Sub, IsThrownVariableInScope);
2798   }
2799 
2800   /// Build a new C++ default-argument expression.
2801   ///
2802   /// By default, builds a new default-argument expression, which does not
2803   /// require any semantic analysis. Subclasses may override this routine to
2804   /// provide different behavior.
2805   ExprResult RebuildCXXDefaultArgExpr(SourceLocation Loc, ParmVarDecl *Param) {
2806     return CXXDefaultArgExpr::Create(getSema().Context, Loc, Param,
2807                                      getSema().CurContext);
2808   }
2809 
2810   /// Build a new C++11 default-initialization expression.
2811   ///
2812   /// By default, builds a new default field initialization expression, which
2813   /// does not require any semantic analysis. Subclasses may override this
2814   /// routine to provide different behavior.
2815   ExprResult RebuildCXXDefaultInitExpr(SourceLocation Loc,
2816                                        FieldDecl *Field) {
2817     return CXXDefaultInitExpr::Create(getSema().Context, Loc, Field,
2818                                       getSema().CurContext);
2819   }
2820 
2821   /// Build a new C++ zero-initialization expression.
2822   ///
2823   /// By default, performs semantic analysis to build the new expression.
2824   /// Subclasses may override this routine to provide different behavior.
2825   ExprResult RebuildCXXScalarValueInitExpr(TypeSourceInfo *TSInfo,
2826                                            SourceLocation LParenLoc,
2827                                            SourceLocation RParenLoc) {
2828     return getSema().BuildCXXTypeConstructExpr(
2829         TSInfo, LParenLoc, None, RParenLoc, /*ListInitialization=*/false);
2830   }
2831 
2832   /// Build a new C++ "new" expression.
2833   ///
2834   /// By default, performs semantic analysis to build the new expression.
2835   /// Subclasses may override this routine to provide different behavior.
2836   ExprResult RebuildCXXNewExpr(SourceLocation StartLoc,
2837                                bool UseGlobal,
2838                                SourceLocation PlacementLParen,
2839                                MultiExprArg PlacementArgs,
2840                                SourceLocation PlacementRParen,
2841                                SourceRange TypeIdParens,
2842                                QualType AllocatedType,
2843                                TypeSourceInfo *AllocatedTypeInfo,
2844                                Optional<Expr *> ArraySize,
2845                                SourceRange DirectInitRange,
2846                                Expr *Initializer) {
2847     return getSema().BuildCXXNew(StartLoc, UseGlobal,
2848                                  PlacementLParen,
2849                                  PlacementArgs,
2850                                  PlacementRParen,
2851                                  TypeIdParens,
2852                                  AllocatedType,
2853                                  AllocatedTypeInfo,
2854                                  ArraySize,
2855                                  DirectInitRange,
2856                                  Initializer);
2857   }
2858 
2859   /// Build a new C++ "delete" expression.
2860   ///
2861   /// By default, performs semantic analysis to build the new expression.
2862   /// Subclasses may override this routine to provide different behavior.
2863   ExprResult RebuildCXXDeleteExpr(SourceLocation StartLoc,
2864                                         bool IsGlobalDelete,
2865                                         bool IsArrayForm,
2866                                         Expr *Operand) {
2867     return getSema().ActOnCXXDelete(StartLoc, IsGlobalDelete, IsArrayForm,
2868                                     Operand);
2869   }
2870 
2871   /// Build a new type trait expression.
2872   ///
2873   /// By default, performs semantic analysis to build the new expression.
2874   /// Subclasses may override this routine to provide different behavior.
2875   ExprResult RebuildTypeTrait(TypeTrait Trait,
2876                               SourceLocation StartLoc,
2877                               ArrayRef<TypeSourceInfo *> Args,
2878                               SourceLocation RParenLoc) {
2879     return getSema().BuildTypeTrait(Trait, StartLoc, Args, RParenLoc);
2880   }
2881 
2882   /// Build a new array type trait expression.
2883   ///
2884   /// By default, performs semantic analysis to build the new expression.
2885   /// Subclasses may override this routine to provide different behavior.
2886   ExprResult RebuildArrayTypeTrait(ArrayTypeTrait Trait,
2887                                    SourceLocation StartLoc,
2888                                    TypeSourceInfo *TSInfo,
2889                                    Expr *DimExpr,
2890                                    SourceLocation RParenLoc) {
2891     return getSema().BuildArrayTypeTrait(Trait, StartLoc, TSInfo, DimExpr, RParenLoc);
2892   }
2893 
2894   /// Build a new expression trait expression.
2895   ///
2896   /// By default, performs semantic analysis to build the new expression.
2897   /// Subclasses may override this routine to provide different behavior.
2898   ExprResult RebuildExpressionTrait(ExpressionTrait Trait,
2899                                    SourceLocation StartLoc,
2900                                    Expr *Queried,
2901                                    SourceLocation RParenLoc) {
2902     return getSema().BuildExpressionTrait(Trait, StartLoc, Queried, RParenLoc);
2903   }
2904 
2905   /// Build a new (previously unresolved) declaration reference
2906   /// expression.
2907   ///
2908   /// By default, performs semantic analysis to build the new expression.
2909   /// Subclasses may override this routine to provide different behavior.
2910   ExprResult RebuildDependentScopeDeclRefExpr(
2911                                           NestedNameSpecifierLoc QualifierLoc,
2912                                           SourceLocation TemplateKWLoc,
2913                                        const DeclarationNameInfo &NameInfo,
2914                               const TemplateArgumentListInfo *TemplateArgs,
2915                                           bool IsAddressOfOperand,
2916                                           TypeSourceInfo **RecoveryTSI) {
2917     CXXScopeSpec SS;
2918     SS.Adopt(QualifierLoc);
2919 
2920     if (TemplateArgs || TemplateKWLoc.isValid())
2921       return getSema().BuildQualifiedTemplateIdExpr(SS, TemplateKWLoc, NameInfo,
2922                                                     TemplateArgs);
2923 
2924     return getSema().BuildQualifiedDeclarationNameExpr(
2925         SS, NameInfo, IsAddressOfOperand, /*S*/nullptr, RecoveryTSI);
2926   }
2927 
2928   /// Build a new template-id expression.
2929   ///
2930   /// By default, performs semantic analysis to build the new expression.
2931   /// Subclasses may override this routine to provide different behavior.
2932   ExprResult RebuildTemplateIdExpr(const CXXScopeSpec &SS,
2933                                    SourceLocation TemplateKWLoc,
2934                                    LookupResult &R,
2935                                    bool RequiresADL,
2936                               const TemplateArgumentListInfo *TemplateArgs) {
2937     return getSema().BuildTemplateIdExpr(SS, TemplateKWLoc, R, RequiresADL,
2938                                          TemplateArgs);
2939   }
2940 
2941   /// Build a new object-construction expression.
2942   ///
2943   /// By default, performs semantic analysis to build the new expression.
2944   /// Subclasses may override this routine to provide different behavior.
2945   ExprResult RebuildCXXConstructExpr(QualType T,
2946                                      SourceLocation Loc,
2947                                      CXXConstructorDecl *Constructor,
2948                                      bool IsElidable,
2949                                      MultiExprArg Args,
2950                                      bool HadMultipleCandidates,
2951                                      bool ListInitialization,
2952                                      bool StdInitListInitialization,
2953                                      bool RequiresZeroInit,
2954                              CXXConstructExpr::ConstructionKind ConstructKind,
2955                                      SourceRange ParenRange) {
2956     SmallVector<Expr*, 8> ConvertedArgs;
2957     if (getSema().CompleteConstructorCall(Constructor, Args, Loc,
2958                                           ConvertedArgs))
2959       return ExprError();
2960 
2961     return getSema().BuildCXXConstructExpr(Loc, T, Constructor,
2962                                            IsElidable,
2963                                            ConvertedArgs,
2964                                            HadMultipleCandidates,
2965                                            ListInitialization,
2966                                            StdInitListInitialization,
2967                                            RequiresZeroInit, ConstructKind,
2968                                            ParenRange);
2969   }
2970 
2971   /// Build a new implicit construction via inherited constructor
2972   /// expression.
2973   ExprResult RebuildCXXInheritedCtorInitExpr(QualType T, SourceLocation Loc,
2974                                              CXXConstructorDecl *Constructor,
2975                                              bool ConstructsVBase,
2976                                              bool InheritedFromVBase) {
2977     return new (getSema().Context) CXXInheritedCtorInitExpr(
2978         Loc, T, Constructor, ConstructsVBase, InheritedFromVBase);
2979   }
2980 
2981   /// Build a new object-construction expression.
2982   ///
2983   /// By default, performs semantic analysis to build the new expression.
2984   /// Subclasses may override this routine to provide different behavior.
2985   ExprResult RebuildCXXTemporaryObjectExpr(TypeSourceInfo *TSInfo,
2986                                            SourceLocation LParenOrBraceLoc,
2987                                            MultiExprArg Args,
2988                                            SourceLocation RParenOrBraceLoc,
2989                                            bool ListInitialization) {
2990     return getSema().BuildCXXTypeConstructExpr(
2991         TSInfo, LParenOrBraceLoc, Args, RParenOrBraceLoc, ListInitialization);
2992   }
2993 
2994   /// Build a new object-construction expression.
2995   ///
2996   /// By default, performs semantic analysis to build the new expression.
2997   /// Subclasses may override this routine to provide different behavior.
2998   ExprResult RebuildCXXUnresolvedConstructExpr(TypeSourceInfo *TSInfo,
2999                                                SourceLocation LParenLoc,
3000                                                MultiExprArg Args,
3001                                                SourceLocation RParenLoc,
3002                                                bool ListInitialization) {
3003     return getSema().BuildCXXTypeConstructExpr(TSInfo, LParenLoc, Args,
3004                                                RParenLoc, ListInitialization);
3005   }
3006 
3007   /// Build a new member reference expression.
3008   ///
3009   /// By default, performs semantic analysis to build the new expression.
3010   /// Subclasses may override this routine to provide different behavior.
3011   ExprResult RebuildCXXDependentScopeMemberExpr(Expr *BaseE,
3012                                                 QualType BaseType,
3013                                                 bool IsArrow,
3014                                                 SourceLocation OperatorLoc,
3015                                           NestedNameSpecifierLoc QualifierLoc,
3016                                                 SourceLocation TemplateKWLoc,
3017                                             NamedDecl *FirstQualifierInScope,
3018                                    const DeclarationNameInfo &MemberNameInfo,
3019                               const TemplateArgumentListInfo *TemplateArgs) {
3020     CXXScopeSpec SS;
3021     SS.Adopt(QualifierLoc);
3022 
3023     return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType,
3024                                             OperatorLoc, IsArrow,
3025                                             SS, TemplateKWLoc,
3026                                             FirstQualifierInScope,
3027                                             MemberNameInfo,
3028                                             TemplateArgs, /*S*/nullptr);
3029   }
3030 
3031   /// Build a new member reference expression.
3032   ///
3033   /// By default, performs semantic analysis to build the new expression.
3034   /// Subclasses may override this routine to provide different behavior.
3035   ExprResult RebuildUnresolvedMemberExpr(Expr *BaseE, QualType BaseType,
3036                                          SourceLocation OperatorLoc,
3037                                          bool IsArrow,
3038                                          NestedNameSpecifierLoc QualifierLoc,
3039                                          SourceLocation TemplateKWLoc,
3040                                          NamedDecl *FirstQualifierInScope,
3041                                          LookupResult &R,
3042                                 const TemplateArgumentListInfo *TemplateArgs) {
3043     CXXScopeSpec SS;
3044     SS.Adopt(QualifierLoc);
3045 
3046     return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType,
3047                                             OperatorLoc, IsArrow,
3048                                             SS, TemplateKWLoc,
3049                                             FirstQualifierInScope,
3050                                             R, TemplateArgs, /*S*/nullptr);
3051   }
3052 
3053   /// Build a new noexcept expression.
3054   ///
3055   /// By default, performs semantic analysis to build the new expression.
3056   /// Subclasses may override this routine to provide different behavior.
3057   ExprResult RebuildCXXNoexceptExpr(SourceRange Range, Expr *Arg) {
3058     return SemaRef.BuildCXXNoexceptExpr(Range.getBegin(), Arg, Range.getEnd());
3059   }
3060 
3061   /// Build a new expression to compute the length of a parameter pack.
3062   ExprResult RebuildSizeOfPackExpr(SourceLocation OperatorLoc,
3063                                    NamedDecl *Pack,
3064                                    SourceLocation PackLoc,
3065                                    SourceLocation RParenLoc,
3066                                    Optional<unsigned> Length,
3067                                    ArrayRef<TemplateArgument> PartialArgs) {
3068     return SizeOfPackExpr::Create(SemaRef.Context, OperatorLoc, Pack, PackLoc,
3069                                   RParenLoc, Length, PartialArgs);
3070   }
3071 
3072   /// Build a new expression representing a call to a source location
3073   ///  builtin.
3074   ///
3075   /// By default, performs semantic analysis to build the new expression.
3076   /// Subclasses may override this routine to provide different behavior.
3077   ExprResult RebuildSourceLocExpr(SourceLocExpr::IdentKind Kind,
3078                                   SourceLocation BuiltinLoc,
3079                                   SourceLocation RPLoc,
3080                                   DeclContext *ParentContext) {
3081     return getSema().BuildSourceLocExpr(Kind, BuiltinLoc, RPLoc, ParentContext);
3082   }
3083 
3084   /// Build a new Objective-C boxed expression.
3085   ///
3086   /// By default, performs semantic analysis to build the new expression.
3087   /// Subclasses may override this routine to provide different behavior.
3088   ExprResult RebuildConceptSpecializationExpr(NestedNameSpecifierLoc NNS,
3089       SourceLocation TemplateKWLoc, DeclarationNameInfo ConceptNameInfo,
3090       NamedDecl *FoundDecl, ConceptDecl *NamedConcept,
3091       TemplateArgumentListInfo *TALI) {
3092     CXXScopeSpec SS;
3093     SS.Adopt(NNS);
3094     ExprResult Result = getSema().CheckConceptTemplateId(SS, TemplateKWLoc,
3095                                                          ConceptNameInfo,
3096                                                          FoundDecl,
3097                                                          NamedConcept, TALI);
3098     if (Result.isInvalid())
3099       return ExprError();
3100     return Result;
3101   }
3102 
3103   /// \brief Build a new requires expression.
3104   ///
3105   /// By default, performs semantic analysis to build the new expression.
3106   /// Subclasses may override this routine to provide different behavior.
3107   ExprResult RebuildRequiresExpr(SourceLocation RequiresKWLoc,
3108                                  RequiresExprBodyDecl *Body,
3109                                  ArrayRef<ParmVarDecl *> LocalParameters,
3110                                  ArrayRef<concepts::Requirement *> Requirements,
3111                                  SourceLocation ClosingBraceLoc) {
3112     return RequiresExpr::Create(SemaRef.Context, RequiresKWLoc, Body,
3113                                 LocalParameters, Requirements, ClosingBraceLoc);
3114   }
3115 
3116   concepts::TypeRequirement *
3117   RebuildTypeRequirement(
3118       concepts::Requirement::SubstitutionDiagnostic *SubstDiag) {
3119     return SemaRef.BuildTypeRequirement(SubstDiag);
3120   }
3121 
3122   concepts::TypeRequirement *RebuildTypeRequirement(TypeSourceInfo *T) {
3123     return SemaRef.BuildTypeRequirement(T);
3124   }
3125 
3126   concepts::ExprRequirement *
3127   RebuildExprRequirement(
3128       concepts::Requirement::SubstitutionDiagnostic *SubstDiag, bool IsSimple,
3129       SourceLocation NoexceptLoc,
3130       concepts::ExprRequirement::ReturnTypeRequirement Ret) {
3131     return SemaRef.BuildExprRequirement(SubstDiag, IsSimple, NoexceptLoc,
3132                                         std::move(Ret));
3133   }
3134 
3135   concepts::ExprRequirement *
3136   RebuildExprRequirement(Expr *E, bool IsSimple, SourceLocation NoexceptLoc,
3137                          concepts::ExprRequirement::ReturnTypeRequirement Ret) {
3138     return SemaRef.BuildExprRequirement(E, IsSimple, NoexceptLoc,
3139                                         std::move(Ret));
3140   }
3141 
3142   concepts::NestedRequirement *
3143   RebuildNestedRequirement(
3144       concepts::Requirement::SubstitutionDiagnostic *SubstDiag) {
3145     return SemaRef.BuildNestedRequirement(SubstDiag);
3146   }
3147 
3148   concepts::NestedRequirement *RebuildNestedRequirement(Expr *Constraint) {
3149     return SemaRef.BuildNestedRequirement(Constraint);
3150   }
3151 
3152   /// \brief Build a new Objective-C boxed expression.
3153   ///
3154   /// By default, performs semantic analysis to build the new expression.
3155   /// Subclasses may override this routine to provide different behavior.
3156   ExprResult RebuildObjCBoxedExpr(SourceRange SR, Expr *ValueExpr) {
3157     return getSema().BuildObjCBoxedExpr(SR, ValueExpr);
3158   }
3159 
3160   /// Build a new Objective-C array literal.
3161   ///
3162   /// By default, performs semantic analysis to build the new expression.
3163   /// Subclasses may override this routine to provide different behavior.
3164   ExprResult RebuildObjCArrayLiteral(SourceRange Range,
3165                                      Expr **Elements, unsigned NumElements) {
3166     return getSema().BuildObjCArrayLiteral(Range,
3167                                            MultiExprArg(Elements, NumElements));
3168   }
3169 
3170   ExprResult RebuildObjCSubscriptRefExpr(SourceLocation RB,
3171                                          Expr *Base, Expr *Key,
3172                                          ObjCMethodDecl *getterMethod,
3173                                          ObjCMethodDecl *setterMethod) {
3174     return  getSema().BuildObjCSubscriptExpression(RB, Base, Key,
3175                                                    getterMethod, setterMethod);
3176   }
3177 
3178   /// Build a new Objective-C dictionary literal.
3179   ///
3180   /// By default, performs semantic analysis to build the new expression.
3181   /// Subclasses may override this routine to provide different behavior.
3182   ExprResult RebuildObjCDictionaryLiteral(SourceRange Range,
3183                               MutableArrayRef<ObjCDictionaryElement> Elements) {
3184     return getSema().BuildObjCDictionaryLiteral(Range, Elements);
3185   }
3186 
3187   /// Build a new Objective-C \@encode expression.
3188   ///
3189   /// By default, performs semantic analysis to build the new expression.
3190   /// Subclasses may override this routine to provide different behavior.
3191   ExprResult RebuildObjCEncodeExpr(SourceLocation AtLoc,
3192                                          TypeSourceInfo *EncodeTypeInfo,
3193                                          SourceLocation RParenLoc) {
3194     return SemaRef.BuildObjCEncodeExpression(AtLoc, EncodeTypeInfo, RParenLoc);
3195   }
3196 
3197   /// Build a new Objective-C class message.
3198   ExprResult RebuildObjCMessageExpr(TypeSourceInfo *ReceiverTypeInfo,
3199                                           Selector Sel,
3200                                           ArrayRef<SourceLocation> SelectorLocs,
3201                                           ObjCMethodDecl *Method,
3202                                           SourceLocation LBracLoc,
3203                                           MultiExprArg Args,
3204                                           SourceLocation RBracLoc) {
3205     return SemaRef.BuildClassMessage(ReceiverTypeInfo,
3206                                      ReceiverTypeInfo->getType(),
3207                                      /*SuperLoc=*/SourceLocation(),
3208                                      Sel, Method, LBracLoc, SelectorLocs,
3209                                      RBracLoc, Args);
3210   }
3211 
3212   /// Build a new Objective-C instance message.
3213   ExprResult RebuildObjCMessageExpr(Expr *Receiver,
3214                                           Selector Sel,
3215                                           ArrayRef<SourceLocation> SelectorLocs,
3216                                           ObjCMethodDecl *Method,
3217                                           SourceLocation LBracLoc,
3218                                           MultiExprArg Args,
3219                                           SourceLocation RBracLoc) {
3220     return SemaRef.BuildInstanceMessage(Receiver,
3221                                         Receiver->getType(),
3222                                         /*SuperLoc=*/SourceLocation(),
3223                                         Sel, Method, LBracLoc, SelectorLocs,
3224                                         RBracLoc, Args);
3225   }
3226 
3227   /// Build a new Objective-C instance/class message to 'super'.
3228   ExprResult RebuildObjCMessageExpr(SourceLocation SuperLoc,
3229                                     Selector Sel,
3230                                     ArrayRef<SourceLocation> SelectorLocs,
3231                                     QualType SuperType,
3232                                     ObjCMethodDecl *Method,
3233                                     SourceLocation LBracLoc,
3234                                     MultiExprArg Args,
3235                                     SourceLocation RBracLoc) {
3236     return Method->isInstanceMethod() ? SemaRef.BuildInstanceMessage(nullptr,
3237                                           SuperType,
3238                                           SuperLoc,
3239                                           Sel, Method, LBracLoc, SelectorLocs,
3240                                           RBracLoc, Args)
3241                                       : SemaRef.BuildClassMessage(nullptr,
3242                                           SuperType,
3243                                           SuperLoc,
3244                                           Sel, Method, LBracLoc, SelectorLocs,
3245                                           RBracLoc, Args);
3246 
3247 
3248   }
3249 
3250   /// Build a new Objective-C ivar reference expression.
3251   ///
3252   /// By default, performs semantic analysis to build the new expression.
3253   /// Subclasses may override this routine to provide different behavior.
3254   ExprResult RebuildObjCIvarRefExpr(Expr *BaseArg, ObjCIvarDecl *Ivar,
3255                                           SourceLocation IvarLoc,
3256                                           bool IsArrow, bool IsFreeIvar) {
3257     CXXScopeSpec SS;
3258     DeclarationNameInfo NameInfo(Ivar->getDeclName(), IvarLoc);
3259     ExprResult Result = getSema().BuildMemberReferenceExpr(
3260         BaseArg, BaseArg->getType(),
3261         /*FIXME:*/ IvarLoc, IsArrow, SS, SourceLocation(),
3262         /*FirstQualifierInScope=*/nullptr, NameInfo,
3263         /*TemplateArgs=*/nullptr,
3264         /*S=*/nullptr);
3265     if (IsFreeIvar && Result.isUsable())
3266       cast<ObjCIvarRefExpr>(Result.get())->setIsFreeIvar(IsFreeIvar);
3267     return Result;
3268   }
3269 
3270   /// Build a new Objective-C property reference expression.
3271   ///
3272   /// By default, performs semantic analysis to build the new expression.
3273   /// Subclasses may override this routine to provide different behavior.
3274   ExprResult RebuildObjCPropertyRefExpr(Expr *BaseArg,
3275                                         ObjCPropertyDecl *Property,
3276                                         SourceLocation PropertyLoc) {
3277     CXXScopeSpec SS;
3278     DeclarationNameInfo NameInfo(Property->getDeclName(), PropertyLoc);
3279     return getSema().BuildMemberReferenceExpr(BaseArg, BaseArg->getType(),
3280                                               /*FIXME:*/PropertyLoc,
3281                                               /*IsArrow=*/false,
3282                                               SS, SourceLocation(),
3283                                               /*FirstQualifierInScope=*/nullptr,
3284                                               NameInfo,
3285                                               /*TemplateArgs=*/nullptr,
3286                                               /*S=*/nullptr);
3287   }
3288 
3289   /// Build a new Objective-C property reference expression.
3290   ///
3291   /// By default, performs semantic analysis to build the new expression.
3292   /// Subclasses may override this routine to provide different behavior.
3293   ExprResult RebuildObjCPropertyRefExpr(Expr *Base, QualType T,
3294                                         ObjCMethodDecl *Getter,
3295                                         ObjCMethodDecl *Setter,
3296                                         SourceLocation PropertyLoc) {
3297     // Since these expressions can only be value-dependent, we do not
3298     // need to perform semantic analysis again.
3299     return Owned(
3300       new (getSema().Context) ObjCPropertyRefExpr(Getter, Setter, T,
3301                                                   VK_LValue, OK_ObjCProperty,
3302                                                   PropertyLoc, Base));
3303   }
3304 
3305   /// Build a new Objective-C "isa" expression.
3306   ///
3307   /// By default, performs semantic analysis to build the new expression.
3308   /// Subclasses may override this routine to provide different behavior.
3309   ExprResult RebuildObjCIsaExpr(Expr *BaseArg, SourceLocation IsaLoc,
3310                                 SourceLocation OpLoc, bool IsArrow) {
3311     CXXScopeSpec SS;
3312     DeclarationNameInfo NameInfo(&getSema().Context.Idents.get("isa"), IsaLoc);
3313     return getSema().BuildMemberReferenceExpr(BaseArg, BaseArg->getType(),
3314                                               OpLoc, IsArrow,
3315                                               SS, SourceLocation(),
3316                                               /*FirstQualifierInScope=*/nullptr,
3317                                               NameInfo,
3318                                               /*TemplateArgs=*/nullptr,
3319                                               /*S=*/nullptr);
3320   }
3321 
3322   /// Build a new shuffle vector expression.
3323   ///
3324   /// By default, performs semantic analysis to build the new expression.
3325   /// Subclasses may override this routine to provide different behavior.
3326   ExprResult RebuildShuffleVectorExpr(SourceLocation BuiltinLoc,
3327                                       MultiExprArg SubExprs,
3328                                       SourceLocation RParenLoc) {
3329     // Find the declaration for __builtin_shufflevector
3330     const IdentifierInfo &Name
3331       = SemaRef.Context.Idents.get("__builtin_shufflevector");
3332     TranslationUnitDecl *TUDecl = SemaRef.Context.getTranslationUnitDecl();
3333     DeclContext::lookup_result Lookup = TUDecl->lookup(DeclarationName(&Name));
3334     assert(!Lookup.empty() && "No __builtin_shufflevector?");
3335 
3336     // Build a reference to the __builtin_shufflevector builtin
3337     FunctionDecl *Builtin = cast<FunctionDecl>(Lookup.front());
3338     Expr *Callee = new (SemaRef.Context)
3339         DeclRefExpr(SemaRef.Context, Builtin, false,
3340                     SemaRef.Context.BuiltinFnTy, VK_RValue, BuiltinLoc);
3341     QualType CalleePtrTy = SemaRef.Context.getPointerType(Builtin->getType());
3342     Callee = SemaRef.ImpCastExprToType(Callee, CalleePtrTy,
3343                                        CK_BuiltinFnToFnPtr).get();
3344 
3345     // Build the CallExpr
3346     ExprResult TheCall = CallExpr::Create(
3347         SemaRef.Context, Callee, SubExprs, Builtin->getCallResultType(),
3348         Expr::getValueKindForType(Builtin->getReturnType()), RParenLoc);
3349 
3350     // Type-check the __builtin_shufflevector expression.
3351     return SemaRef.SemaBuiltinShuffleVector(cast<CallExpr>(TheCall.get()));
3352   }
3353 
3354   /// Build a new convert vector expression.
3355   ExprResult RebuildConvertVectorExpr(SourceLocation BuiltinLoc,
3356                                       Expr *SrcExpr, TypeSourceInfo *DstTInfo,
3357                                       SourceLocation RParenLoc) {
3358     return SemaRef.SemaConvertVectorExpr(SrcExpr, DstTInfo,
3359                                          BuiltinLoc, RParenLoc);
3360   }
3361 
3362   /// Build a new template argument pack expansion.
3363   ///
3364   /// By default, performs semantic analysis to build a new pack expansion
3365   /// for a template argument. Subclasses may override this routine to provide
3366   /// different behavior.
3367   TemplateArgumentLoc RebuildPackExpansion(TemplateArgumentLoc Pattern,
3368                                            SourceLocation EllipsisLoc,
3369                                            Optional<unsigned> NumExpansions) {
3370     switch (Pattern.getArgument().getKind()) {
3371     case TemplateArgument::Expression: {
3372       ExprResult Result
3373         = getSema().CheckPackExpansion(Pattern.getSourceExpression(),
3374                                        EllipsisLoc, NumExpansions);
3375       if (Result.isInvalid())
3376         return TemplateArgumentLoc();
3377 
3378       return TemplateArgumentLoc(Result.get(), Result.get());
3379     }
3380 
3381     case TemplateArgument::Template:
3382       return TemplateArgumentLoc(TemplateArgument(
3383                                           Pattern.getArgument().getAsTemplate(),
3384                                                   NumExpansions),
3385                                  Pattern.getTemplateQualifierLoc(),
3386                                  Pattern.getTemplateNameLoc(),
3387                                  EllipsisLoc);
3388 
3389     case TemplateArgument::Null:
3390     case TemplateArgument::Integral:
3391     case TemplateArgument::Declaration:
3392     case TemplateArgument::Pack:
3393     case TemplateArgument::TemplateExpansion:
3394     case TemplateArgument::NullPtr:
3395       llvm_unreachable("Pack expansion pattern has no parameter packs");
3396 
3397     case TemplateArgument::Type:
3398       if (TypeSourceInfo *Expansion
3399             = getSema().CheckPackExpansion(Pattern.getTypeSourceInfo(),
3400                                            EllipsisLoc,
3401                                            NumExpansions))
3402         return TemplateArgumentLoc(TemplateArgument(Expansion->getType()),
3403                                    Expansion);
3404       break;
3405     }
3406 
3407     return TemplateArgumentLoc();
3408   }
3409 
3410   /// Build a new expression pack expansion.
3411   ///
3412   /// By default, performs semantic analysis to build a new pack expansion
3413   /// for an expression. Subclasses may override this routine to provide
3414   /// different behavior.
3415   ExprResult RebuildPackExpansion(Expr *Pattern, SourceLocation EllipsisLoc,
3416                                   Optional<unsigned> NumExpansions) {
3417     return getSema().CheckPackExpansion(Pattern, EllipsisLoc, NumExpansions);
3418   }
3419 
3420   /// Build a new C++1z fold-expression.
3421   ///
3422   /// By default, performs semantic analysis in order to build a new fold
3423   /// expression.
3424   ExprResult RebuildCXXFoldExpr(SourceLocation LParenLoc, Expr *LHS,
3425                                 BinaryOperatorKind Operator,
3426                                 SourceLocation EllipsisLoc, Expr *RHS,
3427                                 SourceLocation RParenLoc,
3428                                 Optional<unsigned> NumExpansions) {
3429     return getSema().BuildCXXFoldExpr(LParenLoc, LHS, Operator, EllipsisLoc,
3430                                       RHS, RParenLoc, NumExpansions);
3431   }
3432 
3433   /// Build an empty C++1z fold-expression with the given operator.
3434   ///
3435   /// By default, produces the fallback value for the fold-expression, or
3436   /// produce an error if there is no fallback value.
3437   ExprResult RebuildEmptyCXXFoldExpr(SourceLocation EllipsisLoc,
3438                                      BinaryOperatorKind Operator) {
3439     return getSema().BuildEmptyCXXFoldExpr(EllipsisLoc, Operator);
3440   }
3441 
3442   /// Build a new atomic operation expression.
3443   ///
3444   /// By default, performs semantic analysis to build the new expression.
3445   /// Subclasses may override this routine to provide different behavior.
3446   ExprResult RebuildAtomicExpr(SourceLocation BuiltinLoc, MultiExprArg SubExprs,
3447                                AtomicExpr::AtomicOp Op,
3448                                SourceLocation RParenLoc) {
3449     // Use this for all of the locations, since we don't know the difference
3450     // between the call and the expr at this point.
3451     SourceRange Range{BuiltinLoc, RParenLoc};
3452     return getSema().BuildAtomicExpr(Range, Range, RParenLoc, SubExprs, Op,
3453                                      Sema::AtomicArgumentOrder::AST);
3454   }
3455 
3456 private:
3457   TypeLoc TransformTypeInObjectScope(TypeLoc TL,
3458                                      QualType ObjectType,
3459                                      NamedDecl *FirstQualifierInScope,
3460                                      CXXScopeSpec &SS);
3461 
3462   TypeSourceInfo *TransformTypeInObjectScope(TypeSourceInfo *TSInfo,
3463                                              QualType ObjectType,
3464                                              NamedDecl *FirstQualifierInScope,
3465                                              CXXScopeSpec &SS);
3466 
3467   TypeSourceInfo *TransformTSIInObjectScope(TypeLoc TL, QualType ObjectType,
3468                                             NamedDecl *FirstQualifierInScope,
3469                                             CXXScopeSpec &SS);
3470 
3471   QualType TransformDependentNameType(TypeLocBuilder &TLB,
3472                                       DependentNameTypeLoc TL,
3473                                       bool DeducibleTSTContext);
3474 };
3475 
3476 template <typename Derived>
3477 StmtResult TreeTransform<Derived>::TransformStmt(Stmt *S, StmtDiscardKind SDK) {
3478   if (!S)
3479     return S;
3480 
3481   switch (S->getStmtClass()) {
3482   case Stmt::NoStmtClass: break;
3483 
3484   // Transform individual statement nodes
3485   // Pass SDK into statements that can produce a value
3486 #define STMT(Node, Parent)                                              \
3487   case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(S));
3488 #define VALUESTMT(Node, Parent)                                         \
3489   case Stmt::Node##Class:                                               \
3490     return getDerived().Transform##Node(cast<Node>(S), SDK);
3491 #define ABSTRACT_STMT(Node)
3492 #define EXPR(Node, Parent)
3493 #include "clang/AST/StmtNodes.inc"
3494 
3495   // Transform expressions by calling TransformExpr.
3496 #define STMT(Node, Parent)
3497 #define ABSTRACT_STMT(Stmt)
3498 #define EXPR(Node, Parent) case Stmt::Node##Class:
3499 #include "clang/AST/StmtNodes.inc"
3500     {
3501       ExprResult E = getDerived().TransformExpr(cast<Expr>(S));
3502 
3503       if (SDK == SDK_StmtExprResult)
3504         E = getSema().ActOnStmtExprResult(E);
3505       return getSema().ActOnExprStmt(E, SDK == SDK_Discarded);
3506     }
3507   }
3508 
3509   return S;
3510 }
3511 
3512 template<typename Derived>
3513 OMPClause *TreeTransform<Derived>::TransformOMPClause(OMPClause *S) {
3514   if (!S)
3515     return S;
3516 
3517   switch (S->getClauseKind()) {
3518   default: break;
3519   // Transform individual clause nodes
3520 #define OPENMP_CLAUSE(Name, Class)                                             \
3521   case OMPC_ ## Name :                                                         \
3522     return getDerived().Transform ## Class(cast<Class>(S));
3523 #include "clang/Basic/OpenMPKinds.def"
3524   }
3525 
3526   return S;
3527 }
3528 
3529 
3530 template<typename Derived>
3531 ExprResult TreeTransform<Derived>::TransformExpr(Expr *E) {
3532   if (!E)
3533     return E;
3534 
3535   switch (E->getStmtClass()) {
3536     case Stmt::NoStmtClass: break;
3537 #define STMT(Node, Parent) case Stmt::Node##Class: break;
3538 #define ABSTRACT_STMT(Stmt)
3539 #define EXPR(Node, Parent)                                              \
3540     case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(E));
3541 #include "clang/AST/StmtNodes.inc"
3542   }
3543 
3544   return E;
3545 }
3546 
3547 template<typename Derived>
3548 ExprResult TreeTransform<Derived>::TransformInitializer(Expr *Init,
3549                                                         bool NotCopyInit) {
3550   // Initializers are instantiated like expressions, except that various outer
3551   // layers are stripped.
3552   if (!Init)
3553     return Init;
3554 
3555   if (auto *FE = dyn_cast<FullExpr>(Init))
3556     Init = FE->getSubExpr();
3557 
3558   if (auto *AIL = dyn_cast<ArrayInitLoopExpr>(Init))
3559     Init = AIL->getCommonExpr();
3560 
3561   if (MaterializeTemporaryExpr *MTE = dyn_cast<MaterializeTemporaryExpr>(Init))
3562     Init = MTE->getSubExpr();
3563 
3564   while (CXXBindTemporaryExpr *Binder = dyn_cast<CXXBindTemporaryExpr>(Init))
3565     Init = Binder->getSubExpr();
3566 
3567   if (ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(Init))
3568     Init = ICE->getSubExprAsWritten();
3569 
3570   if (CXXStdInitializerListExpr *ILE =
3571           dyn_cast<CXXStdInitializerListExpr>(Init))
3572     return TransformInitializer(ILE->getSubExpr(), NotCopyInit);
3573 
3574   // If this is copy-initialization, we only need to reconstruct
3575   // InitListExprs. Other forms of copy-initialization will be a no-op if
3576   // the initializer is already the right type.
3577   CXXConstructExpr *Construct = dyn_cast<CXXConstructExpr>(Init);
3578   if (!NotCopyInit && !(Construct && Construct->isListInitialization()))
3579     return getDerived().TransformExpr(Init);
3580 
3581   // Revert value-initialization back to empty parens.
3582   if (CXXScalarValueInitExpr *VIE = dyn_cast<CXXScalarValueInitExpr>(Init)) {
3583     SourceRange Parens = VIE->getSourceRange();
3584     return getDerived().RebuildParenListExpr(Parens.getBegin(), None,
3585                                              Parens.getEnd());
3586   }
3587 
3588   // FIXME: We shouldn't build ImplicitValueInitExprs for direct-initialization.
3589   if (isa<ImplicitValueInitExpr>(Init))
3590     return getDerived().RebuildParenListExpr(SourceLocation(), None,
3591                                              SourceLocation());
3592 
3593   // Revert initialization by constructor back to a parenthesized or braced list
3594   // of expressions. Any other form of initializer can just be reused directly.
3595   if (!Construct || isa<CXXTemporaryObjectExpr>(Construct))
3596     return getDerived().TransformExpr(Init);
3597 
3598   // If the initialization implicitly converted an initializer list to a
3599   // std::initializer_list object, unwrap the std::initializer_list too.
3600   if (Construct && Construct->isStdInitListInitialization())
3601     return TransformInitializer(Construct->getArg(0), NotCopyInit);
3602 
3603   // Enter a list-init context if this was list initialization.
3604   EnterExpressionEvaluationContext Context(
3605       getSema(), EnterExpressionEvaluationContext::InitList,
3606       Construct->isListInitialization());
3607 
3608   SmallVector<Expr*, 8> NewArgs;
3609   bool ArgChanged = false;
3610   if (getDerived().TransformExprs(Construct->getArgs(), Construct->getNumArgs(),
3611                                   /*IsCall*/true, NewArgs, &ArgChanged))
3612     return ExprError();
3613 
3614   // If this was list initialization, revert to syntactic list form.
3615   if (Construct->isListInitialization())
3616     return getDerived().RebuildInitList(Construct->getBeginLoc(), NewArgs,
3617                                         Construct->getEndLoc());
3618 
3619   // Build a ParenListExpr to represent anything else.
3620   SourceRange Parens = Construct->getParenOrBraceRange();
3621   if (Parens.isInvalid()) {
3622     // This was a variable declaration's initialization for which no initializer
3623     // was specified.
3624     assert(NewArgs.empty() &&
3625            "no parens or braces but have direct init with arguments?");
3626     return ExprEmpty();
3627   }
3628   return getDerived().RebuildParenListExpr(Parens.getBegin(), NewArgs,
3629                                            Parens.getEnd());
3630 }
3631 
3632 template<typename Derived>
3633 bool TreeTransform<Derived>::TransformExprs(Expr *const *Inputs,
3634                                             unsigned NumInputs,
3635                                             bool IsCall,
3636                                       SmallVectorImpl<Expr *> &Outputs,
3637                                             bool *ArgChanged) {
3638   for (unsigned I = 0; I != NumInputs; ++I) {
3639     // If requested, drop call arguments that need to be dropped.
3640     if (IsCall && getDerived().DropCallArgument(Inputs[I])) {
3641       if (ArgChanged)
3642         *ArgChanged = true;
3643 
3644       break;
3645     }
3646 
3647     if (PackExpansionExpr *Expansion = dyn_cast<PackExpansionExpr>(Inputs[I])) {
3648       Expr *Pattern = Expansion->getPattern();
3649 
3650       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
3651       getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
3652       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
3653 
3654       // Determine whether the set of unexpanded parameter packs can and should
3655       // be expanded.
3656       bool Expand = true;
3657       bool RetainExpansion = false;
3658       Optional<unsigned> OrigNumExpansions = Expansion->getNumExpansions();
3659       Optional<unsigned> NumExpansions = OrigNumExpansions;
3660       if (getDerived().TryExpandParameterPacks(Expansion->getEllipsisLoc(),
3661                                                Pattern->getSourceRange(),
3662                                                Unexpanded,
3663                                                Expand, RetainExpansion,
3664                                                NumExpansions))
3665         return true;
3666 
3667       if (!Expand) {
3668         // The transform has determined that we should perform a simple
3669         // transformation on the pack expansion, producing another pack
3670         // expansion.
3671         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
3672         ExprResult OutPattern = getDerived().TransformExpr(Pattern);
3673         if (OutPattern.isInvalid())
3674           return true;
3675 
3676         ExprResult Out = getDerived().RebuildPackExpansion(OutPattern.get(),
3677                                                 Expansion->getEllipsisLoc(),
3678                                                            NumExpansions);
3679         if (Out.isInvalid())
3680           return true;
3681 
3682         if (ArgChanged)
3683           *ArgChanged = true;
3684         Outputs.push_back(Out.get());
3685         continue;
3686       }
3687 
3688       // Record right away that the argument was changed.  This needs
3689       // to happen even if the array expands to nothing.
3690       if (ArgChanged) *ArgChanged = true;
3691 
3692       // The transform has determined that we should perform an elementwise
3693       // expansion of the pattern. Do so.
3694       for (unsigned I = 0; I != *NumExpansions; ++I) {
3695         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
3696         ExprResult Out = getDerived().TransformExpr(Pattern);
3697         if (Out.isInvalid())
3698           return true;
3699 
3700         if (Out.get()->containsUnexpandedParameterPack()) {
3701           Out = getDerived().RebuildPackExpansion(
3702               Out.get(), Expansion->getEllipsisLoc(), OrigNumExpansions);
3703           if (Out.isInvalid())
3704             return true;
3705         }
3706 
3707         Outputs.push_back(Out.get());
3708       }
3709 
3710       // If we're supposed to retain a pack expansion, do so by temporarily
3711       // forgetting the partially-substituted parameter pack.
3712       if (RetainExpansion) {
3713         ForgetPartiallySubstitutedPackRAII Forget(getDerived());
3714 
3715         ExprResult Out = getDerived().TransformExpr(Pattern);
3716         if (Out.isInvalid())
3717           return true;
3718 
3719         Out = getDerived().RebuildPackExpansion(
3720             Out.get(), Expansion->getEllipsisLoc(), OrigNumExpansions);
3721         if (Out.isInvalid())
3722           return true;
3723 
3724         Outputs.push_back(Out.get());
3725       }
3726 
3727       continue;
3728     }
3729 
3730     ExprResult Result =
3731       IsCall ? getDerived().TransformInitializer(Inputs[I], /*DirectInit*/false)
3732              : getDerived().TransformExpr(Inputs[I]);
3733     if (Result.isInvalid())
3734       return true;
3735 
3736     if (Result.get() != Inputs[I] && ArgChanged)
3737       *ArgChanged = true;
3738 
3739     Outputs.push_back(Result.get());
3740   }
3741 
3742   return false;
3743 }
3744 
3745 template <typename Derived>
3746 Sema::ConditionResult TreeTransform<Derived>::TransformCondition(
3747     SourceLocation Loc, VarDecl *Var, Expr *Expr, Sema::ConditionKind Kind) {
3748   if (Var) {
3749     VarDecl *ConditionVar = cast_or_null<VarDecl>(
3750         getDerived().TransformDefinition(Var->getLocation(), Var));
3751 
3752     if (!ConditionVar)
3753       return Sema::ConditionError();
3754 
3755     return getSema().ActOnConditionVariable(ConditionVar, Loc, Kind);
3756   }
3757 
3758   if (Expr) {
3759     ExprResult CondExpr = getDerived().TransformExpr(Expr);
3760 
3761     if (CondExpr.isInvalid())
3762       return Sema::ConditionError();
3763 
3764     return getSema().ActOnCondition(nullptr, Loc, CondExpr.get(), Kind);
3765   }
3766 
3767   return Sema::ConditionResult();
3768 }
3769 
3770 template<typename Derived>
3771 NestedNameSpecifierLoc
3772 TreeTransform<Derived>::TransformNestedNameSpecifierLoc(
3773                                                     NestedNameSpecifierLoc NNS,
3774                                                      QualType ObjectType,
3775                                              NamedDecl *FirstQualifierInScope) {
3776   SmallVector<NestedNameSpecifierLoc, 4> Qualifiers;
3777   for (NestedNameSpecifierLoc Qualifier = NNS; Qualifier;
3778        Qualifier = Qualifier.getPrefix())
3779     Qualifiers.push_back(Qualifier);
3780 
3781   CXXScopeSpec SS;
3782   while (!Qualifiers.empty()) {
3783     NestedNameSpecifierLoc Q = Qualifiers.pop_back_val();
3784     NestedNameSpecifier *QNNS = Q.getNestedNameSpecifier();
3785 
3786     switch (QNNS->getKind()) {
3787     case NestedNameSpecifier::Identifier: {
3788       Sema::NestedNameSpecInfo IdInfo(QNNS->getAsIdentifier(),
3789                           Q.getLocalBeginLoc(), Q.getLocalEndLoc(), ObjectType);
3790       if (SemaRef.BuildCXXNestedNameSpecifier(/*Scope=*/nullptr, IdInfo, false,
3791                                               SS, FirstQualifierInScope, false))
3792         return NestedNameSpecifierLoc();
3793     }
3794       break;
3795 
3796     case NestedNameSpecifier::Namespace: {
3797       NamespaceDecl *NS
3798         = cast_or_null<NamespaceDecl>(
3799                                     getDerived().TransformDecl(
3800                                                           Q.getLocalBeginLoc(),
3801                                                        QNNS->getAsNamespace()));
3802       SS.Extend(SemaRef.Context, NS, Q.getLocalBeginLoc(), Q.getLocalEndLoc());
3803       break;
3804     }
3805 
3806     case NestedNameSpecifier::NamespaceAlias: {
3807       NamespaceAliasDecl *Alias
3808         = cast_or_null<NamespaceAliasDecl>(
3809                       getDerived().TransformDecl(Q.getLocalBeginLoc(),
3810                                                  QNNS->getAsNamespaceAlias()));
3811       SS.Extend(SemaRef.Context, Alias, Q.getLocalBeginLoc(),
3812                 Q.getLocalEndLoc());
3813       break;
3814     }
3815 
3816     case NestedNameSpecifier::Global:
3817       // There is no meaningful transformation that one could perform on the
3818       // global scope.
3819       SS.MakeGlobal(SemaRef.Context, Q.getBeginLoc());
3820       break;
3821 
3822     case NestedNameSpecifier::Super: {
3823       CXXRecordDecl *RD =
3824           cast_or_null<CXXRecordDecl>(getDerived().TransformDecl(
3825               SourceLocation(), QNNS->getAsRecordDecl()));
3826       SS.MakeSuper(SemaRef.Context, RD, Q.getBeginLoc(), Q.getEndLoc());
3827       break;
3828     }
3829 
3830     case NestedNameSpecifier::TypeSpecWithTemplate:
3831     case NestedNameSpecifier::TypeSpec: {
3832       TypeLoc TL = TransformTypeInObjectScope(Q.getTypeLoc(), ObjectType,
3833                                               FirstQualifierInScope, SS);
3834 
3835       if (!TL)
3836         return NestedNameSpecifierLoc();
3837 
3838       if (TL.getType()->isDependentType() || TL.getType()->isRecordType() ||
3839           (SemaRef.getLangOpts().CPlusPlus11 &&
3840            TL.getType()->isEnumeralType())) {
3841         assert(!TL.getType().hasLocalQualifiers() &&
3842                "Can't get cv-qualifiers here");
3843         if (TL.getType()->isEnumeralType())
3844           SemaRef.Diag(TL.getBeginLoc(),
3845                        diag::warn_cxx98_compat_enum_nested_name_spec);
3846         SS.Extend(SemaRef.Context, /*FIXME:*/SourceLocation(), TL,
3847                   Q.getLocalEndLoc());
3848         break;
3849       }
3850       // If the nested-name-specifier is an invalid type def, don't emit an
3851       // error because a previous error should have already been emitted.
3852       TypedefTypeLoc TTL = TL.getAs<TypedefTypeLoc>();
3853       if (!TTL || !TTL.getTypedefNameDecl()->isInvalidDecl()) {
3854         SemaRef.Diag(TL.getBeginLoc(), diag::err_nested_name_spec_non_tag)
3855           << TL.getType() << SS.getRange();
3856       }
3857       return NestedNameSpecifierLoc();
3858     }
3859     }
3860 
3861     // The qualifier-in-scope and object type only apply to the leftmost entity.
3862     FirstQualifierInScope = nullptr;
3863     ObjectType = QualType();
3864   }
3865 
3866   // Don't rebuild the nested-name-specifier if we don't have to.
3867   if (SS.getScopeRep() == NNS.getNestedNameSpecifier() &&
3868       !getDerived().AlwaysRebuild())
3869     return NNS;
3870 
3871   // If we can re-use the source-location data from the original
3872   // nested-name-specifier, do so.
3873   if (SS.location_size() == NNS.getDataLength() &&
3874       memcmp(SS.location_data(), NNS.getOpaqueData(), SS.location_size()) == 0)
3875     return NestedNameSpecifierLoc(SS.getScopeRep(), NNS.getOpaqueData());
3876 
3877   // Allocate new nested-name-specifier location information.
3878   return SS.getWithLocInContext(SemaRef.Context);
3879 }
3880 
3881 template<typename Derived>
3882 DeclarationNameInfo
3883 TreeTransform<Derived>
3884 ::TransformDeclarationNameInfo(const DeclarationNameInfo &NameInfo) {
3885   DeclarationName Name = NameInfo.getName();
3886   if (!Name)
3887     return DeclarationNameInfo();
3888 
3889   switch (Name.getNameKind()) {
3890   case DeclarationName::Identifier:
3891   case DeclarationName::ObjCZeroArgSelector:
3892   case DeclarationName::ObjCOneArgSelector:
3893   case DeclarationName::ObjCMultiArgSelector:
3894   case DeclarationName::CXXOperatorName:
3895   case DeclarationName::CXXLiteralOperatorName:
3896   case DeclarationName::CXXUsingDirective:
3897     return NameInfo;
3898 
3899   case DeclarationName::CXXDeductionGuideName: {
3900     TemplateDecl *OldTemplate = Name.getCXXDeductionGuideTemplate();
3901     TemplateDecl *NewTemplate = cast_or_null<TemplateDecl>(
3902         getDerived().TransformDecl(NameInfo.getLoc(), OldTemplate));
3903     if (!NewTemplate)
3904       return DeclarationNameInfo();
3905 
3906     DeclarationNameInfo NewNameInfo(NameInfo);
3907     NewNameInfo.setName(
3908         SemaRef.Context.DeclarationNames.getCXXDeductionGuideName(NewTemplate));
3909     return NewNameInfo;
3910   }
3911 
3912   case DeclarationName::CXXConstructorName:
3913   case DeclarationName::CXXDestructorName:
3914   case DeclarationName::CXXConversionFunctionName: {
3915     TypeSourceInfo *NewTInfo;
3916     CanQualType NewCanTy;
3917     if (TypeSourceInfo *OldTInfo = NameInfo.getNamedTypeInfo()) {
3918       NewTInfo = getDerived().TransformType(OldTInfo);
3919       if (!NewTInfo)
3920         return DeclarationNameInfo();
3921       NewCanTy = SemaRef.Context.getCanonicalType(NewTInfo->getType());
3922     }
3923     else {
3924       NewTInfo = nullptr;
3925       TemporaryBase Rebase(*this, NameInfo.getLoc(), Name);
3926       QualType NewT = getDerived().TransformType(Name.getCXXNameType());
3927       if (NewT.isNull())
3928         return DeclarationNameInfo();
3929       NewCanTy = SemaRef.Context.getCanonicalType(NewT);
3930     }
3931 
3932     DeclarationName NewName
3933       = SemaRef.Context.DeclarationNames.getCXXSpecialName(Name.getNameKind(),
3934                                                            NewCanTy);
3935     DeclarationNameInfo NewNameInfo(NameInfo);
3936     NewNameInfo.setName(NewName);
3937     NewNameInfo.setNamedTypeInfo(NewTInfo);
3938     return NewNameInfo;
3939   }
3940   }
3941 
3942   llvm_unreachable("Unknown name kind.");
3943 }
3944 
3945 template<typename Derived>
3946 TemplateName
3947 TreeTransform<Derived>::TransformTemplateName(CXXScopeSpec &SS,
3948                                               TemplateName Name,
3949                                               SourceLocation NameLoc,
3950                                               QualType ObjectType,
3951                                               NamedDecl *FirstQualifierInScope,
3952                                               bool AllowInjectedClassName) {
3953   if (QualifiedTemplateName *QTN = Name.getAsQualifiedTemplateName()) {
3954     TemplateDecl *Template = QTN->getTemplateDecl();
3955     assert(Template && "qualified template name must refer to a template");
3956 
3957     TemplateDecl *TransTemplate
3958       = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc,
3959                                                               Template));
3960     if (!TransTemplate)
3961       return TemplateName();
3962 
3963     if (!getDerived().AlwaysRebuild() &&
3964         SS.getScopeRep() == QTN->getQualifier() &&
3965         TransTemplate == Template)
3966       return Name;
3967 
3968     return getDerived().RebuildTemplateName(SS, QTN->hasTemplateKeyword(),
3969                                             TransTemplate);
3970   }
3971 
3972   if (DependentTemplateName *DTN = Name.getAsDependentTemplateName()) {
3973     if (SS.getScopeRep()) {
3974       // These apply to the scope specifier, not the template.
3975       ObjectType = QualType();
3976       FirstQualifierInScope = nullptr;
3977     }
3978 
3979     if (!getDerived().AlwaysRebuild() &&
3980         SS.getScopeRep() == DTN->getQualifier() &&
3981         ObjectType.isNull())
3982       return Name;
3983 
3984     // FIXME: Preserve the location of the "template" keyword.
3985     SourceLocation TemplateKWLoc = NameLoc;
3986 
3987     if (DTN->isIdentifier()) {
3988       return getDerived().RebuildTemplateName(SS,
3989                                               TemplateKWLoc,
3990                                               *DTN->getIdentifier(),
3991                                               NameLoc,
3992                                               ObjectType,
3993                                               FirstQualifierInScope,
3994                                               AllowInjectedClassName);
3995     }
3996 
3997     return getDerived().RebuildTemplateName(SS, TemplateKWLoc,
3998                                             DTN->getOperator(), NameLoc,
3999                                             ObjectType, AllowInjectedClassName);
4000   }
4001 
4002   if (TemplateDecl *Template = Name.getAsTemplateDecl()) {
4003     TemplateDecl *TransTemplate
4004       = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc,
4005                                                               Template));
4006     if (!TransTemplate)
4007       return TemplateName();
4008 
4009     if (!getDerived().AlwaysRebuild() &&
4010         TransTemplate == Template)
4011       return Name;
4012 
4013     return TemplateName(TransTemplate);
4014   }
4015 
4016   if (SubstTemplateTemplateParmPackStorage *SubstPack
4017       = Name.getAsSubstTemplateTemplateParmPack()) {
4018     TemplateTemplateParmDecl *TransParam
4019     = cast_or_null<TemplateTemplateParmDecl>(
4020             getDerived().TransformDecl(NameLoc, SubstPack->getParameterPack()));
4021     if (!TransParam)
4022       return TemplateName();
4023 
4024     if (!getDerived().AlwaysRebuild() &&
4025         TransParam == SubstPack->getParameterPack())
4026       return Name;
4027 
4028     return getDerived().RebuildTemplateName(TransParam,
4029                                             SubstPack->getArgumentPack());
4030   }
4031 
4032   // These should be getting filtered out before they reach the AST.
4033   llvm_unreachable("overloaded function decl survived to here");
4034 }
4035 
4036 template<typename Derived>
4037 void TreeTransform<Derived>::InventTemplateArgumentLoc(
4038                                          const TemplateArgument &Arg,
4039                                          TemplateArgumentLoc &Output) {
4040   SourceLocation Loc = getDerived().getBaseLocation();
4041   switch (Arg.getKind()) {
4042   case TemplateArgument::Null:
4043     llvm_unreachable("null template argument in TreeTransform");
4044     break;
4045 
4046   case TemplateArgument::Type:
4047     Output = TemplateArgumentLoc(Arg,
4048                SemaRef.Context.getTrivialTypeSourceInfo(Arg.getAsType(), Loc));
4049 
4050     break;
4051 
4052   case TemplateArgument::Template:
4053   case TemplateArgument::TemplateExpansion: {
4054     NestedNameSpecifierLocBuilder Builder;
4055     TemplateName Template = Arg.getAsTemplateOrTemplatePattern();
4056     if (DependentTemplateName *DTN = Template.getAsDependentTemplateName())
4057       Builder.MakeTrivial(SemaRef.Context, DTN->getQualifier(), Loc);
4058     else if (QualifiedTemplateName *QTN = Template.getAsQualifiedTemplateName())
4059       Builder.MakeTrivial(SemaRef.Context, QTN->getQualifier(), Loc);
4060 
4061     if (Arg.getKind() == TemplateArgument::Template)
4062       Output = TemplateArgumentLoc(Arg,
4063                                    Builder.getWithLocInContext(SemaRef.Context),
4064                                    Loc);
4065     else
4066       Output = TemplateArgumentLoc(Arg,
4067                                    Builder.getWithLocInContext(SemaRef.Context),
4068                                    Loc, Loc);
4069 
4070     break;
4071   }
4072 
4073   case TemplateArgument::Expression:
4074     Output = TemplateArgumentLoc(Arg, Arg.getAsExpr());
4075     break;
4076 
4077   case TemplateArgument::Declaration:
4078   case TemplateArgument::Integral:
4079   case TemplateArgument::Pack:
4080   case TemplateArgument::NullPtr:
4081     Output = TemplateArgumentLoc(Arg, TemplateArgumentLocInfo());
4082     break;
4083   }
4084 }
4085 
4086 template<typename Derived>
4087 bool TreeTransform<Derived>::TransformTemplateArgument(
4088                                          const TemplateArgumentLoc &Input,
4089                                          TemplateArgumentLoc &Output, bool Uneval) {
4090   const TemplateArgument &Arg = Input.getArgument();
4091   switch (Arg.getKind()) {
4092   case TemplateArgument::Null:
4093   case TemplateArgument::Integral:
4094   case TemplateArgument::Pack:
4095   case TemplateArgument::Declaration:
4096   case TemplateArgument::NullPtr:
4097     llvm_unreachable("Unexpected TemplateArgument");
4098 
4099   case TemplateArgument::Type: {
4100     TypeSourceInfo *DI = Input.getTypeSourceInfo();
4101     if (!DI)
4102       DI = InventTypeSourceInfo(Input.getArgument().getAsType());
4103 
4104     DI = getDerived().TransformType(DI);
4105     if (!DI) return true;
4106 
4107     Output = TemplateArgumentLoc(TemplateArgument(DI->getType()), DI);
4108     return false;
4109   }
4110 
4111   case TemplateArgument::Template: {
4112     NestedNameSpecifierLoc QualifierLoc = Input.getTemplateQualifierLoc();
4113     if (QualifierLoc) {
4114       QualifierLoc = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc);
4115       if (!QualifierLoc)
4116         return true;
4117     }
4118 
4119     CXXScopeSpec SS;
4120     SS.Adopt(QualifierLoc);
4121     TemplateName Template
4122       = getDerived().TransformTemplateName(SS, Arg.getAsTemplate(),
4123                                            Input.getTemplateNameLoc());
4124     if (Template.isNull())
4125       return true;
4126 
4127     Output = TemplateArgumentLoc(TemplateArgument(Template), QualifierLoc,
4128                                  Input.getTemplateNameLoc());
4129     return false;
4130   }
4131 
4132   case TemplateArgument::TemplateExpansion:
4133     llvm_unreachable("Caller should expand pack expansions");
4134 
4135   case TemplateArgument::Expression: {
4136     // Template argument expressions are constant expressions.
4137     EnterExpressionEvaluationContext Unevaluated(
4138         getSema(),
4139         Uneval ? Sema::ExpressionEvaluationContext::Unevaluated
4140                : Sema::ExpressionEvaluationContext::ConstantEvaluated,
4141         /*LambdaContextDecl=*/nullptr, /*ExprContext=*/
4142         Sema::ExpressionEvaluationContextRecord::EK_TemplateArgument);
4143 
4144     Expr *InputExpr = Input.getSourceExpression();
4145     if (!InputExpr) InputExpr = Input.getArgument().getAsExpr();
4146 
4147     ExprResult E = getDerived().TransformExpr(InputExpr);
4148     E = SemaRef.ActOnConstantExpression(E);
4149     if (E.isInvalid()) return true;
4150     Output = TemplateArgumentLoc(TemplateArgument(E.get()), E.get());
4151     return false;
4152   }
4153   }
4154 
4155   // Work around bogus GCC warning
4156   return true;
4157 }
4158 
4159 /// Iterator adaptor that invents template argument location information
4160 /// for each of the template arguments in its underlying iterator.
4161 template<typename Derived, typename InputIterator>
4162 class TemplateArgumentLocInventIterator {
4163   TreeTransform<Derived> &Self;
4164   InputIterator Iter;
4165 
4166 public:
4167   typedef TemplateArgumentLoc value_type;
4168   typedef TemplateArgumentLoc reference;
4169   typedef typename std::iterator_traits<InputIterator>::difference_type
4170     difference_type;
4171   typedef std::input_iterator_tag iterator_category;
4172 
4173   class pointer {
4174     TemplateArgumentLoc Arg;
4175 
4176   public:
4177     explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { }
4178 
4179     const TemplateArgumentLoc *operator->() const { return &Arg; }
4180   };
4181 
4182   TemplateArgumentLocInventIterator() { }
4183 
4184   explicit TemplateArgumentLocInventIterator(TreeTransform<Derived> &Self,
4185                                              InputIterator Iter)
4186     : Self(Self), Iter(Iter) { }
4187 
4188   TemplateArgumentLocInventIterator &operator++() {
4189     ++Iter;
4190     return *this;
4191   }
4192 
4193   TemplateArgumentLocInventIterator operator++(int) {
4194     TemplateArgumentLocInventIterator Old(*this);
4195     ++(*this);
4196     return Old;
4197   }
4198 
4199   reference operator*() const {
4200     TemplateArgumentLoc Result;
4201     Self.InventTemplateArgumentLoc(*Iter, Result);
4202     return Result;
4203   }
4204 
4205   pointer operator->() const { return pointer(**this); }
4206 
4207   friend bool operator==(const TemplateArgumentLocInventIterator &X,
4208                          const TemplateArgumentLocInventIterator &Y) {
4209     return X.Iter == Y.Iter;
4210   }
4211 
4212   friend bool operator!=(const TemplateArgumentLocInventIterator &X,
4213                          const TemplateArgumentLocInventIterator &Y) {
4214     return X.Iter != Y.Iter;
4215   }
4216 };
4217 
4218 template<typename Derived>
4219 template<typename InputIterator>
4220 bool TreeTransform<Derived>::TransformTemplateArguments(
4221     InputIterator First, InputIterator Last, TemplateArgumentListInfo &Outputs,
4222     bool Uneval) {
4223   for (; First != Last; ++First) {
4224     TemplateArgumentLoc Out;
4225     TemplateArgumentLoc In = *First;
4226 
4227     if (In.getArgument().getKind() == TemplateArgument::Pack) {
4228       // Unpack argument packs, which we translate them into separate
4229       // arguments.
4230       // FIXME: We could do much better if we could guarantee that the
4231       // TemplateArgumentLocInfo for the pack expansion would be usable for
4232       // all of the template arguments in the argument pack.
4233       typedef TemplateArgumentLocInventIterator<Derived,
4234                                                 TemplateArgument::pack_iterator>
4235         PackLocIterator;
4236       if (TransformTemplateArguments(PackLocIterator(*this,
4237                                                  In.getArgument().pack_begin()),
4238                                      PackLocIterator(*this,
4239                                                    In.getArgument().pack_end()),
4240                                      Outputs, Uneval))
4241         return true;
4242 
4243       continue;
4244     }
4245 
4246     if (In.getArgument().isPackExpansion()) {
4247       // We have a pack expansion, for which we will be substituting into
4248       // the pattern.
4249       SourceLocation Ellipsis;
4250       Optional<unsigned> OrigNumExpansions;
4251       TemplateArgumentLoc Pattern
4252         = getSema().getTemplateArgumentPackExpansionPattern(
4253               In, Ellipsis, OrigNumExpansions);
4254 
4255       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
4256       getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
4257       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
4258 
4259       // Determine whether the set of unexpanded parameter packs can and should
4260       // be expanded.
4261       bool Expand = true;
4262       bool RetainExpansion = false;
4263       Optional<unsigned> NumExpansions = OrigNumExpansions;
4264       if (getDerived().TryExpandParameterPacks(Ellipsis,
4265                                                Pattern.getSourceRange(),
4266                                                Unexpanded,
4267                                                Expand,
4268                                                RetainExpansion,
4269                                                NumExpansions))
4270         return true;
4271 
4272       if (!Expand) {
4273         // The transform has determined that we should perform a simple
4274         // transformation on the pack expansion, producing another pack
4275         // expansion.
4276         TemplateArgumentLoc OutPattern;
4277         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
4278         if (getDerived().TransformTemplateArgument(Pattern, OutPattern, Uneval))
4279           return true;
4280 
4281         Out = getDerived().RebuildPackExpansion(OutPattern, Ellipsis,
4282                                                 NumExpansions);
4283         if (Out.getArgument().isNull())
4284           return true;
4285 
4286         Outputs.addArgument(Out);
4287         continue;
4288       }
4289 
4290       // The transform has determined that we should perform an elementwise
4291       // expansion of the pattern. Do so.
4292       for (unsigned I = 0; I != *NumExpansions; ++I) {
4293         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
4294 
4295         if (getDerived().TransformTemplateArgument(Pattern, Out, Uneval))
4296           return true;
4297 
4298         if (Out.getArgument().containsUnexpandedParameterPack()) {
4299           Out = getDerived().RebuildPackExpansion(Out, Ellipsis,
4300                                                   OrigNumExpansions);
4301           if (Out.getArgument().isNull())
4302             return true;
4303         }
4304 
4305         Outputs.addArgument(Out);
4306       }
4307 
4308       // If we're supposed to retain a pack expansion, do so by temporarily
4309       // forgetting the partially-substituted parameter pack.
4310       if (RetainExpansion) {
4311         ForgetPartiallySubstitutedPackRAII Forget(getDerived());
4312 
4313         if (getDerived().TransformTemplateArgument(Pattern, Out, Uneval))
4314           return true;
4315 
4316         Out = getDerived().RebuildPackExpansion(Out, Ellipsis,
4317                                                 OrigNumExpansions);
4318         if (Out.getArgument().isNull())
4319           return true;
4320 
4321         Outputs.addArgument(Out);
4322       }
4323 
4324       continue;
4325     }
4326 
4327     // The simple case:
4328     if (getDerived().TransformTemplateArgument(In, Out, Uneval))
4329       return true;
4330 
4331     Outputs.addArgument(Out);
4332   }
4333 
4334   return false;
4335 
4336 }
4337 
4338 //===----------------------------------------------------------------------===//
4339 // Type transformation
4340 //===----------------------------------------------------------------------===//
4341 
4342 template<typename Derived>
4343 QualType TreeTransform<Derived>::TransformType(QualType T) {
4344   if (getDerived().AlreadyTransformed(T))
4345     return T;
4346 
4347   // Temporary workaround.  All of these transformations should
4348   // eventually turn into transformations on TypeLocs.
4349   TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(T,
4350                                                 getDerived().getBaseLocation());
4351 
4352   TypeSourceInfo *NewDI = getDerived().TransformType(DI);
4353 
4354   if (!NewDI)
4355     return QualType();
4356 
4357   return NewDI->getType();
4358 }
4359 
4360 template<typename Derived>
4361 TypeSourceInfo *TreeTransform<Derived>::TransformType(TypeSourceInfo *DI) {
4362   // Refine the base location to the type's location.
4363   TemporaryBase Rebase(*this, DI->getTypeLoc().getBeginLoc(),
4364                        getDerived().getBaseEntity());
4365   if (getDerived().AlreadyTransformed(DI->getType()))
4366     return DI;
4367 
4368   TypeLocBuilder TLB;
4369 
4370   TypeLoc TL = DI->getTypeLoc();
4371   TLB.reserve(TL.getFullDataSize());
4372 
4373   QualType Result = getDerived().TransformType(TLB, TL);
4374   if (Result.isNull())
4375     return nullptr;
4376 
4377   return TLB.getTypeSourceInfo(SemaRef.Context, Result);
4378 }
4379 
4380 template<typename Derived>
4381 QualType
4382 TreeTransform<Derived>::TransformType(TypeLocBuilder &TLB, TypeLoc T) {
4383   switch (T.getTypeLocClass()) {
4384 #define ABSTRACT_TYPELOC(CLASS, PARENT)
4385 #define TYPELOC(CLASS, PARENT)                                                 \
4386   case TypeLoc::CLASS:                                                         \
4387     return getDerived().Transform##CLASS##Type(TLB,                            \
4388                                                T.castAs<CLASS##TypeLoc>());
4389 #include "clang/AST/TypeLocNodes.def"
4390   }
4391 
4392   llvm_unreachable("unhandled type loc!");
4393 }
4394 
4395 template<typename Derived>
4396 QualType TreeTransform<Derived>::TransformTypeWithDeducedTST(QualType T) {
4397   if (!isa<DependentNameType>(T))
4398     return TransformType(T);
4399 
4400   if (getDerived().AlreadyTransformed(T))
4401     return T;
4402   TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(T,
4403                                                 getDerived().getBaseLocation());
4404   TypeSourceInfo *NewDI = getDerived().TransformTypeWithDeducedTST(DI);
4405   return NewDI ? NewDI->getType() : QualType();
4406 }
4407 
4408 template<typename Derived>
4409 TypeSourceInfo *
4410 TreeTransform<Derived>::TransformTypeWithDeducedTST(TypeSourceInfo *DI) {
4411   if (!isa<DependentNameType>(DI->getType()))
4412     return TransformType(DI);
4413 
4414   // Refine the base location to the type's location.
4415   TemporaryBase Rebase(*this, DI->getTypeLoc().getBeginLoc(),
4416                        getDerived().getBaseEntity());
4417   if (getDerived().AlreadyTransformed(DI->getType()))
4418     return DI;
4419 
4420   TypeLocBuilder TLB;
4421 
4422   TypeLoc TL = DI->getTypeLoc();
4423   TLB.reserve(TL.getFullDataSize());
4424 
4425   auto QTL = TL.getAs<QualifiedTypeLoc>();
4426   if (QTL)
4427     TL = QTL.getUnqualifiedLoc();
4428 
4429   auto DNTL = TL.castAs<DependentNameTypeLoc>();
4430 
4431   QualType Result = getDerived().TransformDependentNameType(
4432       TLB, DNTL, /*DeducedTSTContext*/true);
4433   if (Result.isNull())
4434     return nullptr;
4435 
4436   if (QTL) {
4437     Result = getDerived().RebuildQualifiedType(Result, QTL);
4438     if (Result.isNull())
4439       return nullptr;
4440     TLB.TypeWasModifiedSafely(Result);
4441   }
4442 
4443   return TLB.getTypeSourceInfo(SemaRef.Context, Result);
4444 }
4445 
4446 template<typename Derived>
4447 QualType
4448 TreeTransform<Derived>::TransformQualifiedType(TypeLocBuilder &TLB,
4449                                                QualifiedTypeLoc T) {
4450   QualType Result = getDerived().TransformType(TLB, T.getUnqualifiedLoc());
4451   if (Result.isNull())
4452     return QualType();
4453 
4454   Result = getDerived().RebuildQualifiedType(Result, T);
4455 
4456   if (Result.isNull())
4457     return QualType();
4458 
4459   // RebuildQualifiedType might have updated the type, but not in a way
4460   // that invalidates the TypeLoc. (There's no location information for
4461   // qualifiers.)
4462   TLB.TypeWasModifiedSafely(Result);
4463 
4464   return Result;
4465 }
4466 
4467 template <typename Derived>
4468 QualType TreeTransform<Derived>::RebuildQualifiedType(QualType T,
4469                                                       QualifiedTypeLoc TL) {
4470 
4471   SourceLocation Loc = TL.getBeginLoc();
4472   Qualifiers Quals = TL.getType().getLocalQualifiers();
4473 
4474   if (((T.getAddressSpace() != LangAS::Default &&
4475         Quals.getAddressSpace() != LangAS::Default)) &&
4476       T.getAddressSpace() != Quals.getAddressSpace()) {
4477     SemaRef.Diag(Loc, diag::err_address_space_mismatch_templ_inst)
4478         << TL.getType() << T;
4479     return QualType();
4480   }
4481 
4482   // C++ [dcl.fct]p7:
4483   //   [When] adding cv-qualifications on top of the function type [...] the
4484   //   cv-qualifiers are ignored.
4485   if (T->isFunctionType()) {
4486     T = SemaRef.getASTContext().getAddrSpaceQualType(T,
4487                                                      Quals.getAddressSpace());
4488     return T;
4489   }
4490 
4491   // C++ [dcl.ref]p1:
4492   //   when the cv-qualifiers are introduced through the use of a typedef-name
4493   //   or decltype-specifier [...] the cv-qualifiers are ignored.
4494   // Note that [dcl.ref]p1 lists all cases in which cv-qualifiers can be
4495   // applied to a reference type.
4496   if (T->isReferenceType()) {
4497     // The only qualifier that applies to a reference type is restrict.
4498     if (!Quals.hasRestrict())
4499       return T;
4500     Quals = Qualifiers::fromCVRMask(Qualifiers::Restrict);
4501   }
4502 
4503   // Suppress Objective-C lifetime qualifiers if they don't make sense for the
4504   // resulting type.
4505   if (Quals.hasObjCLifetime()) {
4506     if (!T->isObjCLifetimeType() && !T->isDependentType())
4507       Quals.removeObjCLifetime();
4508     else if (T.getObjCLifetime()) {
4509       // Objective-C ARC:
4510       //   A lifetime qualifier applied to a substituted template parameter
4511       //   overrides the lifetime qualifier from the template argument.
4512       const AutoType *AutoTy;
4513       if (const SubstTemplateTypeParmType *SubstTypeParam
4514                                 = dyn_cast<SubstTemplateTypeParmType>(T)) {
4515         QualType Replacement = SubstTypeParam->getReplacementType();
4516         Qualifiers Qs = Replacement.getQualifiers();
4517         Qs.removeObjCLifetime();
4518         Replacement = SemaRef.Context.getQualifiedType(
4519             Replacement.getUnqualifiedType(), Qs);
4520         T = SemaRef.Context.getSubstTemplateTypeParmType(
4521             SubstTypeParam->getReplacedParameter(), Replacement);
4522       } else if ((AutoTy = dyn_cast<AutoType>(T)) && AutoTy->isDeduced()) {
4523         // 'auto' types behave the same way as template parameters.
4524         QualType Deduced = AutoTy->getDeducedType();
4525         Qualifiers Qs = Deduced.getQualifiers();
4526         Qs.removeObjCLifetime();
4527         Deduced =
4528             SemaRef.Context.getQualifiedType(Deduced.getUnqualifiedType(), Qs);
4529         T = SemaRef.Context.getAutoType(Deduced, AutoTy->getKeyword(),
4530                                         AutoTy->isDependentType(),
4531                                         /*isPack=*/false,
4532                                         AutoTy->getTypeConstraintConcept(),
4533                                         AutoTy->getTypeConstraintArguments());
4534       } else {
4535         // Otherwise, complain about the addition of a qualifier to an
4536         // already-qualified type.
4537         // FIXME: Why is this check not in Sema::BuildQualifiedType?
4538         SemaRef.Diag(Loc, diag::err_attr_objc_ownership_redundant) << T;
4539         Quals.removeObjCLifetime();
4540       }
4541     }
4542   }
4543 
4544   return SemaRef.BuildQualifiedType(T, Loc, Quals);
4545 }
4546 
4547 template<typename Derived>
4548 TypeLoc
4549 TreeTransform<Derived>::TransformTypeInObjectScope(TypeLoc TL,
4550                                                    QualType ObjectType,
4551                                                    NamedDecl *UnqualLookup,
4552                                                    CXXScopeSpec &SS) {
4553   if (getDerived().AlreadyTransformed(TL.getType()))
4554     return TL;
4555 
4556   TypeSourceInfo *TSI =
4557       TransformTSIInObjectScope(TL, ObjectType, UnqualLookup, SS);
4558   if (TSI)
4559     return TSI->getTypeLoc();
4560   return TypeLoc();
4561 }
4562 
4563 template<typename Derived>
4564 TypeSourceInfo *
4565 TreeTransform<Derived>::TransformTypeInObjectScope(TypeSourceInfo *TSInfo,
4566                                                    QualType ObjectType,
4567                                                    NamedDecl *UnqualLookup,
4568                                                    CXXScopeSpec &SS) {
4569   if (getDerived().AlreadyTransformed(TSInfo->getType()))
4570     return TSInfo;
4571 
4572   return TransformTSIInObjectScope(TSInfo->getTypeLoc(), ObjectType,
4573                                    UnqualLookup, SS);
4574 }
4575 
4576 template <typename Derived>
4577 TypeSourceInfo *TreeTransform<Derived>::TransformTSIInObjectScope(
4578     TypeLoc TL, QualType ObjectType, NamedDecl *UnqualLookup,
4579     CXXScopeSpec &SS) {
4580   QualType T = TL.getType();
4581   assert(!getDerived().AlreadyTransformed(T));
4582 
4583   TypeLocBuilder TLB;
4584   QualType Result;
4585 
4586   if (isa<TemplateSpecializationType>(T)) {
4587     TemplateSpecializationTypeLoc SpecTL =
4588         TL.castAs<TemplateSpecializationTypeLoc>();
4589 
4590     TemplateName Template = getDerived().TransformTemplateName(
4591         SS, SpecTL.getTypePtr()->getTemplateName(), SpecTL.getTemplateNameLoc(),
4592         ObjectType, UnqualLookup, /*AllowInjectedClassName*/true);
4593     if (Template.isNull())
4594       return nullptr;
4595 
4596     Result = getDerived().TransformTemplateSpecializationType(TLB, SpecTL,
4597                                                               Template);
4598   } else if (isa<DependentTemplateSpecializationType>(T)) {
4599     DependentTemplateSpecializationTypeLoc SpecTL =
4600         TL.castAs<DependentTemplateSpecializationTypeLoc>();
4601 
4602     TemplateName Template
4603       = getDerived().RebuildTemplateName(SS,
4604                                          SpecTL.getTemplateKeywordLoc(),
4605                                          *SpecTL.getTypePtr()->getIdentifier(),
4606                                          SpecTL.getTemplateNameLoc(),
4607                                          ObjectType, UnqualLookup,
4608                                          /*AllowInjectedClassName*/true);
4609     if (Template.isNull())
4610       return nullptr;
4611 
4612     Result = getDerived().TransformDependentTemplateSpecializationType(TLB,
4613                                                                        SpecTL,
4614                                                                        Template,
4615                                                                        SS);
4616   } else {
4617     // Nothing special needs to be done for these.
4618     Result = getDerived().TransformType(TLB, TL);
4619   }
4620 
4621   if (Result.isNull())
4622     return nullptr;
4623 
4624   return TLB.getTypeSourceInfo(SemaRef.Context, Result);
4625 }
4626 
4627 template <class TyLoc> static inline
4628 QualType TransformTypeSpecType(TypeLocBuilder &TLB, TyLoc T) {
4629   TyLoc NewT = TLB.push<TyLoc>(T.getType());
4630   NewT.setNameLoc(T.getNameLoc());
4631   return T.getType();
4632 }
4633 
4634 template<typename Derived>
4635 QualType TreeTransform<Derived>::TransformBuiltinType(TypeLocBuilder &TLB,
4636                                                       BuiltinTypeLoc T) {
4637   BuiltinTypeLoc NewT = TLB.push<BuiltinTypeLoc>(T.getType());
4638   NewT.setBuiltinLoc(T.getBuiltinLoc());
4639   if (T.needsExtraLocalData())
4640     NewT.getWrittenBuiltinSpecs() = T.getWrittenBuiltinSpecs();
4641   return T.getType();
4642 }
4643 
4644 template<typename Derived>
4645 QualType TreeTransform<Derived>::TransformComplexType(TypeLocBuilder &TLB,
4646                                                       ComplexTypeLoc T) {
4647   // FIXME: recurse?
4648   return TransformTypeSpecType(TLB, T);
4649 }
4650 
4651 template <typename Derived>
4652 QualType TreeTransform<Derived>::TransformAdjustedType(TypeLocBuilder &TLB,
4653                                                        AdjustedTypeLoc TL) {
4654   // Adjustments applied during transformation are handled elsewhere.
4655   return getDerived().TransformType(TLB, TL.getOriginalLoc());
4656 }
4657 
4658 template<typename Derived>
4659 QualType TreeTransform<Derived>::TransformDecayedType(TypeLocBuilder &TLB,
4660                                                       DecayedTypeLoc TL) {
4661   QualType OriginalType = getDerived().TransformType(TLB, TL.getOriginalLoc());
4662   if (OriginalType.isNull())
4663     return QualType();
4664 
4665   QualType Result = TL.getType();
4666   if (getDerived().AlwaysRebuild() ||
4667       OriginalType != TL.getOriginalLoc().getType())
4668     Result = SemaRef.Context.getDecayedType(OriginalType);
4669   TLB.push<DecayedTypeLoc>(Result);
4670   // Nothing to set for DecayedTypeLoc.
4671   return Result;
4672 }
4673 
4674 template<typename Derived>
4675 QualType TreeTransform<Derived>::TransformPointerType(TypeLocBuilder &TLB,
4676                                                       PointerTypeLoc TL) {
4677   QualType PointeeType
4678     = getDerived().TransformType(TLB, TL.getPointeeLoc());
4679   if (PointeeType.isNull())
4680     return QualType();
4681 
4682   QualType Result = TL.getType();
4683   if (PointeeType->getAs<ObjCObjectType>()) {
4684     // A dependent pointer type 'T *' has is being transformed such
4685     // that an Objective-C class type is being replaced for 'T'. The
4686     // resulting pointer type is an ObjCObjectPointerType, not a
4687     // PointerType.
4688     Result = SemaRef.Context.getObjCObjectPointerType(PointeeType);
4689 
4690     ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result);
4691     NewT.setStarLoc(TL.getStarLoc());
4692     return Result;
4693   }
4694 
4695   if (getDerived().AlwaysRebuild() ||
4696       PointeeType != TL.getPointeeLoc().getType()) {
4697     Result = getDerived().RebuildPointerType(PointeeType, TL.getSigilLoc());
4698     if (Result.isNull())
4699       return QualType();
4700   }
4701 
4702   // Objective-C ARC can add lifetime qualifiers to the type that we're
4703   // pointing to.
4704   TLB.TypeWasModifiedSafely(Result->getPointeeType());
4705 
4706   PointerTypeLoc NewT = TLB.push<PointerTypeLoc>(Result);
4707   NewT.setSigilLoc(TL.getSigilLoc());
4708   return Result;
4709 }
4710 
4711 template<typename Derived>
4712 QualType
4713 TreeTransform<Derived>::TransformBlockPointerType(TypeLocBuilder &TLB,
4714                                                   BlockPointerTypeLoc TL) {
4715   QualType PointeeType
4716     = getDerived().TransformType(TLB, TL.getPointeeLoc());
4717   if (PointeeType.isNull())
4718     return QualType();
4719 
4720   QualType Result = TL.getType();
4721   if (getDerived().AlwaysRebuild() ||
4722       PointeeType != TL.getPointeeLoc().getType()) {
4723     Result = getDerived().RebuildBlockPointerType(PointeeType,
4724                                                   TL.getSigilLoc());
4725     if (Result.isNull())
4726       return QualType();
4727   }
4728 
4729   BlockPointerTypeLoc NewT = TLB.push<BlockPointerTypeLoc>(Result);
4730   NewT.setSigilLoc(TL.getSigilLoc());
4731   return Result;
4732 }
4733 
4734 /// Transforms a reference type.  Note that somewhat paradoxically we
4735 /// don't care whether the type itself is an l-value type or an r-value
4736 /// type;  we only care if the type was *written* as an l-value type
4737 /// or an r-value type.
4738 template<typename Derived>
4739 QualType
4740 TreeTransform<Derived>::TransformReferenceType(TypeLocBuilder &TLB,
4741                                                ReferenceTypeLoc TL) {
4742   const ReferenceType *T = TL.getTypePtr();
4743 
4744   // Note that this works with the pointee-as-written.
4745   QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
4746   if (PointeeType.isNull())
4747     return QualType();
4748 
4749   QualType Result = TL.getType();
4750   if (getDerived().AlwaysRebuild() ||
4751       PointeeType != T->getPointeeTypeAsWritten()) {
4752     Result = getDerived().RebuildReferenceType(PointeeType,
4753                                                T->isSpelledAsLValue(),
4754                                                TL.getSigilLoc());
4755     if (Result.isNull())
4756       return QualType();
4757   }
4758 
4759   // Objective-C ARC can add lifetime qualifiers to the type that we're
4760   // referring to.
4761   TLB.TypeWasModifiedSafely(
4762       Result->castAs<ReferenceType>()->getPointeeTypeAsWritten());
4763 
4764   // r-value references can be rebuilt as l-value references.
4765   ReferenceTypeLoc NewTL;
4766   if (isa<LValueReferenceType>(Result))
4767     NewTL = TLB.push<LValueReferenceTypeLoc>(Result);
4768   else
4769     NewTL = TLB.push<RValueReferenceTypeLoc>(Result);
4770   NewTL.setSigilLoc(TL.getSigilLoc());
4771 
4772   return Result;
4773 }
4774 
4775 template<typename Derived>
4776 QualType
4777 TreeTransform<Derived>::TransformLValueReferenceType(TypeLocBuilder &TLB,
4778                                                  LValueReferenceTypeLoc TL) {
4779   return TransformReferenceType(TLB, TL);
4780 }
4781 
4782 template<typename Derived>
4783 QualType
4784 TreeTransform<Derived>::TransformRValueReferenceType(TypeLocBuilder &TLB,
4785                                                  RValueReferenceTypeLoc TL) {
4786   return TransformReferenceType(TLB, TL);
4787 }
4788 
4789 template<typename Derived>
4790 QualType
4791 TreeTransform<Derived>::TransformMemberPointerType(TypeLocBuilder &TLB,
4792                                                    MemberPointerTypeLoc TL) {
4793   QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
4794   if (PointeeType.isNull())
4795     return QualType();
4796 
4797   TypeSourceInfo* OldClsTInfo = TL.getClassTInfo();
4798   TypeSourceInfo *NewClsTInfo = nullptr;
4799   if (OldClsTInfo) {
4800     NewClsTInfo = getDerived().TransformType(OldClsTInfo);
4801     if (!NewClsTInfo)
4802       return QualType();
4803   }
4804 
4805   const MemberPointerType *T = TL.getTypePtr();
4806   QualType OldClsType = QualType(T->getClass(), 0);
4807   QualType NewClsType;
4808   if (NewClsTInfo)
4809     NewClsType = NewClsTInfo->getType();
4810   else {
4811     NewClsType = getDerived().TransformType(OldClsType);
4812     if (NewClsType.isNull())
4813       return QualType();
4814   }
4815 
4816   QualType Result = TL.getType();
4817   if (getDerived().AlwaysRebuild() ||
4818       PointeeType != T->getPointeeType() ||
4819       NewClsType != OldClsType) {
4820     Result = getDerived().RebuildMemberPointerType(PointeeType, NewClsType,
4821                                                    TL.getStarLoc());
4822     if (Result.isNull())
4823       return QualType();
4824   }
4825 
4826   // If we had to adjust the pointee type when building a member pointer, make
4827   // sure to push TypeLoc info for it.
4828   const MemberPointerType *MPT = Result->getAs<MemberPointerType>();
4829   if (MPT && PointeeType != MPT->getPointeeType()) {
4830     assert(isa<AdjustedType>(MPT->getPointeeType()));
4831     TLB.push<AdjustedTypeLoc>(MPT->getPointeeType());
4832   }
4833 
4834   MemberPointerTypeLoc NewTL = TLB.push<MemberPointerTypeLoc>(Result);
4835   NewTL.setSigilLoc(TL.getSigilLoc());
4836   NewTL.setClassTInfo(NewClsTInfo);
4837 
4838   return Result;
4839 }
4840 
4841 template<typename Derived>
4842 QualType
4843 TreeTransform<Derived>::TransformConstantArrayType(TypeLocBuilder &TLB,
4844                                                    ConstantArrayTypeLoc TL) {
4845   const ConstantArrayType *T = TL.getTypePtr();
4846   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
4847   if (ElementType.isNull())
4848     return QualType();
4849 
4850   // Prefer the expression from the TypeLoc;  the other may have been uniqued.
4851   Expr *OldSize = TL.getSizeExpr();
4852   if (!OldSize)
4853     OldSize = const_cast<Expr*>(T->getSizeExpr());
4854   Expr *NewSize = nullptr;
4855   if (OldSize) {
4856     EnterExpressionEvaluationContext Unevaluated(
4857         SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
4858     NewSize = getDerived().TransformExpr(OldSize).template getAs<Expr>();
4859     NewSize = SemaRef.ActOnConstantExpression(NewSize).get();
4860   }
4861 
4862   QualType Result = TL.getType();
4863   if (getDerived().AlwaysRebuild() ||
4864       ElementType != T->getElementType() ||
4865       (T->getSizeExpr() && NewSize != OldSize)) {
4866     Result = getDerived().RebuildConstantArrayType(ElementType,
4867                                                    T->getSizeModifier(),
4868                                                    T->getSize(), NewSize,
4869                                              T->getIndexTypeCVRQualifiers(),
4870                                                    TL.getBracketsRange());
4871     if (Result.isNull())
4872       return QualType();
4873   }
4874 
4875   // We might have either a ConstantArrayType or a VariableArrayType now:
4876   // a ConstantArrayType is allowed to have an element type which is a
4877   // VariableArrayType if the type is dependent.  Fortunately, all array
4878   // types have the same location layout.
4879   ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result);
4880   NewTL.setLBracketLoc(TL.getLBracketLoc());
4881   NewTL.setRBracketLoc(TL.getRBracketLoc());
4882   NewTL.setSizeExpr(NewSize);
4883 
4884   return Result;
4885 }
4886 
4887 template<typename Derived>
4888 QualType TreeTransform<Derived>::TransformIncompleteArrayType(
4889                                               TypeLocBuilder &TLB,
4890                                               IncompleteArrayTypeLoc TL) {
4891   const IncompleteArrayType *T = TL.getTypePtr();
4892   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
4893   if (ElementType.isNull())
4894     return QualType();
4895 
4896   QualType Result = TL.getType();
4897   if (getDerived().AlwaysRebuild() ||
4898       ElementType != T->getElementType()) {
4899     Result = getDerived().RebuildIncompleteArrayType(ElementType,
4900                                                      T->getSizeModifier(),
4901                                            T->getIndexTypeCVRQualifiers(),
4902                                                      TL.getBracketsRange());
4903     if (Result.isNull())
4904       return QualType();
4905   }
4906 
4907   IncompleteArrayTypeLoc NewTL = TLB.push<IncompleteArrayTypeLoc>(Result);
4908   NewTL.setLBracketLoc(TL.getLBracketLoc());
4909   NewTL.setRBracketLoc(TL.getRBracketLoc());
4910   NewTL.setSizeExpr(nullptr);
4911 
4912   return Result;
4913 }
4914 
4915 template<typename Derived>
4916 QualType
4917 TreeTransform<Derived>::TransformVariableArrayType(TypeLocBuilder &TLB,
4918                                                    VariableArrayTypeLoc TL) {
4919   const VariableArrayType *T = TL.getTypePtr();
4920   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
4921   if (ElementType.isNull())
4922     return QualType();
4923 
4924   ExprResult SizeResult;
4925   {
4926     EnterExpressionEvaluationContext Context(
4927         SemaRef, Sema::ExpressionEvaluationContext::PotentiallyEvaluated);
4928     SizeResult = getDerived().TransformExpr(T->getSizeExpr());
4929   }
4930   if (SizeResult.isInvalid())
4931     return QualType();
4932   SizeResult =
4933       SemaRef.ActOnFinishFullExpr(SizeResult.get(), /*DiscardedValue*/ false);
4934   if (SizeResult.isInvalid())
4935     return QualType();
4936 
4937   Expr *Size = SizeResult.get();
4938 
4939   QualType Result = TL.getType();
4940   if (getDerived().AlwaysRebuild() ||
4941       ElementType != T->getElementType() ||
4942       Size != T->getSizeExpr()) {
4943     Result = getDerived().RebuildVariableArrayType(ElementType,
4944                                                    T->getSizeModifier(),
4945                                                    Size,
4946                                              T->getIndexTypeCVRQualifiers(),
4947                                                    TL.getBracketsRange());
4948     if (Result.isNull())
4949       return QualType();
4950   }
4951 
4952   // We might have constant size array now, but fortunately it has the same
4953   // location layout.
4954   ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result);
4955   NewTL.setLBracketLoc(TL.getLBracketLoc());
4956   NewTL.setRBracketLoc(TL.getRBracketLoc());
4957   NewTL.setSizeExpr(Size);
4958 
4959   return Result;
4960 }
4961 
4962 template<typename Derived>
4963 QualType
4964 TreeTransform<Derived>::TransformDependentSizedArrayType(TypeLocBuilder &TLB,
4965                                              DependentSizedArrayTypeLoc TL) {
4966   const DependentSizedArrayType *T = TL.getTypePtr();
4967   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
4968   if (ElementType.isNull())
4969     return QualType();
4970 
4971   // Array bounds are constant expressions.
4972   EnterExpressionEvaluationContext Unevaluated(
4973       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
4974 
4975   // Prefer the expression from the TypeLoc;  the other may have been uniqued.
4976   Expr *origSize = TL.getSizeExpr();
4977   if (!origSize) origSize = T->getSizeExpr();
4978 
4979   ExprResult sizeResult
4980     = getDerived().TransformExpr(origSize);
4981   sizeResult = SemaRef.ActOnConstantExpression(sizeResult);
4982   if (sizeResult.isInvalid())
4983     return QualType();
4984 
4985   Expr *size = sizeResult.get();
4986 
4987   QualType Result = TL.getType();
4988   if (getDerived().AlwaysRebuild() ||
4989       ElementType != T->getElementType() ||
4990       size != origSize) {
4991     Result = getDerived().RebuildDependentSizedArrayType(ElementType,
4992                                                          T->getSizeModifier(),
4993                                                          size,
4994                                                 T->getIndexTypeCVRQualifiers(),
4995                                                         TL.getBracketsRange());
4996     if (Result.isNull())
4997       return QualType();
4998   }
4999 
5000   // We might have any sort of array type now, but fortunately they
5001   // all have the same location layout.
5002   ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result);
5003   NewTL.setLBracketLoc(TL.getLBracketLoc());
5004   NewTL.setRBracketLoc(TL.getRBracketLoc());
5005   NewTL.setSizeExpr(size);
5006 
5007   return Result;
5008 }
5009 
5010 template <typename Derived>
5011 QualType TreeTransform<Derived>::TransformDependentVectorType(
5012     TypeLocBuilder &TLB, DependentVectorTypeLoc TL) {
5013   const DependentVectorType *T = TL.getTypePtr();
5014   QualType ElementType = getDerived().TransformType(T->getElementType());
5015   if (ElementType.isNull())
5016     return QualType();
5017 
5018   EnterExpressionEvaluationContext Unevaluated(
5019       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
5020 
5021   ExprResult Size = getDerived().TransformExpr(T->getSizeExpr());
5022   Size = SemaRef.ActOnConstantExpression(Size);
5023   if (Size.isInvalid())
5024     return QualType();
5025 
5026   QualType Result = TL.getType();
5027   if (getDerived().AlwaysRebuild() || ElementType != T->getElementType() ||
5028       Size.get() != T->getSizeExpr()) {
5029     Result = getDerived().RebuildDependentVectorType(
5030         ElementType, Size.get(), T->getAttributeLoc(), T->getVectorKind());
5031     if (Result.isNull())
5032       return QualType();
5033   }
5034 
5035   // Result might be dependent or not.
5036   if (isa<DependentVectorType>(Result)) {
5037     DependentVectorTypeLoc NewTL =
5038         TLB.push<DependentVectorTypeLoc>(Result);
5039     NewTL.setNameLoc(TL.getNameLoc());
5040   } else {
5041     VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result);
5042     NewTL.setNameLoc(TL.getNameLoc());
5043   }
5044 
5045   return Result;
5046 }
5047 
5048 template<typename Derived>
5049 QualType TreeTransform<Derived>::TransformDependentSizedExtVectorType(
5050                                       TypeLocBuilder &TLB,
5051                                       DependentSizedExtVectorTypeLoc TL) {
5052   const DependentSizedExtVectorType *T = TL.getTypePtr();
5053 
5054   // FIXME: ext vector locs should be nested
5055   QualType ElementType = getDerived().TransformType(T->getElementType());
5056   if (ElementType.isNull())
5057     return QualType();
5058 
5059   // Vector sizes are constant expressions.
5060   EnterExpressionEvaluationContext Unevaluated(
5061       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
5062 
5063   ExprResult Size = getDerived().TransformExpr(T->getSizeExpr());
5064   Size = SemaRef.ActOnConstantExpression(Size);
5065   if (Size.isInvalid())
5066     return QualType();
5067 
5068   QualType Result = TL.getType();
5069   if (getDerived().AlwaysRebuild() ||
5070       ElementType != T->getElementType() ||
5071       Size.get() != T->getSizeExpr()) {
5072     Result = getDerived().RebuildDependentSizedExtVectorType(ElementType,
5073                                                              Size.get(),
5074                                                          T->getAttributeLoc());
5075     if (Result.isNull())
5076       return QualType();
5077   }
5078 
5079   // Result might be dependent or not.
5080   if (isa<DependentSizedExtVectorType>(Result)) {
5081     DependentSizedExtVectorTypeLoc NewTL
5082       = TLB.push<DependentSizedExtVectorTypeLoc>(Result);
5083     NewTL.setNameLoc(TL.getNameLoc());
5084   } else {
5085     ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result);
5086     NewTL.setNameLoc(TL.getNameLoc());
5087   }
5088 
5089   return Result;
5090 }
5091 
5092 template <typename Derived>
5093 QualType TreeTransform<Derived>::TransformDependentAddressSpaceType(
5094     TypeLocBuilder &TLB, DependentAddressSpaceTypeLoc TL) {
5095   const DependentAddressSpaceType *T = TL.getTypePtr();
5096 
5097   QualType pointeeType = getDerived().TransformType(T->getPointeeType());
5098 
5099   if (pointeeType.isNull())
5100     return QualType();
5101 
5102   // Address spaces are constant expressions.
5103   EnterExpressionEvaluationContext Unevaluated(
5104       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
5105 
5106   ExprResult AddrSpace = getDerived().TransformExpr(T->getAddrSpaceExpr());
5107   AddrSpace = SemaRef.ActOnConstantExpression(AddrSpace);
5108   if (AddrSpace.isInvalid())
5109     return QualType();
5110 
5111   QualType Result = TL.getType();
5112   if (getDerived().AlwaysRebuild() || pointeeType != T->getPointeeType() ||
5113       AddrSpace.get() != T->getAddrSpaceExpr()) {
5114     Result = getDerived().RebuildDependentAddressSpaceType(
5115         pointeeType, AddrSpace.get(), T->getAttributeLoc());
5116     if (Result.isNull())
5117       return QualType();
5118   }
5119 
5120   // Result might be dependent or not.
5121   if (isa<DependentAddressSpaceType>(Result)) {
5122     DependentAddressSpaceTypeLoc NewTL =
5123         TLB.push<DependentAddressSpaceTypeLoc>(Result);
5124 
5125     NewTL.setAttrOperandParensRange(TL.getAttrOperandParensRange());
5126     NewTL.setAttrExprOperand(TL.getAttrExprOperand());
5127     NewTL.setAttrNameLoc(TL.getAttrNameLoc());
5128 
5129   } else {
5130     TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(
5131         Result, getDerived().getBaseLocation());
5132     TransformType(TLB, DI->getTypeLoc());
5133   }
5134 
5135   return Result;
5136 }
5137 
5138 template <typename Derived>
5139 QualType TreeTransform<Derived>::TransformVectorType(TypeLocBuilder &TLB,
5140                                                      VectorTypeLoc TL) {
5141   const VectorType *T = TL.getTypePtr();
5142   QualType ElementType = getDerived().TransformType(T->getElementType());
5143   if (ElementType.isNull())
5144     return QualType();
5145 
5146   QualType Result = TL.getType();
5147   if (getDerived().AlwaysRebuild() ||
5148       ElementType != T->getElementType()) {
5149     Result = getDerived().RebuildVectorType(ElementType, T->getNumElements(),
5150                                             T->getVectorKind());
5151     if (Result.isNull())
5152       return QualType();
5153   }
5154 
5155   VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result);
5156   NewTL.setNameLoc(TL.getNameLoc());
5157 
5158   return Result;
5159 }
5160 
5161 template<typename Derived>
5162 QualType TreeTransform<Derived>::TransformExtVectorType(TypeLocBuilder &TLB,
5163                                                         ExtVectorTypeLoc TL) {
5164   const VectorType *T = TL.getTypePtr();
5165   QualType ElementType = getDerived().TransformType(T->getElementType());
5166   if (ElementType.isNull())
5167     return QualType();
5168 
5169   QualType Result = TL.getType();
5170   if (getDerived().AlwaysRebuild() ||
5171       ElementType != T->getElementType()) {
5172     Result = getDerived().RebuildExtVectorType(ElementType,
5173                                                T->getNumElements(),
5174                                                /*FIXME*/ SourceLocation());
5175     if (Result.isNull())
5176       return QualType();
5177   }
5178 
5179   ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result);
5180   NewTL.setNameLoc(TL.getNameLoc());
5181 
5182   return Result;
5183 }
5184 
5185 template <typename Derived>
5186 ParmVarDecl *TreeTransform<Derived>::TransformFunctionTypeParam(
5187     ParmVarDecl *OldParm, int indexAdjustment, Optional<unsigned> NumExpansions,
5188     bool ExpectParameterPack) {
5189   TypeSourceInfo *OldDI = OldParm->getTypeSourceInfo();
5190   TypeSourceInfo *NewDI = nullptr;
5191 
5192   if (NumExpansions && isa<PackExpansionType>(OldDI->getType())) {
5193     // If we're substituting into a pack expansion type and we know the
5194     // length we want to expand to, just substitute for the pattern.
5195     TypeLoc OldTL = OldDI->getTypeLoc();
5196     PackExpansionTypeLoc OldExpansionTL = OldTL.castAs<PackExpansionTypeLoc>();
5197 
5198     TypeLocBuilder TLB;
5199     TypeLoc NewTL = OldDI->getTypeLoc();
5200     TLB.reserve(NewTL.getFullDataSize());
5201 
5202     QualType Result = getDerived().TransformType(TLB,
5203                                                OldExpansionTL.getPatternLoc());
5204     if (Result.isNull())
5205       return nullptr;
5206 
5207     Result = RebuildPackExpansionType(Result,
5208                                 OldExpansionTL.getPatternLoc().getSourceRange(),
5209                                       OldExpansionTL.getEllipsisLoc(),
5210                                       NumExpansions);
5211     if (Result.isNull())
5212       return nullptr;
5213 
5214     PackExpansionTypeLoc NewExpansionTL
5215       = TLB.push<PackExpansionTypeLoc>(Result);
5216     NewExpansionTL.setEllipsisLoc(OldExpansionTL.getEllipsisLoc());
5217     NewDI = TLB.getTypeSourceInfo(SemaRef.Context, Result);
5218   } else
5219     NewDI = getDerived().TransformType(OldDI);
5220   if (!NewDI)
5221     return nullptr;
5222 
5223   if (NewDI == OldDI && indexAdjustment == 0)
5224     return OldParm;
5225 
5226   ParmVarDecl *newParm = ParmVarDecl::Create(SemaRef.Context,
5227                                              OldParm->getDeclContext(),
5228                                              OldParm->getInnerLocStart(),
5229                                              OldParm->getLocation(),
5230                                              OldParm->getIdentifier(),
5231                                              NewDI->getType(),
5232                                              NewDI,
5233                                              OldParm->getStorageClass(),
5234                                              /* DefArg */ nullptr);
5235   newParm->setScopeInfo(OldParm->getFunctionScopeDepth(),
5236                         OldParm->getFunctionScopeIndex() + indexAdjustment);
5237   return newParm;
5238 }
5239 
5240 template <typename Derived>
5241 bool TreeTransform<Derived>::TransformFunctionTypeParams(
5242     SourceLocation Loc, ArrayRef<ParmVarDecl *> Params,
5243     const QualType *ParamTypes,
5244     const FunctionProtoType::ExtParameterInfo *ParamInfos,
5245     SmallVectorImpl<QualType> &OutParamTypes,
5246     SmallVectorImpl<ParmVarDecl *> *PVars,
5247     Sema::ExtParameterInfoBuilder &PInfos) {
5248   int indexAdjustment = 0;
5249 
5250   unsigned NumParams = Params.size();
5251   for (unsigned i = 0; i != NumParams; ++i) {
5252     if (ParmVarDecl *OldParm = Params[i]) {
5253       assert(OldParm->getFunctionScopeIndex() == i);
5254 
5255       Optional<unsigned> NumExpansions;
5256       ParmVarDecl *NewParm = nullptr;
5257       if (OldParm->isParameterPack()) {
5258         // We have a function parameter pack that may need to be expanded.
5259         SmallVector<UnexpandedParameterPack, 2> Unexpanded;
5260 
5261         // Find the parameter packs that could be expanded.
5262         TypeLoc TL = OldParm->getTypeSourceInfo()->getTypeLoc();
5263         PackExpansionTypeLoc ExpansionTL = TL.castAs<PackExpansionTypeLoc>();
5264         TypeLoc Pattern = ExpansionTL.getPatternLoc();
5265         SemaRef.collectUnexpandedParameterPacks(Pattern, Unexpanded);
5266 
5267         // Determine whether we should expand the parameter packs.
5268         bool ShouldExpand = false;
5269         bool RetainExpansion = false;
5270         Optional<unsigned> OrigNumExpansions;
5271         if (Unexpanded.size() > 0) {
5272           OrigNumExpansions = ExpansionTL.getTypePtr()->getNumExpansions();
5273           NumExpansions = OrigNumExpansions;
5274           if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(),
5275                                                    Pattern.getSourceRange(),
5276                                                    Unexpanded,
5277                                                    ShouldExpand,
5278                                                    RetainExpansion,
5279                                                    NumExpansions)) {
5280             return true;
5281           }
5282         } else {
5283 #ifndef NDEBUG
5284           const AutoType *AT =
5285               Pattern.getType().getTypePtr()->getContainedAutoType();
5286           assert((AT && (!AT->isDeduced() || AT->getDeducedType().isNull())) &&
5287                  "Could not find parameter packs or undeduced auto type!");
5288 #endif
5289         }
5290 
5291         if (ShouldExpand) {
5292           // Expand the function parameter pack into multiple, separate
5293           // parameters.
5294           getDerived().ExpandingFunctionParameterPack(OldParm);
5295           for (unsigned I = 0; I != *NumExpansions; ++I) {
5296             Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
5297             ParmVarDecl *NewParm
5298               = getDerived().TransformFunctionTypeParam(OldParm,
5299                                                         indexAdjustment++,
5300                                                         OrigNumExpansions,
5301                                                 /*ExpectParameterPack=*/false);
5302             if (!NewParm)
5303               return true;
5304 
5305             if (ParamInfos)
5306               PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5307             OutParamTypes.push_back(NewParm->getType());
5308             if (PVars)
5309               PVars->push_back(NewParm);
5310           }
5311 
5312           // If we're supposed to retain a pack expansion, do so by temporarily
5313           // forgetting the partially-substituted parameter pack.
5314           if (RetainExpansion) {
5315             ForgetPartiallySubstitutedPackRAII Forget(getDerived());
5316             ParmVarDecl *NewParm
5317               = getDerived().TransformFunctionTypeParam(OldParm,
5318                                                         indexAdjustment++,
5319                                                         OrigNumExpansions,
5320                                                 /*ExpectParameterPack=*/false);
5321             if (!NewParm)
5322               return true;
5323 
5324             if (ParamInfos)
5325               PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5326             OutParamTypes.push_back(NewParm->getType());
5327             if (PVars)
5328               PVars->push_back(NewParm);
5329           }
5330 
5331           // The next parameter should have the same adjustment as the
5332           // last thing we pushed, but we post-incremented indexAdjustment
5333           // on every push.  Also, if we push nothing, the adjustment should
5334           // go down by one.
5335           indexAdjustment--;
5336 
5337           // We're done with the pack expansion.
5338           continue;
5339         }
5340 
5341         // We'll substitute the parameter now without expanding the pack
5342         // expansion.
5343         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
5344         NewParm = getDerived().TransformFunctionTypeParam(OldParm,
5345                                                           indexAdjustment,
5346                                                           NumExpansions,
5347                                                   /*ExpectParameterPack=*/true);
5348         assert(NewParm->isParameterPack() &&
5349                "Parameter pack no longer a parameter pack after "
5350                "transformation.");
5351       } else {
5352         NewParm = getDerived().TransformFunctionTypeParam(
5353             OldParm, indexAdjustment, None, /*ExpectParameterPack=*/ false);
5354       }
5355 
5356       if (!NewParm)
5357         return true;
5358 
5359       if (ParamInfos)
5360         PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5361       OutParamTypes.push_back(NewParm->getType());
5362       if (PVars)
5363         PVars->push_back(NewParm);
5364       continue;
5365     }
5366 
5367     // Deal with the possibility that we don't have a parameter
5368     // declaration for this parameter.
5369     QualType OldType = ParamTypes[i];
5370     bool IsPackExpansion = false;
5371     Optional<unsigned> NumExpansions;
5372     QualType NewType;
5373     if (const PackExpansionType *Expansion
5374                                        = dyn_cast<PackExpansionType>(OldType)) {
5375       // We have a function parameter pack that may need to be expanded.
5376       QualType Pattern = Expansion->getPattern();
5377       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
5378       getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
5379 
5380       // Determine whether we should expand the parameter packs.
5381       bool ShouldExpand = false;
5382       bool RetainExpansion = false;
5383       if (getDerived().TryExpandParameterPacks(Loc, SourceRange(),
5384                                                Unexpanded,
5385                                                ShouldExpand,
5386                                                RetainExpansion,
5387                                                NumExpansions)) {
5388         return true;
5389       }
5390 
5391       if (ShouldExpand) {
5392         // Expand the function parameter pack into multiple, separate
5393         // parameters.
5394         for (unsigned I = 0; I != *NumExpansions; ++I) {
5395           Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
5396           QualType NewType = getDerived().TransformType(Pattern);
5397           if (NewType.isNull())
5398             return true;
5399 
5400           if (NewType->containsUnexpandedParameterPack()) {
5401             NewType =
5402                 getSema().getASTContext().getPackExpansionType(NewType, None);
5403 
5404             if (NewType.isNull())
5405               return true;
5406           }
5407 
5408           if (ParamInfos)
5409             PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5410           OutParamTypes.push_back(NewType);
5411           if (PVars)
5412             PVars->push_back(nullptr);
5413         }
5414 
5415         // We're done with the pack expansion.
5416         continue;
5417       }
5418 
5419       // If we're supposed to retain a pack expansion, do so by temporarily
5420       // forgetting the partially-substituted parameter pack.
5421       if (RetainExpansion) {
5422         ForgetPartiallySubstitutedPackRAII Forget(getDerived());
5423         QualType NewType = getDerived().TransformType(Pattern);
5424         if (NewType.isNull())
5425           return true;
5426 
5427         if (ParamInfos)
5428           PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5429         OutParamTypes.push_back(NewType);
5430         if (PVars)
5431           PVars->push_back(nullptr);
5432       }
5433 
5434       // We'll substitute the parameter now without expanding the pack
5435       // expansion.
5436       OldType = Expansion->getPattern();
5437       IsPackExpansion = true;
5438       Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
5439       NewType = getDerived().TransformType(OldType);
5440     } else {
5441       NewType = getDerived().TransformType(OldType);
5442     }
5443 
5444     if (NewType.isNull())
5445       return true;
5446 
5447     if (IsPackExpansion)
5448       NewType = getSema().Context.getPackExpansionType(NewType,
5449                                                        NumExpansions);
5450 
5451     if (ParamInfos)
5452       PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5453     OutParamTypes.push_back(NewType);
5454     if (PVars)
5455       PVars->push_back(nullptr);
5456   }
5457 
5458 #ifndef NDEBUG
5459   if (PVars) {
5460     for (unsigned i = 0, e = PVars->size(); i != e; ++i)
5461       if (ParmVarDecl *parm = (*PVars)[i])
5462         assert(parm->getFunctionScopeIndex() == i);
5463   }
5464 #endif
5465 
5466   return false;
5467 }
5468 
5469 template<typename Derived>
5470 QualType
5471 TreeTransform<Derived>::TransformFunctionProtoType(TypeLocBuilder &TLB,
5472                                                    FunctionProtoTypeLoc TL) {
5473   SmallVector<QualType, 4> ExceptionStorage;
5474   TreeTransform *This = this; // Work around gcc.gnu.org/PR56135.
5475   return getDerived().TransformFunctionProtoType(
5476       TLB, TL, nullptr, Qualifiers(),
5477       [&](FunctionProtoType::ExceptionSpecInfo &ESI, bool &Changed) {
5478         return This->TransformExceptionSpec(TL.getBeginLoc(), ESI,
5479                                             ExceptionStorage, Changed);
5480       });
5481 }
5482 
5483 template<typename Derived> template<typename Fn>
5484 QualType TreeTransform<Derived>::TransformFunctionProtoType(
5485     TypeLocBuilder &TLB, FunctionProtoTypeLoc TL, CXXRecordDecl *ThisContext,
5486     Qualifiers ThisTypeQuals, Fn TransformExceptionSpec) {
5487 
5488   // Transform the parameters and return type.
5489   //
5490   // We are required to instantiate the params and return type in source order.
5491   // When the function has a trailing return type, we instantiate the
5492   // parameters before the return type,  since the return type can then refer
5493   // to the parameters themselves (via decltype, sizeof, etc.).
5494   //
5495   SmallVector<QualType, 4> ParamTypes;
5496   SmallVector<ParmVarDecl*, 4> ParamDecls;
5497   Sema::ExtParameterInfoBuilder ExtParamInfos;
5498   const FunctionProtoType *T = TL.getTypePtr();
5499 
5500   QualType ResultType;
5501 
5502   if (T->hasTrailingReturn()) {
5503     if (getDerived().TransformFunctionTypeParams(
5504             TL.getBeginLoc(), TL.getParams(),
5505             TL.getTypePtr()->param_type_begin(),
5506             T->getExtParameterInfosOrNull(),
5507             ParamTypes, &ParamDecls, ExtParamInfos))
5508       return QualType();
5509 
5510     {
5511       // C++11 [expr.prim.general]p3:
5512       //   If a declaration declares a member function or member function
5513       //   template of a class X, the expression this is a prvalue of type
5514       //   "pointer to cv-qualifier-seq X" between the optional cv-qualifer-seq
5515       //   and the end of the function-definition, member-declarator, or
5516       //   declarator.
5517       Sema::CXXThisScopeRAII ThisScope(SemaRef, ThisContext, ThisTypeQuals);
5518 
5519       ResultType = getDerived().TransformType(TLB, TL.getReturnLoc());
5520       if (ResultType.isNull())
5521         return QualType();
5522     }
5523   }
5524   else {
5525     ResultType = getDerived().TransformType(TLB, TL.getReturnLoc());
5526     if (ResultType.isNull())
5527       return QualType();
5528 
5529     if (getDerived().TransformFunctionTypeParams(
5530             TL.getBeginLoc(), TL.getParams(),
5531             TL.getTypePtr()->param_type_begin(),
5532             T->getExtParameterInfosOrNull(),
5533             ParamTypes, &ParamDecls, ExtParamInfos))
5534       return QualType();
5535   }
5536 
5537   FunctionProtoType::ExtProtoInfo EPI = T->getExtProtoInfo();
5538 
5539   bool EPIChanged = false;
5540   if (TransformExceptionSpec(EPI.ExceptionSpec, EPIChanged))
5541     return QualType();
5542 
5543   // Handle extended parameter information.
5544   if (auto NewExtParamInfos =
5545         ExtParamInfos.getPointerOrNull(ParamTypes.size())) {
5546     if (!EPI.ExtParameterInfos ||
5547         llvm::makeArrayRef(EPI.ExtParameterInfos, TL.getNumParams())
5548           != llvm::makeArrayRef(NewExtParamInfos, ParamTypes.size())) {
5549       EPIChanged = true;
5550     }
5551     EPI.ExtParameterInfos = NewExtParamInfos;
5552   } else if (EPI.ExtParameterInfos) {
5553     EPIChanged = true;
5554     EPI.ExtParameterInfos = nullptr;
5555   }
5556 
5557   QualType Result = TL.getType();
5558   if (getDerived().AlwaysRebuild() || ResultType != T->getReturnType() ||
5559       T->getParamTypes() != llvm::makeArrayRef(ParamTypes) || EPIChanged) {
5560     Result = getDerived().RebuildFunctionProtoType(ResultType, ParamTypes, EPI);
5561     if (Result.isNull())
5562       return QualType();
5563   }
5564 
5565   FunctionProtoTypeLoc NewTL = TLB.push<FunctionProtoTypeLoc>(Result);
5566   NewTL.setLocalRangeBegin(TL.getLocalRangeBegin());
5567   NewTL.setLParenLoc(TL.getLParenLoc());
5568   NewTL.setRParenLoc(TL.getRParenLoc());
5569   NewTL.setExceptionSpecRange(TL.getExceptionSpecRange());
5570   NewTL.setLocalRangeEnd(TL.getLocalRangeEnd());
5571   for (unsigned i = 0, e = NewTL.getNumParams(); i != e; ++i)
5572     NewTL.setParam(i, ParamDecls[i]);
5573 
5574   return Result;
5575 }
5576 
5577 template<typename Derived>
5578 bool TreeTransform<Derived>::TransformExceptionSpec(
5579     SourceLocation Loc, FunctionProtoType::ExceptionSpecInfo &ESI,
5580     SmallVectorImpl<QualType> &Exceptions, bool &Changed) {
5581   assert(ESI.Type != EST_Uninstantiated && ESI.Type != EST_Unevaluated);
5582 
5583   // Instantiate a dynamic noexcept expression, if any.
5584   if (isComputedNoexcept(ESI.Type)) {
5585     EnterExpressionEvaluationContext Unevaluated(
5586         getSema(), Sema::ExpressionEvaluationContext::ConstantEvaluated);
5587     ExprResult NoexceptExpr = getDerived().TransformExpr(ESI.NoexceptExpr);
5588     if (NoexceptExpr.isInvalid())
5589       return true;
5590 
5591     ExceptionSpecificationType EST = ESI.Type;
5592     NoexceptExpr =
5593         getSema().ActOnNoexceptSpec(Loc, NoexceptExpr.get(), EST);
5594     if (NoexceptExpr.isInvalid())
5595       return true;
5596 
5597     if (ESI.NoexceptExpr != NoexceptExpr.get() || EST != ESI.Type)
5598       Changed = true;
5599     ESI.NoexceptExpr = NoexceptExpr.get();
5600     ESI.Type = EST;
5601   }
5602 
5603   if (ESI.Type != EST_Dynamic)
5604     return false;
5605 
5606   // Instantiate a dynamic exception specification's type.
5607   for (QualType T : ESI.Exceptions) {
5608     if (const PackExpansionType *PackExpansion =
5609             T->getAs<PackExpansionType>()) {
5610       Changed = true;
5611 
5612       // We have a pack expansion. Instantiate it.
5613       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
5614       SemaRef.collectUnexpandedParameterPacks(PackExpansion->getPattern(),
5615                                               Unexpanded);
5616       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
5617 
5618       // Determine whether the set of unexpanded parameter packs can and
5619       // should
5620       // be expanded.
5621       bool Expand = false;
5622       bool RetainExpansion = false;
5623       Optional<unsigned> NumExpansions = PackExpansion->getNumExpansions();
5624       // FIXME: Track the location of the ellipsis (and track source location
5625       // information for the types in the exception specification in general).
5626       if (getDerived().TryExpandParameterPacks(
5627               Loc, SourceRange(), Unexpanded, Expand,
5628               RetainExpansion, NumExpansions))
5629         return true;
5630 
5631       if (!Expand) {
5632         // We can't expand this pack expansion into separate arguments yet;
5633         // just substitute into the pattern and create a new pack expansion
5634         // type.
5635         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
5636         QualType U = getDerived().TransformType(PackExpansion->getPattern());
5637         if (U.isNull())
5638           return true;
5639 
5640         U = SemaRef.Context.getPackExpansionType(U, NumExpansions);
5641         Exceptions.push_back(U);
5642         continue;
5643       }
5644 
5645       // Substitute into the pack expansion pattern for each slice of the
5646       // pack.
5647       for (unsigned ArgIdx = 0; ArgIdx != *NumExpansions; ++ArgIdx) {
5648         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), ArgIdx);
5649 
5650         QualType U = getDerived().TransformType(PackExpansion->getPattern());
5651         if (U.isNull() || SemaRef.CheckSpecifiedExceptionType(U, Loc))
5652           return true;
5653 
5654         Exceptions.push_back(U);
5655       }
5656     } else {
5657       QualType U = getDerived().TransformType(T);
5658       if (U.isNull() || SemaRef.CheckSpecifiedExceptionType(U, Loc))
5659         return true;
5660       if (T != U)
5661         Changed = true;
5662 
5663       Exceptions.push_back(U);
5664     }
5665   }
5666 
5667   ESI.Exceptions = Exceptions;
5668   if (ESI.Exceptions.empty())
5669     ESI.Type = EST_DynamicNone;
5670   return false;
5671 }
5672 
5673 template<typename Derived>
5674 QualType TreeTransform<Derived>::TransformFunctionNoProtoType(
5675                                                  TypeLocBuilder &TLB,
5676                                                  FunctionNoProtoTypeLoc TL) {
5677   const FunctionNoProtoType *T = TL.getTypePtr();
5678   QualType ResultType = getDerived().TransformType(TLB, TL.getReturnLoc());
5679   if (ResultType.isNull())
5680     return QualType();
5681 
5682   QualType Result = TL.getType();
5683   if (getDerived().AlwaysRebuild() || ResultType != T->getReturnType())
5684     Result = getDerived().RebuildFunctionNoProtoType(ResultType);
5685 
5686   FunctionNoProtoTypeLoc NewTL = TLB.push<FunctionNoProtoTypeLoc>(Result);
5687   NewTL.setLocalRangeBegin(TL.getLocalRangeBegin());
5688   NewTL.setLParenLoc(TL.getLParenLoc());
5689   NewTL.setRParenLoc(TL.getRParenLoc());
5690   NewTL.setLocalRangeEnd(TL.getLocalRangeEnd());
5691 
5692   return Result;
5693 }
5694 
5695 template<typename Derived> QualType
5696 TreeTransform<Derived>::TransformUnresolvedUsingType(TypeLocBuilder &TLB,
5697                                                  UnresolvedUsingTypeLoc TL) {
5698   const UnresolvedUsingType *T = TL.getTypePtr();
5699   Decl *D = getDerived().TransformDecl(TL.getNameLoc(), T->getDecl());
5700   if (!D)
5701     return QualType();
5702 
5703   QualType Result = TL.getType();
5704   if (getDerived().AlwaysRebuild() || D != T->getDecl()) {
5705     Result = getDerived().RebuildUnresolvedUsingType(TL.getNameLoc(), D);
5706     if (Result.isNull())
5707       return QualType();
5708   }
5709 
5710   // We might get an arbitrary type spec type back.  We should at
5711   // least always get a type spec type, though.
5712   TypeSpecTypeLoc NewTL = TLB.pushTypeSpec(Result);
5713   NewTL.setNameLoc(TL.getNameLoc());
5714 
5715   return Result;
5716 }
5717 
5718 template<typename Derived>
5719 QualType TreeTransform<Derived>::TransformTypedefType(TypeLocBuilder &TLB,
5720                                                       TypedefTypeLoc TL) {
5721   const TypedefType *T = TL.getTypePtr();
5722   TypedefNameDecl *Typedef
5723     = cast_or_null<TypedefNameDecl>(getDerived().TransformDecl(TL.getNameLoc(),
5724                                                                T->getDecl()));
5725   if (!Typedef)
5726     return QualType();
5727 
5728   QualType Result = TL.getType();
5729   if (getDerived().AlwaysRebuild() ||
5730       Typedef != T->getDecl()) {
5731     Result = getDerived().RebuildTypedefType(Typedef);
5732     if (Result.isNull())
5733       return QualType();
5734   }
5735 
5736   TypedefTypeLoc NewTL = TLB.push<TypedefTypeLoc>(Result);
5737   NewTL.setNameLoc(TL.getNameLoc());
5738 
5739   return Result;
5740 }
5741 
5742 template<typename Derived>
5743 QualType TreeTransform<Derived>::TransformTypeOfExprType(TypeLocBuilder &TLB,
5744                                                       TypeOfExprTypeLoc TL) {
5745   // typeof expressions are not potentially evaluated contexts
5746   EnterExpressionEvaluationContext Unevaluated(
5747       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated,
5748       Sema::ReuseLambdaContextDecl);
5749 
5750   ExprResult E = getDerived().TransformExpr(TL.getUnderlyingExpr());
5751   if (E.isInvalid())
5752     return QualType();
5753 
5754   E = SemaRef.HandleExprEvaluationContextForTypeof(E.get());
5755   if (E.isInvalid())
5756     return QualType();
5757 
5758   QualType Result = TL.getType();
5759   if (getDerived().AlwaysRebuild() ||
5760       E.get() != TL.getUnderlyingExpr()) {
5761     Result = getDerived().RebuildTypeOfExprType(E.get(), TL.getTypeofLoc());
5762     if (Result.isNull())
5763       return QualType();
5764   }
5765   else E.get();
5766 
5767   TypeOfExprTypeLoc NewTL = TLB.push<TypeOfExprTypeLoc>(Result);
5768   NewTL.setTypeofLoc(TL.getTypeofLoc());
5769   NewTL.setLParenLoc(TL.getLParenLoc());
5770   NewTL.setRParenLoc(TL.getRParenLoc());
5771 
5772   return Result;
5773 }
5774 
5775 template<typename Derived>
5776 QualType TreeTransform<Derived>::TransformTypeOfType(TypeLocBuilder &TLB,
5777                                                      TypeOfTypeLoc TL) {
5778   TypeSourceInfo* Old_Under_TI = TL.getUnderlyingTInfo();
5779   TypeSourceInfo* New_Under_TI = getDerived().TransformType(Old_Under_TI);
5780   if (!New_Under_TI)
5781     return QualType();
5782 
5783   QualType Result = TL.getType();
5784   if (getDerived().AlwaysRebuild() || New_Under_TI != Old_Under_TI) {
5785     Result = getDerived().RebuildTypeOfType(New_Under_TI->getType());
5786     if (Result.isNull())
5787       return QualType();
5788   }
5789 
5790   TypeOfTypeLoc NewTL = TLB.push<TypeOfTypeLoc>(Result);
5791   NewTL.setTypeofLoc(TL.getTypeofLoc());
5792   NewTL.setLParenLoc(TL.getLParenLoc());
5793   NewTL.setRParenLoc(TL.getRParenLoc());
5794   NewTL.setUnderlyingTInfo(New_Under_TI);
5795 
5796   return Result;
5797 }
5798 
5799 template<typename Derived>
5800 QualType TreeTransform<Derived>::TransformDecltypeType(TypeLocBuilder &TLB,
5801                                                        DecltypeTypeLoc TL) {
5802   const DecltypeType *T = TL.getTypePtr();
5803 
5804   // decltype expressions are not potentially evaluated contexts
5805   EnterExpressionEvaluationContext Unevaluated(
5806       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, nullptr,
5807       Sema::ExpressionEvaluationContextRecord::EK_Decltype);
5808 
5809   ExprResult E = getDerived().TransformExpr(T->getUnderlyingExpr());
5810   if (E.isInvalid())
5811     return QualType();
5812 
5813   E = getSema().ActOnDecltypeExpression(E.get());
5814   if (E.isInvalid())
5815     return QualType();
5816 
5817   QualType Result = TL.getType();
5818   if (getDerived().AlwaysRebuild() ||
5819       E.get() != T->getUnderlyingExpr()) {
5820     Result = getDerived().RebuildDecltypeType(E.get(), TL.getNameLoc());
5821     if (Result.isNull())
5822       return QualType();
5823   }
5824   else E.get();
5825 
5826   DecltypeTypeLoc NewTL = TLB.push<DecltypeTypeLoc>(Result);
5827   NewTL.setNameLoc(TL.getNameLoc());
5828 
5829   return Result;
5830 }
5831 
5832 template<typename Derived>
5833 QualType TreeTransform<Derived>::TransformUnaryTransformType(
5834                                                             TypeLocBuilder &TLB,
5835                                                      UnaryTransformTypeLoc TL) {
5836   QualType Result = TL.getType();
5837   if (Result->isDependentType()) {
5838     const UnaryTransformType *T = TL.getTypePtr();
5839     QualType NewBase =
5840       getDerived().TransformType(TL.getUnderlyingTInfo())->getType();
5841     Result = getDerived().RebuildUnaryTransformType(NewBase,
5842                                                     T->getUTTKind(),
5843                                                     TL.getKWLoc());
5844     if (Result.isNull())
5845       return QualType();
5846   }
5847 
5848   UnaryTransformTypeLoc NewTL = TLB.push<UnaryTransformTypeLoc>(Result);
5849   NewTL.setKWLoc(TL.getKWLoc());
5850   NewTL.setParensRange(TL.getParensRange());
5851   NewTL.setUnderlyingTInfo(TL.getUnderlyingTInfo());
5852   return Result;
5853 }
5854 
5855 template<typename Derived>
5856 QualType TreeTransform<Derived>::TransformDeducedTemplateSpecializationType(
5857     TypeLocBuilder &TLB, DeducedTemplateSpecializationTypeLoc TL) {
5858   const DeducedTemplateSpecializationType *T = TL.getTypePtr();
5859 
5860   CXXScopeSpec SS;
5861   TemplateName TemplateName = getDerived().TransformTemplateName(
5862       SS, T->getTemplateName(), TL.getTemplateNameLoc());
5863   if (TemplateName.isNull())
5864     return QualType();
5865 
5866   QualType OldDeduced = T->getDeducedType();
5867   QualType NewDeduced;
5868   if (!OldDeduced.isNull()) {
5869     NewDeduced = getDerived().TransformType(OldDeduced);
5870     if (NewDeduced.isNull())
5871       return QualType();
5872   }
5873 
5874   QualType Result = getDerived().RebuildDeducedTemplateSpecializationType(
5875       TemplateName, NewDeduced);
5876   if (Result.isNull())
5877     return QualType();
5878 
5879   DeducedTemplateSpecializationTypeLoc NewTL =
5880       TLB.push<DeducedTemplateSpecializationTypeLoc>(Result);
5881   NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
5882 
5883   return Result;
5884 }
5885 
5886 template<typename Derived>
5887 QualType TreeTransform<Derived>::TransformRecordType(TypeLocBuilder &TLB,
5888                                                      RecordTypeLoc TL) {
5889   const RecordType *T = TL.getTypePtr();
5890   RecordDecl *Record
5891     = cast_or_null<RecordDecl>(getDerived().TransformDecl(TL.getNameLoc(),
5892                                                           T->getDecl()));
5893   if (!Record)
5894     return QualType();
5895 
5896   QualType Result = TL.getType();
5897   if (getDerived().AlwaysRebuild() ||
5898       Record != T->getDecl()) {
5899     Result = getDerived().RebuildRecordType(Record);
5900     if (Result.isNull())
5901       return QualType();
5902   }
5903 
5904   RecordTypeLoc NewTL = TLB.push<RecordTypeLoc>(Result);
5905   NewTL.setNameLoc(TL.getNameLoc());
5906 
5907   return Result;
5908 }
5909 
5910 template<typename Derived>
5911 QualType TreeTransform<Derived>::TransformEnumType(TypeLocBuilder &TLB,
5912                                                    EnumTypeLoc TL) {
5913   const EnumType *T = TL.getTypePtr();
5914   EnumDecl *Enum
5915     = cast_or_null<EnumDecl>(getDerived().TransformDecl(TL.getNameLoc(),
5916                                                         T->getDecl()));
5917   if (!Enum)
5918     return QualType();
5919 
5920   QualType Result = TL.getType();
5921   if (getDerived().AlwaysRebuild() ||
5922       Enum != T->getDecl()) {
5923     Result = getDerived().RebuildEnumType(Enum);
5924     if (Result.isNull())
5925       return QualType();
5926   }
5927 
5928   EnumTypeLoc NewTL = TLB.push<EnumTypeLoc>(Result);
5929   NewTL.setNameLoc(TL.getNameLoc());
5930 
5931   return Result;
5932 }
5933 
5934 template<typename Derived>
5935 QualType TreeTransform<Derived>::TransformInjectedClassNameType(
5936                                          TypeLocBuilder &TLB,
5937                                          InjectedClassNameTypeLoc TL) {
5938   Decl *D = getDerived().TransformDecl(TL.getNameLoc(),
5939                                        TL.getTypePtr()->getDecl());
5940   if (!D) return QualType();
5941 
5942   QualType T = SemaRef.Context.getTypeDeclType(cast<TypeDecl>(D));
5943   TLB.pushTypeSpec(T).setNameLoc(TL.getNameLoc());
5944   return T;
5945 }
5946 
5947 template<typename Derived>
5948 QualType TreeTransform<Derived>::TransformTemplateTypeParmType(
5949                                                 TypeLocBuilder &TLB,
5950                                                 TemplateTypeParmTypeLoc TL) {
5951   return TransformTypeSpecType(TLB, TL);
5952 }
5953 
5954 template<typename Derived>
5955 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmType(
5956                                          TypeLocBuilder &TLB,
5957                                          SubstTemplateTypeParmTypeLoc TL) {
5958   const SubstTemplateTypeParmType *T = TL.getTypePtr();
5959 
5960   // Substitute into the replacement type, which itself might involve something
5961   // that needs to be transformed. This only tends to occur with default
5962   // template arguments of template template parameters.
5963   TemporaryBase Rebase(*this, TL.getNameLoc(), DeclarationName());
5964   QualType Replacement = getDerived().TransformType(T->getReplacementType());
5965   if (Replacement.isNull())
5966     return QualType();
5967 
5968   // Always canonicalize the replacement type.
5969   Replacement = SemaRef.Context.getCanonicalType(Replacement);
5970   QualType Result
5971     = SemaRef.Context.getSubstTemplateTypeParmType(T->getReplacedParameter(),
5972                                                    Replacement);
5973 
5974   // Propagate type-source information.
5975   SubstTemplateTypeParmTypeLoc NewTL
5976     = TLB.push<SubstTemplateTypeParmTypeLoc>(Result);
5977   NewTL.setNameLoc(TL.getNameLoc());
5978   return Result;
5979 
5980 }
5981 
5982 template<typename Derived>
5983 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmPackType(
5984                                           TypeLocBuilder &TLB,
5985                                           SubstTemplateTypeParmPackTypeLoc TL) {
5986   return TransformTypeSpecType(TLB, TL);
5987 }
5988 
5989 template<typename Derived>
5990 QualType TreeTransform<Derived>::TransformTemplateSpecializationType(
5991                                                         TypeLocBuilder &TLB,
5992                                            TemplateSpecializationTypeLoc TL) {
5993   const TemplateSpecializationType *T = TL.getTypePtr();
5994 
5995   // The nested-name-specifier never matters in a TemplateSpecializationType,
5996   // because we can't have a dependent nested-name-specifier anyway.
5997   CXXScopeSpec SS;
5998   TemplateName Template
5999     = getDerived().TransformTemplateName(SS, T->getTemplateName(),
6000                                          TL.getTemplateNameLoc());
6001   if (Template.isNull())
6002     return QualType();
6003 
6004   return getDerived().TransformTemplateSpecializationType(TLB, TL, Template);
6005 }
6006 
6007 template<typename Derived>
6008 QualType TreeTransform<Derived>::TransformAtomicType(TypeLocBuilder &TLB,
6009                                                      AtomicTypeLoc TL) {
6010   QualType ValueType = getDerived().TransformType(TLB, TL.getValueLoc());
6011   if (ValueType.isNull())
6012     return QualType();
6013 
6014   QualType Result = TL.getType();
6015   if (getDerived().AlwaysRebuild() ||
6016       ValueType != TL.getValueLoc().getType()) {
6017     Result = getDerived().RebuildAtomicType(ValueType, TL.getKWLoc());
6018     if (Result.isNull())
6019       return QualType();
6020   }
6021 
6022   AtomicTypeLoc NewTL = TLB.push<AtomicTypeLoc>(Result);
6023   NewTL.setKWLoc(TL.getKWLoc());
6024   NewTL.setLParenLoc(TL.getLParenLoc());
6025   NewTL.setRParenLoc(TL.getRParenLoc());
6026 
6027   return Result;
6028 }
6029 
6030 template <typename Derived>
6031 QualType TreeTransform<Derived>::TransformPipeType(TypeLocBuilder &TLB,
6032                                                    PipeTypeLoc TL) {
6033   QualType ValueType = getDerived().TransformType(TLB, TL.getValueLoc());
6034   if (ValueType.isNull())
6035     return QualType();
6036 
6037   QualType Result = TL.getType();
6038   if (getDerived().AlwaysRebuild() || ValueType != TL.getValueLoc().getType()) {
6039     const PipeType *PT = Result->castAs<PipeType>();
6040     bool isReadPipe = PT->isReadOnly();
6041     Result = getDerived().RebuildPipeType(ValueType, TL.getKWLoc(), isReadPipe);
6042     if (Result.isNull())
6043       return QualType();
6044   }
6045 
6046   PipeTypeLoc NewTL = TLB.push<PipeTypeLoc>(Result);
6047   NewTL.setKWLoc(TL.getKWLoc());
6048 
6049   return Result;
6050 }
6051 
6052   /// Simple iterator that traverses the template arguments in a
6053   /// container that provides a \c getArgLoc() member function.
6054   ///
6055   /// This iterator is intended to be used with the iterator form of
6056   /// \c TreeTransform<Derived>::TransformTemplateArguments().
6057   template<typename ArgLocContainer>
6058   class TemplateArgumentLocContainerIterator {
6059     ArgLocContainer *Container;
6060     unsigned Index;
6061 
6062   public:
6063     typedef TemplateArgumentLoc value_type;
6064     typedef TemplateArgumentLoc reference;
6065     typedef int difference_type;
6066     typedef std::input_iterator_tag iterator_category;
6067 
6068     class pointer {
6069       TemplateArgumentLoc Arg;
6070 
6071     public:
6072       explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { }
6073 
6074       const TemplateArgumentLoc *operator->() const {
6075         return &Arg;
6076       }
6077     };
6078 
6079 
6080     TemplateArgumentLocContainerIterator() {}
6081 
6082     TemplateArgumentLocContainerIterator(ArgLocContainer &Container,
6083                                  unsigned Index)
6084       : Container(&Container), Index(Index) { }
6085 
6086     TemplateArgumentLocContainerIterator &operator++() {
6087       ++Index;
6088       return *this;
6089     }
6090 
6091     TemplateArgumentLocContainerIterator operator++(int) {
6092       TemplateArgumentLocContainerIterator Old(*this);
6093       ++(*this);
6094       return Old;
6095     }
6096 
6097     TemplateArgumentLoc operator*() const {
6098       return Container->getArgLoc(Index);
6099     }
6100 
6101     pointer operator->() const {
6102       return pointer(Container->getArgLoc(Index));
6103     }
6104 
6105     friend bool operator==(const TemplateArgumentLocContainerIterator &X,
6106                            const TemplateArgumentLocContainerIterator &Y) {
6107       return X.Container == Y.Container && X.Index == Y.Index;
6108     }
6109 
6110     friend bool operator!=(const TemplateArgumentLocContainerIterator &X,
6111                            const TemplateArgumentLocContainerIterator &Y) {
6112       return !(X == Y);
6113     }
6114   };
6115 
6116 template<typename Derived>
6117 QualType TreeTransform<Derived>::TransformAutoType(TypeLocBuilder &TLB,
6118                                                    AutoTypeLoc TL) {
6119   const AutoType *T = TL.getTypePtr();
6120   QualType OldDeduced = T->getDeducedType();
6121   QualType NewDeduced;
6122   if (!OldDeduced.isNull()) {
6123     NewDeduced = getDerived().TransformType(OldDeduced);
6124     if (NewDeduced.isNull())
6125       return QualType();
6126   }
6127 
6128   ConceptDecl *NewCD = nullptr;
6129   TemplateArgumentListInfo NewTemplateArgs;
6130   NestedNameSpecifierLoc NewNestedNameSpec;
6131   if (TL.getTypePtr()->isConstrained()) {
6132     NewCD = cast_or_null<ConceptDecl>(
6133         getDerived().TransformDecl(
6134             TL.getConceptNameLoc(),
6135             TL.getTypePtr()->getTypeConstraintConcept()));
6136 
6137     NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
6138     NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
6139     typedef TemplateArgumentLocContainerIterator<AutoTypeLoc> ArgIterator;
6140     if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
6141                                                 ArgIterator(TL,
6142                                                             TL.getNumArgs()),
6143                                                 NewTemplateArgs))
6144       return QualType();
6145 
6146     if (TL.getNestedNameSpecifierLoc()) {
6147       NewNestedNameSpec
6148         = getDerived().TransformNestedNameSpecifierLoc(
6149             TL.getNestedNameSpecifierLoc());
6150       if (!NewNestedNameSpec)
6151         return QualType();
6152     }
6153   }
6154 
6155   QualType Result = TL.getType();
6156   if (getDerived().AlwaysRebuild() || NewDeduced != OldDeduced ||
6157       T->isDependentType()) {
6158     llvm::SmallVector<TemplateArgument, 4> NewArgList;
6159     NewArgList.reserve(NewArgList.size());
6160     for (const auto &ArgLoc : NewTemplateArgs.arguments())
6161       NewArgList.push_back(ArgLoc.getArgument());
6162     Result = getDerived().RebuildAutoType(NewDeduced, T->getKeyword(), NewCD,
6163                                           NewArgList);
6164     if (Result.isNull())
6165       return QualType();
6166   }
6167 
6168   AutoTypeLoc NewTL = TLB.push<AutoTypeLoc>(Result);
6169   NewTL.setNameLoc(TL.getNameLoc());
6170   NewTL.setNestedNameSpecifierLoc(NewNestedNameSpec);
6171   NewTL.setTemplateKWLoc(TL.getTemplateKWLoc());
6172   NewTL.setConceptNameLoc(TL.getConceptNameLoc());
6173   NewTL.setFoundDecl(TL.getFoundDecl());
6174   NewTL.setLAngleLoc(TL.getLAngleLoc());
6175   NewTL.setRAngleLoc(TL.getRAngleLoc());
6176   for (unsigned I = 0; I < TL.getNumArgs(); ++I)
6177     NewTL.setArgLocInfo(I, NewTemplateArgs.arguments()[I].getLocInfo());
6178 
6179   return Result;
6180 }
6181 
6182 template <typename Derived>
6183 QualType TreeTransform<Derived>::TransformTemplateSpecializationType(
6184                                                         TypeLocBuilder &TLB,
6185                                            TemplateSpecializationTypeLoc TL,
6186                                                       TemplateName Template) {
6187   TemplateArgumentListInfo NewTemplateArgs;
6188   NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
6189   NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
6190   typedef TemplateArgumentLocContainerIterator<TemplateSpecializationTypeLoc>
6191     ArgIterator;
6192   if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
6193                                               ArgIterator(TL, TL.getNumArgs()),
6194                                               NewTemplateArgs))
6195     return QualType();
6196 
6197   // FIXME: maybe don't rebuild if all the template arguments are the same.
6198 
6199   QualType Result =
6200     getDerived().RebuildTemplateSpecializationType(Template,
6201                                                    TL.getTemplateNameLoc(),
6202                                                    NewTemplateArgs);
6203 
6204   if (!Result.isNull()) {
6205     // Specializations of template template parameters are represented as
6206     // TemplateSpecializationTypes, and substitution of type alias templates
6207     // within a dependent context can transform them into
6208     // DependentTemplateSpecializationTypes.
6209     if (isa<DependentTemplateSpecializationType>(Result)) {
6210       DependentTemplateSpecializationTypeLoc NewTL
6211         = TLB.push<DependentTemplateSpecializationTypeLoc>(Result);
6212       NewTL.setElaboratedKeywordLoc(SourceLocation());
6213       NewTL.setQualifierLoc(NestedNameSpecifierLoc());
6214       NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6215       NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6216       NewTL.setLAngleLoc(TL.getLAngleLoc());
6217       NewTL.setRAngleLoc(TL.getRAngleLoc());
6218       for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
6219         NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
6220       return Result;
6221     }
6222 
6223     TemplateSpecializationTypeLoc NewTL
6224       = TLB.push<TemplateSpecializationTypeLoc>(Result);
6225     NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6226     NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6227     NewTL.setLAngleLoc(TL.getLAngleLoc());
6228     NewTL.setRAngleLoc(TL.getRAngleLoc());
6229     for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
6230       NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
6231   }
6232 
6233   return Result;
6234 }
6235 
6236 template <typename Derived>
6237 QualType TreeTransform<Derived>::TransformDependentTemplateSpecializationType(
6238                                      TypeLocBuilder &TLB,
6239                                      DependentTemplateSpecializationTypeLoc TL,
6240                                      TemplateName Template,
6241                                      CXXScopeSpec &SS) {
6242   TemplateArgumentListInfo NewTemplateArgs;
6243   NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
6244   NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
6245   typedef TemplateArgumentLocContainerIterator<
6246             DependentTemplateSpecializationTypeLoc> ArgIterator;
6247   if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
6248                                               ArgIterator(TL, TL.getNumArgs()),
6249                                               NewTemplateArgs))
6250     return QualType();
6251 
6252   // FIXME: maybe don't rebuild if all the template arguments are the same.
6253 
6254   if (DependentTemplateName *DTN = Template.getAsDependentTemplateName()) {
6255     QualType Result
6256       = getSema().Context.getDependentTemplateSpecializationType(
6257                                                 TL.getTypePtr()->getKeyword(),
6258                                                          DTN->getQualifier(),
6259                                                          DTN->getIdentifier(),
6260                                                                NewTemplateArgs);
6261 
6262     DependentTemplateSpecializationTypeLoc NewTL
6263       = TLB.push<DependentTemplateSpecializationTypeLoc>(Result);
6264     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6265     NewTL.setQualifierLoc(SS.getWithLocInContext(SemaRef.Context));
6266     NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6267     NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6268     NewTL.setLAngleLoc(TL.getLAngleLoc());
6269     NewTL.setRAngleLoc(TL.getRAngleLoc());
6270     for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
6271       NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
6272     return Result;
6273   }
6274 
6275   QualType Result
6276     = getDerived().RebuildTemplateSpecializationType(Template,
6277                                                      TL.getTemplateNameLoc(),
6278                                                      NewTemplateArgs);
6279 
6280   if (!Result.isNull()) {
6281     /// FIXME: Wrap this in an elaborated-type-specifier?
6282     TemplateSpecializationTypeLoc NewTL
6283       = TLB.push<TemplateSpecializationTypeLoc>(Result);
6284     NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6285     NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6286     NewTL.setLAngleLoc(TL.getLAngleLoc());
6287     NewTL.setRAngleLoc(TL.getRAngleLoc());
6288     for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
6289       NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
6290   }
6291 
6292   return Result;
6293 }
6294 
6295 template<typename Derived>
6296 QualType
6297 TreeTransform<Derived>::TransformElaboratedType(TypeLocBuilder &TLB,
6298                                                 ElaboratedTypeLoc TL) {
6299   const ElaboratedType *T = TL.getTypePtr();
6300 
6301   NestedNameSpecifierLoc QualifierLoc;
6302   // NOTE: the qualifier in an ElaboratedType is optional.
6303   if (TL.getQualifierLoc()) {
6304     QualifierLoc
6305       = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc());
6306     if (!QualifierLoc)
6307       return QualType();
6308   }
6309 
6310   QualType NamedT = getDerived().TransformType(TLB, TL.getNamedTypeLoc());
6311   if (NamedT.isNull())
6312     return QualType();
6313 
6314   // C++0x [dcl.type.elab]p2:
6315   //   If the identifier resolves to a typedef-name or the simple-template-id
6316   //   resolves to an alias template specialization, the
6317   //   elaborated-type-specifier is ill-formed.
6318   if (T->getKeyword() != ETK_None && T->getKeyword() != ETK_Typename) {
6319     if (const TemplateSpecializationType *TST =
6320           NamedT->getAs<TemplateSpecializationType>()) {
6321       TemplateName Template = TST->getTemplateName();
6322       if (TypeAliasTemplateDecl *TAT = dyn_cast_or_null<TypeAliasTemplateDecl>(
6323               Template.getAsTemplateDecl())) {
6324         SemaRef.Diag(TL.getNamedTypeLoc().getBeginLoc(),
6325                      diag::err_tag_reference_non_tag)
6326             << TAT << Sema::NTK_TypeAliasTemplate
6327             << ElaboratedType::getTagTypeKindForKeyword(T->getKeyword());
6328         SemaRef.Diag(TAT->getLocation(), diag::note_declared_at);
6329       }
6330     }
6331   }
6332 
6333   QualType Result = TL.getType();
6334   if (getDerived().AlwaysRebuild() ||
6335       QualifierLoc != TL.getQualifierLoc() ||
6336       NamedT != T->getNamedType()) {
6337     Result = getDerived().RebuildElaboratedType(TL.getElaboratedKeywordLoc(),
6338                                                 T->getKeyword(),
6339                                                 QualifierLoc, NamedT);
6340     if (Result.isNull())
6341       return QualType();
6342   }
6343 
6344   ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
6345   NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6346   NewTL.setQualifierLoc(QualifierLoc);
6347   return Result;
6348 }
6349 
6350 template<typename Derived>
6351 QualType TreeTransform<Derived>::TransformAttributedType(
6352                                                 TypeLocBuilder &TLB,
6353                                                 AttributedTypeLoc TL) {
6354   const AttributedType *oldType = TL.getTypePtr();
6355   QualType modifiedType = getDerived().TransformType(TLB, TL.getModifiedLoc());
6356   if (modifiedType.isNull())
6357     return QualType();
6358 
6359   // oldAttr can be null if we started with a QualType rather than a TypeLoc.
6360   const Attr *oldAttr = TL.getAttr();
6361   const Attr *newAttr = oldAttr ? getDerived().TransformAttr(oldAttr) : nullptr;
6362   if (oldAttr && !newAttr)
6363     return QualType();
6364 
6365   QualType result = TL.getType();
6366 
6367   // FIXME: dependent operand expressions?
6368   if (getDerived().AlwaysRebuild() ||
6369       modifiedType != oldType->getModifiedType()) {
6370     // TODO: this is really lame; we should really be rebuilding the
6371     // equivalent type from first principles.
6372     QualType equivalentType
6373       = getDerived().TransformType(oldType->getEquivalentType());
6374     if (equivalentType.isNull())
6375       return QualType();
6376 
6377     // Check whether we can add nullability; it is only represented as
6378     // type sugar, and therefore cannot be diagnosed in any other way.
6379     if (auto nullability = oldType->getImmediateNullability()) {
6380       if (!modifiedType->canHaveNullability()) {
6381         SemaRef.Diag(TL.getAttr()->getLocation(),
6382                      diag::err_nullability_nonpointer)
6383             << DiagNullabilityKind(*nullability, false) << modifiedType;
6384         return QualType();
6385       }
6386     }
6387 
6388     result = SemaRef.Context.getAttributedType(TL.getAttrKind(),
6389                                                modifiedType,
6390                                                equivalentType);
6391   }
6392 
6393   AttributedTypeLoc newTL = TLB.push<AttributedTypeLoc>(result);
6394   newTL.setAttr(newAttr);
6395   return result;
6396 }
6397 
6398 template<typename Derived>
6399 QualType
6400 TreeTransform<Derived>::TransformParenType(TypeLocBuilder &TLB,
6401                                            ParenTypeLoc TL) {
6402   QualType Inner = getDerived().TransformType(TLB, TL.getInnerLoc());
6403   if (Inner.isNull())
6404     return QualType();
6405 
6406   QualType Result = TL.getType();
6407   if (getDerived().AlwaysRebuild() ||
6408       Inner != TL.getInnerLoc().getType()) {
6409     Result = getDerived().RebuildParenType(Inner);
6410     if (Result.isNull())
6411       return QualType();
6412   }
6413 
6414   ParenTypeLoc NewTL = TLB.push<ParenTypeLoc>(Result);
6415   NewTL.setLParenLoc(TL.getLParenLoc());
6416   NewTL.setRParenLoc(TL.getRParenLoc());
6417   return Result;
6418 }
6419 
6420 template <typename Derived>
6421 QualType
6422 TreeTransform<Derived>::TransformMacroQualifiedType(TypeLocBuilder &TLB,
6423                                                     MacroQualifiedTypeLoc TL) {
6424   QualType Inner = getDerived().TransformType(TLB, TL.getInnerLoc());
6425   if (Inner.isNull())
6426     return QualType();
6427 
6428   QualType Result = TL.getType();
6429   if (getDerived().AlwaysRebuild() || Inner != TL.getInnerLoc().getType()) {
6430     Result =
6431         getDerived().RebuildMacroQualifiedType(Inner, TL.getMacroIdentifier());
6432     if (Result.isNull())
6433       return QualType();
6434   }
6435 
6436   MacroQualifiedTypeLoc NewTL = TLB.push<MacroQualifiedTypeLoc>(Result);
6437   NewTL.setExpansionLoc(TL.getExpansionLoc());
6438   return Result;
6439 }
6440 
6441 template<typename Derived>
6442 QualType TreeTransform<Derived>::TransformDependentNameType(
6443     TypeLocBuilder &TLB, DependentNameTypeLoc TL) {
6444   return TransformDependentNameType(TLB, TL, false);
6445 }
6446 
6447 template<typename Derived>
6448 QualType TreeTransform<Derived>::TransformDependentNameType(
6449     TypeLocBuilder &TLB, DependentNameTypeLoc TL, bool DeducedTSTContext) {
6450   const DependentNameType *T = TL.getTypePtr();
6451 
6452   NestedNameSpecifierLoc QualifierLoc
6453     = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc());
6454   if (!QualifierLoc)
6455     return QualType();
6456 
6457   QualType Result
6458     = getDerived().RebuildDependentNameType(T->getKeyword(),
6459                                             TL.getElaboratedKeywordLoc(),
6460                                             QualifierLoc,
6461                                             T->getIdentifier(),
6462                                             TL.getNameLoc(),
6463                                             DeducedTSTContext);
6464   if (Result.isNull())
6465     return QualType();
6466 
6467   if (const ElaboratedType* ElabT = Result->getAs<ElaboratedType>()) {
6468     QualType NamedT = ElabT->getNamedType();
6469     TLB.pushTypeSpec(NamedT).setNameLoc(TL.getNameLoc());
6470 
6471     ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
6472     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6473     NewTL.setQualifierLoc(QualifierLoc);
6474   } else {
6475     DependentNameTypeLoc NewTL = TLB.push<DependentNameTypeLoc>(Result);
6476     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6477     NewTL.setQualifierLoc(QualifierLoc);
6478     NewTL.setNameLoc(TL.getNameLoc());
6479   }
6480   return Result;
6481 }
6482 
6483 template<typename Derived>
6484 QualType TreeTransform<Derived>::
6485           TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB,
6486                                  DependentTemplateSpecializationTypeLoc TL) {
6487   NestedNameSpecifierLoc QualifierLoc;
6488   if (TL.getQualifierLoc()) {
6489     QualifierLoc
6490       = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc());
6491     if (!QualifierLoc)
6492       return QualType();
6493   }
6494 
6495   return getDerived()
6496            .TransformDependentTemplateSpecializationType(TLB, TL, QualifierLoc);
6497 }
6498 
6499 template<typename Derived>
6500 QualType TreeTransform<Derived>::
6501 TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB,
6502                                    DependentTemplateSpecializationTypeLoc TL,
6503                                        NestedNameSpecifierLoc QualifierLoc) {
6504   const DependentTemplateSpecializationType *T = TL.getTypePtr();
6505 
6506   TemplateArgumentListInfo NewTemplateArgs;
6507   NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
6508   NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
6509 
6510   typedef TemplateArgumentLocContainerIterator<
6511   DependentTemplateSpecializationTypeLoc> ArgIterator;
6512   if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
6513                                               ArgIterator(TL, TL.getNumArgs()),
6514                                               NewTemplateArgs))
6515     return QualType();
6516 
6517   QualType Result = getDerived().RebuildDependentTemplateSpecializationType(
6518       T->getKeyword(), QualifierLoc, TL.getTemplateKeywordLoc(),
6519       T->getIdentifier(), TL.getTemplateNameLoc(), NewTemplateArgs,
6520       /*AllowInjectedClassName*/ false);
6521   if (Result.isNull())
6522     return QualType();
6523 
6524   if (const ElaboratedType *ElabT = dyn_cast<ElaboratedType>(Result)) {
6525     QualType NamedT = ElabT->getNamedType();
6526 
6527     // Copy information relevant to the template specialization.
6528     TemplateSpecializationTypeLoc NamedTL
6529       = TLB.push<TemplateSpecializationTypeLoc>(NamedT);
6530     NamedTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6531     NamedTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6532     NamedTL.setLAngleLoc(TL.getLAngleLoc());
6533     NamedTL.setRAngleLoc(TL.getRAngleLoc());
6534     for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I)
6535       NamedTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo());
6536 
6537     // Copy information relevant to the elaborated type.
6538     ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
6539     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6540     NewTL.setQualifierLoc(QualifierLoc);
6541   } else if (isa<DependentTemplateSpecializationType>(Result)) {
6542     DependentTemplateSpecializationTypeLoc SpecTL
6543       = TLB.push<DependentTemplateSpecializationTypeLoc>(Result);
6544     SpecTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6545     SpecTL.setQualifierLoc(QualifierLoc);
6546     SpecTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6547     SpecTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6548     SpecTL.setLAngleLoc(TL.getLAngleLoc());
6549     SpecTL.setRAngleLoc(TL.getRAngleLoc());
6550     for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I)
6551       SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo());
6552   } else {
6553     TemplateSpecializationTypeLoc SpecTL
6554       = TLB.push<TemplateSpecializationTypeLoc>(Result);
6555     SpecTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6556     SpecTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6557     SpecTL.setLAngleLoc(TL.getLAngleLoc());
6558     SpecTL.setRAngleLoc(TL.getRAngleLoc());
6559     for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I)
6560       SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo());
6561   }
6562   return Result;
6563 }
6564 
6565 template<typename Derived>
6566 QualType TreeTransform<Derived>::TransformPackExpansionType(TypeLocBuilder &TLB,
6567                                                       PackExpansionTypeLoc TL) {
6568   QualType Pattern
6569     = getDerived().TransformType(TLB, TL.getPatternLoc());
6570   if (Pattern.isNull())
6571     return QualType();
6572 
6573   QualType Result = TL.getType();
6574   if (getDerived().AlwaysRebuild() ||
6575       Pattern != TL.getPatternLoc().getType()) {
6576     Result = getDerived().RebuildPackExpansionType(Pattern,
6577                                            TL.getPatternLoc().getSourceRange(),
6578                                                    TL.getEllipsisLoc(),
6579                                            TL.getTypePtr()->getNumExpansions());
6580     if (Result.isNull())
6581       return QualType();
6582   }
6583 
6584   PackExpansionTypeLoc NewT = TLB.push<PackExpansionTypeLoc>(Result);
6585   NewT.setEllipsisLoc(TL.getEllipsisLoc());
6586   return Result;
6587 }
6588 
6589 template<typename Derived>
6590 QualType
6591 TreeTransform<Derived>::TransformObjCInterfaceType(TypeLocBuilder &TLB,
6592                                                    ObjCInterfaceTypeLoc TL) {
6593   // ObjCInterfaceType is never dependent.
6594   TLB.pushFullCopy(TL);
6595   return TL.getType();
6596 }
6597 
6598 template<typename Derived>
6599 QualType
6600 TreeTransform<Derived>::TransformObjCTypeParamType(TypeLocBuilder &TLB,
6601                                                    ObjCTypeParamTypeLoc TL) {
6602   const ObjCTypeParamType *T = TL.getTypePtr();
6603   ObjCTypeParamDecl *OTP = cast_or_null<ObjCTypeParamDecl>(
6604       getDerived().TransformDecl(T->getDecl()->getLocation(), T->getDecl()));
6605   if (!OTP)
6606     return QualType();
6607 
6608   QualType Result = TL.getType();
6609   if (getDerived().AlwaysRebuild() ||
6610       OTP != T->getDecl()) {
6611     Result = getDerived().RebuildObjCTypeParamType(OTP,
6612                  TL.getProtocolLAngleLoc(),
6613                  llvm::makeArrayRef(TL.getTypePtr()->qual_begin(),
6614                                     TL.getNumProtocols()),
6615                  TL.getProtocolLocs(),
6616                  TL.getProtocolRAngleLoc());
6617     if (Result.isNull())
6618       return QualType();
6619   }
6620 
6621   ObjCTypeParamTypeLoc NewTL = TLB.push<ObjCTypeParamTypeLoc>(Result);
6622   if (TL.getNumProtocols()) {
6623     NewTL.setProtocolLAngleLoc(TL.getProtocolLAngleLoc());
6624     for (unsigned i = 0, n = TL.getNumProtocols(); i != n; ++i)
6625       NewTL.setProtocolLoc(i, TL.getProtocolLoc(i));
6626     NewTL.setProtocolRAngleLoc(TL.getProtocolRAngleLoc());
6627   }
6628   return Result;
6629 }
6630 
6631 template<typename Derived>
6632 QualType
6633 TreeTransform<Derived>::TransformObjCObjectType(TypeLocBuilder &TLB,
6634                                                 ObjCObjectTypeLoc TL) {
6635   // Transform base type.
6636   QualType BaseType = getDerived().TransformType(TLB, TL.getBaseLoc());
6637   if (BaseType.isNull())
6638     return QualType();
6639 
6640   bool AnyChanged = BaseType != TL.getBaseLoc().getType();
6641 
6642   // Transform type arguments.
6643   SmallVector<TypeSourceInfo *, 4> NewTypeArgInfos;
6644   for (unsigned i = 0, n = TL.getNumTypeArgs(); i != n; ++i) {
6645     TypeSourceInfo *TypeArgInfo = TL.getTypeArgTInfo(i);
6646     TypeLoc TypeArgLoc = TypeArgInfo->getTypeLoc();
6647     QualType TypeArg = TypeArgInfo->getType();
6648     if (auto PackExpansionLoc = TypeArgLoc.getAs<PackExpansionTypeLoc>()) {
6649       AnyChanged = true;
6650 
6651       // We have a pack expansion. Instantiate it.
6652       const auto *PackExpansion = PackExpansionLoc.getType()
6653                                     ->castAs<PackExpansionType>();
6654       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
6655       SemaRef.collectUnexpandedParameterPacks(PackExpansion->getPattern(),
6656                                               Unexpanded);
6657       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
6658 
6659       // Determine whether the set of unexpanded parameter packs can
6660       // and should be expanded.
6661       TypeLoc PatternLoc = PackExpansionLoc.getPatternLoc();
6662       bool Expand = false;
6663       bool RetainExpansion = false;
6664       Optional<unsigned> NumExpansions = PackExpansion->getNumExpansions();
6665       if (getDerived().TryExpandParameterPacks(
6666             PackExpansionLoc.getEllipsisLoc(), PatternLoc.getSourceRange(),
6667             Unexpanded, Expand, RetainExpansion, NumExpansions))
6668         return QualType();
6669 
6670       if (!Expand) {
6671         // We can't expand this pack expansion into separate arguments yet;
6672         // just substitute into the pattern and create a new pack expansion
6673         // type.
6674         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
6675 
6676         TypeLocBuilder TypeArgBuilder;
6677         TypeArgBuilder.reserve(PatternLoc.getFullDataSize());
6678         QualType NewPatternType = getDerived().TransformType(TypeArgBuilder,
6679                                                              PatternLoc);
6680         if (NewPatternType.isNull())
6681           return QualType();
6682 
6683         QualType NewExpansionType = SemaRef.Context.getPackExpansionType(
6684                                       NewPatternType, NumExpansions);
6685         auto NewExpansionLoc = TLB.push<PackExpansionTypeLoc>(NewExpansionType);
6686         NewExpansionLoc.setEllipsisLoc(PackExpansionLoc.getEllipsisLoc());
6687         NewTypeArgInfos.push_back(
6688           TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewExpansionType));
6689         continue;
6690       }
6691 
6692       // Substitute into the pack expansion pattern for each slice of the
6693       // pack.
6694       for (unsigned ArgIdx = 0; ArgIdx != *NumExpansions; ++ArgIdx) {
6695         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), ArgIdx);
6696 
6697         TypeLocBuilder TypeArgBuilder;
6698         TypeArgBuilder.reserve(PatternLoc.getFullDataSize());
6699 
6700         QualType NewTypeArg = getDerived().TransformType(TypeArgBuilder,
6701                                                          PatternLoc);
6702         if (NewTypeArg.isNull())
6703           return QualType();
6704 
6705         NewTypeArgInfos.push_back(
6706           TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewTypeArg));
6707       }
6708 
6709       continue;
6710     }
6711 
6712     TypeLocBuilder TypeArgBuilder;
6713     TypeArgBuilder.reserve(TypeArgLoc.getFullDataSize());
6714     QualType NewTypeArg = getDerived().TransformType(TypeArgBuilder, TypeArgLoc);
6715     if (NewTypeArg.isNull())
6716       return QualType();
6717 
6718     // If nothing changed, just keep the old TypeSourceInfo.
6719     if (NewTypeArg == TypeArg) {
6720       NewTypeArgInfos.push_back(TypeArgInfo);
6721       continue;
6722     }
6723 
6724     NewTypeArgInfos.push_back(
6725       TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewTypeArg));
6726     AnyChanged = true;
6727   }
6728 
6729   QualType Result = TL.getType();
6730   if (getDerived().AlwaysRebuild() || AnyChanged) {
6731     // Rebuild the type.
6732     Result = getDerived().RebuildObjCObjectType(
6733         BaseType, TL.getBeginLoc(), TL.getTypeArgsLAngleLoc(), NewTypeArgInfos,
6734         TL.getTypeArgsRAngleLoc(), TL.getProtocolLAngleLoc(),
6735         llvm::makeArrayRef(TL.getTypePtr()->qual_begin(), TL.getNumProtocols()),
6736         TL.getProtocolLocs(), TL.getProtocolRAngleLoc());
6737 
6738     if (Result.isNull())
6739       return QualType();
6740   }
6741 
6742   ObjCObjectTypeLoc NewT = TLB.push<ObjCObjectTypeLoc>(Result);
6743   NewT.setHasBaseTypeAsWritten(true);
6744   NewT.setTypeArgsLAngleLoc(TL.getTypeArgsLAngleLoc());
6745   for (unsigned i = 0, n = TL.getNumTypeArgs(); i != n; ++i)
6746     NewT.setTypeArgTInfo(i, NewTypeArgInfos[i]);
6747   NewT.setTypeArgsRAngleLoc(TL.getTypeArgsRAngleLoc());
6748   NewT.setProtocolLAngleLoc(TL.getProtocolLAngleLoc());
6749   for (unsigned i = 0, n = TL.getNumProtocols(); i != n; ++i)
6750     NewT.setProtocolLoc(i, TL.getProtocolLoc(i));
6751   NewT.setProtocolRAngleLoc(TL.getProtocolRAngleLoc());
6752   return Result;
6753 }
6754 
6755 template<typename Derived>
6756 QualType
6757 TreeTransform<Derived>::TransformObjCObjectPointerType(TypeLocBuilder &TLB,
6758                                                ObjCObjectPointerTypeLoc TL) {
6759   QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
6760   if (PointeeType.isNull())
6761     return QualType();
6762 
6763   QualType Result = TL.getType();
6764   if (getDerived().AlwaysRebuild() ||
6765       PointeeType != TL.getPointeeLoc().getType()) {
6766     Result = getDerived().RebuildObjCObjectPointerType(PointeeType,
6767                                                        TL.getStarLoc());
6768     if (Result.isNull())
6769       return QualType();
6770   }
6771 
6772   ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result);
6773   NewT.setStarLoc(TL.getStarLoc());
6774   return Result;
6775 }
6776 
6777 //===----------------------------------------------------------------------===//
6778 // Statement transformation
6779 //===----------------------------------------------------------------------===//
6780 template<typename Derived>
6781 StmtResult
6782 TreeTransform<Derived>::TransformNullStmt(NullStmt *S) {
6783   return S;
6784 }
6785 
6786 template<typename Derived>
6787 StmtResult
6788 TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S) {
6789   return getDerived().TransformCompoundStmt(S, false);
6790 }
6791 
6792 template<typename Derived>
6793 StmtResult
6794 TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S,
6795                                               bool IsStmtExpr) {
6796   Sema::CompoundScopeRAII CompoundScope(getSema());
6797 
6798   const Stmt *ExprResult = S->getStmtExprResult();
6799   bool SubStmtInvalid = false;
6800   bool SubStmtChanged = false;
6801   SmallVector<Stmt*, 8> Statements;
6802   for (auto *B : S->body()) {
6803     StmtResult Result = getDerived().TransformStmt(
6804         B, IsStmtExpr && B == ExprResult ? SDK_StmtExprResult : SDK_Discarded);
6805 
6806     if (Result.isInvalid()) {
6807       // Immediately fail if this was a DeclStmt, since it's very
6808       // likely that this will cause problems for future statements.
6809       if (isa<DeclStmt>(B))
6810         return StmtError();
6811 
6812       // Otherwise, just keep processing substatements and fail later.
6813       SubStmtInvalid = true;
6814       continue;
6815     }
6816 
6817     SubStmtChanged = SubStmtChanged || Result.get() != B;
6818     Statements.push_back(Result.getAs<Stmt>());
6819   }
6820 
6821   if (SubStmtInvalid)
6822     return StmtError();
6823 
6824   if (!getDerived().AlwaysRebuild() &&
6825       !SubStmtChanged)
6826     return S;
6827 
6828   return getDerived().RebuildCompoundStmt(S->getLBracLoc(),
6829                                           Statements,
6830                                           S->getRBracLoc(),
6831                                           IsStmtExpr);
6832 }
6833 
6834 template<typename Derived>
6835 StmtResult
6836 TreeTransform<Derived>::TransformCaseStmt(CaseStmt *S) {
6837   ExprResult LHS, RHS;
6838   {
6839     EnterExpressionEvaluationContext Unevaluated(
6840         SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
6841 
6842     // Transform the left-hand case value.
6843     LHS = getDerived().TransformExpr(S->getLHS());
6844     LHS = SemaRef.ActOnCaseExpr(S->getCaseLoc(), LHS);
6845     if (LHS.isInvalid())
6846       return StmtError();
6847 
6848     // Transform the right-hand case value (for the GNU case-range extension).
6849     RHS = getDerived().TransformExpr(S->getRHS());
6850     RHS = SemaRef.ActOnCaseExpr(S->getCaseLoc(), RHS);
6851     if (RHS.isInvalid())
6852       return StmtError();
6853   }
6854 
6855   // Build the case statement.
6856   // Case statements are always rebuilt so that they will attached to their
6857   // transformed switch statement.
6858   StmtResult Case = getDerived().RebuildCaseStmt(S->getCaseLoc(),
6859                                                        LHS.get(),
6860                                                        S->getEllipsisLoc(),
6861                                                        RHS.get(),
6862                                                        S->getColonLoc());
6863   if (Case.isInvalid())
6864     return StmtError();
6865 
6866   // Transform the statement following the case
6867   StmtResult SubStmt =
6868       getDerived().TransformStmt(S->getSubStmt());
6869   if (SubStmt.isInvalid())
6870     return StmtError();
6871 
6872   // Attach the body to the case statement
6873   return getDerived().RebuildCaseStmtBody(Case.get(), SubStmt.get());
6874 }
6875 
6876 template <typename Derived>
6877 StmtResult TreeTransform<Derived>::TransformDefaultStmt(DefaultStmt *S) {
6878   // Transform the statement following the default case
6879   StmtResult SubStmt =
6880       getDerived().TransformStmt(S->getSubStmt());
6881   if (SubStmt.isInvalid())
6882     return StmtError();
6883 
6884   // Default statements are always rebuilt
6885   return getDerived().RebuildDefaultStmt(S->getDefaultLoc(), S->getColonLoc(),
6886                                          SubStmt.get());
6887 }
6888 
6889 template<typename Derived>
6890 StmtResult
6891 TreeTransform<Derived>::TransformLabelStmt(LabelStmt *S, StmtDiscardKind SDK) {
6892   StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt(), SDK);
6893   if (SubStmt.isInvalid())
6894     return StmtError();
6895 
6896   Decl *LD = getDerived().TransformDecl(S->getDecl()->getLocation(),
6897                                         S->getDecl());
6898   if (!LD)
6899     return StmtError();
6900 
6901   // If we're transforming "in-place" (we're not creating new local
6902   // declarations), assume we're replacing the old label statement
6903   // and clear out the reference to it.
6904   if (LD == S->getDecl())
6905     S->getDecl()->setStmt(nullptr);
6906 
6907   // FIXME: Pass the real colon location in.
6908   return getDerived().RebuildLabelStmt(S->getIdentLoc(),
6909                                        cast<LabelDecl>(LD), SourceLocation(),
6910                                        SubStmt.get());
6911 }
6912 
6913 template <typename Derived>
6914 const Attr *TreeTransform<Derived>::TransformAttr(const Attr *R) {
6915   if (!R)
6916     return R;
6917 
6918   switch (R->getKind()) {
6919 // Transform attributes with a pragma spelling by calling TransformXXXAttr.
6920 #define ATTR(X)
6921 #define PRAGMA_SPELLING_ATTR(X)                                                \
6922   case attr::X:                                                                \
6923     return getDerived().Transform##X##Attr(cast<X##Attr>(R));
6924 #include "clang/Basic/AttrList.inc"
6925   default:
6926     return R;
6927   }
6928 }
6929 
6930 template <typename Derived>
6931 StmtResult
6932 TreeTransform<Derived>::TransformAttributedStmt(AttributedStmt *S,
6933                                                 StmtDiscardKind SDK) {
6934   bool AttrsChanged = false;
6935   SmallVector<const Attr *, 1> Attrs;
6936 
6937   // Visit attributes and keep track if any are transformed.
6938   for (const auto *I : S->getAttrs()) {
6939     const Attr *R = getDerived().TransformAttr(I);
6940     AttrsChanged |= (I != R);
6941     Attrs.push_back(R);
6942   }
6943 
6944   StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt(), SDK);
6945   if (SubStmt.isInvalid())
6946     return StmtError();
6947 
6948   if (SubStmt.get() == S->getSubStmt() && !AttrsChanged)
6949     return S;
6950 
6951   return getDerived().RebuildAttributedStmt(S->getAttrLoc(), Attrs,
6952                                             SubStmt.get());
6953 }
6954 
6955 template<typename Derived>
6956 StmtResult
6957 TreeTransform<Derived>::TransformIfStmt(IfStmt *S) {
6958   // Transform the initialization statement
6959   StmtResult Init = getDerived().TransformStmt(S->getInit());
6960   if (Init.isInvalid())
6961     return StmtError();
6962 
6963   // Transform the condition
6964   Sema::ConditionResult Cond = getDerived().TransformCondition(
6965       S->getIfLoc(), S->getConditionVariable(), S->getCond(),
6966       S->isConstexpr() ? Sema::ConditionKind::ConstexprIf
6967                        : Sema::ConditionKind::Boolean);
6968   if (Cond.isInvalid())
6969     return StmtError();
6970 
6971   // If this is a constexpr if, determine which arm we should instantiate.
6972   llvm::Optional<bool> ConstexprConditionValue;
6973   if (S->isConstexpr())
6974     ConstexprConditionValue = Cond.getKnownValue();
6975 
6976   // Transform the "then" branch.
6977   StmtResult Then;
6978   if (!ConstexprConditionValue || *ConstexprConditionValue) {
6979     Then = getDerived().TransformStmt(S->getThen());
6980     if (Then.isInvalid())
6981       return StmtError();
6982   } else {
6983     Then = new (getSema().Context) NullStmt(S->getThen()->getBeginLoc());
6984   }
6985 
6986   // Transform the "else" branch.
6987   StmtResult Else;
6988   if (!ConstexprConditionValue || !*ConstexprConditionValue) {
6989     Else = getDerived().TransformStmt(S->getElse());
6990     if (Else.isInvalid())
6991       return StmtError();
6992   }
6993 
6994   if (!getDerived().AlwaysRebuild() &&
6995       Init.get() == S->getInit() &&
6996       Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) &&
6997       Then.get() == S->getThen() &&
6998       Else.get() == S->getElse())
6999     return S;
7000 
7001   return getDerived().RebuildIfStmt(S->getIfLoc(), S->isConstexpr(), Cond,
7002                                     Init.get(), Then.get(), S->getElseLoc(),
7003                                     Else.get());
7004 }
7005 
7006 template<typename Derived>
7007 StmtResult
7008 TreeTransform<Derived>::TransformSwitchStmt(SwitchStmt *S) {
7009   // Transform the initialization statement
7010   StmtResult Init = getDerived().TransformStmt(S->getInit());
7011   if (Init.isInvalid())
7012     return StmtError();
7013 
7014   // Transform the condition.
7015   Sema::ConditionResult Cond = getDerived().TransformCondition(
7016       S->getSwitchLoc(), S->getConditionVariable(), S->getCond(),
7017       Sema::ConditionKind::Switch);
7018   if (Cond.isInvalid())
7019     return StmtError();
7020 
7021   // Rebuild the switch statement.
7022   StmtResult Switch
7023     = getDerived().RebuildSwitchStmtStart(S->getSwitchLoc(), Init.get(), Cond);
7024   if (Switch.isInvalid())
7025     return StmtError();
7026 
7027   // Transform the body of the switch statement.
7028   StmtResult Body = getDerived().TransformStmt(S->getBody());
7029   if (Body.isInvalid())
7030     return StmtError();
7031 
7032   // Complete the switch statement.
7033   return getDerived().RebuildSwitchStmtBody(S->getSwitchLoc(), Switch.get(),
7034                                             Body.get());
7035 }
7036 
7037 template<typename Derived>
7038 StmtResult
7039 TreeTransform<Derived>::TransformWhileStmt(WhileStmt *S) {
7040   // Transform the condition
7041   Sema::ConditionResult Cond = getDerived().TransformCondition(
7042       S->getWhileLoc(), S->getConditionVariable(), S->getCond(),
7043       Sema::ConditionKind::Boolean);
7044   if (Cond.isInvalid())
7045     return StmtError();
7046 
7047   // Transform the body
7048   StmtResult Body = getDerived().TransformStmt(S->getBody());
7049   if (Body.isInvalid())
7050     return StmtError();
7051 
7052   if (!getDerived().AlwaysRebuild() &&
7053       Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) &&
7054       Body.get() == S->getBody())
7055     return Owned(S);
7056 
7057   return getDerived().RebuildWhileStmt(S->getWhileLoc(), Cond, Body.get());
7058 }
7059 
7060 template<typename Derived>
7061 StmtResult
7062 TreeTransform<Derived>::TransformDoStmt(DoStmt *S) {
7063   // Transform the body
7064   StmtResult Body = getDerived().TransformStmt(S->getBody());
7065   if (Body.isInvalid())
7066     return StmtError();
7067 
7068   // Transform the condition
7069   ExprResult Cond = getDerived().TransformExpr(S->getCond());
7070   if (Cond.isInvalid())
7071     return StmtError();
7072 
7073   if (!getDerived().AlwaysRebuild() &&
7074       Cond.get() == S->getCond() &&
7075       Body.get() == S->getBody())
7076     return S;
7077 
7078   return getDerived().RebuildDoStmt(S->getDoLoc(), Body.get(), S->getWhileLoc(),
7079                                     /*FIXME:*/S->getWhileLoc(), Cond.get(),
7080                                     S->getRParenLoc());
7081 }
7082 
7083 template<typename Derived>
7084 StmtResult
7085 TreeTransform<Derived>::TransformForStmt(ForStmt *S) {
7086   if (getSema().getLangOpts().OpenMP)
7087     getSema().startOpenMPLoop();
7088 
7089   // Transform the initialization statement
7090   StmtResult Init = getDerived().TransformStmt(S->getInit());
7091   if (Init.isInvalid())
7092     return StmtError();
7093 
7094   // In OpenMP loop region loop control variable must be captured and be
7095   // private. Perform analysis of first part (if any).
7096   if (getSema().getLangOpts().OpenMP && Init.isUsable())
7097     getSema().ActOnOpenMPLoopInitialization(S->getForLoc(), Init.get());
7098 
7099   // Transform the condition
7100   Sema::ConditionResult Cond = getDerived().TransformCondition(
7101       S->getForLoc(), S->getConditionVariable(), S->getCond(),
7102       Sema::ConditionKind::Boolean);
7103   if (Cond.isInvalid())
7104     return StmtError();
7105 
7106   // Transform the increment
7107   ExprResult Inc = getDerived().TransformExpr(S->getInc());
7108   if (Inc.isInvalid())
7109     return StmtError();
7110 
7111   Sema::FullExprArg FullInc(getSema().MakeFullDiscardedValueExpr(Inc.get()));
7112   if (S->getInc() && !FullInc.get())
7113     return StmtError();
7114 
7115   // Transform the body
7116   StmtResult Body = getDerived().TransformStmt(S->getBody());
7117   if (Body.isInvalid())
7118     return StmtError();
7119 
7120   if (!getDerived().AlwaysRebuild() &&
7121       Init.get() == S->getInit() &&
7122       Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) &&
7123       Inc.get() == S->getInc() &&
7124       Body.get() == S->getBody())
7125     return S;
7126 
7127   return getDerived().RebuildForStmt(S->getForLoc(), S->getLParenLoc(),
7128                                      Init.get(), Cond, FullInc,
7129                                      S->getRParenLoc(), Body.get());
7130 }
7131 
7132 template<typename Derived>
7133 StmtResult
7134 TreeTransform<Derived>::TransformGotoStmt(GotoStmt *S) {
7135   Decl *LD = getDerived().TransformDecl(S->getLabel()->getLocation(),
7136                                         S->getLabel());
7137   if (!LD)
7138     return StmtError();
7139 
7140   // Goto statements must always be rebuilt, to resolve the label.
7141   return getDerived().RebuildGotoStmt(S->getGotoLoc(), S->getLabelLoc(),
7142                                       cast<LabelDecl>(LD));
7143 }
7144 
7145 template<typename Derived>
7146 StmtResult
7147 TreeTransform<Derived>::TransformIndirectGotoStmt(IndirectGotoStmt *S) {
7148   ExprResult Target = getDerived().TransformExpr(S->getTarget());
7149   if (Target.isInvalid())
7150     return StmtError();
7151   Target = SemaRef.MaybeCreateExprWithCleanups(Target.get());
7152 
7153   if (!getDerived().AlwaysRebuild() &&
7154       Target.get() == S->getTarget())
7155     return S;
7156 
7157   return getDerived().RebuildIndirectGotoStmt(S->getGotoLoc(), S->getStarLoc(),
7158                                               Target.get());
7159 }
7160 
7161 template<typename Derived>
7162 StmtResult
7163 TreeTransform<Derived>::TransformContinueStmt(ContinueStmt *S) {
7164   return S;
7165 }
7166 
7167 template<typename Derived>
7168 StmtResult
7169 TreeTransform<Derived>::TransformBreakStmt(BreakStmt *S) {
7170   return S;
7171 }
7172 
7173 template<typename Derived>
7174 StmtResult
7175 TreeTransform<Derived>::TransformReturnStmt(ReturnStmt *S) {
7176   ExprResult Result = getDerived().TransformInitializer(S->getRetValue(),
7177                                                         /*NotCopyInit*/false);
7178   if (Result.isInvalid())
7179     return StmtError();
7180 
7181   // FIXME: We always rebuild the return statement because there is no way
7182   // to tell whether the return type of the function has changed.
7183   return getDerived().RebuildReturnStmt(S->getReturnLoc(), Result.get());
7184 }
7185 
7186 template<typename Derived>
7187 StmtResult
7188 TreeTransform<Derived>::TransformDeclStmt(DeclStmt *S) {
7189   bool DeclChanged = false;
7190   SmallVector<Decl *, 4> Decls;
7191   for (auto *D : S->decls()) {
7192     Decl *Transformed = getDerived().TransformDefinition(D->getLocation(), D);
7193     if (!Transformed)
7194       return StmtError();
7195 
7196     if (Transformed != D)
7197       DeclChanged = true;
7198 
7199     Decls.push_back(Transformed);
7200   }
7201 
7202   if (!getDerived().AlwaysRebuild() && !DeclChanged)
7203     return S;
7204 
7205   return getDerived().RebuildDeclStmt(Decls, S->getBeginLoc(), S->getEndLoc());
7206 }
7207 
7208 template<typename Derived>
7209 StmtResult
7210 TreeTransform<Derived>::TransformGCCAsmStmt(GCCAsmStmt *S) {
7211 
7212   SmallVector<Expr*, 8> Constraints;
7213   SmallVector<Expr*, 8> Exprs;
7214   SmallVector<IdentifierInfo *, 4> Names;
7215 
7216   ExprResult AsmString;
7217   SmallVector<Expr*, 8> Clobbers;
7218 
7219   bool ExprsChanged = false;
7220 
7221   // Go through the outputs.
7222   for (unsigned I = 0, E = S->getNumOutputs(); I != E; ++I) {
7223     Names.push_back(S->getOutputIdentifier(I));
7224 
7225     // No need to transform the constraint literal.
7226     Constraints.push_back(S->getOutputConstraintLiteral(I));
7227 
7228     // Transform the output expr.
7229     Expr *OutputExpr = S->getOutputExpr(I);
7230     ExprResult Result = getDerived().TransformExpr(OutputExpr);
7231     if (Result.isInvalid())
7232       return StmtError();
7233 
7234     ExprsChanged |= Result.get() != OutputExpr;
7235 
7236     Exprs.push_back(Result.get());
7237   }
7238 
7239   // Go through the inputs.
7240   for (unsigned I = 0, E = S->getNumInputs(); I != E; ++I) {
7241     Names.push_back(S->getInputIdentifier(I));
7242 
7243     // No need to transform the constraint literal.
7244     Constraints.push_back(S->getInputConstraintLiteral(I));
7245 
7246     // Transform the input expr.
7247     Expr *InputExpr = S->getInputExpr(I);
7248     ExprResult Result = getDerived().TransformExpr(InputExpr);
7249     if (Result.isInvalid())
7250       return StmtError();
7251 
7252     ExprsChanged |= Result.get() != InputExpr;
7253 
7254     Exprs.push_back(Result.get());
7255   }
7256 
7257   // Go through the Labels.
7258   for (unsigned I = 0, E = S->getNumLabels(); I != E; ++I) {
7259     Names.push_back(S->getLabelIdentifier(I));
7260 
7261     ExprResult Result = getDerived().TransformExpr(S->getLabelExpr(I));
7262     if (Result.isInvalid())
7263       return StmtError();
7264     ExprsChanged |= Result.get() != S->getLabelExpr(I);
7265     Exprs.push_back(Result.get());
7266   }
7267   if (!getDerived().AlwaysRebuild() && !ExprsChanged)
7268     return S;
7269 
7270   // Go through the clobbers.
7271   for (unsigned I = 0, E = S->getNumClobbers(); I != E; ++I)
7272     Clobbers.push_back(S->getClobberStringLiteral(I));
7273 
7274   // No need to transform the asm string literal.
7275   AsmString = S->getAsmString();
7276   return getDerived().RebuildGCCAsmStmt(S->getAsmLoc(), S->isSimple(),
7277                                         S->isVolatile(), S->getNumOutputs(),
7278                                         S->getNumInputs(), Names.data(),
7279                                         Constraints, Exprs, AsmString.get(),
7280                                         Clobbers, S->getNumLabels(),
7281                                         S->getRParenLoc());
7282 }
7283 
7284 template<typename Derived>
7285 StmtResult
7286 TreeTransform<Derived>::TransformMSAsmStmt(MSAsmStmt *S) {
7287   ArrayRef<Token> AsmToks =
7288     llvm::makeArrayRef(S->getAsmToks(), S->getNumAsmToks());
7289 
7290   bool HadError = false, HadChange = false;
7291 
7292   ArrayRef<Expr*> SrcExprs = S->getAllExprs();
7293   SmallVector<Expr*, 8> TransformedExprs;
7294   TransformedExprs.reserve(SrcExprs.size());
7295   for (unsigned i = 0, e = SrcExprs.size(); i != e; ++i) {
7296     ExprResult Result = getDerived().TransformExpr(SrcExprs[i]);
7297     if (!Result.isUsable()) {
7298       HadError = true;
7299     } else {
7300       HadChange |= (Result.get() != SrcExprs[i]);
7301       TransformedExprs.push_back(Result.get());
7302     }
7303   }
7304 
7305   if (HadError) return StmtError();
7306   if (!HadChange && !getDerived().AlwaysRebuild())
7307     return Owned(S);
7308 
7309   return getDerived().RebuildMSAsmStmt(S->getAsmLoc(), S->getLBraceLoc(),
7310                                        AsmToks, S->getAsmString(),
7311                                        S->getNumOutputs(), S->getNumInputs(),
7312                                        S->getAllConstraints(), S->getClobbers(),
7313                                        TransformedExprs, S->getEndLoc());
7314 }
7315 
7316 // C++ Coroutines TS
7317 
7318 template<typename Derived>
7319 StmtResult
7320 TreeTransform<Derived>::TransformCoroutineBodyStmt(CoroutineBodyStmt *S) {
7321   auto *ScopeInfo = SemaRef.getCurFunction();
7322   auto *FD = cast<FunctionDecl>(SemaRef.CurContext);
7323   assert(FD && ScopeInfo && !ScopeInfo->CoroutinePromise &&
7324          ScopeInfo->NeedsCoroutineSuspends &&
7325          ScopeInfo->CoroutineSuspends.first == nullptr &&
7326          ScopeInfo->CoroutineSuspends.second == nullptr &&
7327          "expected clean scope info");
7328 
7329   // Set that we have (possibly-invalid) suspend points before we do anything
7330   // that may fail.
7331   ScopeInfo->setNeedsCoroutineSuspends(false);
7332 
7333   // We re-build the coroutine promise object (and the coroutine parameters its
7334   // type and constructor depend on) based on the types used in our current
7335   // function. We must do so, and set it on the current FunctionScopeInfo,
7336   // before attempting to transform the other parts of the coroutine body
7337   // statement, such as the implicit suspend statements (because those
7338   // statements reference the FunctionScopeInfo::CoroutinePromise).
7339   if (!SemaRef.buildCoroutineParameterMoves(FD->getLocation()))
7340     return StmtError();
7341   auto *Promise = SemaRef.buildCoroutinePromise(FD->getLocation());
7342   if (!Promise)
7343     return StmtError();
7344   getDerived().transformedLocalDecl(S->getPromiseDecl(), {Promise});
7345   ScopeInfo->CoroutinePromise = Promise;
7346 
7347   // Transform the implicit coroutine statements constructed using dependent
7348   // types during the previous parse: initial and final suspensions, the return
7349   // object, and others. We also transform the coroutine function's body.
7350   StmtResult InitSuspend = getDerived().TransformStmt(S->getInitSuspendStmt());
7351   if (InitSuspend.isInvalid())
7352     return StmtError();
7353   StmtResult FinalSuspend =
7354       getDerived().TransformStmt(S->getFinalSuspendStmt());
7355   if (FinalSuspend.isInvalid())
7356     return StmtError();
7357   ScopeInfo->setCoroutineSuspends(InitSuspend.get(), FinalSuspend.get());
7358   assert(isa<Expr>(InitSuspend.get()) && isa<Expr>(FinalSuspend.get()));
7359 
7360   StmtResult BodyRes = getDerived().TransformStmt(S->getBody());
7361   if (BodyRes.isInvalid())
7362     return StmtError();
7363 
7364   CoroutineStmtBuilder Builder(SemaRef, *FD, *ScopeInfo, BodyRes.get());
7365   if (Builder.isInvalid())
7366     return StmtError();
7367 
7368   Expr *ReturnObject = S->getReturnValueInit();
7369   assert(ReturnObject && "the return object is expected to be valid");
7370   ExprResult Res = getDerived().TransformInitializer(ReturnObject,
7371                                                      /*NoCopyInit*/ false);
7372   if (Res.isInvalid())
7373     return StmtError();
7374   Builder.ReturnValue = Res.get();
7375 
7376   // If during the previous parse the coroutine still had a dependent promise
7377   // statement, we may need to build some implicit coroutine statements
7378   // (such as exception and fallthrough handlers) for the first time.
7379   if (S->hasDependentPromiseType()) {
7380     // We can only build these statements, however, if the current promise type
7381     // is not dependent.
7382     if (!Promise->getType()->isDependentType()) {
7383       assert(!S->getFallthroughHandler() && !S->getExceptionHandler() &&
7384              !S->getReturnStmtOnAllocFailure() && !S->getDeallocate() &&
7385              "these nodes should not have been built yet");
7386       if (!Builder.buildDependentStatements())
7387         return StmtError();
7388     }
7389   } else {
7390     if (auto *OnFallthrough = S->getFallthroughHandler()) {
7391       StmtResult Res = getDerived().TransformStmt(OnFallthrough);
7392       if (Res.isInvalid())
7393         return StmtError();
7394       Builder.OnFallthrough = Res.get();
7395     }
7396 
7397     if (auto *OnException = S->getExceptionHandler()) {
7398       StmtResult Res = getDerived().TransformStmt(OnException);
7399       if (Res.isInvalid())
7400         return StmtError();
7401       Builder.OnException = Res.get();
7402     }
7403 
7404     if (auto *OnAllocFailure = S->getReturnStmtOnAllocFailure()) {
7405       StmtResult Res = getDerived().TransformStmt(OnAllocFailure);
7406       if (Res.isInvalid())
7407         return StmtError();
7408       Builder.ReturnStmtOnAllocFailure = Res.get();
7409     }
7410 
7411     // Transform any additional statements we may have already built
7412     assert(S->getAllocate() && S->getDeallocate() &&
7413            "allocation and deallocation calls must already be built");
7414     ExprResult AllocRes = getDerived().TransformExpr(S->getAllocate());
7415     if (AllocRes.isInvalid())
7416       return StmtError();
7417     Builder.Allocate = AllocRes.get();
7418 
7419     ExprResult DeallocRes = getDerived().TransformExpr(S->getDeallocate());
7420     if (DeallocRes.isInvalid())
7421       return StmtError();
7422     Builder.Deallocate = DeallocRes.get();
7423 
7424     assert(S->getResultDecl() && "ResultDecl must already be built");
7425     StmtResult ResultDecl = getDerived().TransformStmt(S->getResultDecl());
7426     if (ResultDecl.isInvalid())
7427       return StmtError();
7428     Builder.ResultDecl = ResultDecl.get();
7429 
7430     if (auto *ReturnStmt = S->getReturnStmt()) {
7431       StmtResult Res = getDerived().TransformStmt(ReturnStmt);
7432       if (Res.isInvalid())
7433         return StmtError();
7434       Builder.ReturnStmt = Res.get();
7435     }
7436   }
7437 
7438   return getDerived().RebuildCoroutineBodyStmt(Builder);
7439 }
7440 
7441 template<typename Derived>
7442 StmtResult
7443 TreeTransform<Derived>::TransformCoreturnStmt(CoreturnStmt *S) {
7444   ExprResult Result = getDerived().TransformInitializer(S->getOperand(),
7445                                                         /*NotCopyInit*/false);
7446   if (Result.isInvalid())
7447     return StmtError();
7448 
7449   // Always rebuild; we don't know if this needs to be injected into a new
7450   // context or if the promise type has changed.
7451   return getDerived().RebuildCoreturnStmt(S->getKeywordLoc(), Result.get(),
7452                                           S->isImplicit());
7453 }
7454 
7455 template<typename Derived>
7456 ExprResult
7457 TreeTransform<Derived>::TransformCoawaitExpr(CoawaitExpr *E) {
7458   ExprResult Result = getDerived().TransformInitializer(E->getOperand(),
7459                                                         /*NotCopyInit*/false);
7460   if (Result.isInvalid())
7461     return ExprError();
7462 
7463   // Always rebuild; we don't know if this needs to be injected into a new
7464   // context or if the promise type has changed.
7465   return getDerived().RebuildCoawaitExpr(E->getKeywordLoc(), Result.get(),
7466                                          E->isImplicit());
7467 }
7468 
7469 template <typename Derived>
7470 ExprResult
7471 TreeTransform<Derived>::TransformDependentCoawaitExpr(DependentCoawaitExpr *E) {
7472   ExprResult OperandResult = getDerived().TransformInitializer(E->getOperand(),
7473                                                         /*NotCopyInit*/ false);
7474   if (OperandResult.isInvalid())
7475     return ExprError();
7476 
7477   ExprResult LookupResult = getDerived().TransformUnresolvedLookupExpr(
7478           E->getOperatorCoawaitLookup());
7479 
7480   if (LookupResult.isInvalid())
7481     return ExprError();
7482 
7483   // Always rebuild; we don't know if this needs to be injected into a new
7484   // context or if the promise type has changed.
7485   return getDerived().RebuildDependentCoawaitExpr(
7486       E->getKeywordLoc(), OperandResult.get(),
7487       cast<UnresolvedLookupExpr>(LookupResult.get()));
7488 }
7489 
7490 template<typename Derived>
7491 ExprResult
7492 TreeTransform<Derived>::TransformCoyieldExpr(CoyieldExpr *E) {
7493   ExprResult Result = getDerived().TransformInitializer(E->getOperand(),
7494                                                         /*NotCopyInit*/false);
7495   if (Result.isInvalid())
7496     return ExprError();
7497 
7498   // Always rebuild; we don't know if this needs to be injected into a new
7499   // context or if the promise type has changed.
7500   return getDerived().RebuildCoyieldExpr(E->getKeywordLoc(), Result.get());
7501 }
7502 
7503 // Objective-C Statements.
7504 
7505 template<typename Derived>
7506 StmtResult
7507 TreeTransform<Derived>::TransformObjCAtTryStmt(ObjCAtTryStmt *S) {
7508   // Transform the body of the @try.
7509   StmtResult TryBody = getDerived().TransformStmt(S->getTryBody());
7510   if (TryBody.isInvalid())
7511     return StmtError();
7512 
7513   // Transform the @catch statements (if present).
7514   bool AnyCatchChanged = false;
7515   SmallVector<Stmt*, 8> CatchStmts;
7516   for (unsigned I = 0, N = S->getNumCatchStmts(); I != N; ++I) {
7517     StmtResult Catch = getDerived().TransformStmt(S->getCatchStmt(I));
7518     if (Catch.isInvalid())
7519       return StmtError();
7520     if (Catch.get() != S->getCatchStmt(I))
7521       AnyCatchChanged = true;
7522     CatchStmts.push_back(Catch.get());
7523   }
7524 
7525   // Transform the @finally statement (if present).
7526   StmtResult Finally;
7527   if (S->getFinallyStmt()) {
7528     Finally = getDerived().TransformStmt(S->getFinallyStmt());
7529     if (Finally.isInvalid())
7530       return StmtError();
7531   }
7532 
7533   // If nothing changed, just retain this statement.
7534   if (!getDerived().AlwaysRebuild() &&
7535       TryBody.get() == S->getTryBody() &&
7536       !AnyCatchChanged &&
7537       Finally.get() == S->getFinallyStmt())
7538     return S;
7539 
7540   // Build a new statement.
7541   return getDerived().RebuildObjCAtTryStmt(S->getAtTryLoc(), TryBody.get(),
7542                                            CatchStmts, Finally.get());
7543 }
7544 
7545 template<typename Derived>
7546 StmtResult
7547 TreeTransform<Derived>::TransformObjCAtCatchStmt(ObjCAtCatchStmt *S) {
7548   // Transform the @catch parameter, if there is one.
7549   VarDecl *Var = nullptr;
7550   if (VarDecl *FromVar = S->getCatchParamDecl()) {
7551     TypeSourceInfo *TSInfo = nullptr;
7552     if (FromVar->getTypeSourceInfo()) {
7553       TSInfo = getDerived().TransformType(FromVar->getTypeSourceInfo());
7554       if (!TSInfo)
7555         return StmtError();
7556     }
7557 
7558     QualType T;
7559     if (TSInfo)
7560       T = TSInfo->getType();
7561     else {
7562       T = getDerived().TransformType(FromVar->getType());
7563       if (T.isNull())
7564         return StmtError();
7565     }
7566 
7567     Var = getDerived().RebuildObjCExceptionDecl(FromVar, TSInfo, T);
7568     if (!Var)
7569       return StmtError();
7570   }
7571 
7572   StmtResult Body = getDerived().TransformStmt(S->getCatchBody());
7573   if (Body.isInvalid())
7574     return StmtError();
7575 
7576   return getDerived().RebuildObjCAtCatchStmt(S->getAtCatchLoc(),
7577                                              S->getRParenLoc(),
7578                                              Var, Body.get());
7579 }
7580 
7581 template<typename Derived>
7582 StmtResult
7583 TreeTransform<Derived>::TransformObjCAtFinallyStmt(ObjCAtFinallyStmt *S) {
7584   // Transform the body.
7585   StmtResult Body = getDerived().TransformStmt(S->getFinallyBody());
7586   if (Body.isInvalid())
7587     return StmtError();
7588 
7589   // If nothing changed, just retain this statement.
7590   if (!getDerived().AlwaysRebuild() &&
7591       Body.get() == S->getFinallyBody())
7592     return S;
7593 
7594   // Build a new statement.
7595   return getDerived().RebuildObjCAtFinallyStmt(S->getAtFinallyLoc(),
7596                                                Body.get());
7597 }
7598 
7599 template<typename Derived>
7600 StmtResult
7601 TreeTransform<Derived>::TransformObjCAtThrowStmt(ObjCAtThrowStmt *S) {
7602   ExprResult Operand;
7603   if (S->getThrowExpr()) {
7604     Operand = getDerived().TransformExpr(S->getThrowExpr());
7605     if (Operand.isInvalid())
7606       return StmtError();
7607   }
7608 
7609   if (!getDerived().AlwaysRebuild() &&
7610       Operand.get() == S->getThrowExpr())
7611     return S;
7612 
7613   return getDerived().RebuildObjCAtThrowStmt(S->getThrowLoc(), Operand.get());
7614 }
7615 
7616 template<typename Derived>
7617 StmtResult
7618 TreeTransform<Derived>::TransformObjCAtSynchronizedStmt(
7619                                                   ObjCAtSynchronizedStmt *S) {
7620   // Transform the object we are locking.
7621   ExprResult Object = getDerived().TransformExpr(S->getSynchExpr());
7622   if (Object.isInvalid())
7623     return StmtError();
7624   Object =
7625     getDerived().RebuildObjCAtSynchronizedOperand(S->getAtSynchronizedLoc(),
7626                                                   Object.get());
7627   if (Object.isInvalid())
7628     return StmtError();
7629 
7630   // Transform the body.
7631   StmtResult Body = getDerived().TransformStmt(S->getSynchBody());
7632   if (Body.isInvalid())
7633     return StmtError();
7634 
7635   // If nothing change, just retain the current statement.
7636   if (!getDerived().AlwaysRebuild() &&
7637       Object.get() == S->getSynchExpr() &&
7638       Body.get() == S->getSynchBody())
7639     return S;
7640 
7641   // Build a new statement.
7642   return getDerived().RebuildObjCAtSynchronizedStmt(S->getAtSynchronizedLoc(),
7643                                                     Object.get(), Body.get());
7644 }
7645 
7646 template<typename Derived>
7647 StmtResult
7648 TreeTransform<Derived>::TransformObjCAutoreleasePoolStmt(
7649                                               ObjCAutoreleasePoolStmt *S) {
7650   // Transform the body.
7651   StmtResult Body = getDerived().TransformStmt(S->getSubStmt());
7652   if (Body.isInvalid())
7653     return StmtError();
7654 
7655   // If nothing changed, just retain this statement.
7656   if (!getDerived().AlwaysRebuild() &&
7657       Body.get() == S->getSubStmt())
7658     return S;
7659 
7660   // Build a new statement.
7661   return getDerived().RebuildObjCAutoreleasePoolStmt(
7662                         S->getAtLoc(), Body.get());
7663 }
7664 
7665 template<typename Derived>
7666 StmtResult
7667 TreeTransform<Derived>::TransformObjCForCollectionStmt(
7668                                                   ObjCForCollectionStmt *S) {
7669   // Transform the element statement.
7670   StmtResult Element =
7671       getDerived().TransformStmt(S->getElement(), SDK_NotDiscarded);
7672   if (Element.isInvalid())
7673     return StmtError();
7674 
7675   // Transform the collection expression.
7676   ExprResult Collection = getDerived().TransformExpr(S->getCollection());
7677   if (Collection.isInvalid())
7678     return StmtError();
7679 
7680   // Transform the body.
7681   StmtResult Body = getDerived().TransformStmt(S->getBody());
7682   if (Body.isInvalid())
7683     return StmtError();
7684 
7685   // If nothing changed, just retain this statement.
7686   if (!getDerived().AlwaysRebuild() &&
7687       Element.get() == S->getElement() &&
7688       Collection.get() == S->getCollection() &&
7689       Body.get() == S->getBody())
7690     return S;
7691 
7692   // Build a new statement.
7693   return getDerived().RebuildObjCForCollectionStmt(S->getForLoc(),
7694                                                    Element.get(),
7695                                                    Collection.get(),
7696                                                    S->getRParenLoc(),
7697                                                    Body.get());
7698 }
7699 
7700 template <typename Derived>
7701 StmtResult TreeTransform<Derived>::TransformCXXCatchStmt(CXXCatchStmt *S) {
7702   // Transform the exception declaration, if any.
7703   VarDecl *Var = nullptr;
7704   if (VarDecl *ExceptionDecl = S->getExceptionDecl()) {
7705     TypeSourceInfo *T =
7706         getDerived().TransformType(ExceptionDecl->getTypeSourceInfo());
7707     if (!T)
7708       return StmtError();
7709 
7710     Var = getDerived().RebuildExceptionDecl(
7711         ExceptionDecl, T, ExceptionDecl->getInnerLocStart(),
7712         ExceptionDecl->getLocation(), ExceptionDecl->getIdentifier());
7713     if (!Var || Var->isInvalidDecl())
7714       return StmtError();
7715   }
7716 
7717   // Transform the actual exception handler.
7718   StmtResult Handler = getDerived().TransformStmt(S->getHandlerBlock());
7719   if (Handler.isInvalid())
7720     return StmtError();
7721 
7722   if (!getDerived().AlwaysRebuild() && !Var &&
7723       Handler.get() == S->getHandlerBlock())
7724     return S;
7725 
7726   return getDerived().RebuildCXXCatchStmt(S->getCatchLoc(), Var, Handler.get());
7727 }
7728 
7729 template <typename Derived>
7730 StmtResult TreeTransform<Derived>::TransformCXXTryStmt(CXXTryStmt *S) {
7731   // Transform the try block itself.
7732   StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock());
7733   if (TryBlock.isInvalid())
7734     return StmtError();
7735 
7736   // Transform the handlers.
7737   bool HandlerChanged = false;
7738   SmallVector<Stmt *, 8> Handlers;
7739   for (unsigned I = 0, N = S->getNumHandlers(); I != N; ++I) {
7740     StmtResult Handler = getDerived().TransformCXXCatchStmt(S->getHandler(I));
7741     if (Handler.isInvalid())
7742       return StmtError();
7743 
7744     HandlerChanged = HandlerChanged || Handler.get() != S->getHandler(I);
7745     Handlers.push_back(Handler.getAs<Stmt>());
7746   }
7747 
7748   if (!getDerived().AlwaysRebuild() && TryBlock.get() == S->getTryBlock() &&
7749       !HandlerChanged)
7750     return S;
7751 
7752   return getDerived().RebuildCXXTryStmt(S->getTryLoc(), TryBlock.get(),
7753                                         Handlers);
7754 }
7755 
7756 template<typename Derived>
7757 StmtResult
7758 TreeTransform<Derived>::TransformCXXForRangeStmt(CXXForRangeStmt *S) {
7759   StmtResult Init =
7760       S->getInit() ? getDerived().TransformStmt(S->getInit()) : StmtResult();
7761   if (Init.isInvalid())
7762     return StmtError();
7763 
7764   StmtResult Range = getDerived().TransformStmt(S->getRangeStmt());
7765   if (Range.isInvalid())
7766     return StmtError();
7767 
7768   StmtResult Begin = getDerived().TransformStmt(S->getBeginStmt());
7769   if (Begin.isInvalid())
7770     return StmtError();
7771   StmtResult End = getDerived().TransformStmt(S->getEndStmt());
7772   if (End.isInvalid())
7773     return StmtError();
7774 
7775   ExprResult Cond = getDerived().TransformExpr(S->getCond());
7776   if (Cond.isInvalid())
7777     return StmtError();
7778   if (Cond.get())
7779     Cond = SemaRef.CheckBooleanCondition(S->getColonLoc(), Cond.get());
7780   if (Cond.isInvalid())
7781     return StmtError();
7782   if (Cond.get())
7783     Cond = SemaRef.MaybeCreateExprWithCleanups(Cond.get());
7784 
7785   ExprResult Inc = getDerived().TransformExpr(S->getInc());
7786   if (Inc.isInvalid())
7787     return StmtError();
7788   if (Inc.get())
7789     Inc = SemaRef.MaybeCreateExprWithCleanups(Inc.get());
7790 
7791   StmtResult LoopVar = getDerived().TransformStmt(S->getLoopVarStmt());
7792   if (LoopVar.isInvalid())
7793     return StmtError();
7794 
7795   StmtResult NewStmt = S;
7796   if (getDerived().AlwaysRebuild() ||
7797       Init.get() != S->getInit() ||
7798       Range.get() != S->getRangeStmt() ||
7799       Begin.get() != S->getBeginStmt() ||
7800       End.get() != S->getEndStmt() ||
7801       Cond.get() != S->getCond() ||
7802       Inc.get() != S->getInc() ||
7803       LoopVar.get() != S->getLoopVarStmt()) {
7804     NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(),
7805                                                   S->getCoawaitLoc(), Init.get(),
7806                                                   S->getColonLoc(), Range.get(),
7807                                                   Begin.get(), End.get(),
7808                                                   Cond.get(),
7809                                                   Inc.get(), LoopVar.get(),
7810                                                   S->getRParenLoc());
7811     if (NewStmt.isInvalid())
7812       return StmtError();
7813   }
7814 
7815   StmtResult Body = getDerived().TransformStmt(S->getBody());
7816   if (Body.isInvalid())
7817     return StmtError();
7818 
7819   // Body has changed but we didn't rebuild the for-range statement. Rebuild
7820   // it now so we have a new statement to attach the body to.
7821   if (Body.get() != S->getBody() && NewStmt.get() == S) {
7822     NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(),
7823                                                   S->getCoawaitLoc(), Init.get(),
7824                                                   S->getColonLoc(), Range.get(),
7825                                                   Begin.get(), End.get(),
7826                                                   Cond.get(),
7827                                                   Inc.get(), LoopVar.get(),
7828                                                   S->getRParenLoc());
7829     if (NewStmt.isInvalid())
7830       return StmtError();
7831   }
7832 
7833   if (NewStmt.get() == S)
7834     return S;
7835 
7836   return FinishCXXForRangeStmt(NewStmt.get(), Body.get());
7837 }
7838 
7839 template<typename Derived>
7840 StmtResult
7841 TreeTransform<Derived>::TransformMSDependentExistsStmt(
7842                                                     MSDependentExistsStmt *S) {
7843   // Transform the nested-name-specifier, if any.
7844   NestedNameSpecifierLoc QualifierLoc;
7845   if (S->getQualifierLoc()) {
7846     QualifierLoc
7847       = getDerived().TransformNestedNameSpecifierLoc(S->getQualifierLoc());
7848     if (!QualifierLoc)
7849       return StmtError();
7850   }
7851 
7852   // Transform the declaration name.
7853   DeclarationNameInfo NameInfo = S->getNameInfo();
7854   if (NameInfo.getName()) {
7855     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
7856     if (!NameInfo.getName())
7857       return StmtError();
7858   }
7859 
7860   // Check whether anything changed.
7861   if (!getDerived().AlwaysRebuild() &&
7862       QualifierLoc == S->getQualifierLoc() &&
7863       NameInfo.getName() == S->getNameInfo().getName())
7864     return S;
7865 
7866   // Determine whether this name exists, if we can.
7867   CXXScopeSpec SS;
7868   SS.Adopt(QualifierLoc);
7869   bool Dependent = false;
7870   switch (getSema().CheckMicrosoftIfExistsSymbol(/*S=*/nullptr, SS, NameInfo)) {
7871   case Sema::IER_Exists:
7872     if (S->isIfExists())
7873       break;
7874 
7875     return new (getSema().Context) NullStmt(S->getKeywordLoc());
7876 
7877   case Sema::IER_DoesNotExist:
7878     if (S->isIfNotExists())
7879       break;
7880 
7881     return new (getSema().Context) NullStmt(S->getKeywordLoc());
7882 
7883   case Sema::IER_Dependent:
7884     Dependent = true;
7885     break;
7886 
7887   case Sema::IER_Error:
7888     return StmtError();
7889   }
7890 
7891   // We need to continue with the instantiation, so do so now.
7892   StmtResult SubStmt = getDerived().TransformCompoundStmt(S->getSubStmt());
7893   if (SubStmt.isInvalid())
7894     return StmtError();
7895 
7896   // If we have resolved the name, just transform to the substatement.
7897   if (!Dependent)
7898     return SubStmt;
7899 
7900   // The name is still dependent, so build a dependent expression again.
7901   return getDerived().RebuildMSDependentExistsStmt(S->getKeywordLoc(),
7902                                                    S->isIfExists(),
7903                                                    QualifierLoc,
7904                                                    NameInfo,
7905                                                    SubStmt.get());
7906 }
7907 
7908 template<typename Derived>
7909 ExprResult
7910 TreeTransform<Derived>::TransformMSPropertyRefExpr(MSPropertyRefExpr *E) {
7911   NestedNameSpecifierLoc QualifierLoc;
7912   if (E->getQualifierLoc()) {
7913     QualifierLoc
7914     = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
7915     if (!QualifierLoc)
7916       return ExprError();
7917   }
7918 
7919   MSPropertyDecl *PD = cast_or_null<MSPropertyDecl>(
7920     getDerived().TransformDecl(E->getMemberLoc(), E->getPropertyDecl()));
7921   if (!PD)
7922     return ExprError();
7923 
7924   ExprResult Base = getDerived().TransformExpr(E->getBaseExpr());
7925   if (Base.isInvalid())
7926     return ExprError();
7927 
7928   return new (SemaRef.getASTContext())
7929       MSPropertyRefExpr(Base.get(), PD, E->isArrow(),
7930                         SemaRef.getASTContext().PseudoObjectTy, VK_LValue,
7931                         QualifierLoc, E->getMemberLoc());
7932 }
7933 
7934 template <typename Derived>
7935 ExprResult TreeTransform<Derived>::TransformMSPropertySubscriptExpr(
7936     MSPropertySubscriptExpr *E) {
7937   auto BaseRes = getDerived().TransformExpr(E->getBase());
7938   if (BaseRes.isInvalid())
7939     return ExprError();
7940   auto IdxRes = getDerived().TransformExpr(E->getIdx());
7941   if (IdxRes.isInvalid())
7942     return ExprError();
7943 
7944   if (!getDerived().AlwaysRebuild() &&
7945       BaseRes.get() == E->getBase() &&
7946       IdxRes.get() == E->getIdx())
7947     return E;
7948 
7949   return getDerived().RebuildArraySubscriptExpr(
7950       BaseRes.get(), SourceLocation(), IdxRes.get(), E->getRBracketLoc());
7951 }
7952 
7953 template <typename Derived>
7954 StmtResult TreeTransform<Derived>::TransformSEHTryStmt(SEHTryStmt *S) {
7955   StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock());
7956   if (TryBlock.isInvalid())
7957     return StmtError();
7958 
7959   StmtResult Handler = getDerived().TransformSEHHandler(S->getHandler());
7960   if (Handler.isInvalid())
7961     return StmtError();
7962 
7963   if (!getDerived().AlwaysRebuild() && TryBlock.get() == S->getTryBlock() &&
7964       Handler.get() == S->getHandler())
7965     return S;
7966 
7967   return getDerived().RebuildSEHTryStmt(S->getIsCXXTry(), S->getTryLoc(),
7968                                         TryBlock.get(), Handler.get());
7969 }
7970 
7971 template <typename Derived>
7972 StmtResult TreeTransform<Derived>::TransformSEHFinallyStmt(SEHFinallyStmt *S) {
7973   StmtResult Block = getDerived().TransformCompoundStmt(S->getBlock());
7974   if (Block.isInvalid())
7975     return StmtError();
7976 
7977   return getDerived().RebuildSEHFinallyStmt(S->getFinallyLoc(), Block.get());
7978 }
7979 
7980 template <typename Derived>
7981 StmtResult TreeTransform<Derived>::TransformSEHExceptStmt(SEHExceptStmt *S) {
7982   ExprResult FilterExpr = getDerived().TransformExpr(S->getFilterExpr());
7983   if (FilterExpr.isInvalid())
7984     return StmtError();
7985 
7986   StmtResult Block = getDerived().TransformCompoundStmt(S->getBlock());
7987   if (Block.isInvalid())
7988     return StmtError();
7989 
7990   return getDerived().RebuildSEHExceptStmt(S->getExceptLoc(), FilterExpr.get(),
7991                                            Block.get());
7992 }
7993 
7994 template <typename Derived>
7995 StmtResult TreeTransform<Derived>::TransformSEHHandler(Stmt *Handler) {
7996   if (isa<SEHFinallyStmt>(Handler))
7997     return getDerived().TransformSEHFinallyStmt(cast<SEHFinallyStmt>(Handler));
7998   else
7999     return getDerived().TransformSEHExceptStmt(cast<SEHExceptStmt>(Handler));
8000 }
8001 
8002 template<typename Derived>
8003 StmtResult
8004 TreeTransform<Derived>::TransformSEHLeaveStmt(SEHLeaveStmt *S) {
8005   return S;
8006 }
8007 
8008 //===----------------------------------------------------------------------===//
8009 // OpenMP directive transformation
8010 //===----------------------------------------------------------------------===//
8011 template <typename Derived>
8012 StmtResult TreeTransform<Derived>::TransformOMPExecutableDirective(
8013     OMPExecutableDirective *D) {
8014 
8015   // Transform the clauses
8016   llvm::SmallVector<OMPClause *, 16> TClauses;
8017   ArrayRef<OMPClause *> Clauses = D->clauses();
8018   TClauses.reserve(Clauses.size());
8019   for (ArrayRef<OMPClause *>::iterator I = Clauses.begin(), E = Clauses.end();
8020        I != E; ++I) {
8021     if (*I) {
8022       getDerived().getSema().StartOpenMPClause((*I)->getClauseKind());
8023       OMPClause *Clause = getDerived().TransformOMPClause(*I);
8024       getDerived().getSema().EndOpenMPClause();
8025       if (Clause)
8026         TClauses.push_back(Clause);
8027     } else {
8028       TClauses.push_back(nullptr);
8029     }
8030   }
8031   StmtResult AssociatedStmt;
8032   if (D->hasAssociatedStmt() && D->getAssociatedStmt()) {
8033     getDerived().getSema().ActOnOpenMPRegionStart(D->getDirectiveKind(),
8034                                                   /*CurScope=*/nullptr);
8035     StmtResult Body;
8036     {
8037       Sema::CompoundScopeRAII CompoundScope(getSema());
8038       Stmt *CS = D->getInnermostCapturedStmt()->getCapturedStmt();
8039       Body = getDerived().TransformStmt(CS);
8040     }
8041     AssociatedStmt =
8042         getDerived().getSema().ActOnOpenMPRegionEnd(Body, TClauses);
8043     if (AssociatedStmt.isInvalid()) {
8044       return StmtError();
8045     }
8046   }
8047   if (TClauses.size() != Clauses.size()) {
8048     return StmtError();
8049   }
8050 
8051   // Transform directive name for 'omp critical' directive.
8052   DeclarationNameInfo DirName;
8053   if (D->getDirectiveKind() == OMPD_critical) {
8054     DirName = cast<OMPCriticalDirective>(D)->getDirectiveName();
8055     DirName = getDerived().TransformDeclarationNameInfo(DirName);
8056   }
8057   OpenMPDirectiveKind CancelRegion = OMPD_unknown;
8058   if (D->getDirectiveKind() == OMPD_cancellation_point) {
8059     CancelRegion = cast<OMPCancellationPointDirective>(D)->getCancelRegion();
8060   } else if (D->getDirectiveKind() == OMPD_cancel) {
8061     CancelRegion = cast<OMPCancelDirective>(D)->getCancelRegion();
8062   }
8063 
8064   return getDerived().RebuildOMPExecutableDirective(
8065       D->getDirectiveKind(), DirName, CancelRegion, TClauses,
8066       AssociatedStmt.get(), D->getBeginLoc(), D->getEndLoc());
8067 }
8068 
8069 template <typename Derived>
8070 StmtResult
8071 TreeTransform<Derived>::TransformOMPParallelDirective(OMPParallelDirective *D) {
8072   DeclarationNameInfo DirName;
8073   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel, DirName, nullptr,
8074                                              D->getBeginLoc());
8075   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8076   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8077   return Res;
8078 }
8079 
8080 template <typename Derived>
8081 StmtResult
8082 TreeTransform<Derived>::TransformOMPSimdDirective(OMPSimdDirective *D) {
8083   DeclarationNameInfo DirName;
8084   getDerived().getSema().StartOpenMPDSABlock(OMPD_simd, DirName, nullptr,
8085                                              D->getBeginLoc());
8086   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8087   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8088   return Res;
8089 }
8090 
8091 template <typename Derived>
8092 StmtResult
8093 TreeTransform<Derived>::TransformOMPForDirective(OMPForDirective *D) {
8094   DeclarationNameInfo DirName;
8095   getDerived().getSema().StartOpenMPDSABlock(OMPD_for, DirName, nullptr,
8096                                              D->getBeginLoc());
8097   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8098   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8099   return Res;
8100 }
8101 
8102 template <typename Derived>
8103 StmtResult
8104 TreeTransform<Derived>::TransformOMPForSimdDirective(OMPForSimdDirective *D) {
8105   DeclarationNameInfo DirName;
8106   getDerived().getSema().StartOpenMPDSABlock(OMPD_for_simd, DirName, nullptr,
8107                                              D->getBeginLoc());
8108   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8109   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8110   return Res;
8111 }
8112 
8113 template <typename Derived>
8114 StmtResult
8115 TreeTransform<Derived>::TransformOMPSectionsDirective(OMPSectionsDirective *D) {
8116   DeclarationNameInfo DirName;
8117   getDerived().getSema().StartOpenMPDSABlock(OMPD_sections, DirName, nullptr,
8118                                              D->getBeginLoc());
8119   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8120   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8121   return Res;
8122 }
8123 
8124 template <typename Derived>
8125 StmtResult
8126 TreeTransform<Derived>::TransformOMPSectionDirective(OMPSectionDirective *D) {
8127   DeclarationNameInfo DirName;
8128   getDerived().getSema().StartOpenMPDSABlock(OMPD_section, DirName, nullptr,
8129                                              D->getBeginLoc());
8130   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8131   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8132   return Res;
8133 }
8134 
8135 template <typename Derived>
8136 StmtResult
8137 TreeTransform<Derived>::TransformOMPSingleDirective(OMPSingleDirective *D) {
8138   DeclarationNameInfo DirName;
8139   getDerived().getSema().StartOpenMPDSABlock(OMPD_single, DirName, nullptr,
8140                                              D->getBeginLoc());
8141   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8142   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8143   return Res;
8144 }
8145 
8146 template <typename Derived>
8147 StmtResult
8148 TreeTransform<Derived>::TransformOMPMasterDirective(OMPMasterDirective *D) {
8149   DeclarationNameInfo DirName;
8150   getDerived().getSema().StartOpenMPDSABlock(OMPD_master, DirName, nullptr,
8151                                              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
8159 TreeTransform<Derived>::TransformOMPCriticalDirective(OMPCriticalDirective *D) {
8160   getDerived().getSema().StartOpenMPDSABlock(
8161       OMPD_critical, D->getDirectiveName(), nullptr, D->getBeginLoc());
8162   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8163   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8164   return Res;
8165 }
8166 
8167 template <typename Derived>
8168 StmtResult TreeTransform<Derived>::TransformOMPParallelForDirective(
8169     OMPParallelForDirective *D) {
8170   DeclarationNameInfo DirName;
8171   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_for, DirName,
8172                                              nullptr, D->getBeginLoc());
8173   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8174   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8175   return Res;
8176 }
8177 
8178 template <typename Derived>
8179 StmtResult TreeTransform<Derived>::TransformOMPParallelForSimdDirective(
8180     OMPParallelForSimdDirective *D) {
8181   DeclarationNameInfo DirName;
8182   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_for_simd, DirName,
8183                                              nullptr, D->getBeginLoc());
8184   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8185   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8186   return Res;
8187 }
8188 
8189 template <typename Derived>
8190 StmtResult TreeTransform<Derived>::TransformOMPParallelMasterDirective(
8191     OMPParallelMasterDirective *D) {
8192   DeclarationNameInfo DirName;
8193   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_master, DirName,
8194                                              nullptr, D->getBeginLoc());
8195   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8196   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8197   return Res;
8198 }
8199 
8200 template <typename Derived>
8201 StmtResult TreeTransform<Derived>::TransformOMPParallelSectionsDirective(
8202     OMPParallelSectionsDirective *D) {
8203   DeclarationNameInfo DirName;
8204   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_sections, DirName,
8205                                              nullptr, D->getBeginLoc());
8206   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8207   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8208   return Res;
8209 }
8210 
8211 template <typename Derived>
8212 StmtResult
8213 TreeTransform<Derived>::TransformOMPTaskDirective(OMPTaskDirective *D) {
8214   DeclarationNameInfo DirName;
8215   getDerived().getSema().StartOpenMPDSABlock(OMPD_task, DirName, nullptr,
8216                                              D->getBeginLoc());
8217   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8218   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8219   return Res;
8220 }
8221 
8222 template <typename Derived>
8223 StmtResult TreeTransform<Derived>::TransformOMPTaskyieldDirective(
8224     OMPTaskyieldDirective *D) {
8225   DeclarationNameInfo DirName;
8226   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskyield, DirName, nullptr,
8227                                              D->getBeginLoc());
8228   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8229   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8230   return Res;
8231 }
8232 
8233 template <typename Derived>
8234 StmtResult
8235 TreeTransform<Derived>::TransformOMPBarrierDirective(OMPBarrierDirective *D) {
8236   DeclarationNameInfo DirName;
8237   getDerived().getSema().StartOpenMPDSABlock(OMPD_barrier, DirName, nullptr,
8238                                              D->getBeginLoc());
8239   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8240   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8241   return Res;
8242 }
8243 
8244 template <typename Derived>
8245 StmtResult
8246 TreeTransform<Derived>::TransformOMPTaskwaitDirective(OMPTaskwaitDirective *D) {
8247   DeclarationNameInfo DirName;
8248   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskwait, DirName, nullptr,
8249                                              D->getBeginLoc());
8250   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8251   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8252   return Res;
8253 }
8254 
8255 template <typename Derived>
8256 StmtResult TreeTransform<Derived>::TransformOMPTaskgroupDirective(
8257     OMPTaskgroupDirective *D) {
8258   DeclarationNameInfo DirName;
8259   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskgroup, DirName, nullptr,
8260                                              D->getBeginLoc());
8261   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8262   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8263   return Res;
8264 }
8265 
8266 template <typename Derived>
8267 StmtResult
8268 TreeTransform<Derived>::TransformOMPFlushDirective(OMPFlushDirective *D) {
8269   DeclarationNameInfo DirName;
8270   getDerived().getSema().StartOpenMPDSABlock(OMPD_flush, DirName, nullptr,
8271                                              D->getBeginLoc());
8272   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8273   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8274   return Res;
8275 }
8276 
8277 template <typename Derived>
8278 StmtResult
8279 TreeTransform<Derived>::TransformOMPDepobjDirective(OMPDepobjDirective *D) {
8280   DeclarationNameInfo DirName;
8281   getDerived().getSema().StartOpenMPDSABlock(OMPD_depobj, DirName, nullptr,
8282                                              D->getBeginLoc());
8283   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8284   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8285   return Res;
8286 }
8287 
8288 template <typename Derived>
8289 StmtResult
8290 TreeTransform<Derived>::TransformOMPOrderedDirective(OMPOrderedDirective *D) {
8291   DeclarationNameInfo DirName;
8292   getDerived().getSema().StartOpenMPDSABlock(OMPD_ordered, DirName, nullptr,
8293                                              D->getBeginLoc());
8294   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8295   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8296   return Res;
8297 }
8298 
8299 template <typename Derived>
8300 StmtResult
8301 TreeTransform<Derived>::TransformOMPAtomicDirective(OMPAtomicDirective *D) {
8302   DeclarationNameInfo DirName;
8303   getDerived().getSema().StartOpenMPDSABlock(OMPD_atomic, DirName, nullptr,
8304                                              D->getBeginLoc());
8305   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8306   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8307   return Res;
8308 }
8309 
8310 template <typename Derived>
8311 StmtResult
8312 TreeTransform<Derived>::TransformOMPTargetDirective(OMPTargetDirective *D) {
8313   DeclarationNameInfo DirName;
8314   getDerived().getSema().StartOpenMPDSABlock(OMPD_target, DirName, nullptr,
8315                                              D->getBeginLoc());
8316   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8317   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8318   return Res;
8319 }
8320 
8321 template <typename Derived>
8322 StmtResult TreeTransform<Derived>::TransformOMPTargetDataDirective(
8323     OMPTargetDataDirective *D) {
8324   DeclarationNameInfo DirName;
8325   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_data, DirName, nullptr,
8326                                              D->getBeginLoc());
8327   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8328   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8329   return Res;
8330 }
8331 
8332 template <typename Derived>
8333 StmtResult TreeTransform<Derived>::TransformOMPTargetEnterDataDirective(
8334     OMPTargetEnterDataDirective *D) {
8335   DeclarationNameInfo DirName;
8336   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_enter_data, DirName,
8337                                              nullptr, D->getBeginLoc());
8338   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8339   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8340   return Res;
8341 }
8342 
8343 template <typename Derived>
8344 StmtResult TreeTransform<Derived>::TransformOMPTargetExitDataDirective(
8345     OMPTargetExitDataDirective *D) {
8346   DeclarationNameInfo DirName;
8347   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_exit_data, DirName,
8348                                              nullptr, D->getBeginLoc());
8349   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8350   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8351   return Res;
8352 }
8353 
8354 template <typename Derived>
8355 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelDirective(
8356     OMPTargetParallelDirective *D) {
8357   DeclarationNameInfo DirName;
8358   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel, DirName,
8359                                              nullptr, D->getBeginLoc());
8360   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8361   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8362   return Res;
8363 }
8364 
8365 template <typename Derived>
8366 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelForDirective(
8367     OMPTargetParallelForDirective *D) {
8368   DeclarationNameInfo DirName;
8369   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel_for, DirName,
8370                                              nullptr, D->getBeginLoc());
8371   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8372   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8373   return Res;
8374 }
8375 
8376 template <typename Derived>
8377 StmtResult TreeTransform<Derived>::TransformOMPTargetUpdateDirective(
8378     OMPTargetUpdateDirective *D) {
8379   DeclarationNameInfo DirName;
8380   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_update, DirName,
8381                                              nullptr, D->getBeginLoc());
8382   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8383   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8384   return Res;
8385 }
8386 
8387 template <typename Derived>
8388 StmtResult
8389 TreeTransform<Derived>::TransformOMPTeamsDirective(OMPTeamsDirective *D) {
8390   DeclarationNameInfo DirName;
8391   getDerived().getSema().StartOpenMPDSABlock(OMPD_teams, DirName, nullptr,
8392                                              D->getBeginLoc());
8393   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8394   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8395   return Res;
8396 }
8397 
8398 template <typename Derived>
8399 StmtResult TreeTransform<Derived>::TransformOMPCancellationPointDirective(
8400     OMPCancellationPointDirective *D) {
8401   DeclarationNameInfo DirName;
8402   getDerived().getSema().StartOpenMPDSABlock(OMPD_cancellation_point, DirName,
8403                                              nullptr, D->getBeginLoc());
8404   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8405   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8406   return Res;
8407 }
8408 
8409 template <typename Derived>
8410 StmtResult
8411 TreeTransform<Derived>::TransformOMPCancelDirective(OMPCancelDirective *D) {
8412   DeclarationNameInfo DirName;
8413   getDerived().getSema().StartOpenMPDSABlock(OMPD_cancel, DirName, nullptr,
8414                                              D->getBeginLoc());
8415   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8416   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8417   return Res;
8418 }
8419 
8420 template <typename Derived>
8421 StmtResult
8422 TreeTransform<Derived>::TransformOMPTaskLoopDirective(OMPTaskLoopDirective *D) {
8423   DeclarationNameInfo DirName;
8424   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskloop, DirName, nullptr,
8425                                              D->getBeginLoc());
8426   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8427   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8428   return Res;
8429 }
8430 
8431 template <typename Derived>
8432 StmtResult TreeTransform<Derived>::TransformOMPTaskLoopSimdDirective(
8433     OMPTaskLoopSimdDirective *D) {
8434   DeclarationNameInfo DirName;
8435   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskloop_simd, DirName,
8436                                              nullptr, D->getBeginLoc());
8437   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8438   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8439   return Res;
8440 }
8441 
8442 template <typename Derived>
8443 StmtResult TreeTransform<Derived>::TransformOMPMasterTaskLoopDirective(
8444     OMPMasterTaskLoopDirective *D) {
8445   DeclarationNameInfo DirName;
8446   getDerived().getSema().StartOpenMPDSABlock(OMPD_master_taskloop, DirName,
8447                                              nullptr, D->getBeginLoc());
8448   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8449   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8450   return Res;
8451 }
8452 
8453 template <typename Derived>
8454 StmtResult TreeTransform<Derived>::TransformOMPMasterTaskLoopSimdDirective(
8455     OMPMasterTaskLoopSimdDirective *D) {
8456   DeclarationNameInfo DirName;
8457   getDerived().getSema().StartOpenMPDSABlock(OMPD_master_taskloop_simd, DirName,
8458                                              nullptr, D->getBeginLoc());
8459   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8460   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8461   return Res;
8462 }
8463 
8464 template <typename Derived>
8465 StmtResult TreeTransform<Derived>::TransformOMPParallelMasterTaskLoopDirective(
8466     OMPParallelMasterTaskLoopDirective *D) {
8467   DeclarationNameInfo DirName;
8468   getDerived().getSema().StartOpenMPDSABlock(
8469       OMPD_parallel_master_taskloop, DirName, nullptr, D->getBeginLoc());
8470   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8471   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8472   return Res;
8473 }
8474 
8475 template <typename Derived>
8476 StmtResult
8477 TreeTransform<Derived>::TransformOMPParallelMasterTaskLoopSimdDirective(
8478     OMPParallelMasterTaskLoopSimdDirective *D) {
8479   DeclarationNameInfo DirName;
8480   getDerived().getSema().StartOpenMPDSABlock(
8481       OMPD_parallel_master_taskloop_simd, DirName, nullptr, D->getBeginLoc());
8482   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8483   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8484   return Res;
8485 }
8486 
8487 template <typename Derived>
8488 StmtResult TreeTransform<Derived>::TransformOMPDistributeDirective(
8489     OMPDistributeDirective *D) {
8490   DeclarationNameInfo DirName;
8491   getDerived().getSema().StartOpenMPDSABlock(OMPD_distribute, DirName, nullptr,
8492                                              D->getBeginLoc());
8493   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8494   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8495   return Res;
8496 }
8497 
8498 template <typename Derived>
8499 StmtResult TreeTransform<Derived>::TransformOMPDistributeParallelForDirective(
8500     OMPDistributeParallelForDirective *D) {
8501   DeclarationNameInfo DirName;
8502   getDerived().getSema().StartOpenMPDSABlock(
8503       OMPD_distribute_parallel_for, DirName, nullptr, D->getBeginLoc());
8504   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8505   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8506   return Res;
8507 }
8508 
8509 template <typename Derived>
8510 StmtResult
8511 TreeTransform<Derived>::TransformOMPDistributeParallelForSimdDirective(
8512     OMPDistributeParallelForSimdDirective *D) {
8513   DeclarationNameInfo DirName;
8514   getDerived().getSema().StartOpenMPDSABlock(
8515       OMPD_distribute_parallel_for_simd, DirName, nullptr, D->getBeginLoc());
8516   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8517   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8518   return Res;
8519 }
8520 
8521 template <typename Derived>
8522 StmtResult TreeTransform<Derived>::TransformOMPDistributeSimdDirective(
8523     OMPDistributeSimdDirective *D) {
8524   DeclarationNameInfo DirName;
8525   getDerived().getSema().StartOpenMPDSABlock(OMPD_distribute_simd, DirName,
8526                                              nullptr, D->getBeginLoc());
8527   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8528   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8529   return Res;
8530 }
8531 
8532 template <typename Derived>
8533 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelForSimdDirective(
8534     OMPTargetParallelForSimdDirective *D) {
8535   DeclarationNameInfo DirName;
8536   getDerived().getSema().StartOpenMPDSABlock(
8537       OMPD_target_parallel_for_simd, DirName, nullptr, D->getBeginLoc());
8538   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8539   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8540   return Res;
8541 }
8542 
8543 template <typename Derived>
8544 StmtResult TreeTransform<Derived>::TransformOMPTargetSimdDirective(
8545     OMPTargetSimdDirective *D) {
8546   DeclarationNameInfo DirName;
8547   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_simd, DirName, nullptr,
8548                                              D->getBeginLoc());
8549   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8550   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8551   return Res;
8552 }
8553 
8554 template <typename Derived>
8555 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeDirective(
8556     OMPTeamsDistributeDirective *D) {
8557   DeclarationNameInfo DirName;
8558   getDerived().getSema().StartOpenMPDSABlock(OMPD_teams_distribute, DirName,
8559                                              nullptr, D->getBeginLoc());
8560   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8561   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8562   return Res;
8563 }
8564 
8565 template <typename Derived>
8566 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeSimdDirective(
8567     OMPTeamsDistributeSimdDirective *D) {
8568   DeclarationNameInfo DirName;
8569   getDerived().getSema().StartOpenMPDSABlock(
8570       OMPD_teams_distribute_simd, DirName, nullptr, D->getBeginLoc());
8571   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8572   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8573   return Res;
8574 }
8575 
8576 template <typename Derived>
8577 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeParallelForSimdDirective(
8578     OMPTeamsDistributeParallelForSimdDirective *D) {
8579   DeclarationNameInfo DirName;
8580   getDerived().getSema().StartOpenMPDSABlock(
8581       OMPD_teams_distribute_parallel_for_simd, DirName, nullptr,
8582       D->getBeginLoc());
8583   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8584   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8585   return Res;
8586 }
8587 
8588 template <typename Derived>
8589 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeParallelForDirective(
8590     OMPTeamsDistributeParallelForDirective *D) {
8591   DeclarationNameInfo DirName;
8592   getDerived().getSema().StartOpenMPDSABlock(
8593       OMPD_teams_distribute_parallel_for, DirName, nullptr, D->getBeginLoc());
8594   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8595   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8596   return Res;
8597 }
8598 
8599 template <typename Derived>
8600 StmtResult TreeTransform<Derived>::TransformOMPTargetTeamsDirective(
8601     OMPTargetTeamsDirective *D) {
8602   DeclarationNameInfo DirName;
8603   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_teams, DirName,
8604                                              nullptr, D->getBeginLoc());
8605   auto Res = getDerived().TransformOMPExecutableDirective(D);
8606   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8607   return Res;
8608 }
8609 
8610 template <typename Derived>
8611 StmtResult TreeTransform<Derived>::TransformOMPTargetTeamsDistributeDirective(
8612     OMPTargetTeamsDistributeDirective *D) {
8613   DeclarationNameInfo DirName;
8614   getDerived().getSema().StartOpenMPDSABlock(
8615       OMPD_target_teams_distribute, DirName, nullptr, D->getBeginLoc());
8616   auto Res = getDerived().TransformOMPExecutableDirective(D);
8617   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8618   return Res;
8619 }
8620 
8621 template <typename Derived>
8622 StmtResult
8623 TreeTransform<Derived>::TransformOMPTargetTeamsDistributeParallelForDirective(
8624     OMPTargetTeamsDistributeParallelForDirective *D) {
8625   DeclarationNameInfo DirName;
8626   getDerived().getSema().StartOpenMPDSABlock(
8627       OMPD_target_teams_distribute_parallel_for, DirName, nullptr,
8628       D->getBeginLoc());
8629   auto Res = getDerived().TransformOMPExecutableDirective(D);
8630   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8631   return Res;
8632 }
8633 
8634 template <typename Derived>
8635 StmtResult TreeTransform<Derived>::
8636     TransformOMPTargetTeamsDistributeParallelForSimdDirective(
8637         OMPTargetTeamsDistributeParallelForSimdDirective *D) {
8638   DeclarationNameInfo DirName;
8639   getDerived().getSema().StartOpenMPDSABlock(
8640       OMPD_target_teams_distribute_parallel_for_simd, DirName, nullptr,
8641       D->getBeginLoc());
8642   auto Res = getDerived().TransformOMPExecutableDirective(D);
8643   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8644   return Res;
8645 }
8646 
8647 template <typename Derived>
8648 StmtResult
8649 TreeTransform<Derived>::TransformOMPTargetTeamsDistributeSimdDirective(
8650     OMPTargetTeamsDistributeSimdDirective *D) {
8651   DeclarationNameInfo DirName;
8652   getDerived().getSema().StartOpenMPDSABlock(
8653       OMPD_target_teams_distribute_simd, DirName, nullptr, D->getBeginLoc());
8654   auto Res = getDerived().TransformOMPExecutableDirective(D);
8655   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8656   return Res;
8657 }
8658 
8659 
8660 //===----------------------------------------------------------------------===//
8661 // OpenMP clause transformation
8662 //===----------------------------------------------------------------------===//
8663 template <typename Derived>
8664 OMPClause *TreeTransform<Derived>::TransformOMPIfClause(OMPIfClause *C) {
8665   ExprResult Cond = getDerived().TransformExpr(C->getCondition());
8666   if (Cond.isInvalid())
8667     return nullptr;
8668   return getDerived().RebuildOMPIfClause(
8669       C->getNameModifier(), Cond.get(), C->getBeginLoc(), C->getLParenLoc(),
8670       C->getNameModifierLoc(), C->getColonLoc(), C->getEndLoc());
8671 }
8672 
8673 template <typename Derived>
8674 OMPClause *TreeTransform<Derived>::TransformOMPFinalClause(OMPFinalClause *C) {
8675   ExprResult Cond = getDerived().TransformExpr(C->getCondition());
8676   if (Cond.isInvalid())
8677     return nullptr;
8678   return getDerived().RebuildOMPFinalClause(Cond.get(), C->getBeginLoc(),
8679                                             C->getLParenLoc(), C->getEndLoc());
8680 }
8681 
8682 template <typename Derived>
8683 OMPClause *
8684 TreeTransform<Derived>::TransformOMPNumThreadsClause(OMPNumThreadsClause *C) {
8685   ExprResult NumThreads = getDerived().TransformExpr(C->getNumThreads());
8686   if (NumThreads.isInvalid())
8687     return nullptr;
8688   return getDerived().RebuildOMPNumThreadsClause(
8689       NumThreads.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
8690 }
8691 
8692 template <typename Derived>
8693 OMPClause *
8694 TreeTransform<Derived>::TransformOMPSafelenClause(OMPSafelenClause *C) {
8695   ExprResult E = getDerived().TransformExpr(C->getSafelen());
8696   if (E.isInvalid())
8697     return nullptr;
8698   return getDerived().RebuildOMPSafelenClause(
8699       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
8700 }
8701 
8702 template <typename Derived>
8703 OMPClause *
8704 TreeTransform<Derived>::TransformOMPAllocatorClause(OMPAllocatorClause *C) {
8705   ExprResult E = getDerived().TransformExpr(C->getAllocator());
8706   if (E.isInvalid())
8707     return nullptr;
8708   return getDerived().RebuildOMPAllocatorClause(
8709       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
8710 }
8711 
8712 template <typename Derived>
8713 OMPClause *
8714 TreeTransform<Derived>::TransformOMPSimdlenClause(OMPSimdlenClause *C) {
8715   ExprResult E = getDerived().TransformExpr(C->getSimdlen());
8716   if (E.isInvalid())
8717     return nullptr;
8718   return getDerived().RebuildOMPSimdlenClause(
8719       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
8720 }
8721 
8722 template <typename Derived>
8723 OMPClause *
8724 TreeTransform<Derived>::TransformOMPCollapseClause(OMPCollapseClause *C) {
8725   ExprResult E = getDerived().TransformExpr(C->getNumForLoops());
8726   if (E.isInvalid())
8727     return nullptr;
8728   return getDerived().RebuildOMPCollapseClause(
8729       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
8730 }
8731 
8732 template <typename Derived>
8733 OMPClause *
8734 TreeTransform<Derived>::TransformOMPDefaultClause(OMPDefaultClause *C) {
8735   return getDerived().RebuildOMPDefaultClause(
8736       C->getDefaultKind(), C->getDefaultKindKwLoc(), C->getBeginLoc(),
8737       C->getLParenLoc(), C->getEndLoc());
8738 }
8739 
8740 template <typename Derived>
8741 OMPClause *
8742 TreeTransform<Derived>::TransformOMPProcBindClause(OMPProcBindClause *C) {
8743   return getDerived().RebuildOMPProcBindClause(
8744       C->getProcBindKind(), C->getProcBindKindKwLoc(), C->getBeginLoc(),
8745       C->getLParenLoc(), C->getEndLoc());
8746 }
8747 
8748 template <typename Derived>
8749 OMPClause *
8750 TreeTransform<Derived>::TransformOMPScheduleClause(OMPScheduleClause *C) {
8751   ExprResult E = getDerived().TransformExpr(C->getChunkSize());
8752   if (E.isInvalid())
8753     return nullptr;
8754   return getDerived().RebuildOMPScheduleClause(
8755       C->getFirstScheduleModifier(), C->getSecondScheduleModifier(),
8756       C->getScheduleKind(), E.get(), C->getBeginLoc(), C->getLParenLoc(),
8757       C->getFirstScheduleModifierLoc(), C->getSecondScheduleModifierLoc(),
8758       C->getScheduleKindLoc(), C->getCommaLoc(), C->getEndLoc());
8759 }
8760 
8761 template <typename Derived>
8762 OMPClause *
8763 TreeTransform<Derived>::TransformOMPOrderedClause(OMPOrderedClause *C) {
8764   ExprResult E;
8765   if (auto *Num = C->getNumForLoops()) {
8766     E = getDerived().TransformExpr(Num);
8767     if (E.isInvalid())
8768       return nullptr;
8769   }
8770   return getDerived().RebuildOMPOrderedClause(C->getBeginLoc(), C->getEndLoc(),
8771                                               C->getLParenLoc(), E.get());
8772 }
8773 
8774 template <typename Derived>
8775 OMPClause *
8776 TreeTransform<Derived>::TransformOMPNowaitClause(OMPNowaitClause *C) {
8777   // No need to rebuild this clause, no template-dependent parameters.
8778   return C;
8779 }
8780 
8781 template <typename Derived>
8782 OMPClause *
8783 TreeTransform<Derived>::TransformOMPUntiedClause(OMPUntiedClause *C) {
8784   // No need to rebuild this clause, no template-dependent parameters.
8785   return C;
8786 }
8787 
8788 template <typename Derived>
8789 OMPClause *
8790 TreeTransform<Derived>::TransformOMPMergeableClause(OMPMergeableClause *C) {
8791   // No need to rebuild this clause, no template-dependent parameters.
8792   return C;
8793 }
8794 
8795 template <typename Derived>
8796 OMPClause *TreeTransform<Derived>::TransformOMPReadClause(OMPReadClause *C) {
8797   // No need to rebuild this clause, no template-dependent parameters.
8798   return C;
8799 }
8800 
8801 template <typename Derived>
8802 OMPClause *TreeTransform<Derived>::TransformOMPWriteClause(OMPWriteClause *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>::TransformOMPUpdateClause(OMPUpdateClause *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>::TransformOMPCaptureClause(OMPCaptureClause *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>::TransformOMPSeqCstClause(OMPSeqCstClause *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>::TransformOMPAcqRelClause(OMPAcqRelClause *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>::TransformOMPAcquireClause(OMPAcquireClause *C) {
8838   // No need to rebuild this clause, no template-dependent parameters.
8839   return C;
8840 }
8841 
8842 template <typename Derived>
8843 OMPClause *
8844 TreeTransform<Derived>::TransformOMPReleaseClause(OMPReleaseClause *C) {
8845   // No need to rebuild this clause, no template-dependent parameters.
8846   return C;
8847 }
8848 
8849 template <typename Derived>
8850 OMPClause *
8851 TreeTransform<Derived>::TransformOMPRelaxedClause(OMPRelaxedClause *C) {
8852   // No need to rebuild this clause, no template-dependent parameters.
8853   return C;
8854 }
8855 
8856 template <typename Derived>
8857 OMPClause *
8858 TreeTransform<Derived>::TransformOMPThreadsClause(OMPThreadsClause *C) {
8859   // No need to rebuild this clause, no template-dependent parameters.
8860   return C;
8861 }
8862 
8863 template <typename Derived>
8864 OMPClause *TreeTransform<Derived>::TransformOMPSIMDClause(OMPSIMDClause *C) {
8865   // No need to rebuild this clause, no template-dependent parameters.
8866   return C;
8867 }
8868 
8869 template <typename Derived>
8870 OMPClause *
8871 TreeTransform<Derived>::TransformOMPNogroupClause(OMPNogroupClause *C) {
8872   // No need to rebuild this clause, no template-dependent parameters.
8873   return C;
8874 }
8875 
8876 template <typename Derived>
8877 OMPClause *
8878 TreeTransform<Derived>::TransformOMPDestroyClause(OMPDestroyClause *C) {
8879   // No need to rebuild this clause, no template-dependent parameters.
8880   return C;
8881 }
8882 
8883 template <typename Derived>
8884 OMPClause *TreeTransform<Derived>::TransformOMPUnifiedAddressClause(
8885     OMPUnifiedAddressClause *C) {
8886   llvm_unreachable("unified_address clause cannot appear in dependent context");
8887 }
8888 
8889 template <typename Derived>
8890 OMPClause *TreeTransform<Derived>::TransformOMPUnifiedSharedMemoryClause(
8891     OMPUnifiedSharedMemoryClause *C) {
8892   llvm_unreachable(
8893       "unified_shared_memory clause cannot appear in dependent context");
8894 }
8895 
8896 template <typename Derived>
8897 OMPClause *TreeTransform<Derived>::TransformOMPReverseOffloadClause(
8898     OMPReverseOffloadClause *C) {
8899   llvm_unreachable("reverse_offload clause cannot appear in dependent context");
8900 }
8901 
8902 template <typename Derived>
8903 OMPClause *TreeTransform<Derived>::TransformOMPDynamicAllocatorsClause(
8904     OMPDynamicAllocatorsClause *C) {
8905   llvm_unreachable(
8906       "dynamic_allocators clause cannot appear in dependent context");
8907 }
8908 
8909 template <typename Derived>
8910 OMPClause *TreeTransform<Derived>::TransformOMPAtomicDefaultMemOrderClause(
8911     OMPAtomicDefaultMemOrderClause *C) {
8912   llvm_unreachable(
8913       "atomic_default_mem_order clause cannot appear in dependent context");
8914 }
8915 
8916 template <typename Derived>
8917 OMPClause *
8918 TreeTransform<Derived>::TransformOMPPrivateClause(OMPPrivateClause *C) {
8919   llvm::SmallVector<Expr *, 16> Vars;
8920   Vars.reserve(C->varlist_size());
8921   for (auto *VE : C->varlists()) {
8922     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8923     if (EVar.isInvalid())
8924       return nullptr;
8925     Vars.push_back(EVar.get());
8926   }
8927   return getDerived().RebuildOMPPrivateClause(
8928       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
8929 }
8930 
8931 template <typename Derived>
8932 OMPClause *TreeTransform<Derived>::TransformOMPFirstprivateClause(
8933     OMPFirstprivateClause *C) {
8934   llvm::SmallVector<Expr *, 16> Vars;
8935   Vars.reserve(C->varlist_size());
8936   for (auto *VE : C->varlists()) {
8937     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8938     if (EVar.isInvalid())
8939       return nullptr;
8940     Vars.push_back(EVar.get());
8941   }
8942   return getDerived().RebuildOMPFirstprivateClause(
8943       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
8944 }
8945 
8946 template <typename Derived>
8947 OMPClause *
8948 TreeTransform<Derived>::TransformOMPLastprivateClause(OMPLastprivateClause *C) {
8949   llvm::SmallVector<Expr *, 16> Vars;
8950   Vars.reserve(C->varlist_size());
8951   for (auto *VE : C->varlists()) {
8952     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8953     if (EVar.isInvalid())
8954       return nullptr;
8955     Vars.push_back(EVar.get());
8956   }
8957   return getDerived().RebuildOMPLastprivateClause(
8958       Vars, C->getKind(), C->getKindLoc(), C->getColonLoc(), C->getBeginLoc(),
8959       C->getLParenLoc(), C->getEndLoc());
8960 }
8961 
8962 template <typename Derived>
8963 OMPClause *
8964 TreeTransform<Derived>::TransformOMPSharedClause(OMPSharedClause *C) {
8965   llvm::SmallVector<Expr *, 16> Vars;
8966   Vars.reserve(C->varlist_size());
8967   for (auto *VE : C->varlists()) {
8968     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8969     if (EVar.isInvalid())
8970       return nullptr;
8971     Vars.push_back(EVar.get());
8972   }
8973   return getDerived().RebuildOMPSharedClause(Vars, C->getBeginLoc(),
8974                                              C->getLParenLoc(), C->getEndLoc());
8975 }
8976 
8977 template <typename Derived>
8978 OMPClause *
8979 TreeTransform<Derived>::TransformOMPReductionClause(OMPReductionClause *C) {
8980   llvm::SmallVector<Expr *, 16> Vars;
8981   Vars.reserve(C->varlist_size());
8982   for (auto *VE : C->varlists()) {
8983     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8984     if (EVar.isInvalid())
8985       return nullptr;
8986     Vars.push_back(EVar.get());
8987   }
8988   CXXScopeSpec ReductionIdScopeSpec;
8989   ReductionIdScopeSpec.Adopt(C->getQualifierLoc());
8990 
8991   DeclarationNameInfo NameInfo = C->getNameInfo();
8992   if (NameInfo.getName()) {
8993     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
8994     if (!NameInfo.getName())
8995       return nullptr;
8996   }
8997   // Build a list of all UDR decls with the same names ranged by the Scopes.
8998   // The Scope boundary is a duplication of the previous decl.
8999   llvm::SmallVector<Expr *, 16> UnresolvedReductions;
9000   for (auto *E : C->reduction_ops()) {
9001     // Transform all the decls.
9002     if (E) {
9003       auto *ULE = cast<UnresolvedLookupExpr>(E);
9004       UnresolvedSet<8> Decls;
9005       for (auto *D : ULE->decls()) {
9006         NamedDecl *InstD =
9007             cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D));
9008         Decls.addDecl(InstD, InstD->getAccess());
9009       }
9010       UnresolvedReductions.push_back(
9011        UnresolvedLookupExpr::Create(
9012           SemaRef.Context, /*NamingClass=*/nullptr,
9013           ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context),
9014           NameInfo, /*ADL=*/true, ULE->isOverloaded(),
9015           Decls.begin(), Decls.end()));
9016     } else
9017       UnresolvedReductions.push_back(nullptr);
9018   }
9019   return getDerived().RebuildOMPReductionClause(
9020       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(),
9021       C->getEndLoc(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions);
9022 }
9023 
9024 template <typename Derived>
9025 OMPClause *TreeTransform<Derived>::TransformOMPTaskReductionClause(
9026     OMPTaskReductionClause *C) {
9027   llvm::SmallVector<Expr *, 16> Vars;
9028   Vars.reserve(C->varlist_size());
9029   for (auto *VE : C->varlists()) {
9030     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9031     if (EVar.isInvalid())
9032       return nullptr;
9033     Vars.push_back(EVar.get());
9034   }
9035   CXXScopeSpec ReductionIdScopeSpec;
9036   ReductionIdScopeSpec.Adopt(C->getQualifierLoc());
9037 
9038   DeclarationNameInfo NameInfo = C->getNameInfo();
9039   if (NameInfo.getName()) {
9040     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
9041     if (!NameInfo.getName())
9042       return nullptr;
9043   }
9044   // Build a list of all UDR decls with the same names ranged by the Scopes.
9045   // The Scope boundary is a duplication of the previous decl.
9046   llvm::SmallVector<Expr *, 16> UnresolvedReductions;
9047   for (auto *E : C->reduction_ops()) {
9048     // Transform all the decls.
9049     if (E) {
9050       auto *ULE = cast<UnresolvedLookupExpr>(E);
9051       UnresolvedSet<8> Decls;
9052       for (auto *D : ULE->decls()) {
9053         NamedDecl *InstD =
9054             cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D));
9055         Decls.addDecl(InstD, InstD->getAccess());
9056       }
9057       UnresolvedReductions.push_back(UnresolvedLookupExpr::Create(
9058           SemaRef.Context, /*NamingClass=*/nullptr,
9059           ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), NameInfo,
9060           /*ADL=*/true, ULE->isOverloaded(), Decls.begin(), Decls.end()));
9061     } else
9062       UnresolvedReductions.push_back(nullptr);
9063   }
9064   return getDerived().RebuildOMPTaskReductionClause(
9065       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(),
9066       C->getEndLoc(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions);
9067 }
9068 
9069 template <typename Derived>
9070 OMPClause *
9071 TreeTransform<Derived>::TransformOMPInReductionClause(OMPInReductionClause *C) {
9072   llvm::SmallVector<Expr *, 16> Vars;
9073   Vars.reserve(C->varlist_size());
9074   for (auto *VE : C->varlists()) {
9075     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9076     if (EVar.isInvalid())
9077       return nullptr;
9078     Vars.push_back(EVar.get());
9079   }
9080   CXXScopeSpec ReductionIdScopeSpec;
9081   ReductionIdScopeSpec.Adopt(C->getQualifierLoc());
9082 
9083   DeclarationNameInfo NameInfo = C->getNameInfo();
9084   if (NameInfo.getName()) {
9085     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
9086     if (!NameInfo.getName())
9087       return nullptr;
9088   }
9089   // Build a list of all UDR decls with the same names ranged by the Scopes.
9090   // The Scope boundary is a duplication of the previous decl.
9091   llvm::SmallVector<Expr *, 16> UnresolvedReductions;
9092   for (auto *E : C->reduction_ops()) {
9093     // Transform all the decls.
9094     if (E) {
9095       auto *ULE = cast<UnresolvedLookupExpr>(E);
9096       UnresolvedSet<8> Decls;
9097       for (auto *D : ULE->decls()) {
9098         NamedDecl *InstD =
9099             cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D));
9100         Decls.addDecl(InstD, InstD->getAccess());
9101       }
9102       UnresolvedReductions.push_back(UnresolvedLookupExpr::Create(
9103           SemaRef.Context, /*NamingClass=*/nullptr,
9104           ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), NameInfo,
9105           /*ADL=*/true, ULE->isOverloaded(), Decls.begin(), Decls.end()));
9106     } else
9107       UnresolvedReductions.push_back(nullptr);
9108   }
9109   return getDerived().RebuildOMPInReductionClause(
9110       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(),
9111       C->getEndLoc(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions);
9112 }
9113 
9114 template <typename Derived>
9115 OMPClause *
9116 TreeTransform<Derived>::TransformOMPLinearClause(OMPLinearClause *C) {
9117   llvm::SmallVector<Expr *, 16> Vars;
9118   Vars.reserve(C->varlist_size());
9119   for (auto *VE : C->varlists()) {
9120     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9121     if (EVar.isInvalid())
9122       return nullptr;
9123     Vars.push_back(EVar.get());
9124   }
9125   ExprResult Step = getDerived().TransformExpr(C->getStep());
9126   if (Step.isInvalid())
9127     return nullptr;
9128   return getDerived().RebuildOMPLinearClause(
9129       Vars, Step.get(), C->getBeginLoc(), C->getLParenLoc(), C->getModifier(),
9130       C->getModifierLoc(), C->getColonLoc(), C->getEndLoc());
9131 }
9132 
9133 template <typename Derived>
9134 OMPClause *
9135 TreeTransform<Derived>::TransformOMPAlignedClause(OMPAlignedClause *C) {
9136   llvm::SmallVector<Expr *, 16> Vars;
9137   Vars.reserve(C->varlist_size());
9138   for (auto *VE : C->varlists()) {
9139     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9140     if (EVar.isInvalid())
9141       return nullptr;
9142     Vars.push_back(EVar.get());
9143   }
9144   ExprResult Alignment = getDerived().TransformExpr(C->getAlignment());
9145   if (Alignment.isInvalid())
9146     return nullptr;
9147   return getDerived().RebuildOMPAlignedClause(
9148       Vars, Alignment.get(), C->getBeginLoc(), C->getLParenLoc(),
9149       C->getColonLoc(), C->getEndLoc());
9150 }
9151 
9152 template <typename Derived>
9153 OMPClause *
9154 TreeTransform<Derived>::TransformOMPCopyinClause(OMPCopyinClause *C) {
9155   llvm::SmallVector<Expr *, 16> Vars;
9156   Vars.reserve(C->varlist_size());
9157   for (auto *VE : C->varlists()) {
9158     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9159     if (EVar.isInvalid())
9160       return nullptr;
9161     Vars.push_back(EVar.get());
9162   }
9163   return getDerived().RebuildOMPCopyinClause(Vars, C->getBeginLoc(),
9164                                              C->getLParenLoc(), C->getEndLoc());
9165 }
9166 
9167 template <typename Derived>
9168 OMPClause *
9169 TreeTransform<Derived>::TransformOMPCopyprivateClause(OMPCopyprivateClause *C) {
9170   llvm::SmallVector<Expr *, 16> Vars;
9171   Vars.reserve(C->varlist_size());
9172   for (auto *VE : C->varlists()) {
9173     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9174     if (EVar.isInvalid())
9175       return nullptr;
9176     Vars.push_back(EVar.get());
9177   }
9178   return getDerived().RebuildOMPCopyprivateClause(
9179       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9180 }
9181 
9182 template <typename Derived>
9183 OMPClause *TreeTransform<Derived>::TransformOMPFlushClause(OMPFlushClause *C) {
9184   llvm::SmallVector<Expr *, 16> Vars;
9185   Vars.reserve(C->varlist_size());
9186   for (auto *VE : C->varlists()) {
9187     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9188     if (EVar.isInvalid())
9189       return nullptr;
9190     Vars.push_back(EVar.get());
9191   }
9192   return getDerived().RebuildOMPFlushClause(Vars, C->getBeginLoc(),
9193                                             C->getLParenLoc(), C->getEndLoc());
9194 }
9195 
9196 template <typename Derived>
9197 OMPClause *
9198 TreeTransform<Derived>::TransformOMPDepobjClause(OMPDepobjClause *C) {
9199   ExprResult E = getDerived().TransformExpr(C->getDepobj());
9200   if (E.isInvalid())
9201     return nullptr;
9202   return getDerived().RebuildOMPDepobjClause(E.get(), C->getBeginLoc(),
9203                                              C->getLParenLoc(), C->getEndLoc());
9204 }
9205 
9206 template <typename Derived>
9207 OMPClause *
9208 TreeTransform<Derived>::TransformOMPDependClause(OMPDependClause *C) {
9209   llvm::SmallVector<Expr *, 16> Vars;
9210   Vars.reserve(C->varlist_size());
9211   for (auto *VE : C->varlists()) {
9212     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9213     if (EVar.isInvalid())
9214       return nullptr;
9215     Vars.push_back(EVar.get());
9216   }
9217   return getDerived().RebuildOMPDependClause(
9218       C->getDependencyKind(), C->getDependencyLoc(), C->getColonLoc(), Vars,
9219       C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9220 }
9221 
9222 template <typename Derived>
9223 OMPClause *
9224 TreeTransform<Derived>::TransformOMPDeviceClause(OMPDeviceClause *C) {
9225   ExprResult E = getDerived().TransformExpr(C->getDevice());
9226   if (E.isInvalid())
9227     return nullptr;
9228   return getDerived().RebuildOMPDeviceClause(E.get(), C->getBeginLoc(),
9229                                              C->getLParenLoc(), C->getEndLoc());
9230 }
9231 
9232 template <typename Derived, class T>
9233 bool transformOMPMappableExprListClause(
9234     TreeTransform<Derived> &TT, OMPMappableExprListClause<T> *C,
9235     llvm::SmallVectorImpl<Expr *> &Vars, CXXScopeSpec &MapperIdScopeSpec,
9236     DeclarationNameInfo &MapperIdInfo,
9237     llvm::SmallVectorImpl<Expr *> &UnresolvedMappers) {
9238   // Transform expressions in the list.
9239   Vars.reserve(C->varlist_size());
9240   for (auto *VE : C->varlists()) {
9241     ExprResult EVar = TT.getDerived().TransformExpr(cast<Expr>(VE));
9242     if (EVar.isInvalid())
9243       return true;
9244     Vars.push_back(EVar.get());
9245   }
9246   // Transform mapper scope specifier and identifier.
9247   NestedNameSpecifierLoc QualifierLoc;
9248   if (C->getMapperQualifierLoc()) {
9249     QualifierLoc = TT.getDerived().TransformNestedNameSpecifierLoc(
9250         C->getMapperQualifierLoc());
9251     if (!QualifierLoc)
9252       return true;
9253   }
9254   MapperIdScopeSpec.Adopt(QualifierLoc);
9255   MapperIdInfo = C->getMapperIdInfo();
9256   if (MapperIdInfo.getName()) {
9257     MapperIdInfo = TT.getDerived().TransformDeclarationNameInfo(MapperIdInfo);
9258     if (!MapperIdInfo.getName())
9259       return true;
9260   }
9261   // Build a list of all candidate OMPDeclareMapperDecls, which is provided by
9262   // the previous user-defined mapper lookup in dependent environment.
9263   for (auto *E : C->mapperlists()) {
9264     // Transform all the decls.
9265     if (E) {
9266       auto *ULE = cast<UnresolvedLookupExpr>(E);
9267       UnresolvedSet<8> Decls;
9268       for (auto *D : ULE->decls()) {
9269         NamedDecl *InstD =
9270             cast<NamedDecl>(TT.getDerived().TransformDecl(E->getExprLoc(), D));
9271         Decls.addDecl(InstD, InstD->getAccess());
9272       }
9273       UnresolvedMappers.push_back(UnresolvedLookupExpr::Create(
9274           TT.getSema().Context, /*NamingClass=*/nullptr,
9275           MapperIdScopeSpec.getWithLocInContext(TT.getSema().Context),
9276           MapperIdInfo, /*ADL=*/true, ULE->isOverloaded(), Decls.begin(),
9277           Decls.end()));
9278     } else {
9279       UnresolvedMappers.push_back(nullptr);
9280     }
9281   }
9282   return false;
9283 }
9284 
9285 template <typename Derived>
9286 OMPClause *TreeTransform<Derived>::TransformOMPMapClause(OMPMapClause *C) {
9287   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9288   llvm::SmallVector<Expr *, 16> Vars;
9289   CXXScopeSpec MapperIdScopeSpec;
9290   DeclarationNameInfo MapperIdInfo;
9291   llvm::SmallVector<Expr *, 16> UnresolvedMappers;
9292   if (transformOMPMappableExprListClause<Derived, OMPMapClause>(
9293           *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers))
9294     return nullptr;
9295   return getDerived().RebuildOMPMapClause(
9296       C->getMapTypeModifiers(), C->getMapTypeModifiersLoc(), MapperIdScopeSpec,
9297       MapperIdInfo, C->getMapType(), C->isImplicitMapType(), C->getMapLoc(),
9298       C->getColonLoc(), Vars, Locs, UnresolvedMappers);
9299 }
9300 
9301 template <typename Derived>
9302 OMPClause *
9303 TreeTransform<Derived>::TransformOMPAllocateClause(OMPAllocateClause *C) {
9304   Expr *Allocator = C->getAllocator();
9305   if (Allocator) {
9306     ExprResult AllocatorRes = getDerived().TransformExpr(Allocator);
9307     if (AllocatorRes.isInvalid())
9308       return nullptr;
9309     Allocator = AllocatorRes.get();
9310   }
9311   llvm::SmallVector<Expr *, 16> Vars;
9312   Vars.reserve(C->varlist_size());
9313   for (auto *VE : C->varlists()) {
9314     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9315     if (EVar.isInvalid())
9316       return nullptr;
9317     Vars.push_back(EVar.get());
9318   }
9319   return getDerived().RebuildOMPAllocateClause(
9320       Allocator, Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(),
9321       C->getEndLoc());
9322 }
9323 
9324 template <typename Derived>
9325 OMPClause *
9326 TreeTransform<Derived>::TransformOMPNumTeamsClause(OMPNumTeamsClause *C) {
9327   ExprResult E = getDerived().TransformExpr(C->getNumTeams());
9328   if (E.isInvalid())
9329     return nullptr;
9330   return getDerived().RebuildOMPNumTeamsClause(
9331       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9332 }
9333 
9334 template <typename Derived>
9335 OMPClause *
9336 TreeTransform<Derived>::TransformOMPThreadLimitClause(OMPThreadLimitClause *C) {
9337   ExprResult E = getDerived().TransformExpr(C->getThreadLimit());
9338   if (E.isInvalid())
9339     return nullptr;
9340   return getDerived().RebuildOMPThreadLimitClause(
9341       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9342 }
9343 
9344 template <typename Derived>
9345 OMPClause *
9346 TreeTransform<Derived>::TransformOMPPriorityClause(OMPPriorityClause *C) {
9347   ExprResult E = getDerived().TransformExpr(C->getPriority());
9348   if (E.isInvalid())
9349     return nullptr;
9350   return getDerived().RebuildOMPPriorityClause(
9351       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9352 }
9353 
9354 template <typename Derived>
9355 OMPClause *
9356 TreeTransform<Derived>::TransformOMPGrainsizeClause(OMPGrainsizeClause *C) {
9357   ExprResult E = getDerived().TransformExpr(C->getGrainsize());
9358   if (E.isInvalid())
9359     return nullptr;
9360   return getDerived().RebuildOMPGrainsizeClause(
9361       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9362 }
9363 
9364 template <typename Derived>
9365 OMPClause *
9366 TreeTransform<Derived>::TransformOMPNumTasksClause(OMPNumTasksClause *C) {
9367   ExprResult E = getDerived().TransformExpr(C->getNumTasks());
9368   if (E.isInvalid())
9369     return nullptr;
9370   return getDerived().RebuildOMPNumTasksClause(
9371       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9372 }
9373 
9374 template <typename Derived>
9375 OMPClause *TreeTransform<Derived>::TransformOMPHintClause(OMPHintClause *C) {
9376   ExprResult E = getDerived().TransformExpr(C->getHint());
9377   if (E.isInvalid())
9378     return nullptr;
9379   return getDerived().RebuildOMPHintClause(E.get(), C->getBeginLoc(),
9380                                            C->getLParenLoc(), C->getEndLoc());
9381 }
9382 
9383 template <typename Derived>
9384 OMPClause *TreeTransform<Derived>::TransformOMPDistScheduleClause(
9385     OMPDistScheduleClause *C) {
9386   ExprResult E = getDerived().TransformExpr(C->getChunkSize());
9387   if (E.isInvalid())
9388     return nullptr;
9389   return getDerived().RebuildOMPDistScheduleClause(
9390       C->getDistScheduleKind(), E.get(), C->getBeginLoc(), C->getLParenLoc(),
9391       C->getDistScheduleKindLoc(), C->getCommaLoc(), C->getEndLoc());
9392 }
9393 
9394 template <typename Derived>
9395 OMPClause *
9396 TreeTransform<Derived>::TransformOMPDefaultmapClause(OMPDefaultmapClause *C) {
9397   // Rebuild Defaultmap Clause since we need to invoke the checking of
9398   // defaultmap(none:variable-category) after template initialization.
9399   return getDerived().RebuildOMPDefaultmapClause(C->getDefaultmapModifier(),
9400                                                  C->getDefaultmapKind(),
9401                                                  C->getBeginLoc(),
9402                                                  C->getLParenLoc(),
9403                                                  C->getDefaultmapModifierLoc(),
9404                                                  C->getDefaultmapKindLoc(),
9405                                                  C->getEndLoc());
9406 }
9407 
9408 template <typename Derived>
9409 OMPClause *TreeTransform<Derived>::TransformOMPToClause(OMPToClause *C) {
9410   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9411   llvm::SmallVector<Expr *, 16> Vars;
9412   CXXScopeSpec MapperIdScopeSpec;
9413   DeclarationNameInfo MapperIdInfo;
9414   llvm::SmallVector<Expr *, 16> UnresolvedMappers;
9415   if (transformOMPMappableExprListClause<Derived, OMPToClause>(
9416           *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers))
9417     return nullptr;
9418   return getDerived().RebuildOMPToClause(Vars, MapperIdScopeSpec, MapperIdInfo,
9419                                          Locs, UnresolvedMappers);
9420 }
9421 
9422 template <typename Derived>
9423 OMPClause *TreeTransform<Derived>::TransformOMPFromClause(OMPFromClause *C) {
9424   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9425   llvm::SmallVector<Expr *, 16> Vars;
9426   CXXScopeSpec MapperIdScopeSpec;
9427   DeclarationNameInfo MapperIdInfo;
9428   llvm::SmallVector<Expr *, 16> UnresolvedMappers;
9429   if (transformOMPMappableExprListClause<Derived, OMPFromClause>(
9430           *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers))
9431     return nullptr;
9432   return getDerived().RebuildOMPFromClause(
9433       Vars, MapperIdScopeSpec, MapperIdInfo, Locs, UnresolvedMappers);
9434 }
9435 
9436 template <typename Derived>
9437 OMPClause *TreeTransform<Derived>::TransformOMPUseDevicePtrClause(
9438     OMPUseDevicePtrClause *C) {
9439   llvm::SmallVector<Expr *, 16> Vars;
9440   Vars.reserve(C->varlist_size());
9441   for (auto *VE : C->varlists()) {
9442     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9443     if (EVar.isInvalid())
9444       return nullptr;
9445     Vars.push_back(EVar.get());
9446   }
9447   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9448   return getDerived().RebuildOMPUseDevicePtrClause(Vars, Locs);
9449 }
9450 
9451 template <typename Derived>
9452 OMPClause *
9453 TreeTransform<Derived>::TransformOMPIsDevicePtrClause(OMPIsDevicePtrClause *C) {
9454   llvm::SmallVector<Expr *, 16> Vars;
9455   Vars.reserve(C->varlist_size());
9456   for (auto *VE : C->varlists()) {
9457     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9458     if (EVar.isInvalid())
9459       return nullptr;
9460     Vars.push_back(EVar.get());
9461   }
9462   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9463   return getDerived().RebuildOMPIsDevicePtrClause(Vars, Locs);
9464 }
9465 
9466 template <typename Derived>
9467 OMPClause *
9468 TreeTransform<Derived>::TransformOMPNontemporalClause(OMPNontemporalClause *C) {
9469   llvm::SmallVector<Expr *, 16> Vars;
9470   Vars.reserve(C->varlist_size());
9471   for (auto *VE : C->varlists()) {
9472     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9473     if (EVar.isInvalid())
9474       return nullptr;
9475     Vars.push_back(EVar.get());
9476   }
9477   return getDerived().RebuildOMPNontemporalClause(
9478       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9479 }
9480 
9481 template <typename Derived>
9482 OMPClause *
9483 TreeTransform<Derived>::TransformOMPOrderClause(OMPOrderClause *C) {
9484   return getDerived().RebuildOMPOrderClause(C->getKind(), C->getKindKwLoc(),
9485                                             C->getBeginLoc(), C->getLParenLoc(),
9486                                             C->getEndLoc());
9487 }
9488 
9489 //===----------------------------------------------------------------------===//
9490 // Expression transformation
9491 //===----------------------------------------------------------------------===//
9492 template<typename Derived>
9493 ExprResult
9494 TreeTransform<Derived>::TransformConstantExpr(ConstantExpr *E) {
9495   return TransformExpr(E->getSubExpr());
9496 }
9497 
9498 template<typename Derived>
9499 ExprResult
9500 TreeTransform<Derived>::TransformPredefinedExpr(PredefinedExpr *E) {
9501   if (!E->isTypeDependent())
9502     return E;
9503 
9504   return getDerived().RebuildPredefinedExpr(E->getLocation(),
9505                                             E->getIdentKind());
9506 }
9507 
9508 template<typename Derived>
9509 ExprResult
9510 TreeTransform<Derived>::TransformDeclRefExpr(DeclRefExpr *E) {
9511   NestedNameSpecifierLoc QualifierLoc;
9512   if (E->getQualifierLoc()) {
9513     QualifierLoc
9514       = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
9515     if (!QualifierLoc)
9516       return ExprError();
9517   }
9518 
9519   ValueDecl *ND
9520     = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getLocation(),
9521                                                          E->getDecl()));
9522   if (!ND)
9523     return ExprError();
9524 
9525   NamedDecl *Found = ND;
9526   if (E->getFoundDecl() != E->getDecl()) {
9527     Found = cast_or_null<NamedDecl>(
9528         getDerived().TransformDecl(E->getLocation(), E->getFoundDecl()));
9529     if (!Found)
9530       return ExprError();
9531   }
9532 
9533   DeclarationNameInfo NameInfo = E->getNameInfo();
9534   if (NameInfo.getName()) {
9535     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
9536     if (!NameInfo.getName())
9537       return ExprError();
9538   }
9539 
9540   if (!getDerived().AlwaysRebuild() &&
9541       QualifierLoc == E->getQualifierLoc() &&
9542       ND == E->getDecl() &&
9543       Found == E->getFoundDecl() &&
9544       NameInfo.getName() == E->getDecl()->getDeclName() &&
9545       !E->hasExplicitTemplateArgs()) {
9546 
9547     // Mark it referenced in the new context regardless.
9548     // FIXME: this is a bit instantiation-specific.
9549     SemaRef.MarkDeclRefReferenced(E);
9550 
9551     return E;
9552   }
9553 
9554   TemplateArgumentListInfo TransArgs, *TemplateArgs = nullptr;
9555   if (E->hasExplicitTemplateArgs()) {
9556     TemplateArgs = &TransArgs;
9557     TransArgs.setLAngleLoc(E->getLAngleLoc());
9558     TransArgs.setRAngleLoc(E->getRAngleLoc());
9559     if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
9560                                                 E->getNumTemplateArgs(),
9561                                                 TransArgs))
9562       return ExprError();
9563   }
9564 
9565   return getDerived().RebuildDeclRefExpr(QualifierLoc, ND, NameInfo,
9566                                          Found, TemplateArgs);
9567 }
9568 
9569 template<typename Derived>
9570 ExprResult
9571 TreeTransform<Derived>::TransformIntegerLiteral(IntegerLiteral *E) {
9572   return E;
9573 }
9574 
9575 template <typename Derived>
9576 ExprResult TreeTransform<Derived>::TransformFixedPointLiteral(
9577     FixedPointLiteral *E) {
9578   return E;
9579 }
9580 
9581 template<typename Derived>
9582 ExprResult
9583 TreeTransform<Derived>::TransformFloatingLiteral(FloatingLiteral *E) {
9584   return E;
9585 }
9586 
9587 template<typename Derived>
9588 ExprResult
9589 TreeTransform<Derived>::TransformImaginaryLiteral(ImaginaryLiteral *E) {
9590   return E;
9591 }
9592 
9593 template<typename Derived>
9594 ExprResult
9595 TreeTransform<Derived>::TransformStringLiteral(StringLiteral *E) {
9596   return E;
9597 }
9598 
9599 template<typename Derived>
9600 ExprResult
9601 TreeTransform<Derived>::TransformCharacterLiteral(CharacterLiteral *E) {
9602   return E;
9603 }
9604 
9605 template<typename Derived>
9606 ExprResult
9607 TreeTransform<Derived>::TransformUserDefinedLiteral(UserDefinedLiteral *E) {
9608   if (FunctionDecl *FD = E->getDirectCallee())
9609     SemaRef.MarkFunctionReferenced(E->getBeginLoc(), FD);
9610   return SemaRef.MaybeBindToTemporary(E);
9611 }
9612 
9613 template<typename Derived>
9614 ExprResult
9615 TreeTransform<Derived>::TransformGenericSelectionExpr(GenericSelectionExpr *E) {
9616   ExprResult ControllingExpr =
9617     getDerived().TransformExpr(E->getControllingExpr());
9618   if (ControllingExpr.isInvalid())
9619     return ExprError();
9620 
9621   SmallVector<Expr *, 4> AssocExprs;
9622   SmallVector<TypeSourceInfo *, 4> AssocTypes;
9623   for (const GenericSelectionExpr::Association Assoc : E->associations()) {
9624     TypeSourceInfo *TSI = Assoc.getTypeSourceInfo();
9625     if (TSI) {
9626       TypeSourceInfo *AssocType = getDerived().TransformType(TSI);
9627       if (!AssocType)
9628         return ExprError();
9629       AssocTypes.push_back(AssocType);
9630     } else {
9631       AssocTypes.push_back(nullptr);
9632     }
9633 
9634     ExprResult AssocExpr =
9635         getDerived().TransformExpr(Assoc.getAssociationExpr());
9636     if (AssocExpr.isInvalid())
9637       return ExprError();
9638     AssocExprs.push_back(AssocExpr.get());
9639   }
9640 
9641   return getDerived().RebuildGenericSelectionExpr(E->getGenericLoc(),
9642                                                   E->getDefaultLoc(),
9643                                                   E->getRParenLoc(),
9644                                                   ControllingExpr.get(),
9645                                                   AssocTypes,
9646                                                   AssocExprs);
9647 }
9648 
9649 template<typename Derived>
9650 ExprResult
9651 TreeTransform<Derived>::TransformParenExpr(ParenExpr *E) {
9652   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
9653   if (SubExpr.isInvalid())
9654     return ExprError();
9655 
9656   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr())
9657     return E;
9658 
9659   return getDerived().RebuildParenExpr(SubExpr.get(), E->getLParen(),
9660                                        E->getRParen());
9661 }
9662 
9663 /// The operand of a unary address-of operator has special rules: it's
9664 /// allowed to refer to a non-static member of a class even if there's no 'this'
9665 /// object available.
9666 template<typename Derived>
9667 ExprResult
9668 TreeTransform<Derived>::TransformAddressOfOperand(Expr *E) {
9669   if (DependentScopeDeclRefExpr *DRE = dyn_cast<DependentScopeDeclRefExpr>(E))
9670     return getDerived().TransformDependentScopeDeclRefExpr(DRE, true, nullptr);
9671   else
9672     return getDerived().TransformExpr(E);
9673 }
9674 
9675 template<typename Derived>
9676 ExprResult
9677 TreeTransform<Derived>::TransformUnaryOperator(UnaryOperator *E) {
9678   ExprResult SubExpr;
9679   if (E->getOpcode() == UO_AddrOf)
9680     SubExpr = TransformAddressOfOperand(E->getSubExpr());
9681   else
9682     SubExpr = TransformExpr(E->getSubExpr());
9683   if (SubExpr.isInvalid())
9684     return ExprError();
9685 
9686   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr())
9687     return E;
9688 
9689   return getDerived().RebuildUnaryOperator(E->getOperatorLoc(),
9690                                            E->getOpcode(),
9691                                            SubExpr.get());
9692 }
9693 
9694 template<typename Derived>
9695 ExprResult
9696 TreeTransform<Derived>::TransformOffsetOfExpr(OffsetOfExpr *E) {
9697   // Transform the type.
9698   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo());
9699   if (!Type)
9700     return ExprError();
9701 
9702   // Transform all of the components into components similar to what the
9703   // parser uses.
9704   // FIXME: It would be slightly more efficient in the non-dependent case to
9705   // just map FieldDecls, rather than requiring the rebuilder to look for
9706   // the fields again. However, __builtin_offsetof is rare enough in
9707   // template code that we don't care.
9708   bool ExprChanged = false;
9709   typedef Sema::OffsetOfComponent Component;
9710   SmallVector<Component, 4> Components;
9711   for (unsigned I = 0, N = E->getNumComponents(); I != N; ++I) {
9712     const OffsetOfNode &ON = E->getComponent(I);
9713     Component Comp;
9714     Comp.isBrackets = true;
9715     Comp.LocStart = ON.getSourceRange().getBegin();
9716     Comp.LocEnd = ON.getSourceRange().getEnd();
9717     switch (ON.getKind()) {
9718     case OffsetOfNode::Array: {
9719       Expr *FromIndex = E->getIndexExpr(ON.getArrayExprIndex());
9720       ExprResult Index = getDerived().TransformExpr(FromIndex);
9721       if (Index.isInvalid())
9722         return ExprError();
9723 
9724       ExprChanged = ExprChanged || Index.get() != FromIndex;
9725       Comp.isBrackets = true;
9726       Comp.U.E = Index.get();
9727       break;
9728     }
9729 
9730     case OffsetOfNode::Field:
9731     case OffsetOfNode::Identifier:
9732       Comp.isBrackets = false;
9733       Comp.U.IdentInfo = ON.getFieldName();
9734       if (!Comp.U.IdentInfo)
9735         continue;
9736 
9737       break;
9738 
9739     case OffsetOfNode::Base:
9740       // Will be recomputed during the rebuild.
9741       continue;
9742     }
9743 
9744     Components.push_back(Comp);
9745   }
9746 
9747   // If nothing changed, retain the existing expression.
9748   if (!getDerived().AlwaysRebuild() &&
9749       Type == E->getTypeSourceInfo() &&
9750       !ExprChanged)
9751     return E;
9752 
9753   // Build a new offsetof expression.
9754   return getDerived().RebuildOffsetOfExpr(E->getOperatorLoc(), Type,
9755                                           Components, E->getRParenLoc());
9756 }
9757 
9758 template<typename Derived>
9759 ExprResult
9760 TreeTransform<Derived>::TransformOpaqueValueExpr(OpaqueValueExpr *E) {
9761   assert((!E->getSourceExpr() || getDerived().AlreadyTransformed(E->getType())) &&
9762          "opaque value expression requires transformation");
9763   return E;
9764 }
9765 
9766 template<typename Derived>
9767 ExprResult
9768 TreeTransform<Derived>::TransformTypoExpr(TypoExpr *E) {
9769   return E;
9770 }
9771 
9772 template<typename Derived>
9773 ExprResult
9774 TreeTransform<Derived>::TransformPseudoObjectExpr(PseudoObjectExpr *E) {
9775   // Rebuild the syntactic form.  The original syntactic form has
9776   // opaque-value expressions in it, so strip those away and rebuild
9777   // the result.  This is a really awful way of doing this, but the
9778   // better solution (rebuilding the semantic expressions and
9779   // rebinding OVEs as necessary) doesn't work; we'd need
9780   // TreeTransform to not strip away implicit conversions.
9781   Expr *newSyntacticForm = SemaRef.recreateSyntacticForm(E);
9782   ExprResult result = getDerived().TransformExpr(newSyntacticForm);
9783   if (result.isInvalid()) return ExprError();
9784 
9785   // If that gives us a pseudo-object result back, the pseudo-object
9786   // expression must have been an lvalue-to-rvalue conversion which we
9787   // should reapply.
9788   if (result.get()->hasPlaceholderType(BuiltinType::PseudoObject))
9789     result = SemaRef.checkPseudoObjectRValue(result.get());
9790 
9791   return result;
9792 }
9793 
9794 template<typename Derived>
9795 ExprResult
9796 TreeTransform<Derived>::TransformUnaryExprOrTypeTraitExpr(
9797                                                 UnaryExprOrTypeTraitExpr *E) {
9798   if (E->isArgumentType()) {
9799     TypeSourceInfo *OldT = E->getArgumentTypeInfo();
9800 
9801     TypeSourceInfo *NewT = getDerived().TransformType(OldT);
9802     if (!NewT)
9803       return ExprError();
9804 
9805     if (!getDerived().AlwaysRebuild() && OldT == NewT)
9806       return E;
9807 
9808     return getDerived().RebuildUnaryExprOrTypeTrait(NewT, E->getOperatorLoc(),
9809                                                     E->getKind(),
9810                                                     E->getSourceRange());
9811   }
9812 
9813   // C++0x [expr.sizeof]p1:
9814   //   The operand is either an expression, which is an unevaluated operand
9815   //   [...]
9816   EnterExpressionEvaluationContext Unevaluated(
9817       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated,
9818       Sema::ReuseLambdaContextDecl);
9819 
9820   // Try to recover if we have something like sizeof(T::X) where X is a type.
9821   // Notably, there must be *exactly* one set of parens if X is a type.
9822   TypeSourceInfo *RecoveryTSI = nullptr;
9823   ExprResult SubExpr;
9824   auto *PE = dyn_cast<ParenExpr>(E->getArgumentExpr());
9825   if (auto *DRE =
9826           PE ? dyn_cast<DependentScopeDeclRefExpr>(PE->getSubExpr()) : nullptr)
9827     SubExpr = getDerived().TransformParenDependentScopeDeclRefExpr(
9828         PE, DRE, false, &RecoveryTSI);
9829   else
9830     SubExpr = getDerived().TransformExpr(E->getArgumentExpr());
9831 
9832   if (RecoveryTSI) {
9833     return getDerived().RebuildUnaryExprOrTypeTrait(
9834         RecoveryTSI, E->getOperatorLoc(), E->getKind(), E->getSourceRange());
9835   } else if (SubExpr.isInvalid())
9836     return ExprError();
9837 
9838   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getArgumentExpr())
9839     return E;
9840 
9841   return getDerived().RebuildUnaryExprOrTypeTrait(SubExpr.get(),
9842                                                   E->getOperatorLoc(),
9843                                                   E->getKind(),
9844                                                   E->getSourceRange());
9845 }
9846 
9847 template<typename Derived>
9848 ExprResult
9849 TreeTransform<Derived>::TransformArraySubscriptExpr(ArraySubscriptExpr *E) {
9850   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
9851   if (LHS.isInvalid())
9852     return ExprError();
9853 
9854   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
9855   if (RHS.isInvalid())
9856     return ExprError();
9857 
9858 
9859   if (!getDerived().AlwaysRebuild() &&
9860       LHS.get() == E->getLHS() &&
9861       RHS.get() == E->getRHS())
9862     return E;
9863 
9864   return getDerived().RebuildArraySubscriptExpr(
9865       LHS.get(),
9866       /*FIXME:*/ E->getLHS()->getBeginLoc(), RHS.get(), E->getRBracketLoc());
9867 }
9868 
9869 template <typename Derived>
9870 ExprResult
9871 TreeTransform<Derived>::TransformOMPArraySectionExpr(OMPArraySectionExpr *E) {
9872   ExprResult Base = getDerived().TransformExpr(E->getBase());
9873   if (Base.isInvalid())
9874     return ExprError();
9875 
9876   ExprResult LowerBound;
9877   if (E->getLowerBound()) {
9878     LowerBound = getDerived().TransformExpr(E->getLowerBound());
9879     if (LowerBound.isInvalid())
9880       return ExprError();
9881   }
9882 
9883   ExprResult Length;
9884   if (E->getLength()) {
9885     Length = getDerived().TransformExpr(E->getLength());
9886     if (Length.isInvalid())
9887       return ExprError();
9888   }
9889 
9890   if (!getDerived().AlwaysRebuild() && Base.get() == E->getBase() &&
9891       LowerBound.get() == E->getLowerBound() && Length.get() == E->getLength())
9892     return E;
9893 
9894   return getDerived().RebuildOMPArraySectionExpr(
9895       Base.get(), E->getBase()->getEndLoc(), LowerBound.get(), E->getColonLoc(),
9896       Length.get(), E->getRBracketLoc());
9897 }
9898 
9899 template<typename Derived>
9900 ExprResult
9901 TreeTransform<Derived>::TransformCallExpr(CallExpr *E) {
9902   // Transform the callee.
9903   ExprResult Callee = getDerived().TransformExpr(E->getCallee());
9904   if (Callee.isInvalid())
9905     return ExprError();
9906 
9907   // Transform arguments.
9908   bool ArgChanged = false;
9909   SmallVector<Expr*, 8> Args;
9910   if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
9911                                   &ArgChanged))
9912     return ExprError();
9913 
9914   if (!getDerived().AlwaysRebuild() &&
9915       Callee.get() == E->getCallee() &&
9916       !ArgChanged)
9917     return SemaRef.MaybeBindToTemporary(E);
9918 
9919   // FIXME: Wrong source location information for the '('.
9920   SourceLocation FakeLParenLoc
9921     = ((Expr *)Callee.get())->getSourceRange().getBegin();
9922   return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc,
9923                                       Args,
9924                                       E->getRParenLoc());
9925 }
9926 
9927 template<typename Derived>
9928 ExprResult
9929 TreeTransform<Derived>::TransformMemberExpr(MemberExpr *E) {
9930   ExprResult Base = getDerived().TransformExpr(E->getBase());
9931   if (Base.isInvalid())
9932     return ExprError();
9933 
9934   NestedNameSpecifierLoc QualifierLoc;
9935   if (E->hasQualifier()) {
9936     QualifierLoc
9937       = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
9938 
9939     if (!QualifierLoc)
9940       return ExprError();
9941   }
9942   SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc();
9943 
9944   ValueDecl *Member
9945     = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getMemberLoc(),
9946                                                          E->getMemberDecl()));
9947   if (!Member)
9948     return ExprError();
9949 
9950   NamedDecl *FoundDecl = E->getFoundDecl();
9951   if (FoundDecl == E->getMemberDecl()) {
9952     FoundDecl = Member;
9953   } else {
9954     FoundDecl = cast_or_null<NamedDecl>(
9955                    getDerived().TransformDecl(E->getMemberLoc(), FoundDecl));
9956     if (!FoundDecl)
9957       return ExprError();
9958   }
9959 
9960   if (!getDerived().AlwaysRebuild() &&
9961       Base.get() == E->getBase() &&
9962       QualifierLoc == E->getQualifierLoc() &&
9963       Member == E->getMemberDecl() &&
9964       FoundDecl == E->getFoundDecl() &&
9965       !E->hasExplicitTemplateArgs()) {
9966 
9967     // Mark it referenced in the new context regardless.
9968     // FIXME: this is a bit instantiation-specific.
9969     SemaRef.MarkMemberReferenced(E);
9970 
9971     return E;
9972   }
9973 
9974   TemplateArgumentListInfo TransArgs;
9975   if (E->hasExplicitTemplateArgs()) {
9976     TransArgs.setLAngleLoc(E->getLAngleLoc());
9977     TransArgs.setRAngleLoc(E->getRAngleLoc());
9978     if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
9979                                                 E->getNumTemplateArgs(),
9980                                                 TransArgs))
9981       return ExprError();
9982   }
9983 
9984   // FIXME: Bogus source location for the operator
9985   SourceLocation FakeOperatorLoc =
9986       SemaRef.getLocForEndOfToken(E->getBase()->getSourceRange().getEnd());
9987 
9988   // FIXME: to do this check properly, we will need to preserve the
9989   // first-qualifier-in-scope here, just in case we had a dependent
9990   // base (and therefore couldn't do the check) and a
9991   // nested-name-qualifier (and therefore could do the lookup).
9992   NamedDecl *FirstQualifierInScope = nullptr;
9993   DeclarationNameInfo MemberNameInfo = E->getMemberNameInfo();
9994   if (MemberNameInfo.getName()) {
9995     MemberNameInfo = getDerived().TransformDeclarationNameInfo(MemberNameInfo);
9996     if (!MemberNameInfo.getName())
9997       return ExprError();
9998   }
9999 
10000   return getDerived().RebuildMemberExpr(Base.get(), FakeOperatorLoc,
10001                                         E->isArrow(),
10002                                         QualifierLoc,
10003                                         TemplateKWLoc,
10004                                         MemberNameInfo,
10005                                         Member,
10006                                         FoundDecl,
10007                                         (E->hasExplicitTemplateArgs()
10008                                            ? &TransArgs : nullptr),
10009                                         FirstQualifierInScope);
10010 }
10011 
10012 template<typename Derived>
10013 ExprResult
10014 TreeTransform<Derived>::TransformBinaryOperator(BinaryOperator *E) {
10015   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
10016   if (LHS.isInvalid())
10017     return ExprError();
10018 
10019   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
10020   if (RHS.isInvalid())
10021     return ExprError();
10022 
10023   if (!getDerived().AlwaysRebuild() &&
10024       LHS.get() == E->getLHS() &&
10025       RHS.get() == E->getRHS())
10026     return E;
10027 
10028   Sema::FPFeaturesStateRAII FPFeaturesState(getSema());
10029   getSema().FPFeatures = E->getFPFeatures();
10030 
10031   return getDerived().RebuildBinaryOperator(E->getOperatorLoc(), E->getOpcode(),
10032                                             LHS.get(), RHS.get());
10033 }
10034 
10035 template <typename Derived>
10036 ExprResult TreeTransform<Derived>::TransformCXXRewrittenBinaryOperator(
10037     CXXRewrittenBinaryOperator *E) {
10038   CXXRewrittenBinaryOperator::DecomposedForm Decomp = E->getDecomposedForm();
10039 
10040   ExprResult LHS = getDerived().TransformExpr(const_cast<Expr*>(Decomp.LHS));
10041   if (LHS.isInvalid())
10042     return ExprError();
10043 
10044   ExprResult RHS = getDerived().TransformExpr(const_cast<Expr*>(Decomp.RHS));
10045   if (RHS.isInvalid())
10046     return ExprError();
10047 
10048   if (!getDerived().AlwaysRebuild() &&
10049       LHS.get() == Decomp.LHS &&
10050       RHS.get() == Decomp.RHS)
10051     return E;
10052 
10053   // Extract the already-resolved callee declarations so that we can restrict
10054   // ourselves to using them as the unqualified lookup results when rebuilding.
10055   UnresolvedSet<2> UnqualLookups;
10056   Expr *PossibleBinOps[] = {E->getSemanticForm(),
10057                             const_cast<Expr *>(Decomp.InnerBinOp)};
10058   for (Expr *PossibleBinOp : PossibleBinOps) {
10059     auto *Op = dyn_cast<CXXOperatorCallExpr>(PossibleBinOp->IgnoreImplicit());
10060     if (!Op)
10061       continue;
10062     auto *Callee = dyn_cast<DeclRefExpr>(Op->getCallee()->IgnoreImplicit());
10063     if (!Callee || isa<CXXMethodDecl>(Callee->getDecl()))
10064       continue;
10065 
10066     // Transform the callee in case we built a call to a local extern
10067     // declaration.
10068     NamedDecl *Found = cast_or_null<NamedDecl>(getDerived().TransformDecl(
10069         E->getOperatorLoc(), Callee->getFoundDecl()));
10070     if (!Found)
10071       return ExprError();
10072     UnqualLookups.addDecl(Found);
10073   }
10074 
10075   return getDerived().RebuildCXXRewrittenBinaryOperator(
10076       E->getOperatorLoc(), Decomp.Opcode, UnqualLookups, LHS.get(), RHS.get());
10077 }
10078 
10079 template<typename Derived>
10080 ExprResult
10081 TreeTransform<Derived>::TransformCompoundAssignOperator(
10082                                                       CompoundAssignOperator *E) {
10083   return getDerived().TransformBinaryOperator(E);
10084 }
10085 
10086 template<typename Derived>
10087 ExprResult TreeTransform<Derived>::
10088 TransformBinaryConditionalOperator(BinaryConditionalOperator *e) {
10089   // Just rebuild the common and RHS expressions and see whether we
10090   // get any changes.
10091 
10092   ExprResult commonExpr = getDerived().TransformExpr(e->getCommon());
10093   if (commonExpr.isInvalid())
10094     return ExprError();
10095 
10096   ExprResult rhs = getDerived().TransformExpr(e->getFalseExpr());
10097   if (rhs.isInvalid())
10098     return ExprError();
10099 
10100   if (!getDerived().AlwaysRebuild() &&
10101       commonExpr.get() == e->getCommon() &&
10102       rhs.get() == e->getFalseExpr())
10103     return e;
10104 
10105   return getDerived().RebuildConditionalOperator(commonExpr.get(),
10106                                                  e->getQuestionLoc(),
10107                                                  nullptr,
10108                                                  e->getColonLoc(),
10109                                                  rhs.get());
10110 }
10111 
10112 template<typename Derived>
10113 ExprResult
10114 TreeTransform<Derived>::TransformConditionalOperator(ConditionalOperator *E) {
10115   ExprResult Cond = getDerived().TransformExpr(E->getCond());
10116   if (Cond.isInvalid())
10117     return ExprError();
10118 
10119   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
10120   if (LHS.isInvalid())
10121     return ExprError();
10122 
10123   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
10124   if (RHS.isInvalid())
10125     return ExprError();
10126 
10127   if (!getDerived().AlwaysRebuild() &&
10128       Cond.get() == E->getCond() &&
10129       LHS.get() == E->getLHS() &&
10130       RHS.get() == E->getRHS())
10131     return E;
10132 
10133   return getDerived().RebuildConditionalOperator(Cond.get(),
10134                                                  E->getQuestionLoc(),
10135                                                  LHS.get(),
10136                                                  E->getColonLoc(),
10137                                                  RHS.get());
10138 }
10139 
10140 template<typename Derived>
10141 ExprResult
10142 TreeTransform<Derived>::TransformImplicitCastExpr(ImplicitCastExpr *E) {
10143   // Implicit casts are eliminated during transformation, since they
10144   // will be recomputed by semantic analysis after transformation.
10145   return getDerived().TransformExpr(E->getSubExprAsWritten());
10146 }
10147 
10148 template<typename Derived>
10149 ExprResult
10150 TreeTransform<Derived>::TransformCStyleCastExpr(CStyleCastExpr *E) {
10151   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten());
10152   if (!Type)
10153     return ExprError();
10154 
10155   ExprResult SubExpr
10156     = getDerived().TransformExpr(E->getSubExprAsWritten());
10157   if (SubExpr.isInvalid())
10158     return ExprError();
10159 
10160   if (!getDerived().AlwaysRebuild() &&
10161       Type == E->getTypeInfoAsWritten() &&
10162       SubExpr.get() == E->getSubExpr())
10163     return E;
10164 
10165   return getDerived().RebuildCStyleCastExpr(E->getLParenLoc(),
10166                                             Type,
10167                                             E->getRParenLoc(),
10168                                             SubExpr.get());
10169 }
10170 
10171 template<typename Derived>
10172 ExprResult
10173 TreeTransform<Derived>::TransformCompoundLiteralExpr(CompoundLiteralExpr *E) {
10174   TypeSourceInfo *OldT = E->getTypeSourceInfo();
10175   TypeSourceInfo *NewT = getDerived().TransformType(OldT);
10176   if (!NewT)
10177     return ExprError();
10178 
10179   ExprResult Init = getDerived().TransformExpr(E->getInitializer());
10180   if (Init.isInvalid())
10181     return ExprError();
10182 
10183   if (!getDerived().AlwaysRebuild() &&
10184       OldT == NewT &&
10185       Init.get() == E->getInitializer())
10186     return SemaRef.MaybeBindToTemporary(E);
10187 
10188   // Note: the expression type doesn't necessarily match the
10189   // type-as-written, but that's okay, because it should always be
10190   // derivable from the initializer.
10191 
10192   return getDerived().RebuildCompoundLiteralExpr(
10193       E->getLParenLoc(), NewT,
10194       /*FIXME:*/ E->getInitializer()->getEndLoc(), Init.get());
10195 }
10196 
10197 template<typename Derived>
10198 ExprResult
10199 TreeTransform<Derived>::TransformExtVectorElementExpr(ExtVectorElementExpr *E) {
10200   ExprResult Base = getDerived().TransformExpr(E->getBase());
10201   if (Base.isInvalid())
10202     return ExprError();
10203 
10204   if (!getDerived().AlwaysRebuild() &&
10205       Base.get() == E->getBase())
10206     return E;
10207 
10208   // FIXME: Bad source location
10209   SourceLocation FakeOperatorLoc =
10210       SemaRef.getLocForEndOfToken(E->getBase()->getEndLoc());
10211   return getDerived().RebuildExtVectorElementExpr(Base.get(), FakeOperatorLoc,
10212                                                   E->getAccessorLoc(),
10213                                                   E->getAccessor());
10214 }
10215 
10216 template<typename Derived>
10217 ExprResult
10218 TreeTransform<Derived>::TransformInitListExpr(InitListExpr *E) {
10219   if (InitListExpr *Syntactic = E->getSyntacticForm())
10220     E = Syntactic;
10221 
10222   bool InitChanged = false;
10223 
10224   EnterExpressionEvaluationContext Context(
10225       getSema(), EnterExpressionEvaluationContext::InitList);
10226 
10227   SmallVector<Expr*, 4> Inits;
10228   if (getDerived().TransformExprs(E->getInits(), E->getNumInits(), false,
10229                                   Inits, &InitChanged))
10230     return ExprError();
10231 
10232   if (!getDerived().AlwaysRebuild() && !InitChanged) {
10233     // FIXME: Attempt to reuse the existing syntactic form of the InitListExpr
10234     // in some cases. We can't reuse it in general, because the syntactic and
10235     // semantic forms are linked, and we can't know that semantic form will
10236     // match even if the syntactic form does.
10237   }
10238 
10239   return getDerived().RebuildInitList(E->getLBraceLoc(), Inits,
10240                                       E->getRBraceLoc());
10241 }
10242 
10243 template<typename Derived>
10244 ExprResult
10245 TreeTransform<Derived>::TransformDesignatedInitExpr(DesignatedInitExpr *E) {
10246   Designation Desig;
10247 
10248   // transform the initializer value
10249   ExprResult Init = getDerived().TransformExpr(E->getInit());
10250   if (Init.isInvalid())
10251     return ExprError();
10252 
10253   // transform the designators.
10254   SmallVector<Expr*, 4> ArrayExprs;
10255   bool ExprChanged = false;
10256   for (const DesignatedInitExpr::Designator &D : E->designators()) {
10257     if (D.isFieldDesignator()) {
10258       Desig.AddDesignator(Designator::getField(D.getFieldName(),
10259                                                D.getDotLoc(),
10260                                                D.getFieldLoc()));
10261       if (D.getField()) {
10262         FieldDecl *Field = cast_or_null<FieldDecl>(
10263             getDerived().TransformDecl(D.getFieldLoc(), D.getField()));
10264         if (Field != D.getField())
10265           // Rebuild the expression when the transformed FieldDecl is
10266           // different to the already assigned FieldDecl.
10267           ExprChanged = true;
10268       } else {
10269         // Ensure that the designator expression is rebuilt when there isn't
10270         // a resolved FieldDecl in the designator as we don't want to assign
10271         // a FieldDecl to a pattern designator that will be instantiated again.
10272         ExprChanged = true;
10273       }
10274       continue;
10275     }
10276 
10277     if (D.isArrayDesignator()) {
10278       ExprResult Index = getDerived().TransformExpr(E->getArrayIndex(D));
10279       if (Index.isInvalid())
10280         return ExprError();
10281 
10282       Desig.AddDesignator(
10283           Designator::getArray(Index.get(), D.getLBracketLoc()));
10284 
10285       ExprChanged = ExprChanged || Init.get() != E->getArrayIndex(D);
10286       ArrayExprs.push_back(Index.get());
10287       continue;
10288     }
10289 
10290     assert(D.isArrayRangeDesignator() && "New kind of designator?");
10291     ExprResult Start
10292       = getDerived().TransformExpr(E->getArrayRangeStart(D));
10293     if (Start.isInvalid())
10294       return ExprError();
10295 
10296     ExprResult End = getDerived().TransformExpr(E->getArrayRangeEnd(D));
10297     if (End.isInvalid())
10298       return ExprError();
10299 
10300     Desig.AddDesignator(Designator::getArrayRange(Start.get(),
10301                                                   End.get(),
10302                                                   D.getLBracketLoc(),
10303                                                   D.getEllipsisLoc()));
10304 
10305     ExprChanged = ExprChanged || Start.get() != E->getArrayRangeStart(D) ||
10306                   End.get() != E->getArrayRangeEnd(D);
10307 
10308     ArrayExprs.push_back(Start.get());
10309     ArrayExprs.push_back(End.get());
10310   }
10311 
10312   if (!getDerived().AlwaysRebuild() &&
10313       Init.get() == E->getInit() &&
10314       !ExprChanged)
10315     return E;
10316 
10317   return getDerived().RebuildDesignatedInitExpr(Desig, ArrayExprs,
10318                                                 E->getEqualOrColonLoc(),
10319                                                 E->usesGNUSyntax(), Init.get());
10320 }
10321 
10322 // Seems that if TransformInitListExpr() only works on the syntactic form of an
10323 // InitListExpr, then a DesignatedInitUpdateExpr is not encountered.
10324 template<typename Derived>
10325 ExprResult
10326 TreeTransform<Derived>::TransformDesignatedInitUpdateExpr(
10327     DesignatedInitUpdateExpr *E) {
10328   llvm_unreachable("Unexpected DesignatedInitUpdateExpr in syntactic form of "
10329                    "initializer");
10330   return ExprError();
10331 }
10332 
10333 template<typename Derived>
10334 ExprResult
10335 TreeTransform<Derived>::TransformNoInitExpr(
10336     NoInitExpr *E) {
10337   llvm_unreachable("Unexpected NoInitExpr in syntactic form of initializer");
10338   return ExprError();
10339 }
10340 
10341 template<typename Derived>
10342 ExprResult
10343 TreeTransform<Derived>::TransformArrayInitLoopExpr(ArrayInitLoopExpr *E) {
10344   llvm_unreachable("Unexpected ArrayInitLoopExpr outside of initializer");
10345   return ExprError();
10346 }
10347 
10348 template<typename Derived>
10349 ExprResult
10350 TreeTransform<Derived>::TransformArrayInitIndexExpr(ArrayInitIndexExpr *E) {
10351   llvm_unreachable("Unexpected ArrayInitIndexExpr outside of initializer");
10352   return ExprError();
10353 }
10354 
10355 template<typename Derived>
10356 ExprResult
10357 TreeTransform<Derived>::TransformImplicitValueInitExpr(
10358                                                      ImplicitValueInitExpr *E) {
10359   TemporaryBase Rebase(*this, E->getBeginLoc(), DeclarationName());
10360 
10361   // FIXME: Will we ever have proper type location here? Will we actually
10362   // need to transform the type?
10363   QualType T = getDerived().TransformType(E->getType());
10364   if (T.isNull())
10365     return ExprError();
10366 
10367   if (!getDerived().AlwaysRebuild() &&
10368       T == E->getType())
10369     return E;
10370 
10371   return getDerived().RebuildImplicitValueInitExpr(T);
10372 }
10373 
10374 template<typename Derived>
10375 ExprResult
10376 TreeTransform<Derived>::TransformVAArgExpr(VAArgExpr *E) {
10377   TypeSourceInfo *TInfo = getDerived().TransformType(E->getWrittenTypeInfo());
10378   if (!TInfo)
10379     return ExprError();
10380 
10381   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
10382   if (SubExpr.isInvalid())
10383     return ExprError();
10384 
10385   if (!getDerived().AlwaysRebuild() &&
10386       TInfo == E->getWrittenTypeInfo() &&
10387       SubExpr.get() == E->getSubExpr())
10388     return E;
10389 
10390   return getDerived().RebuildVAArgExpr(E->getBuiltinLoc(), SubExpr.get(),
10391                                        TInfo, E->getRParenLoc());
10392 }
10393 
10394 template<typename Derived>
10395 ExprResult
10396 TreeTransform<Derived>::TransformParenListExpr(ParenListExpr *E) {
10397   bool ArgumentChanged = false;
10398   SmallVector<Expr*, 4> Inits;
10399   if (TransformExprs(E->getExprs(), E->getNumExprs(), true, Inits,
10400                      &ArgumentChanged))
10401     return ExprError();
10402 
10403   return getDerived().RebuildParenListExpr(E->getLParenLoc(),
10404                                            Inits,
10405                                            E->getRParenLoc());
10406 }
10407 
10408 /// Transform an address-of-label expression.
10409 ///
10410 /// By default, the transformation of an address-of-label expression always
10411 /// rebuilds the expression, so that the label identifier can be resolved to
10412 /// the corresponding label statement by semantic analysis.
10413 template<typename Derived>
10414 ExprResult
10415 TreeTransform<Derived>::TransformAddrLabelExpr(AddrLabelExpr *E) {
10416   Decl *LD = getDerived().TransformDecl(E->getLabel()->getLocation(),
10417                                         E->getLabel());
10418   if (!LD)
10419     return ExprError();
10420 
10421   return getDerived().RebuildAddrLabelExpr(E->getAmpAmpLoc(), E->getLabelLoc(),
10422                                            cast<LabelDecl>(LD));
10423 }
10424 
10425 template<typename Derived>
10426 ExprResult
10427 TreeTransform<Derived>::TransformStmtExpr(StmtExpr *E) {
10428   SemaRef.ActOnStartStmtExpr();
10429   StmtResult SubStmt
10430     = getDerived().TransformCompoundStmt(E->getSubStmt(), true);
10431   if (SubStmt.isInvalid()) {
10432     SemaRef.ActOnStmtExprError();
10433     return ExprError();
10434   }
10435 
10436   if (!getDerived().AlwaysRebuild() &&
10437       SubStmt.get() == E->getSubStmt()) {
10438     // Calling this an 'error' is unintuitive, but it does the right thing.
10439     SemaRef.ActOnStmtExprError();
10440     return SemaRef.MaybeBindToTemporary(E);
10441   }
10442 
10443   return getDerived().RebuildStmtExpr(E->getLParenLoc(),
10444                                       SubStmt.get(),
10445                                       E->getRParenLoc());
10446 }
10447 
10448 template<typename Derived>
10449 ExprResult
10450 TreeTransform<Derived>::TransformChooseExpr(ChooseExpr *E) {
10451   ExprResult Cond = getDerived().TransformExpr(E->getCond());
10452   if (Cond.isInvalid())
10453     return ExprError();
10454 
10455   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
10456   if (LHS.isInvalid())
10457     return ExprError();
10458 
10459   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
10460   if (RHS.isInvalid())
10461     return ExprError();
10462 
10463   if (!getDerived().AlwaysRebuild() &&
10464       Cond.get() == E->getCond() &&
10465       LHS.get() == E->getLHS() &&
10466       RHS.get() == E->getRHS())
10467     return E;
10468 
10469   return getDerived().RebuildChooseExpr(E->getBuiltinLoc(),
10470                                         Cond.get(), LHS.get(), RHS.get(),
10471                                         E->getRParenLoc());
10472 }
10473 
10474 template<typename Derived>
10475 ExprResult
10476 TreeTransform<Derived>::TransformGNUNullExpr(GNUNullExpr *E) {
10477   return E;
10478 }
10479 
10480 template<typename Derived>
10481 ExprResult
10482 TreeTransform<Derived>::TransformCXXOperatorCallExpr(CXXOperatorCallExpr *E) {
10483   switch (E->getOperator()) {
10484   case OO_New:
10485   case OO_Delete:
10486   case OO_Array_New:
10487   case OO_Array_Delete:
10488     llvm_unreachable("new and delete operators cannot use CXXOperatorCallExpr");
10489 
10490   case OO_Call: {
10491     // This is a call to an object's operator().
10492     assert(E->getNumArgs() >= 1 && "Object call is missing arguments");
10493 
10494     // Transform the object itself.
10495     ExprResult Object = getDerived().TransformExpr(E->getArg(0));
10496     if (Object.isInvalid())
10497       return ExprError();
10498 
10499     // FIXME: Poor location information
10500     SourceLocation FakeLParenLoc = SemaRef.getLocForEndOfToken(
10501         static_cast<Expr *>(Object.get())->getEndLoc());
10502 
10503     // Transform the call arguments.
10504     SmallVector<Expr*, 8> Args;
10505     if (getDerived().TransformExprs(E->getArgs() + 1, E->getNumArgs() - 1, true,
10506                                     Args))
10507       return ExprError();
10508 
10509     return getDerived().RebuildCallExpr(Object.get(), FakeLParenLoc, Args,
10510                                         E->getEndLoc());
10511   }
10512 
10513 #define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly) \
10514   case OO_##Name:
10515 #define OVERLOADED_OPERATOR_MULTI(Name,Spelling,Unary,Binary,MemberOnly)
10516 #include "clang/Basic/OperatorKinds.def"
10517   case OO_Subscript:
10518     // Handled below.
10519     break;
10520 
10521   case OO_Conditional:
10522     llvm_unreachable("conditional operator is not actually overloadable");
10523 
10524   case OO_None:
10525   case NUM_OVERLOADED_OPERATORS:
10526     llvm_unreachable("not an overloaded operator?");
10527   }
10528 
10529   ExprResult Callee = getDerived().TransformExpr(E->getCallee());
10530   if (Callee.isInvalid())
10531     return ExprError();
10532 
10533   ExprResult First;
10534   if (E->getOperator() == OO_Amp)
10535     First = getDerived().TransformAddressOfOperand(E->getArg(0));
10536   else
10537     First = getDerived().TransformExpr(E->getArg(0));
10538   if (First.isInvalid())
10539     return ExprError();
10540 
10541   ExprResult Second;
10542   if (E->getNumArgs() == 2) {
10543     Second = getDerived().TransformExpr(E->getArg(1));
10544     if (Second.isInvalid())
10545       return ExprError();
10546   }
10547 
10548   if (!getDerived().AlwaysRebuild() &&
10549       Callee.get() == E->getCallee() &&
10550       First.get() == E->getArg(0) &&
10551       (E->getNumArgs() != 2 || Second.get() == E->getArg(1)))
10552     return SemaRef.MaybeBindToTemporary(E);
10553 
10554   Sema::FPFeaturesStateRAII FPFeaturesState(getSema());
10555   getSema().FPFeatures = E->getFPFeatures();
10556 
10557   return getDerived().RebuildCXXOperatorCallExpr(E->getOperator(),
10558                                                  E->getOperatorLoc(),
10559                                                  Callee.get(),
10560                                                  First.get(),
10561                                                  Second.get());
10562 }
10563 
10564 template<typename Derived>
10565 ExprResult
10566 TreeTransform<Derived>::TransformCXXMemberCallExpr(CXXMemberCallExpr *E) {
10567   return getDerived().TransformCallExpr(E);
10568 }
10569 
10570 template <typename Derived>
10571 ExprResult TreeTransform<Derived>::TransformSourceLocExpr(SourceLocExpr *E) {
10572   bool NeedRebuildFunc = E->getIdentKind() == SourceLocExpr::Function &&
10573                          getSema().CurContext != E->getParentContext();
10574 
10575   if (!getDerived().AlwaysRebuild() && !NeedRebuildFunc)
10576     return E;
10577 
10578   return getDerived().RebuildSourceLocExpr(E->getIdentKind(), E->getBeginLoc(),
10579                                            E->getEndLoc(),
10580                                            getSema().CurContext);
10581 }
10582 
10583 template<typename Derived>
10584 ExprResult
10585 TreeTransform<Derived>::TransformCUDAKernelCallExpr(CUDAKernelCallExpr *E) {
10586   // Transform the callee.
10587   ExprResult Callee = getDerived().TransformExpr(E->getCallee());
10588   if (Callee.isInvalid())
10589     return ExprError();
10590 
10591   // Transform exec config.
10592   ExprResult EC = getDerived().TransformCallExpr(E->getConfig());
10593   if (EC.isInvalid())
10594     return ExprError();
10595 
10596   // Transform arguments.
10597   bool ArgChanged = false;
10598   SmallVector<Expr*, 8> Args;
10599   if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
10600                                   &ArgChanged))
10601     return ExprError();
10602 
10603   if (!getDerived().AlwaysRebuild() &&
10604       Callee.get() == E->getCallee() &&
10605       !ArgChanged)
10606     return SemaRef.MaybeBindToTemporary(E);
10607 
10608   // FIXME: Wrong source location information for the '('.
10609   SourceLocation FakeLParenLoc
10610     = ((Expr *)Callee.get())->getSourceRange().getBegin();
10611   return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc,
10612                                       Args,
10613                                       E->getRParenLoc(), EC.get());
10614 }
10615 
10616 template<typename Derived>
10617 ExprResult
10618 TreeTransform<Derived>::TransformCXXNamedCastExpr(CXXNamedCastExpr *E) {
10619   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten());
10620   if (!Type)
10621     return ExprError();
10622 
10623   ExprResult SubExpr
10624     = getDerived().TransformExpr(E->getSubExprAsWritten());
10625   if (SubExpr.isInvalid())
10626     return ExprError();
10627 
10628   if (!getDerived().AlwaysRebuild() &&
10629       Type == E->getTypeInfoAsWritten() &&
10630       SubExpr.get() == E->getSubExpr())
10631     return E;
10632   return getDerived().RebuildCXXNamedCastExpr(
10633       E->getOperatorLoc(), E->getStmtClass(), E->getAngleBrackets().getBegin(),
10634       Type, E->getAngleBrackets().getEnd(),
10635       // FIXME. this should be '(' location
10636       E->getAngleBrackets().getEnd(), SubExpr.get(), E->getRParenLoc());
10637 }
10638 
10639 template<typename Derived>
10640 ExprResult
10641 TreeTransform<Derived>::TransformBuiltinBitCastExpr(BuiltinBitCastExpr *BCE) {
10642   TypeSourceInfo *TSI =
10643       getDerived().TransformType(BCE->getTypeInfoAsWritten());
10644   if (!TSI)
10645     return ExprError();
10646 
10647   ExprResult Sub = getDerived().TransformExpr(BCE->getSubExpr());
10648   if (Sub.isInvalid())
10649     return ExprError();
10650 
10651   return getDerived().RebuildBuiltinBitCastExpr(BCE->getBeginLoc(), TSI,
10652                                                 Sub.get(), BCE->getEndLoc());
10653 }
10654 
10655 template<typename Derived>
10656 ExprResult
10657 TreeTransform<Derived>::TransformCXXStaticCastExpr(CXXStaticCastExpr *E) {
10658   return getDerived().TransformCXXNamedCastExpr(E);
10659 }
10660 
10661 template<typename Derived>
10662 ExprResult
10663 TreeTransform<Derived>::TransformCXXDynamicCastExpr(CXXDynamicCastExpr *E) {
10664   return getDerived().TransformCXXNamedCastExpr(E);
10665 }
10666 
10667 template<typename Derived>
10668 ExprResult
10669 TreeTransform<Derived>::TransformCXXReinterpretCastExpr(
10670                                                       CXXReinterpretCastExpr *E) {
10671   return getDerived().TransformCXXNamedCastExpr(E);
10672 }
10673 
10674 template<typename Derived>
10675 ExprResult
10676 TreeTransform<Derived>::TransformCXXConstCastExpr(CXXConstCastExpr *E) {
10677   return getDerived().TransformCXXNamedCastExpr(E);
10678 }
10679 
10680 template<typename Derived>
10681 ExprResult
10682 TreeTransform<Derived>::TransformCXXFunctionalCastExpr(
10683                                                      CXXFunctionalCastExpr *E) {
10684   TypeSourceInfo *Type =
10685       getDerived().TransformTypeWithDeducedTST(E->getTypeInfoAsWritten());
10686   if (!Type)
10687     return ExprError();
10688 
10689   ExprResult SubExpr
10690     = getDerived().TransformExpr(E->getSubExprAsWritten());
10691   if (SubExpr.isInvalid())
10692     return ExprError();
10693 
10694   if (!getDerived().AlwaysRebuild() &&
10695       Type == E->getTypeInfoAsWritten() &&
10696       SubExpr.get() == E->getSubExpr())
10697     return E;
10698 
10699   return getDerived().RebuildCXXFunctionalCastExpr(Type,
10700                                                    E->getLParenLoc(),
10701                                                    SubExpr.get(),
10702                                                    E->getRParenLoc(),
10703                                                    E->isListInitialization());
10704 }
10705 
10706 template<typename Derived>
10707 ExprResult
10708 TreeTransform<Derived>::TransformCXXTypeidExpr(CXXTypeidExpr *E) {
10709   if (E->isTypeOperand()) {
10710     TypeSourceInfo *TInfo
10711       = getDerived().TransformType(E->getTypeOperandSourceInfo());
10712     if (!TInfo)
10713       return ExprError();
10714 
10715     if (!getDerived().AlwaysRebuild() &&
10716         TInfo == E->getTypeOperandSourceInfo())
10717       return E;
10718 
10719     return getDerived().RebuildCXXTypeidExpr(E->getType(), E->getBeginLoc(),
10720                                              TInfo, E->getEndLoc());
10721   }
10722 
10723   // We don't know whether the subexpression is potentially evaluated until
10724   // after we perform semantic analysis.  We speculatively assume it is
10725   // unevaluated; it will get fixed later if the subexpression is in fact
10726   // potentially evaluated.
10727   EnterExpressionEvaluationContext Unevaluated(
10728       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated,
10729       Sema::ReuseLambdaContextDecl);
10730 
10731   ExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand());
10732   if (SubExpr.isInvalid())
10733     return ExprError();
10734 
10735   if (!getDerived().AlwaysRebuild() &&
10736       SubExpr.get() == E->getExprOperand())
10737     return E;
10738 
10739   return getDerived().RebuildCXXTypeidExpr(E->getType(), E->getBeginLoc(),
10740                                            SubExpr.get(), E->getEndLoc());
10741 }
10742 
10743 template<typename Derived>
10744 ExprResult
10745 TreeTransform<Derived>::TransformCXXUuidofExpr(CXXUuidofExpr *E) {
10746   if (E->isTypeOperand()) {
10747     TypeSourceInfo *TInfo
10748       = getDerived().TransformType(E->getTypeOperandSourceInfo());
10749     if (!TInfo)
10750       return ExprError();
10751 
10752     if (!getDerived().AlwaysRebuild() &&
10753         TInfo == E->getTypeOperandSourceInfo())
10754       return E;
10755 
10756     return getDerived().RebuildCXXUuidofExpr(E->getType(), E->getBeginLoc(),
10757                                              TInfo, E->getEndLoc());
10758   }
10759 
10760   EnterExpressionEvaluationContext Unevaluated(
10761       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
10762 
10763   ExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand());
10764   if (SubExpr.isInvalid())
10765     return ExprError();
10766 
10767   if (!getDerived().AlwaysRebuild() &&
10768       SubExpr.get() == E->getExprOperand())
10769     return E;
10770 
10771   return getDerived().RebuildCXXUuidofExpr(E->getType(), E->getBeginLoc(),
10772                                            SubExpr.get(), E->getEndLoc());
10773 }
10774 
10775 template<typename Derived>
10776 ExprResult
10777 TreeTransform<Derived>::TransformCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) {
10778   return E;
10779 }
10780 
10781 template<typename Derived>
10782 ExprResult
10783 TreeTransform<Derived>::TransformCXXNullPtrLiteralExpr(
10784                                                      CXXNullPtrLiteralExpr *E) {
10785   return E;
10786 }
10787 
10788 template<typename Derived>
10789 ExprResult
10790 TreeTransform<Derived>::TransformCXXThisExpr(CXXThisExpr *E) {
10791   QualType T = getSema().getCurrentThisType();
10792 
10793   if (!getDerived().AlwaysRebuild() && T == E->getType()) {
10794     // Mark it referenced in the new context regardless.
10795     // FIXME: this is a bit instantiation-specific.
10796     getSema().MarkThisReferenced(E);
10797     return E;
10798   }
10799 
10800   return getDerived().RebuildCXXThisExpr(E->getBeginLoc(), T, E->isImplicit());
10801 }
10802 
10803 template<typename Derived>
10804 ExprResult
10805 TreeTransform<Derived>::TransformCXXThrowExpr(CXXThrowExpr *E) {
10806   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
10807   if (SubExpr.isInvalid())
10808     return ExprError();
10809 
10810   if (!getDerived().AlwaysRebuild() &&
10811       SubExpr.get() == E->getSubExpr())
10812     return E;
10813 
10814   return getDerived().RebuildCXXThrowExpr(E->getThrowLoc(), SubExpr.get(),
10815                                           E->isThrownVariableInScope());
10816 }
10817 
10818 template<typename Derived>
10819 ExprResult
10820 TreeTransform<Derived>::TransformCXXDefaultArgExpr(CXXDefaultArgExpr *E) {
10821   ParmVarDecl *Param = cast_or_null<ParmVarDecl>(
10822       getDerived().TransformDecl(E->getBeginLoc(), E->getParam()));
10823   if (!Param)
10824     return ExprError();
10825 
10826   if (!getDerived().AlwaysRebuild() && Param == E->getParam() &&
10827       E->getUsedContext() == SemaRef.CurContext)
10828     return E;
10829 
10830   return getDerived().RebuildCXXDefaultArgExpr(E->getUsedLocation(), Param);
10831 }
10832 
10833 template<typename Derived>
10834 ExprResult
10835 TreeTransform<Derived>::TransformCXXDefaultInitExpr(CXXDefaultInitExpr *E) {
10836   FieldDecl *Field = cast_or_null<FieldDecl>(
10837       getDerived().TransformDecl(E->getBeginLoc(), E->getField()));
10838   if (!Field)
10839     return ExprError();
10840 
10841   if (!getDerived().AlwaysRebuild() && Field == E->getField() &&
10842       E->getUsedContext() == SemaRef.CurContext)
10843     return E;
10844 
10845   return getDerived().RebuildCXXDefaultInitExpr(E->getExprLoc(), Field);
10846 }
10847 
10848 template<typename Derived>
10849 ExprResult
10850 TreeTransform<Derived>::TransformCXXScalarValueInitExpr(
10851                                                     CXXScalarValueInitExpr *E) {
10852   TypeSourceInfo *T = getDerived().TransformType(E->getTypeSourceInfo());
10853   if (!T)
10854     return ExprError();
10855 
10856   if (!getDerived().AlwaysRebuild() &&
10857       T == E->getTypeSourceInfo())
10858     return E;
10859 
10860   return getDerived().RebuildCXXScalarValueInitExpr(T,
10861                                           /*FIXME:*/T->getTypeLoc().getEndLoc(),
10862                                                     E->getRParenLoc());
10863 }
10864 
10865 template<typename Derived>
10866 ExprResult
10867 TreeTransform<Derived>::TransformCXXNewExpr(CXXNewExpr *E) {
10868   // Transform the type that we're allocating
10869   TypeSourceInfo *AllocTypeInfo =
10870       getDerived().TransformTypeWithDeducedTST(E->getAllocatedTypeSourceInfo());
10871   if (!AllocTypeInfo)
10872     return ExprError();
10873 
10874   // Transform the size of the array we're allocating (if any).
10875   Optional<Expr *> ArraySize;
10876   if (Optional<Expr *> OldArraySize = E->getArraySize()) {
10877     ExprResult NewArraySize;
10878     if (*OldArraySize) {
10879       NewArraySize = getDerived().TransformExpr(*OldArraySize);
10880       if (NewArraySize.isInvalid())
10881         return ExprError();
10882     }
10883     ArraySize = NewArraySize.get();
10884   }
10885 
10886   // Transform the placement arguments (if any).
10887   bool ArgumentChanged = false;
10888   SmallVector<Expr*, 8> PlacementArgs;
10889   if (getDerived().TransformExprs(E->getPlacementArgs(),
10890                                   E->getNumPlacementArgs(), true,
10891                                   PlacementArgs, &ArgumentChanged))
10892     return ExprError();
10893 
10894   // Transform the initializer (if any).
10895   Expr *OldInit = E->getInitializer();
10896   ExprResult NewInit;
10897   if (OldInit)
10898     NewInit = getDerived().TransformInitializer(OldInit, true);
10899   if (NewInit.isInvalid())
10900     return ExprError();
10901 
10902   // Transform new operator and delete operator.
10903   FunctionDecl *OperatorNew = nullptr;
10904   if (E->getOperatorNew()) {
10905     OperatorNew = cast_or_null<FunctionDecl>(
10906         getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorNew()));
10907     if (!OperatorNew)
10908       return ExprError();
10909   }
10910 
10911   FunctionDecl *OperatorDelete = nullptr;
10912   if (E->getOperatorDelete()) {
10913     OperatorDelete = cast_or_null<FunctionDecl>(
10914         getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorDelete()));
10915     if (!OperatorDelete)
10916       return ExprError();
10917   }
10918 
10919   if (!getDerived().AlwaysRebuild() &&
10920       AllocTypeInfo == E->getAllocatedTypeSourceInfo() &&
10921       ArraySize == E->getArraySize() &&
10922       NewInit.get() == OldInit &&
10923       OperatorNew == E->getOperatorNew() &&
10924       OperatorDelete == E->getOperatorDelete() &&
10925       !ArgumentChanged) {
10926     // Mark any declarations we need as referenced.
10927     // FIXME: instantiation-specific.
10928     if (OperatorNew)
10929       SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorNew);
10930     if (OperatorDelete)
10931       SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorDelete);
10932 
10933     if (E->isArray() && !E->getAllocatedType()->isDependentType()) {
10934       QualType ElementType
10935         = SemaRef.Context.getBaseElementType(E->getAllocatedType());
10936       if (const RecordType *RecordT = ElementType->getAs<RecordType>()) {
10937         CXXRecordDecl *Record = cast<CXXRecordDecl>(RecordT->getDecl());
10938         if (CXXDestructorDecl *Destructor = SemaRef.LookupDestructor(Record)) {
10939           SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Destructor);
10940         }
10941       }
10942     }
10943 
10944     return E;
10945   }
10946 
10947   QualType AllocType = AllocTypeInfo->getType();
10948   if (!ArraySize) {
10949     // If no array size was specified, but the new expression was
10950     // instantiated with an array type (e.g., "new T" where T is
10951     // instantiated with "int[4]"), extract the outer bound from the
10952     // array type as our array size. We do this with constant and
10953     // dependently-sized array types.
10954     const ArrayType *ArrayT = SemaRef.Context.getAsArrayType(AllocType);
10955     if (!ArrayT) {
10956       // Do nothing
10957     } else if (const ConstantArrayType *ConsArrayT
10958                                      = dyn_cast<ConstantArrayType>(ArrayT)) {
10959       ArraySize = IntegerLiteral::Create(SemaRef.Context, ConsArrayT->getSize(),
10960                                          SemaRef.Context.getSizeType(),
10961                                          /*FIXME:*/ E->getBeginLoc());
10962       AllocType = ConsArrayT->getElementType();
10963     } else if (const DependentSizedArrayType *DepArrayT
10964                               = dyn_cast<DependentSizedArrayType>(ArrayT)) {
10965       if (DepArrayT->getSizeExpr()) {
10966         ArraySize = DepArrayT->getSizeExpr();
10967         AllocType = DepArrayT->getElementType();
10968       }
10969     }
10970   }
10971 
10972   return getDerived().RebuildCXXNewExpr(
10973       E->getBeginLoc(), E->isGlobalNew(),
10974       /*FIXME:*/ E->getBeginLoc(), PlacementArgs,
10975       /*FIXME:*/ E->getBeginLoc(), E->getTypeIdParens(), AllocType,
10976       AllocTypeInfo, ArraySize, E->getDirectInitRange(), NewInit.get());
10977 }
10978 
10979 template<typename Derived>
10980 ExprResult
10981 TreeTransform<Derived>::TransformCXXDeleteExpr(CXXDeleteExpr *E) {
10982   ExprResult Operand = getDerived().TransformExpr(E->getArgument());
10983   if (Operand.isInvalid())
10984     return ExprError();
10985 
10986   // Transform the delete operator, if known.
10987   FunctionDecl *OperatorDelete = nullptr;
10988   if (E->getOperatorDelete()) {
10989     OperatorDelete = cast_or_null<FunctionDecl>(
10990         getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorDelete()));
10991     if (!OperatorDelete)
10992       return ExprError();
10993   }
10994 
10995   if (!getDerived().AlwaysRebuild() &&
10996       Operand.get() == E->getArgument() &&
10997       OperatorDelete == E->getOperatorDelete()) {
10998     // Mark any declarations we need as referenced.
10999     // FIXME: instantiation-specific.
11000     if (OperatorDelete)
11001       SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorDelete);
11002 
11003     if (!E->getArgument()->isTypeDependent()) {
11004       QualType Destroyed = SemaRef.Context.getBaseElementType(
11005                                                          E->getDestroyedType());
11006       if (const RecordType *DestroyedRec = Destroyed->getAs<RecordType>()) {
11007         CXXRecordDecl *Record = cast<CXXRecordDecl>(DestroyedRec->getDecl());
11008         SemaRef.MarkFunctionReferenced(E->getBeginLoc(),
11009                                        SemaRef.LookupDestructor(Record));
11010       }
11011     }
11012 
11013     return E;
11014   }
11015 
11016   return getDerived().RebuildCXXDeleteExpr(
11017       E->getBeginLoc(), E->isGlobalDelete(), E->isArrayForm(), Operand.get());
11018 }
11019 
11020 template<typename Derived>
11021 ExprResult
11022 TreeTransform<Derived>::TransformCXXPseudoDestructorExpr(
11023                                                      CXXPseudoDestructorExpr *E) {
11024   ExprResult Base = getDerived().TransformExpr(E->getBase());
11025   if (Base.isInvalid())
11026     return ExprError();
11027 
11028   ParsedType ObjectTypePtr;
11029   bool MayBePseudoDestructor = false;
11030   Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(),
11031                                               E->getOperatorLoc(),
11032                                         E->isArrow()? tok::arrow : tok::period,
11033                                               ObjectTypePtr,
11034                                               MayBePseudoDestructor);
11035   if (Base.isInvalid())
11036     return ExprError();
11037 
11038   QualType ObjectType = ObjectTypePtr.get();
11039   NestedNameSpecifierLoc QualifierLoc = E->getQualifierLoc();
11040   if (QualifierLoc) {
11041     QualifierLoc
11042       = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc, ObjectType);
11043     if (!QualifierLoc)
11044       return ExprError();
11045   }
11046   CXXScopeSpec SS;
11047   SS.Adopt(QualifierLoc);
11048 
11049   PseudoDestructorTypeStorage Destroyed;
11050   if (E->getDestroyedTypeInfo()) {
11051     TypeSourceInfo *DestroyedTypeInfo
11052       = getDerived().TransformTypeInObjectScope(E->getDestroyedTypeInfo(),
11053                                                 ObjectType, nullptr, SS);
11054     if (!DestroyedTypeInfo)
11055       return ExprError();
11056     Destroyed = DestroyedTypeInfo;
11057   } else if (!ObjectType.isNull() && ObjectType->isDependentType()) {
11058     // We aren't likely to be able to resolve the identifier down to a type
11059     // now anyway, so just retain the identifier.
11060     Destroyed = PseudoDestructorTypeStorage(E->getDestroyedTypeIdentifier(),
11061                                             E->getDestroyedTypeLoc());
11062   } else {
11063     // Look for a destructor known with the given name.
11064     ParsedType T = SemaRef.getDestructorName(E->getTildeLoc(),
11065                                               *E->getDestroyedTypeIdentifier(),
11066                                                 E->getDestroyedTypeLoc(),
11067                                                 /*Scope=*/nullptr,
11068                                                 SS, ObjectTypePtr,
11069                                                 false);
11070     if (!T)
11071       return ExprError();
11072 
11073     Destroyed
11074       = SemaRef.Context.getTrivialTypeSourceInfo(SemaRef.GetTypeFromParser(T),
11075                                                  E->getDestroyedTypeLoc());
11076   }
11077 
11078   TypeSourceInfo *ScopeTypeInfo = nullptr;
11079   if (E->getScopeTypeInfo()) {
11080     CXXScopeSpec EmptySS;
11081     ScopeTypeInfo = getDerived().TransformTypeInObjectScope(
11082                       E->getScopeTypeInfo(), ObjectType, nullptr, EmptySS);
11083     if (!ScopeTypeInfo)
11084       return ExprError();
11085   }
11086 
11087   return getDerived().RebuildCXXPseudoDestructorExpr(Base.get(),
11088                                                      E->getOperatorLoc(),
11089                                                      E->isArrow(),
11090                                                      SS,
11091                                                      ScopeTypeInfo,
11092                                                      E->getColonColonLoc(),
11093                                                      E->getTildeLoc(),
11094                                                      Destroyed);
11095 }
11096 
11097 template <typename Derived>
11098 bool TreeTransform<Derived>::TransformOverloadExprDecls(OverloadExpr *Old,
11099                                                         bool RequiresADL,
11100                                                         LookupResult &R) {
11101   // Transform all the decls.
11102   bool AllEmptyPacks = true;
11103   for (auto *OldD : Old->decls()) {
11104     Decl *InstD = getDerived().TransformDecl(Old->getNameLoc(), OldD);
11105     if (!InstD) {
11106       // Silently ignore these if a UsingShadowDecl instantiated to nothing.
11107       // This can happen because of dependent hiding.
11108       if (isa<UsingShadowDecl>(OldD))
11109         continue;
11110       else {
11111         R.clear();
11112         return true;
11113       }
11114     }
11115 
11116     // Expand using pack declarations.
11117     NamedDecl *SingleDecl = cast<NamedDecl>(InstD);
11118     ArrayRef<NamedDecl*> Decls = SingleDecl;
11119     if (auto *UPD = dyn_cast<UsingPackDecl>(InstD))
11120       Decls = UPD->expansions();
11121 
11122     // Expand using declarations.
11123     for (auto *D : Decls) {
11124       if (auto *UD = dyn_cast<UsingDecl>(D)) {
11125         for (auto *SD : UD->shadows())
11126           R.addDecl(SD);
11127       } else {
11128         R.addDecl(D);
11129       }
11130     }
11131 
11132     AllEmptyPacks &= Decls.empty();
11133   };
11134 
11135   // C++ [temp.res]/8.4.2:
11136   //   The program is ill-formed, no diagnostic required, if [...] lookup for
11137   //   a name in the template definition found a using-declaration, but the
11138   //   lookup in the corresponding scope in the instantiation odoes not find
11139   //   any declarations because the using-declaration was a pack expansion and
11140   //   the corresponding pack is empty
11141   if (AllEmptyPacks && !RequiresADL) {
11142     getSema().Diag(Old->getNameLoc(), diag::err_using_pack_expansion_empty)
11143         << isa<UnresolvedMemberExpr>(Old) << Old->getName();
11144     return true;
11145   }
11146 
11147   // Resolve a kind, but don't do any further analysis.  If it's
11148   // ambiguous, the callee needs to deal with it.
11149   R.resolveKind();
11150   return false;
11151 }
11152 
11153 template<typename Derived>
11154 ExprResult
11155 TreeTransform<Derived>::TransformUnresolvedLookupExpr(
11156                                                   UnresolvedLookupExpr *Old) {
11157   LookupResult R(SemaRef, Old->getName(), Old->getNameLoc(),
11158                  Sema::LookupOrdinaryName);
11159 
11160   // Transform the declaration set.
11161   if (TransformOverloadExprDecls(Old, Old->requiresADL(), R))
11162     return ExprError();
11163 
11164   // Rebuild the nested-name qualifier, if present.
11165   CXXScopeSpec SS;
11166   if (Old->getQualifierLoc()) {
11167     NestedNameSpecifierLoc QualifierLoc
11168       = getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc());
11169     if (!QualifierLoc)
11170       return ExprError();
11171 
11172     SS.Adopt(QualifierLoc);
11173   }
11174 
11175   if (Old->getNamingClass()) {
11176     CXXRecordDecl *NamingClass
11177       = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl(
11178                                                             Old->getNameLoc(),
11179                                                         Old->getNamingClass()));
11180     if (!NamingClass) {
11181       R.clear();
11182       return ExprError();
11183     }
11184 
11185     R.setNamingClass(NamingClass);
11186   }
11187 
11188   SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc();
11189 
11190   // If we have neither explicit template arguments, nor the template keyword,
11191   // it's a normal declaration name or member reference.
11192   if (!Old->hasExplicitTemplateArgs() && !TemplateKWLoc.isValid()) {
11193     NamedDecl *D = R.getAsSingle<NamedDecl>();
11194     // In a C++11 unevaluated context, an UnresolvedLookupExpr might refer to an
11195     // instance member. In other contexts, BuildPossibleImplicitMemberExpr will
11196     // give a good diagnostic.
11197     if (D && D->isCXXInstanceMember()) {
11198       return SemaRef.BuildPossibleImplicitMemberExpr(SS, TemplateKWLoc, R,
11199                                                      /*TemplateArgs=*/nullptr,
11200                                                      /*Scope=*/nullptr);
11201     }
11202 
11203     return getDerived().RebuildDeclarationNameExpr(SS, R, Old->requiresADL());
11204   }
11205 
11206   // If we have template arguments, rebuild them, then rebuild the
11207   // templateid expression.
11208   TemplateArgumentListInfo TransArgs(Old->getLAngleLoc(), Old->getRAngleLoc());
11209   if (Old->hasExplicitTemplateArgs() &&
11210       getDerived().TransformTemplateArguments(Old->getTemplateArgs(),
11211                                               Old->getNumTemplateArgs(),
11212                                               TransArgs)) {
11213     R.clear();
11214     return ExprError();
11215   }
11216 
11217   return getDerived().RebuildTemplateIdExpr(SS, TemplateKWLoc, R,
11218                                             Old->requiresADL(), &TransArgs);
11219 }
11220 
11221 template<typename Derived>
11222 ExprResult
11223 TreeTransform<Derived>::TransformTypeTraitExpr(TypeTraitExpr *E) {
11224   bool ArgChanged = false;
11225   SmallVector<TypeSourceInfo *, 4> Args;
11226   for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) {
11227     TypeSourceInfo *From = E->getArg(I);
11228     TypeLoc FromTL = From->getTypeLoc();
11229     if (!FromTL.getAs<PackExpansionTypeLoc>()) {
11230       TypeLocBuilder TLB;
11231       TLB.reserve(FromTL.getFullDataSize());
11232       QualType To = getDerived().TransformType(TLB, FromTL);
11233       if (To.isNull())
11234         return ExprError();
11235 
11236       if (To == From->getType())
11237         Args.push_back(From);
11238       else {
11239         Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
11240         ArgChanged = true;
11241       }
11242       continue;
11243     }
11244 
11245     ArgChanged = true;
11246 
11247     // We have a pack expansion. Instantiate it.
11248     PackExpansionTypeLoc ExpansionTL = FromTL.castAs<PackExpansionTypeLoc>();
11249     TypeLoc PatternTL = ExpansionTL.getPatternLoc();
11250     SmallVector<UnexpandedParameterPack, 2> Unexpanded;
11251     SemaRef.collectUnexpandedParameterPacks(PatternTL, Unexpanded);
11252 
11253     // Determine whether the set of unexpanded parameter packs can and should
11254     // be expanded.
11255     bool Expand = true;
11256     bool RetainExpansion = false;
11257     Optional<unsigned> OrigNumExpansions =
11258         ExpansionTL.getTypePtr()->getNumExpansions();
11259     Optional<unsigned> NumExpansions = OrigNumExpansions;
11260     if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(),
11261                                              PatternTL.getSourceRange(),
11262                                              Unexpanded,
11263                                              Expand, RetainExpansion,
11264                                              NumExpansions))
11265       return ExprError();
11266 
11267     if (!Expand) {
11268       // The transform has determined that we should perform a simple
11269       // transformation on the pack expansion, producing another pack
11270       // expansion.
11271       Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
11272 
11273       TypeLocBuilder TLB;
11274       TLB.reserve(From->getTypeLoc().getFullDataSize());
11275 
11276       QualType To = getDerived().TransformType(TLB, PatternTL);
11277       if (To.isNull())
11278         return ExprError();
11279 
11280       To = getDerived().RebuildPackExpansionType(To,
11281                                                  PatternTL.getSourceRange(),
11282                                                  ExpansionTL.getEllipsisLoc(),
11283                                                  NumExpansions);
11284       if (To.isNull())
11285         return ExprError();
11286 
11287       PackExpansionTypeLoc ToExpansionTL
11288         = TLB.push<PackExpansionTypeLoc>(To);
11289       ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc());
11290       Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
11291       continue;
11292     }
11293 
11294     // Expand the pack expansion by substituting for each argument in the
11295     // pack(s).
11296     for (unsigned I = 0; I != *NumExpansions; ++I) {
11297       Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(SemaRef, I);
11298       TypeLocBuilder TLB;
11299       TLB.reserve(PatternTL.getFullDataSize());
11300       QualType To = getDerived().TransformType(TLB, PatternTL);
11301       if (To.isNull())
11302         return ExprError();
11303 
11304       if (To->containsUnexpandedParameterPack()) {
11305         To = getDerived().RebuildPackExpansionType(To,
11306                                                    PatternTL.getSourceRange(),
11307                                                    ExpansionTL.getEllipsisLoc(),
11308                                                    NumExpansions);
11309         if (To.isNull())
11310           return ExprError();
11311 
11312         PackExpansionTypeLoc ToExpansionTL
11313           = TLB.push<PackExpansionTypeLoc>(To);
11314         ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc());
11315       }
11316 
11317       Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
11318     }
11319 
11320     if (!RetainExpansion)
11321       continue;
11322 
11323     // If we're supposed to retain a pack expansion, do so by temporarily
11324     // forgetting the partially-substituted parameter pack.
11325     ForgetPartiallySubstitutedPackRAII Forget(getDerived());
11326 
11327     TypeLocBuilder TLB;
11328     TLB.reserve(From->getTypeLoc().getFullDataSize());
11329 
11330     QualType To = getDerived().TransformType(TLB, PatternTL);
11331     if (To.isNull())
11332       return ExprError();
11333 
11334     To = getDerived().RebuildPackExpansionType(To,
11335                                                PatternTL.getSourceRange(),
11336                                                ExpansionTL.getEllipsisLoc(),
11337                                                NumExpansions);
11338     if (To.isNull())
11339       return ExprError();
11340 
11341     PackExpansionTypeLoc ToExpansionTL
11342       = TLB.push<PackExpansionTypeLoc>(To);
11343     ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc());
11344     Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
11345   }
11346 
11347   if (!getDerived().AlwaysRebuild() && !ArgChanged)
11348     return E;
11349 
11350   return getDerived().RebuildTypeTrait(E->getTrait(), E->getBeginLoc(), Args,
11351                                        E->getEndLoc());
11352 }
11353 
11354 template<typename Derived>
11355 ExprResult
11356 TreeTransform<Derived>::TransformConceptSpecializationExpr(
11357                                                  ConceptSpecializationExpr *E) {
11358   const ASTTemplateArgumentListInfo *Old = E->getTemplateArgsAsWritten();
11359   TemplateArgumentListInfo TransArgs(Old->LAngleLoc, Old->RAngleLoc);
11360   if (getDerived().TransformTemplateArguments(Old->getTemplateArgs(),
11361                                               Old->NumTemplateArgs, TransArgs))
11362     return ExprError();
11363 
11364   return getDerived().RebuildConceptSpecializationExpr(
11365       E->getNestedNameSpecifierLoc(), E->getTemplateKWLoc(),
11366       E->getConceptNameInfo(), E->getFoundDecl(), E->getNamedConcept(),
11367       &TransArgs);
11368 }
11369 
11370 template<typename Derived>
11371 ExprResult
11372 TreeTransform<Derived>::TransformRequiresExpr(RequiresExpr *E) {
11373   SmallVector<ParmVarDecl*, 4> TransParams;
11374   SmallVector<QualType, 4> TransParamTypes;
11375   Sema::ExtParameterInfoBuilder ExtParamInfos;
11376 
11377   // C++2a [expr.prim.req]p2
11378   // Expressions appearing within a requirement-body are unevaluated operands.
11379   EnterExpressionEvaluationContext Ctx(
11380       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
11381 
11382   RequiresExprBodyDecl *Body = RequiresExprBodyDecl::Create(
11383       getSema().Context, E->getBody()->getDeclContext(),
11384       E->getBody()->getBeginLoc());
11385 
11386   Sema::ContextRAII SavedContext(getSema(), Body, /*NewThisContext*/false);
11387 
11388   if (getDerived().TransformFunctionTypeParams(E->getRequiresKWLoc(),
11389                                                E->getLocalParameters(),
11390                                                /*ParamTypes=*/nullptr,
11391                                                /*ParamInfos=*/nullptr,
11392                                                TransParamTypes, &TransParams,
11393                                                ExtParamInfos))
11394     return ExprError();
11395 
11396   for (ParmVarDecl *Param : TransParams)
11397     Param->setDeclContext(Body);
11398 
11399   SmallVector<concepts::Requirement *, 4> TransReqs;
11400   if (getDerived().TransformRequiresExprRequirements(E->getRequirements(),
11401                                                      TransReqs))
11402     return ExprError();
11403 
11404   for (concepts::Requirement *Req : TransReqs) {
11405     if (auto *ER = dyn_cast<concepts::ExprRequirement>(Req)) {
11406       if (ER->getReturnTypeRequirement().isTypeConstraint()) {
11407         ER->getReturnTypeRequirement()
11408                 .getTypeConstraintTemplateParameterList()->getParam(0)
11409                 ->setDeclContext(Body);
11410       }
11411     }
11412   }
11413 
11414   return getDerived().RebuildRequiresExpr(E->getRequiresKWLoc(), Body,
11415                                           TransParams, TransReqs,
11416                                           E->getRBraceLoc());
11417 }
11418 
11419 template<typename Derived>
11420 bool TreeTransform<Derived>::TransformRequiresExprRequirements(
11421     ArrayRef<concepts::Requirement *> Reqs,
11422     SmallVectorImpl<concepts::Requirement *> &Transformed) {
11423   for (concepts::Requirement *Req : Reqs) {
11424     concepts::Requirement *TransReq = nullptr;
11425     if (auto *TypeReq = dyn_cast<concepts::TypeRequirement>(Req))
11426       TransReq = getDerived().TransformTypeRequirement(TypeReq);
11427     else if (auto *ExprReq = dyn_cast<concepts::ExprRequirement>(Req))
11428       TransReq = getDerived().TransformExprRequirement(ExprReq);
11429     else
11430       TransReq = getDerived().TransformNestedRequirement(
11431                      cast<concepts::NestedRequirement>(Req));
11432     if (!TransReq)
11433       return true;
11434     Transformed.push_back(TransReq);
11435   }
11436   return false;
11437 }
11438 
11439 template<typename Derived>
11440 concepts::TypeRequirement *
11441 TreeTransform<Derived>::TransformTypeRequirement(
11442     concepts::TypeRequirement *Req) {
11443   if (Req->isSubstitutionFailure()) {
11444     if (getDerived().AlwaysRebuild())
11445       return getDerived().RebuildTypeRequirement(
11446               Req->getSubstitutionDiagnostic());
11447     return Req;
11448   }
11449   TypeSourceInfo *TransType = getDerived().TransformType(Req->getType());
11450   if (!TransType)
11451     return nullptr;
11452   return getDerived().RebuildTypeRequirement(TransType);
11453 }
11454 
11455 template<typename Derived>
11456 concepts::ExprRequirement *
11457 TreeTransform<Derived>::TransformExprRequirement(concepts::ExprRequirement *Req) {
11458   llvm::PointerUnion<Expr *, concepts::Requirement::SubstitutionDiagnostic *> TransExpr;
11459   if (Req->isExprSubstitutionFailure())
11460     TransExpr = Req->getExprSubstitutionDiagnostic();
11461   else {
11462     ExprResult TransExprRes = getDerived().TransformExpr(Req->getExpr());
11463     if (TransExprRes.isInvalid())
11464       return nullptr;
11465     TransExpr = TransExprRes.get();
11466   }
11467 
11468   llvm::Optional<concepts::ExprRequirement::ReturnTypeRequirement> TransRetReq;
11469   const auto &RetReq = Req->getReturnTypeRequirement();
11470   if (RetReq.isEmpty())
11471     TransRetReq.emplace();
11472   else if (RetReq.isSubstitutionFailure())
11473     TransRetReq.emplace(RetReq.getSubstitutionDiagnostic());
11474   else if (RetReq.isTypeConstraint()) {
11475     TemplateParameterList *OrigTPL =
11476         RetReq.getTypeConstraintTemplateParameterList();
11477     TemplateParameterList *TPL =
11478         getDerived().TransformTemplateParameterList(OrigTPL);
11479     if (!TPL)
11480       return nullptr;
11481     TransRetReq.emplace(TPL);
11482   }
11483   assert(TransRetReq.hasValue() &&
11484          "All code paths leading here must set TransRetReq");
11485   if (Expr *E = TransExpr.dyn_cast<Expr *>())
11486     return getDerived().RebuildExprRequirement(E, Req->isSimple(),
11487                                                Req->getNoexceptLoc(),
11488                                                std::move(*TransRetReq));
11489   return getDerived().RebuildExprRequirement(
11490       TransExpr.get<concepts::Requirement::SubstitutionDiagnostic *>(),
11491       Req->isSimple(), Req->getNoexceptLoc(), std::move(*TransRetReq));
11492 }
11493 
11494 template<typename Derived>
11495 concepts::NestedRequirement *
11496 TreeTransform<Derived>::TransformNestedRequirement(
11497     concepts::NestedRequirement *Req) {
11498   if (Req->isSubstitutionFailure()) {
11499     if (getDerived().AlwaysRebuild())
11500       return getDerived().RebuildNestedRequirement(
11501           Req->getSubstitutionDiagnostic());
11502     return Req;
11503   }
11504   ExprResult TransConstraint =
11505       getDerived().TransformExpr(Req->getConstraintExpr());
11506   if (TransConstraint.isInvalid())
11507     return nullptr;
11508   return getDerived().RebuildNestedRequirement(TransConstraint.get());
11509 }
11510 
11511 template<typename Derived>
11512 ExprResult
11513 TreeTransform<Derived>::TransformArrayTypeTraitExpr(ArrayTypeTraitExpr *E) {
11514   TypeSourceInfo *T = getDerived().TransformType(E->getQueriedTypeSourceInfo());
11515   if (!T)
11516     return ExprError();
11517 
11518   if (!getDerived().AlwaysRebuild() &&
11519       T == E->getQueriedTypeSourceInfo())
11520     return E;
11521 
11522   ExprResult SubExpr;
11523   {
11524     EnterExpressionEvaluationContext Unevaluated(
11525         SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
11526     SubExpr = getDerived().TransformExpr(E->getDimensionExpression());
11527     if (SubExpr.isInvalid())
11528       return ExprError();
11529 
11530     if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getDimensionExpression())
11531       return E;
11532   }
11533 
11534   return getDerived().RebuildArrayTypeTrait(E->getTrait(), E->getBeginLoc(), T,
11535                                             SubExpr.get(), E->getEndLoc());
11536 }
11537 
11538 template<typename Derived>
11539 ExprResult
11540 TreeTransform<Derived>::TransformExpressionTraitExpr(ExpressionTraitExpr *E) {
11541   ExprResult SubExpr;
11542   {
11543     EnterExpressionEvaluationContext Unevaluated(
11544         SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
11545     SubExpr = getDerived().TransformExpr(E->getQueriedExpression());
11546     if (SubExpr.isInvalid())
11547       return ExprError();
11548 
11549     if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getQueriedExpression())
11550       return E;
11551   }
11552 
11553   return getDerived().RebuildExpressionTrait(E->getTrait(), E->getBeginLoc(),
11554                                              SubExpr.get(), E->getEndLoc());
11555 }
11556 
11557 template <typename Derived>
11558 ExprResult TreeTransform<Derived>::TransformParenDependentScopeDeclRefExpr(
11559     ParenExpr *PE, DependentScopeDeclRefExpr *DRE, bool AddrTaken,
11560     TypeSourceInfo **RecoveryTSI) {
11561   ExprResult NewDRE = getDerived().TransformDependentScopeDeclRefExpr(
11562       DRE, AddrTaken, RecoveryTSI);
11563 
11564   // Propagate both errors and recovered types, which return ExprEmpty.
11565   if (!NewDRE.isUsable())
11566     return NewDRE;
11567 
11568   // We got an expr, wrap it up in parens.
11569   if (!getDerived().AlwaysRebuild() && NewDRE.get() == DRE)
11570     return PE;
11571   return getDerived().RebuildParenExpr(NewDRE.get(), PE->getLParen(),
11572                                        PE->getRParen());
11573 }
11574 
11575 template <typename Derived>
11576 ExprResult TreeTransform<Derived>::TransformDependentScopeDeclRefExpr(
11577     DependentScopeDeclRefExpr *E) {
11578   return TransformDependentScopeDeclRefExpr(E, /*IsAddressOfOperand=*/false,
11579                                             nullptr);
11580 }
11581 
11582 template<typename Derived>
11583 ExprResult
11584 TreeTransform<Derived>::TransformDependentScopeDeclRefExpr(
11585                                                DependentScopeDeclRefExpr *E,
11586                                                bool IsAddressOfOperand,
11587                                                TypeSourceInfo **RecoveryTSI) {
11588   assert(E->getQualifierLoc());
11589   NestedNameSpecifierLoc QualifierLoc
11590   = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
11591   if (!QualifierLoc)
11592     return ExprError();
11593   SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc();
11594 
11595   // TODO: If this is a conversion-function-id, verify that the
11596   // destination type name (if present) resolves the same way after
11597   // instantiation as it did in the local scope.
11598 
11599   DeclarationNameInfo NameInfo
11600     = getDerived().TransformDeclarationNameInfo(E->getNameInfo());
11601   if (!NameInfo.getName())
11602     return ExprError();
11603 
11604   if (!E->hasExplicitTemplateArgs()) {
11605     if (!getDerived().AlwaysRebuild() &&
11606         QualifierLoc == E->getQualifierLoc() &&
11607         // Note: it is sufficient to compare the Name component of NameInfo:
11608         // if name has not changed, DNLoc has not changed either.
11609         NameInfo.getName() == E->getDeclName())
11610       return E;
11611 
11612     return getDerived().RebuildDependentScopeDeclRefExpr(
11613         QualifierLoc, TemplateKWLoc, NameInfo, /*TemplateArgs=*/nullptr,
11614         IsAddressOfOperand, RecoveryTSI);
11615   }
11616 
11617   TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc());
11618   if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
11619                                               E->getNumTemplateArgs(),
11620                                               TransArgs))
11621     return ExprError();
11622 
11623   return getDerived().RebuildDependentScopeDeclRefExpr(
11624       QualifierLoc, TemplateKWLoc, NameInfo, &TransArgs, IsAddressOfOperand,
11625       RecoveryTSI);
11626 }
11627 
11628 template<typename Derived>
11629 ExprResult
11630 TreeTransform<Derived>::TransformCXXConstructExpr(CXXConstructExpr *E) {
11631   // CXXConstructExprs other than for list-initialization and
11632   // CXXTemporaryObjectExpr are always implicit, so when we have
11633   // a 1-argument construction we just transform that argument.
11634   if ((E->getNumArgs() == 1 ||
11635        (E->getNumArgs() > 1 && getDerived().DropCallArgument(E->getArg(1)))) &&
11636       (!getDerived().DropCallArgument(E->getArg(0))) &&
11637       !E->isListInitialization())
11638     return getDerived().TransformExpr(E->getArg(0));
11639 
11640   TemporaryBase Rebase(*this, /*FIXME*/ E->getBeginLoc(), DeclarationName());
11641 
11642   QualType T = getDerived().TransformType(E->getType());
11643   if (T.isNull())
11644     return ExprError();
11645 
11646   CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>(
11647       getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor()));
11648   if (!Constructor)
11649     return ExprError();
11650 
11651   bool ArgumentChanged = false;
11652   SmallVector<Expr*, 8> Args;
11653   {
11654     EnterExpressionEvaluationContext Context(
11655         getSema(), EnterExpressionEvaluationContext::InitList,
11656         E->isListInitialization());
11657     if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
11658                                     &ArgumentChanged))
11659       return ExprError();
11660   }
11661 
11662   if (!getDerived().AlwaysRebuild() &&
11663       T == E->getType() &&
11664       Constructor == E->getConstructor() &&
11665       !ArgumentChanged) {
11666     // Mark the constructor as referenced.
11667     // FIXME: Instantiation-specific
11668     SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor);
11669     return E;
11670   }
11671 
11672   return getDerived().RebuildCXXConstructExpr(
11673       T, /*FIXME:*/ E->getBeginLoc(), Constructor, E->isElidable(), Args,
11674       E->hadMultipleCandidates(), E->isListInitialization(),
11675       E->isStdInitListInitialization(), E->requiresZeroInitialization(),
11676       E->getConstructionKind(), E->getParenOrBraceRange());
11677 }
11678 
11679 template<typename Derived>
11680 ExprResult TreeTransform<Derived>::TransformCXXInheritedCtorInitExpr(
11681     CXXInheritedCtorInitExpr *E) {
11682   QualType T = getDerived().TransformType(E->getType());
11683   if (T.isNull())
11684     return ExprError();
11685 
11686   CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>(
11687       getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor()));
11688   if (!Constructor)
11689     return ExprError();
11690 
11691   if (!getDerived().AlwaysRebuild() &&
11692       T == E->getType() &&
11693       Constructor == E->getConstructor()) {
11694     // Mark the constructor as referenced.
11695     // FIXME: Instantiation-specific
11696     SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor);
11697     return E;
11698   }
11699 
11700   return getDerived().RebuildCXXInheritedCtorInitExpr(
11701       T, E->getLocation(), Constructor,
11702       E->constructsVBase(), E->inheritedFromVBase());
11703 }
11704 
11705 /// Transform a C++ temporary-binding expression.
11706 ///
11707 /// Since CXXBindTemporaryExpr nodes are implicitly generated, we just
11708 /// transform the subexpression and return that.
11709 template<typename Derived>
11710 ExprResult
11711 TreeTransform<Derived>::TransformCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) {
11712   return getDerived().TransformExpr(E->getSubExpr());
11713 }
11714 
11715 /// Transform a C++ expression that contains cleanups that should
11716 /// be run after the expression is evaluated.
11717 ///
11718 /// Since ExprWithCleanups nodes are implicitly generated, we
11719 /// just transform the subexpression and return that.
11720 template<typename Derived>
11721 ExprResult
11722 TreeTransform<Derived>::TransformExprWithCleanups(ExprWithCleanups *E) {
11723   return getDerived().TransformExpr(E->getSubExpr());
11724 }
11725 
11726 template<typename Derived>
11727 ExprResult
11728 TreeTransform<Derived>::TransformCXXTemporaryObjectExpr(
11729                                                     CXXTemporaryObjectExpr *E) {
11730   TypeSourceInfo *T =
11731       getDerived().TransformTypeWithDeducedTST(E->getTypeSourceInfo());
11732   if (!T)
11733     return ExprError();
11734 
11735   CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>(
11736       getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor()));
11737   if (!Constructor)
11738     return ExprError();
11739 
11740   bool ArgumentChanged = false;
11741   SmallVector<Expr*, 8> Args;
11742   Args.reserve(E->getNumArgs());
11743   {
11744     EnterExpressionEvaluationContext Context(
11745         getSema(), EnterExpressionEvaluationContext::InitList,
11746         E->isListInitialization());
11747     if (TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
11748                        &ArgumentChanged))
11749       return ExprError();
11750   }
11751 
11752   if (!getDerived().AlwaysRebuild() &&
11753       T == E->getTypeSourceInfo() &&
11754       Constructor == E->getConstructor() &&
11755       !ArgumentChanged) {
11756     // FIXME: Instantiation-specific
11757     SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor);
11758     return SemaRef.MaybeBindToTemporary(E);
11759   }
11760 
11761   // FIXME: We should just pass E->isListInitialization(), but we're not
11762   // prepared to handle list-initialization without a child InitListExpr.
11763   SourceLocation LParenLoc = T->getTypeLoc().getEndLoc();
11764   return getDerived().RebuildCXXTemporaryObjectExpr(
11765       T, LParenLoc, Args, E->getEndLoc(),
11766       /*ListInitialization=*/LParenLoc.isInvalid());
11767 }
11768 
11769 template<typename Derived>
11770 ExprResult
11771 TreeTransform<Derived>::TransformLambdaExpr(LambdaExpr *E) {
11772   // Transform any init-capture expressions before entering the scope of the
11773   // lambda body, because they are not semantically within that scope.
11774   typedef std::pair<ExprResult, QualType> InitCaptureInfoTy;
11775   struct TransformedInitCapture {
11776     // The location of the ... if the result is retaining a pack expansion.
11777     SourceLocation EllipsisLoc;
11778     // Zero or more expansions of the init-capture.
11779     SmallVector<InitCaptureInfoTy, 4> Expansions;
11780   };
11781   SmallVector<TransformedInitCapture, 4> InitCaptures;
11782   InitCaptures.resize(E->explicit_capture_end() - E->explicit_capture_begin());
11783   for (LambdaExpr::capture_iterator C = E->capture_begin(),
11784                                     CEnd = E->capture_end();
11785        C != CEnd; ++C) {
11786     if (!E->isInitCapture(C))
11787       continue;
11788 
11789     TransformedInitCapture &Result = InitCaptures[C - E->capture_begin()];
11790     VarDecl *OldVD = C->getCapturedVar();
11791 
11792     auto SubstInitCapture = [&](SourceLocation EllipsisLoc,
11793                                 Optional<unsigned> NumExpansions) {
11794       ExprResult NewExprInitResult = getDerived().TransformInitializer(
11795           OldVD->getInit(), OldVD->getInitStyle() == VarDecl::CallInit);
11796 
11797       if (NewExprInitResult.isInvalid()) {
11798         Result.Expansions.push_back(InitCaptureInfoTy(ExprError(), QualType()));
11799         return;
11800       }
11801       Expr *NewExprInit = NewExprInitResult.get();
11802 
11803       QualType NewInitCaptureType =
11804           getSema().buildLambdaInitCaptureInitialization(
11805               C->getLocation(), OldVD->getType()->isReferenceType(),
11806               EllipsisLoc, NumExpansions, OldVD->getIdentifier(),
11807               C->getCapturedVar()->getInitStyle() != VarDecl::CInit,
11808               NewExprInit);
11809       Result.Expansions.push_back(
11810           InitCaptureInfoTy(NewExprInit, NewInitCaptureType));
11811     };
11812 
11813     // If this is an init-capture pack, consider expanding the pack now.
11814     if (OldVD->isParameterPack()) {
11815       PackExpansionTypeLoc ExpansionTL = OldVD->getTypeSourceInfo()
11816                                              ->getTypeLoc()
11817                                              .castAs<PackExpansionTypeLoc>();
11818       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
11819       SemaRef.collectUnexpandedParameterPacks(OldVD->getInit(), Unexpanded);
11820 
11821       // Determine whether the set of unexpanded parameter packs can and should
11822       // be expanded.
11823       bool Expand = true;
11824       bool RetainExpansion = false;
11825       Optional<unsigned> OrigNumExpansions =
11826           ExpansionTL.getTypePtr()->getNumExpansions();
11827       Optional<unsigned> NumExpansions = OrigNumExpansions;
11828       if (getDerived().TryExpandParameterPacks(
11829               ExpansionTL.getEllipsisLoc(),
11830               OldVD->getInit()->getSourceRange(), Unexpanded, Expand,
11831               RetainExpansion, NumExpansions))
11832         return ExprError();
11833       if (Expand) {
11834         for (unsigned I = 0; I != *NumExpansions; ++I) {
11835           Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
11836           SubstInitCapture(SourceLocation(), None);
11837         }
11838       }
11839       if (!Expand || RetainExpansion) {
11840         ForgetPartiallySubstitutedPackRAII Forget(getDerived());
11841         SubstInitCapture(ExpansionTL.getEllipsisLoc(), NumExpansions);
11842         Result.EllipsisLoc = ExpansionTL.getEllipsisLoc();
11843       }
11844     } else {
11845       SubstInitCapture(SourceLocation(), None);
11846     }
11847   }
11848 
11849   LambdaScopeInfo *LSI = getSema().PushLambdaScope();
11850   Sema::FunctionScopeRAII FuncScopeCleanup(getSema());
11851 
11852   // Transform the template parameters, and add them to the current
11853   // instantiation scope. The null case is handled correctly.
11854   auto TPL = getDerived().TransformTemplateParameterList(
11855       E->getTemplateParameterList());
11856   LSI->GLTemplateParameterList = TPL;
11857 
11858   // Transform the type of the original lambda's call operator.
11859   // The transformation MUST be done in the CurrentInstantiationScope since
11860   // it introduces a mapping of the original to the newly created
11861   // transformed parameters.
11862   TypeSourceInfo *NewCallOpTSI = nullptr;
11863   {
11864     TypeSourceInfo *OldCallOpTSI = E->getCallOperator()->getTypeSourceInfo();
11865     FunctionProtoTypeLoc OldCallOpFPTL =
11866         OldCallOpTSI->getTypeLoc().getAs<FunctionProtoTypeLoc>();
11867 
11868     TypeLocBuilder NewCallOpTLBuilder;
11869     SmallVector<QualType, 4> ExceptionStorage;
11870     TreeTransform *This = this; // Work around gcc.gnu.org/PR56135.
11871     QualType NewCallOpType = TransformFunctionProtoType(
11872         NewCallOpTLBuilder, OldCallOpFPTL, nullptr, Qualifiers(),
11873         [&](FunctionProtoType::ExceptionSpecInfo &ESI, bool &Changed) {
11874           return This->TransformExceptionSpec(OldCallOpFPTL.getBeginLoc(), ESI,
11875                                               ExceptionStorage, Changed);
11876         });
11877     if (NewCallOpType.isNull())
11878       return ExprError();
11879     NewCallOpTSI = NewCallOpTLBuilder.getTypeSourceInfo(getSema().Context,
11880                                                         NewCallOpType);
11881   }
11882 
11883   // Transform the trailing requires clause
11884   ExprResult NewTrailingRequiresClause;
11885   if (Expr *TRC = E->getCallOperator()->getTrailingRequiresClause())
11886     // FIXME: Concepts: Substitution into requires clause should only happen
11887     //                  when checking satisfaction.
11888     NewTrailingRequiresClause = getDerived().TransformExpr(TRC);
11889 
11890   // Create the local class that will describe the lambda.
11891   CXXRecordDecl *OldClass = E->getLambdaClass();
11892   CXXRecordDecl *Class
11893     = getSema().createLambdaClosureType(E->getIntroducerRange(),
11894                                         NewCallOpTSI,
11895                                         /*KnownDependent=*/false,
11896                                         E->getCaptureDefault());
11897   getDerived().transformedLocalDecl(OldClass, {Class});
11898 
11899   Optional<std::tuple<unsigned, bool, Decl *>> Mangling;
11900   if (getDerived().ReplacingOriginal())
11901     Mangling = std::make_tuple(OldClass->getLambdaManglingNumber(),
11902                                OldClass->hasKnownLambdaInternalLinkage(),
11903                                OldClass->getLambdaContextDecl());
11904 
11905   // Build the call operator.
11906   CXXMethodDecl *NewCallOperator = getSema().startLambdaDefinition(
11907       Class, E->getIntroducerRange(), NewCallOpTSI,
11908       E->getCallOperator()->getEndLoc(),
11909       NewCallOpTSI->getTypeLoc().castAs<FunctionProtoTypeLoc>().getParams(),
11910       E->getCallOperator()->getConstexprKind(),
11911       NewTrailingRequiresClause.get());
11912 
11913   LSI->CallOperator = NewCallOperator;
11914 
11915   for (unsigned I = 0, NumParams = NewCallOperator->getNumParams();
11916        I != NumParams; ++I) {
11917     auto *P = NewCallOperator->getParamDecl(I);
11918     if (P->hasUninstantiatedDefaultArg()) {
11919       EnterExpressionEvaluationContext Eval(
11920           getSema(),
11921           Sema::ExpressionEvaluationContext::PotentiallyEvaluatedIfUsed, P);
11922       ExprResult R = getDerived().TransformExpr(
11923           E->getCallOperator()->getParamDecl(I)->getDefaultArg());
11924       P->setDefaultArg(R.get());
11925     }
11926   }
11927 
11928   getDerived().transformAttrs(E->getCallOperator(), NewCallOperator);
11929   getDerived().transformedLocalDecl(E->getCallOperator(), {NewCallOperator});
11930 
11931   // Number the lambda for linkage purposes if necessary.
11932   getSema().handleLambdaNumbering(Class, NewCallOperator, Mangling);
11933 
11934   // Introduce the context of the call operator.
11935   Sema::ContextRAII SavedContext(getSema(), NewCallOperator,
11936                                  /*NewThisContext*/false);
11937 
11938   // Enter the scope of the lambda.
11939   getSema().buildLambdaScope(LSI, NewCallOperator,
11940                              E->getIntroducerRange(),
11941                              E->getCaptureDefault(),
11942                              E->getCaptureDefaultLoc(),
11943                              E->hasExplicitParameters(),
11944                              E->hasExplicitResultType(),
11945                              E->isMutable());
11946 
11947   bool Invalid = false;
11948 
11949   // Transform captures.
11950   for (LambdaExpr::capture_iterator C = E->capture_begin(),
11951                                  CEnd = E->capture_end();
11952        C != CEnd; ++C) {
11953     // When we hit the first implicit capture, tell Sema that we've finished
11954     // the list of explicit captures.
11955     if (C->isImplicit())
11956       break;
11957 
11958     // Capturing 'this' is trivial.
11959     if (C->capturesThis()) {
11960       getSema().CheckCXXThisCapture(C->getLocation(), C->isExplicit(),
11961                                     /*BuildAndDiagnose*/ true, nullptr,
11962                                     C->getCaptureKind() == LCK_StarThis);
11963       continue;
11964     }
11965     // Captured expression will be recaptured during captured variables
11966     // rebuilding.
11967     if (C->capturesVLAType())
11968       continue;
11969 
11970     // Rebuild init-captures, including the implied field declaration.
11971     if (E->isInitCapture(C)) {
11972       TransformedInitCapture &NewC = InitCaptures[C - E->capture_begin()];
11973 
11974       VarDecl *OldVD = C->getCapturedVar();
11975       llvm::SmallVector<Decl*, 4> NewVDs;
11976 
11977       for (InitCaptureInfoTy &Info : NewC.Expansions) {
11978         ExprResult Init = Info.first;
11979         QualType InitQualType = Info.second;
11980         if (Init.isInvalid() || InitQualType.isNull()) {
11981           Invalid = true;
11982           break;
11983         }
11984         VarDecl *NewVD = getSema().createLambdaInitCaptureVarDecl(
11985             OldVD->getLocation(), InitQualType, NewC.EllipsisLoc,
11986             OldVD->getIdentifier(), OldVD->getInitStyle(), Init.get());
11987         if (!NewVD) {
11988           Invalid = true;
11989           break;
11990         }
11991         NewVDs.push_back(NewVD);
11992         getSema().addInitCapture(LSI, NewVD);
11993       }
11994 
11995       if (Invalid)
11996         break;
11997 
11998       getDerived().transformedLocalDecl(OldVD, NewVDs);
11999       continue;
12000     }
12001 
12002     assert(C->capturesVariable() && "unexpected kind of lambda capture");
12003 
12004     // Determine the capture kind for Sema.
12005     Sema::TryCaptureKind Kind
12006       = C->isImplicit()? Sema::TryCapture_Implicit
12007                        : C->getCaptureKind() == LCK_ByCopy
12008                            ? Sema::TryCapture_ExplicitByVal
12009                            : Sema::TryCapture_ExplicitByRef;
12010     SourceLocation EllipsisLoc;
12011     if (C->isPackExpansion()) {
12012       UnexpandedParameterPack Unexpanded(C->getCapturedVar(), C->getLocation());
12013       bool ShouldExpand = false;
12014       bool RetainExpansion = false;
12015       Optional<unsigned> NumExpansions;
12016       if (getDerived().TryExpandParameterPacks(C->getEllipsisLoc(),
12017                                                C->getLocation(),
12018                                                Unexpanded,
12019                                                ShouldExpand, RetainExpansion,
12020                                                NumExpansions)) {
12021         Invalid = true;
12022         continue;
12023       }
12024 
12025       if (ShouldExpand) {
12026         // The transform has determined that we should perform an expansion;
12027         // transform and capture each of the arguments.
12028         // expansion of the pattern. Do so.
12029         VarDecl *Pack = C->getCapturedVar();
12030         for (unsigned I = 0; I != *NumExpansions; ++I) {
12031           Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
12032           VarDecl *CapturedVar
12033             = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(),
12034                                                                Pack));
12035           if (!CapturedVar) {
12036             Invalid = true;
12037             continue;
12038           }
12039 
12040           // Capture the transformed variable.
12041           getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind);
12042         }
12043 
12044         // FIXME: Retain a pack expansion if RetainExpansion is true.
12045 
12046         continue;
12047       }
12048 
12049       EllipsisLoc = C->getEllipsisLoc();
12050     }
12051 
12052     // Transform the captured variable.
12053     VarDecl *CapturedVar
12054       = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(),
12055                                                          C->getCapturedVar()));
12056     if (!CapturedVar || CapturedVar->isInvalidDecl()) {
12057       Invalid = true;
12058       continue;
12059     }
12060 
12061     // Capture the transformed variable.
12062     getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind,
12063                                  EllipsisLoc);
12064   }
12065   getSema().finishLambdaExplicitCaptures(LSI);
12066 
12067   // FIXME: Sema's lambda-building mechanism expects us to push an expression
12068   // evaluation context even if we're not transforming the function body.
12069   getSema().PushExpressionEvaluationContext(
12070       Sema::ExpressionEvaluationContext::PotentiallyEvaluated);
12071 
12072   // Instantiate the body of the lambda expression.
12073   StmtResult Body =
12074       Invalid ? StmtError() : getDerived().TransformLambdaBody(E, E->getBody());
12075 
12076   // ActOnLambda* will pop the function scope for us.
12077   FuncScopeCleanup.disable();
12078 
12079   if (Body.isInvalid()) {
12080     SavedContext.pop();
12081     getSema().ActOnLambdaError(E->getBeginLoc(), /*CurScope=*/nullptr,
12082                                /*IsInstantiation=*/true);
12083     return ExprError();
12084   }
12085 
12086   // Copy the LSI before ActOnFinishFunctionBody removes it.
12087   // FIXME: This is dumb. Store the lambda information somewhere that outlives
12088   // the call operator.
12089   auto LSICopy = *LSI;
12090   getSema().ActOnFinishFunctionBody(NewCallOperator, Body.get(),
12091                                     /*IsInstantiation*/ true);
12092   SavedContext.pop();
12093 
12094   return getSema().BuildLambdaExpr(E->getBeginLoc(), Body.get()->getEndLoc(),
12095                                    &LSICopy);
12096 }
12097 
12098 template<typename Derived>
12099 StmtResult
12100 TreeTransform<Derived>::TransformLambdaBody(LambdaExpr *E, Stmt *S) {
12101   return TransformStmt(S);
12102 }
12103 
12104 template<typename Derived>
12105 StmtResult
12106 TreeTransform<Derived>::SkipLambdaBody(LambdaExpr *E, Stmt *S) {
12107   // Transform captures.
12108   for (LambdaExpr::capture_iterator C = E->capture_begin(),
12109                                  CEnd = E->capture_end();
12110        C != CEnd; ++C) {
12111     // When we hit the first implicit capture, tell Sema that we've finished
12112     // the list of explicit captures.
12113     if (!C->isImplicit())
12114       continue;
12115 
12116     // Capturing 'this' is trivial.
12117     if (C->capturesThis()) {
12118       getSema().CheckCXXThisCapture(C->getLocation(), C->isExplicit(),
12119                                     /*BuildAndDiagnose*/ true, nullptr,
12120                                     C->getCaptureKind() == LCK_StarThis);
12121       continue;
12122     }
12123     // Captured expression will be recaptured during captured variables
12124     // rebuilding.
12125     if (C->capturesVLAType())
12126       continue;
12127 
12128     assert(C->capturesVariable() && "unexpected kind of lambda capture");
12129     assert(!E->isInitCapture(C) && "implicit init-capture?");
12130 
12131     // Transform the captured variable.
12132     VarDecl *CapturedVar = cast_or_null<VarDecl>(
12133         getDerived().TransformDecl(C->getLocation(), C->getCapturedVar()));
12134     if (!CapturedVar || CapturedVar->isInvalidDecl())
12135       return StmtError();
12136 
12137     // Capture the transformed variable.
12138     getSema().tryCaptureVariable(CapturedVar, C->getLocation());
12139   }
12140 
12141   return S;
12142 }
12143 
12144 template<typename Derived>
12145 ExprResult
12146 TreeTransform<Derived>::TransformCXXUnresolvedConstructExpr(
12147                                                   CXXUnresolvedConstructExpr *E) {
12148   TypeSourceInfo *T =
12149       getDerived().TransformTypeWithDeducedTST(E->getTypeSourceInfo());
12150   if (!T)
12151     return ExprError();
12152 
12153   bool ArgumentChanged = false;
12154   SmallVector<Expr*, 8> Args;
12155   Args.reserve(E->arg_size());
12156   {
12157     EnterExpressionEvaluationContext Context(
12158         getSema(), EnterExpressionEvaluationContext::InitList,
12159         E->isListInitialization());
12160     if (getDerived().TransformExprs(E->arg_begin(), E->arg_size(), true, Args,
12161                                     &ArgumentChanged))
12162       return ExprError();
12163   }
12164 
12165   if (!getDerived().AlwaysRebuild() &&
12166       T == E->getTypeSourceInfo() &&
12167       !ArgumentChanged)
12168     return E;
12169 
12170   // FIXME: we're faking the locations of the commas
12171   return getDerived().RebuildCXXUnresolvedConstructExpr(
12172       T, E->getLParenLoc(), Args, E->getRParenLoc(), E->isListInitialization());
12173 }
12174 
12175 template<typename Derived>
12176 ExprResult
12177 TreeTransform<Derived>::TransformCXXDependentScopeMemberExpr(
12178                                              CXXDependentScopeMemberExpr *E) {
12179   // Transform the base of the expression.
12180   ExprResult Base((Expr*) nullptr);
12181   Expr *OldBase;
12182   QualType BaseType;
12183   QualType ObjectType;
12184   if (!E->isImplicitAccess()) {
12185     OldBase = E->getBase();
12186     Base = getDerived().TransformExpr(OldBase);
12187     if (Base.isInvalid())
12188       return ExprError();
12189 
12190     // Start the member reference and compute the object's type.
12191     ParsedType ObjectTy;
12192     bool MayBePseudoDestructor = false;
12193     Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(),
12194                                                 E->getOperatorLoc(),
12195                                       E->isArrow()? tok::arrow : tok::period,
12196                                                 ObjectTy,
12197                                                 MayBePseudoDestructor);
12198     if (Base.isInvalid())
12199       return ExprError();
12200 
12201     ObjectType = ObjectTy.get();
12202     BaseType = ((Expr*) Base.get())->getType();
12203   } else {
12204     OldBase = nullptr;
12205     BaseType = getDerived().TransformType(E->getBaseType());
12206     ObjectType = BaseType->castAs<PointerType>()->getPointeeType();
12207   }
12208 
12209   // Transform the first part of the nested-name-specifier that qualifies
12210   // the member name.
12211   NamedDecl *FirstQualifierInScope
12212     = getDerived().TransformFirstQualifierInScope(
12213                                             E->getFirstQualifierFoundInScope(),
12214                                             E->getQualifierLoc().getBeginLoc());
12215 
12216   NestedNameSpecifierLoc QualifierLoc;
12217   if (E->getQualifier()) {
12218     QualifierLoc
12219       = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc(),
12220                                                      ObjectType,
12221                                                      FirstQualifierInScope);
12222     if (!QualifierLoc)
12223       return ExprError();
12224   }
12225 
12226   SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc();
12227 
12228   // TODO: If this is a conversion-function-id, verify that the
12229   // destination type name (if present) resolves the same way after
12230   // instantiation as it did in the local scope.
12231 
12232   DeclarationNameInfo NameInfo
12233     = getDerived().TransformDeclarationNameInfo(E->getMemberNameInfo());
12234   if (!NameInfo.getName())
12235     return ExprError();
12236 
12237   if (!E->hasExplicitTemplateArgs()) {
12238     // This is a reference to a member without an explicitly-specified
12239     // template argument list. Optimize for this common case.
12240     if (!getDerived().AlwaysRebuild() &&
12241         Base.get() == OldBase &&
12242         BaseType == E->getBaseType() &&
12243         QualifierLoc == E->getQualifierLoc() &&
12244         NameInfo.getName() == E->getMember() &&
12245         FirstQualifierInScope == E->getFirstQualifierFoundInScope())
12246       return E;
12247 
12248     return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(),
12249                                                        BaseType,
12250                                                        E->isArrow(),
12251                                                        E->getOperatorLoc(),
12252                                                        QualifierLoc,
12253                                                        TemplateKWLoc,
12254                                                        FirstQualifierInScope,
12255                                                        NameInfo,
12256                                                        /*TemplateArgs*/nullptr);
12257   }
12258 
12259   TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc());
12260   if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
12261                                               E->getNumTemplateArgs(),
12262                                               TransArgs))
12263     return ExprError();
12264 
12265   return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(),
12266                                                      BaseType,
12267                                                      E->isArrow(),
12268                                                      E->getOperatorLoc(),
12269                                                      QualifierLoc,
12270                                                      TemplateKWLoc,
12271                                                      FirstQualifierInScope,
12272                                                      NameInfo,
12273                                                      &TransArgs);
12274 }
12275 
12276 template<typename Derived>
12277 ExprResult
12278 TreeTransform<Derived>::TransformUnresolvedMemberExpr(UnresolvedMemberExpr *Old) {
12279   // Transform the base of the expression.
12280   ExprResult Base((Expr*) nullptr);
12281   QualType BaseType;
12282   if (!Old->isImplicitAccess()) {
12283     Base = getDerived().TransformExpr(Old->getBase());
12284     if (Base.isInvalid())
12285       return ExprError();
12286     Base = getSema().PerformMemberExprBaseConversion(Base.get(),
12287                                                      Old->isArrow());
12288     if (Base.isInvalid())
12289       return ExprError();
12290     BaseType = Base.get()->getType();
12291   } else {
12292     BaseType = getDerived().TransformType(Old->getBaseType());
12293   }
12294 
12295   NestedNameSpecifierLoc QualifierLoc;
12296   if (Old->getQualifierLoc()) {
12297     QualifierLoc
12298     = getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc());
12299     if (!QualifierLoc)
12300       return ExprError();
12301   }
12302 
12303   SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc();
12304 
12305   LookupResult R(SemaRef, Old->getMemberNameInfo(),
12306                  Sema::LookupOrdinaryName);
12307 
12308   // Transform the declaration set.
12309   if (TransformOverloadExprDecls(Old, /*RequiresADL*/false, R))
12310     return ExprError();
12311 
12312   // Determine the naming class.
12313   if (Old->getNamingClass()) {
12314     CXXRecordDecl *NamingClass
12315       = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl(
12316                                                           Old->getMemberLoc(),
12317                                                         Old->getNamingClass()));
12318     if (!NamingClass)
12319       return ExprError();
12320 
12321     R.setNamingClass(NamingClass);
12322   }
12323 
12324   TemplateArgumentListInfo TransArgs;
12325   if (Old->hasExplicitTemplateArgs()) {
12326     TransArgs.setLAngleLoc(Old->getLAngleLoc());
12327     TransArgs.setRAngleLoc(Old->getRAngleLoc());
12328     if (getDerived().TransformTemplateArguments(Old->getTemplateArgs(),
12329                                                 Old->getNumTemplateArgs(),
12330                                                 TransArgs))
12331       return ExprError();
12332   }
12333 
12334   // FIXME: to do this check properly, we will need to preserve the
12335   // first-qualifier-in-scope here, just in case we had a dependent
12336   // base (and therefore couldn't do the check) and a
12337   // nested-name-qualifier (and therefore could do the lookup).
12338   NamedDecl *FirstQualifierInScope = nullptr;
12339 
12340   return getDerived().RebuildUnresolvedMemberExpr(Base.get(),
12341                                                   BaseType,
12342                                                   Old->getOperatorLoc(),
12343                                                   Old->isArrow(),
12344                                                   QualifierLoc,
12345                                                   TemplateKWLoc,
12346                                                   FirstQualifierInScope,
12347                                                   R,
12348                                               (Old->hasExplicitTemplateArgs()
12349                                                   ? &TransArgs : nullptr));
12350 }
12351 
12352 template<typename Derived>
12353 ExprResult
12354 TreeTransform<Derived>::TransformCXXNoexceptExpr(CXXNoexceptExpr *E) {
12355   EnterExpressionEvaluationContext Unevaluated(
12356       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
12357   ExprResult SubExpr = getDerived().TransformExpr(E->getOperand());
12358   if (SubExpr.isInvalid())
12359     return ExprError();
12360 
12361   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getOperand())
12362     return E;
12363 
12364   return getDerived().RebuildCXXNoexceptExpr(E->getSourceRange(),SubExpr.get());
12365 }
12366 
12367 template<typename Derived>
12368 ExprResult
12369 TreeTransform<Derived>::TransformPackExpansionExpr(PackExpansionExpr *E) {
12370   ExprResult Pattern = getDerived().TransformExpr(E->getPattern());
12371   if (Pattern.isInvalid())
12372     return ExprError();
12373 
12374   if (!getDerived().AlwaysRebuild() && Pattern.get() == E->getPattern())
12375     return E;
12376 
12377   return getDerived().RebuildPackExpansion(Pattern.get(), E->getEllipsisLoc(),
12378                                            E->getNumExpansions());
12379 }
12380 
12381 template<typename Derived>
12382 ExprResult
12383 TreeTransform<Derived>::TransformSizeOfPackExpr(SizeOfPackExpr *E) {
12384   // If E is not value-dependent, then nothing will change when we transform it.
12385   // Note: This is an instantiation-centric view.
12386   if (!E->isValueDependent())
12387     return E;
12388 
12389   EnterExpressionEvaluationContext Unevaluated(
12390       getSema(), Sema::ExpressionEvaluationContext::Unevaluated);
12391 
12392   ArrayRef<TemplateArgument> PackArgs;
12393   TemplateArgument ArgStorage;
12394 
12395   // Find the argument list to transform.
12396   if (E->isPartiallySubstituted()) {
12397     PackArgs = E->getPartialArguments();
12398   } else if (E->isValueDependent()) {
12399     UnexpandedParameterPack Unexpanded(E->getPack(), E->getPackLoc());
12400     bool ShouldExpand = false;
12401     bool RetainExpansion = false;
12402     Optional<unsigned> NumExpansions;
12403     if (getDerived().TryExpandParameterPacks(E->getOperatorLoc(), E->getPackLoc(),
12404                                              Unexpanded,
12405                                              ShouldExpand, RetainExpansion,
12406                                              NumExpansions))
12407       return ExprError();
12408 
12409     // If we need to expand the pack, build a template argument from it and
12410     // expand that.
12411     if (ShouldExpand) {
12412       auto *Pack = E->getPack();
12413       if (auto *TTPD = dyn_cast<TemplateTypeParmDecl>(Pack)) {
12414         ArgStorage = getSema().Context.getPackExpansionType(
12415             getSema().Context.getTypeDeclType(TTPD), None);
12416       } else if (auto *TTPD = dyn_cast<TemplateTemplateParmDecl>(Pack)) {
12417         ArgStorage = TemplateArgument(TemplateName(TTPD), None);
12418       } else {
12419         auto *VD = cast<ValueDecl>(Pack);
12420         ExprResult DRE = getSema().BuildDeclRefExpr(
12421             VD, VD->getType().getNonLValueExprType(getSema().Context),
12422             VD->getType()->isReferenceType() ? VK_LValue : VK_RValue,
12423             E->getPackLoc());
12424         if (DRE.isInvalid())
12425           return ExprError();
12426         ArgStorage = new (getSema().Context) PackExpansionExpr(
12427             getSema().Context.DependentTy, DRE.get(), E->getPackLoc(), None);
12428       }
12429       PackArgs = ArgStorage;
12430     }
12431   }
12432 
12433   // If we're not expanding the pack, just transform the decl.
12434   if (!PackArgs.size()) {
12435     auto *Pack = cast_or_null<NamedDecl>(
12436         getDerived().TransformDecl(E->getPackLoc(), E->getPack()));
12437     if (!Pack)
12438       return ExprError();
12439     return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), Pack,
12440                                               E->getPackLoc(),
12441                                               E->getRParenLoc(), None, None);
12442   }
12443 
12444   // Try to compute the result without performing a partial substitution.
12445   Optional<unsigned> Result = 0;
12446   for (const TemplateArgument &Arg : PackArgs) {
12447     if (!Arg.isPackExpansion()) {
12448       Result = *Result + 1;
12449       continue;
12450     }
12451 
12452     TemplateArgumentLoc ArgLoc;
12453     InventTemplateArgumentLoc(Arg, ArgLoc);
12454 
12455     // Find the pattern of the pack expansion.
12456     SourceLocation Ellipsis;
12457     Optional<unsigned> OrigNumExpansions;
12458     TemplateArgumentLoc Pattern =
12459         getSema().getTemplateArgumentPackExpansionPattern(ArgLoc, Ellipsis,
12460                                                           OrigNumExpansions);
12461 
12462     // Substitute under the pack expansion. Do not expand the pack (yet).
12463     TemplateArgumentLoc OutPattern;
12464     Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
12465     if (getDerived().TransformTemplateArgument(Pattern, OutPattern,
12466                                                /*Uneval*/ true))
12467       return true;
12468 
12469     // See if we can determine the number of arguments from the result.
12470     Optional<unsigned> NumExpansions =
12471         getSema().getFullyPackExpandedSize(OutPattern.getArgument());
12472     if (!NumExpansions) {
12473       // No: we must be in an alias template expansion, and we're going to need
12474       // to actually expand the packs.
12475       Result = None;
12476       break;
12477     }
12478 
12479     Result = *Result + *NumExpansions;
12480   }
12481 
12482   // Common case: we could determine the number of expansions without
12483   // substituting.
12484   if (Result)
12485     return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(),
12486                                               E->getPackLoc(),
12487                                               E->getRParenLoc(), *Result, None);
12488 
12489   TemplateArgumentListInfo TransformedPackArgs(E->getPackLoc(),
12490                                                E->getPackLoc());
12491   {
12492     TemporaryBase Rebase(*this, E->getPackLoc(), getBaseEntity());
12493     typedef TemplateArgumentLocInventIterator<
12494         Derived, const TemplateArgument*> PackLocIterator;
12495     if (TransformTemplateArguments(PackLocIterator(*this, PackArgs.begin()),
12496                                    PackLocIterator(*this, PackArgs.end()),
12497                                    TransformedPackArgs, /*Uneval*/true))
12498       return ExprError();
12499   }
12500 
12501   // Check whether we managed to fully-expand the pack.
12502   // FIXME: Is it possible for us to do so and not hit the early exit path?
12503   SmallVector<TemplateArgument, 8> Args;
12504   bool PartialSubstitution = false;
12505   for (auto &Loc : TransformedPackArgs.arguments()) {
12506     Args.push_back(Loc.getArgument());
12507     if (Loc.getArgument().isPackExpansion())
12508       PartialSubstitution = true;
12509   }
12510 
12511   if (PartialSubstitution)
12512     return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(),
12513                                               E->getPackLoc(),
12514                                               E->getRParenLoc(), None, Args);
12515 
12516   return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(),
12517                                             E->getPackLoc(), E->getRParenLoc(),
12518                                             Args.size(), None);
12519 }
12520 
12521 template<typename Derived>
12522 ExprResult
12523 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmPackExpr(
12524                                           SubstNonTypeTemplateParmPackExpr *E) {
12525   // Default behavior is to do nothing with this transformation.
12526   return E;
12527 }
12528 
12529 template<typename Derived>
12530 ExprResult
12531 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmExpr(
12532                                           SubstNonTypeTemplateParmExpr *E) {
12533   // Default behavior is to do nothing with this transformation.
12534   return E;
12535 }
12536 
12537 template<typename Derived>
12538 ExprResult
12539 TreeTransform<Derived>::TransformFunctionParmPackExpr(FunctionParmPackExpr *E) {
12540   // Default behavior is to do nothing with this transformation.
12541   return E;
12542 }
12543 
12544 template<typename Derived>
12545 ExprResult
12546 TreeTransform<Derived>::TransformMaterializeTemporaryExpr(
12547                                                   MaterializeTemporaryExpr *E) {
12548   return getDerived().TransformExpr(E->getSubExpr());
12549 }
12550 
12551 template<typename Derived>
12552 ExprResult
12553 TreeTransform<Derived>::TransformCXXFoldExpr(CXXFoldExpr *E) {
12554   Expr *Pattern = E->getPattern();
12555 
12556   SmallVector<UnexpandedParameterPack, 2> Unexpanded;
12557   getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
12558   assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
12559 
12560   // Determine whether the set of unexpanded parameter packs can and should
12561   // be expanded.
12562   bool Expand = true;
12563   bool RetainExpansion = false;
12564   Optional<unsigned> OrigNumExpansions = E->getNumExpansions(),
12565                      NumExpansions = OrigNumExpansions;
12566   if (getDerived().TryExpandParameterPacks(E->getEllipsisLoc(),
12567                                            Pattern->getSourceRange(),
12568                                            Unexpanded,
12569                                            Expand, RetainExpansion,
12570                                            NumExpansions))
12571     return true;
12572 
12573   if (!Expand) {
12574     // Do not expand any packs here, just transform and rebuild a fold
12575     // expression.
12576     Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
12577 
12578     ExprResult LHS =
12579         E->getLHS() ? getDerived().TransformExpr(E->getLHS()) : ExprResult();
12580     if (LHS.isInvalid())
12581       return true;
12582 
12583     ExprResult RHS =
12584         E->getRHS() ? getDerived().TransformExpr(E->getRHS()) : ExprResult();
12585     if (RHS.isInvalid())
12586       return true;
12587 
12588     if (!getDerived().AlwaysRebuild() &&
12589         LHS.get() == E->getLHS() && RHS.get() == E->getRHS())
12590       return E;
12591 
12592     return getDerived().RebuildCXXFoldExpr(
12593         E->getBeginLoc(), LHS.get(), E->getOperator(), E->getEllipsisLoc(),
12594         RHS.get(), E->getEndLoc(), NumExpansions);
12595   }
12596 
12597   // The transform has determined that we should perform an elementwise
12598   // expansion of the pattern. Do so.
12599   ExprResult Result = getDerived().TransformExpr(E->getInit());
12600   if (Result.isInvalid())
12601     return true;
12602   bool LeftFold = E->isLeftFold();
12603 
12604   // If we're retaining an expansion for a right fold, it is the innermost
12605   // component and takes the init (if any).
12606   if (!LeftFold && RetainExpansion) {
12607     ForgetPartiallySubstitutedPackRAII Forget(getDerived());
12608 
12609     ExprResult Out = getDerived().TransformExpr(Pattern);
12610     if (Out.isInvalid())
12611       return true;
12612 
12613     Result = getDerived().RebuildCXXFoldExpr(
12614         E->getBeginLoc(), Out.get(), E->getOperator(), E->getEllipsisLoc(),
12615         Result.get(), E->getEndLoc(), OrigNumExpansions);
12616     if (Result.isInvalid())
12617       return true;
12618   }
12619 
12620   for (unsigned I = 0; I != *NumExpansions; ++I) {
12621     Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(
12622         getSema(), LeftFold ? I : *NumExpansions - I - 1);
12623     ExprResult Out = getDerived().TransformExpr(Pattern);
12624     if (Out.isInvalid())
12625       return true;
12626 
12627     if (Out.get()->containsUnexpandedParameterPack()) {
12628       // We still have a pack; retain a pack expansion for this slice.
12629       Result = getDerived().RebuildCXXFoldExpr(
12630           E->getBeginLoc(), LeftFold ? Result.get() : Out.get(),
12631           E->getOperator(), E->getEllipsisLoc(),
12632           LeftFold ? Out.get() : Result.get(), E->getEndLoc(),
12633           OrigNumExpansions);
12634     } else if (Result.isUsable()) {
12635       // We've got down to a single element; build a binary operator.
12636       Result = getDerived().RebuildBinaryOperator(
12637           E->getEllipsisLoc(), E->getOperator(),
12638           LeftFold ? Result.get() : Out.get(),
12639           LeftFold ? Out.get() : Result.get());
12640     } else
12641       Result = Out;
12642 
12643     if (Result.isInvalid())
12644       return true;
12645   }
12646 
12647   // If we're retaining an expansion for a left fold, it is the outermost
12648   // component and takes the complete expansion so far as its init (if any).
12649   if (LeftFold && RetainExpansion) {
12650     ForgetPartiallySubstitutedPackRAII Forget(getDerived());
12651 
12652     ExprResult Out = getDerived().TransformExpr(Pattern);
12653     if (Out.isInvalid())
12654       return true;
12655 
12656     Result = getDerived().RebuildCXXFoldExpr(
12657         E->getBeginLoc(), Result.get(), E->getOperator(), E->getEllipsisLoc(),
12658         Out.get(), E->getEndLoc(), OrigNumExpansions);
12659     if (Result.isInvalid())
12660       return true;
12661   }
12662 
12663   // If we had no init and an empty pack, and we're not retaining an expansion,
12664   // then produce a fallback value or error.
12665   if (Result.isUnset())
12666     return getDerived().RebuildEmptyCXXFoldExpr(E->getEllipsisLoc(),
12667                                                 E->getOperator());
12668 
12669   return Result;
12670 }
12671 
12672 template<typename Derived>
12673 ExprResult
12674 TreeTransform<Derived>::TransformCXXStdInitializerListExpr(
12675     CXXStdInitializerListExpr *E) {
12676   return getDerived().TransformExpr(E->getSubExpr());
12677 }
12678 
12679 template<typename Derived>
12680 ExprResult
12681 TreeTransform<Derived>::TransformObjCStringLiteral(ObjCStringLiteral *E) {
12682   return SemaRef.MaybeBindToTemporary(E);
12683 }
12684 
12685 template<typename Derived>
12686 ExprResult
12687 TreeTransform<Derived>::TransformObjCBoolLiteralExpr(ObjCBoolLiteralExpr *E) {
12688   return E;
12689 }
12690 
12691 template<typename Derived>
12692 ExprResult
12693 TreeTransform<Derived>::TransformObjCBoxedExpr(ObjCBoxedExpr *E) {
12694   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
12695   if (SubExpr.isInvalid())
12696     return ExprError();
12697 
12698   if (!getDerived().AlwaysRebuild() &&
12699       SubExpr.get() == E->getSubExpr())
12700     return E;
12701 
12702   return getDerived().RebuildObjCBoxedExpr(E->getSourceRange(), SubExpr.get());
12703 }
12704 
12705 template<typename Derived>
12706 ExprResult
12707 TreeTransform<Derived>::TransformObjCArrayLiteral(ObjCArrayLiteral *E) {
12708   // Transform each of the elements.
12709   SmallVector<Expr *, 8> Elements;
12710   bool ArgChanged = false;
12711   if (getDerived().TransformExprs(E->getElements(), E->getNumElements(),
12712                                   /*IsCall=*/false, Elements, &ArgChanged))
12713     return ExprError();
12714 
12715   if (!getDerived().AlwaysRebuild() && !ArgChanged)
12716     return SemaRef.MaybeBindToTemporary(E);
12717 
12718   return getDerived().RebuildObjCArrayLiteral(E->getSourceRange(),
12719                                               Elements.data(),
12720                                               Elements.size());
12721 }
12722 
12723 template<typename Derived>
12724 ExprResult
12725 TreeTransform<Derived>::TransformObjCDictionaryLiteral(
12726                                                     ObjCDictionaryLiteral *E) {
12727   // Transform each of the elements.
12728   SmallVector<ObjCDictionaryElement, 8> Elements;
12729   bool ArgChanged = false;
12730   for (unsigned I = 0, N = E->getNumElements(); I != N; ++I) {
12731     ObjCDictionaryElement OrigElement = E->getKeyValueElement(I);
12732 
12733     if (OrigElement.isPackExpansion()) {
12734       // This key/value element is a pack expansion.
12735       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
12736       getSema().collectUnexpandedParameterPacks(OrigElement.Key, Unexpanded);
12737       getSema().collectUnexpandedParameterPacks(OrigElement.Value, Unexpanded);
12738       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
12739 
12740       // Determine whether the set of unexpanded parameter packs can
12741       // and should be expanded.
12742       bool Expand = true;
12743       bool RetainExpansion = false;
12744       Optional<unsigned> OrigNumExpansions = OrigElement.NumExpansions;
12745       Optional<unsigned> NumExpansions = OrigNumExpansions;
12746       SourceRange PatternRange(OrigElement.Key->getBeginLoc(),
12747                                OrigElement.Value->getEndLoc());
12748       if (getDerived().TryExpandParameterPacks(OrigElement.EllipsisLoc,
12749                                                PatternRange, Unexpanded, Expand,
12750                                                RetainExpansion, NumExpansions))
12751         return ExprError();
12752 
12753       if (!Expand) {
12754         // The transform has determined that we should perform a simple
12755         // transformation on the pack expansion, producing another pack
12756         // expansion.
12757         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
12758         ExprResult Key = getDerived().TransformExpr(OrigElement.Key);
12759         if (Key.isInvalid())
12760           return ExprError();
12761 
12762         if (Key.get() != OrigElement.Key)
12763           ArgChanged = true;
12764 
12765         ExprResult Value = getDerived().TransformExpr(OrigElement.Value);
12766         if (Value.isInvalid())
12767           return ExprError();
12768 
12769         if (Value.get() != OrigElement.Value)
12770           ArgChanged = true;
12771 
12772         ObjCDictionaryElement Expansion = {
12773           Key.get(), Value.get(), OrigElement.EllipsisLoc, NumExpansions
12774         };
12775         Elements.push_back(Expansion);
12776         continue;
12777       }
12778 
12779       // Record right away that the argument was changed.  This needs
12780       // to happen even if the array expands to nothing.
12781       ArgChanged = true;
12782 
12783       // The transform has determined that we should perform an elementwise
12784       // expansion of the pattern. Do so.
12785       for (unsigned I = 0; I != *NumExpansions; ++I) {
12786         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
12787         ExprResult Key = getDerived().TransformExpr(OrigElement.Key);
12788         if (Key.isInvalid())
12789           return ExprError();
12790 
12791         ExprResult Value = getDerived().TransformExpr(OrigElement.Value);
12792         if (Value.isInvalid())
12793           return ExprError();
12794 
12795         ObjCDictionaryElement Element = {
12796           Key.get(), Value.get(), SourceLocation(), NumExpansions
12797         };
12798 
12799         // If any unexpanded parameter packs remain, we still have a
12800         // pack expansion.
12801         // FIXME: Can this really happen?
12802         if (Key.get()->containsUnexpandedParameterPack() ||
12803             Value.get()->containsUnexpandedParameterPack())
12804           Element.EllipsisLoc = OrigElement.EllipsisLoc;
12805 
12806         Elements.push_back(Element);
12807       }
12808 
12809       // FIXME: Retain a pack expansion if RetainExpansion is true.
12810 
12811       // We've finished with this pack expansion.
12812       continue;
12813     }
12814 
12815     // Transform and check key.
12816     ExprResult Key = getDerived().TransformExpr(OrigElement.Key);
12817     if (Key.isInvalid())
12818       return ExprError();
12819 
12820     if (Key.get() != OrigElement.Key)
12821       ArgChanged = true;
12822 
12823     // Transform and check value.
12824     ExprResult Value
12825       = getDerived().TransformExpr(OrigElement.Value);
12826     if (Value.isInvalid())
12827       return ExprError();
12828 
12829     if (Value.get() != OrigElement.Value)
12830       ArgChanged = true;
12831 
12832     ObjCDictionaryElement Element = {
12833       Key.get(), Value.get(), SourceLocation(), None
12834     };
12835     Elements.push_back(Element);
12836   }
12837 
12838   if (!getDerived().AlwaysRebuild() && !ArgChanged)
12839     return SemaRef.MaybeBindToTemporary(E);
12840 
12841   return getDerived().RebuildObjCDictionaryLiteral(E->getSourceRange(),
12842                                                    Elements);
12843 }
12844 
12845 template<typename Derived>
12846 ExprResult
12847 TreeTransform<Derived>::TransformObjCEncodeExpr(ObjCEncodeExpr *E) {
12848   TypeSourceInfo *EncodedTypeInfo
12849     = getDerived().TransformType(E->getEncodedTypeSourceInfo());
12850   if (!EncodedTypeInfo)
12851     return ExprError();
12852 
12853   if (!getDerived().AlwaysRebuild() &&
12854       EncodedTypeInfo == E->getEncodedTypeSourceInfo())
12855     return E;
12856 
12857   return getDerived().RebuildObjCEncodeExpr(E->getAtLoc(),
12858                                             EncodedTypeInfo,
12859                                             E->getRParenLoc());
12860 }
12861 
12862 template<typename Derived>
12863 ExprResult TreeTransform<Derived>::
12864 TransformObjCIndirectCopyRestoreExpr(ObjCIndirectCopyRestoreExpr *E) {
12865   // This is a kind of implicit conversion, and it needs to get dropped
12866   // and recomputed for the same general reasons that ImplicitCastExprs
12867   // do, as well a more specific one: this expression is only valid when
12868   // it appears *immediately* as an argument expression.
12869   return getDerived().TransformExpr(E->getSubExpr());
12870 }
12871 
12872 template<typename Derived>
12873 ExprResult TreeTransform<Derived>::
12874 TransformObjCBridgedCastExpr(ObjCBridgedCastExpr *E) {
12875   TypeSourceInfo *TSInfo
12876     = getDerived().TransformType(E->getTypeInfoAsWritten());
12877   if (!TSInfo)
12878     return ExprError();
12879 
12880   ExprResult Result = getDerived().TransformExpr(E->getSubExpr());
12881   if (Result.isInvalid())
12882     return ExprError();
12883 
12884   if (!getDerived().AlwaysRebuild() &&
12885       TSInfo == E->getTypeInfoAsWritten() &&
12886       Result.get() == E->getSubExpr())
12887     return E;
12888 
12889   return SemaRef.BuildObjCBridgedCast(E->getLParenLoc(), E->getBridgeKind(),
12890                                       E->getBridgeKeywordLoc(), TSInfo,
12891                                       Result.get());
12892 }
12893 
12894 template <typename Derived>
12895 ExprResult TreeTransform<Derived>::TransformObjCAvailabilityCheckExpr(
12896     ObjCAvailabilityCheckExpr *E) {
12897   return E;
12898 }
12899 
12900 template<typename Derived>
12901 ExprResult
12902 TreeTransform<Derived>::TransformObjCMessageExpr(ObjCMessageExpr *E) {
12903   // Transform arguments.
12904   bool ArgChanged = false;
12905   SmallVector<Expr*, 8> Args;
12906   Args.reserve(E->getNumArgs());
12907   if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), false, Args,
12908                                   &ArgChanged))
12909     return ExprError();
12910 
12911   if (E->getReceiverKind() == ObjCMessageExpr::Class) {
12912     // Class message: transform the receiver type.
12913     TypeSourceInfo *ReceiverTypeInfo
12914       = getDerived().TransformType(E->getClassReceiverTypeInfo());
12915     if (!ReceiverTypeInfo)
12916       return ExprError();
12917 
12918     // If nothing changed, just retain the existing message send.
12919     if (!getDerived().AlwaysRebuild() &&
12920         ReceiverTypeInfo == E->getClassReceiverTypeInfo() && !ArgChanged)
12921       return SemaRef.MaybeBindToTemporary(E);
12922 
12923     // Build a new class message send.
12924     SmallVector<SourceLocation, 16> SelLocs;
12925     E->getSelectorLocs(SelLocs);
12926     return getDerived().RebuildObjCMessageExpr(ReceiverTypeInfo,
12927                                                E->getSelector(),
12928                                                SelLocs,
12929                                                E->getMethodDecl(),
12930                                                E->getLeftLoc(),
12931                                                Args,
12932                                                E->getRightLoc());
12933   }
12934   else if (E->getReceiverKind() == ObjCMessageExpr::SuperClass ||
12935            E->getReceiverKind() == ObjCMessageExpr::SuperInstance) {
12936     if (!E->getMethodDecl())
12937       return ExprError();
12938 
12939     // Build a new class message send to 'super'.
12940     SmallVector<SourceLocation, 16> SelLocs;
12941     E->getSelectorLocs(SelLocs);
12942     return getDerived().RebuildObjCMessageExpr(E->getSuperLoc(),
12943                                                E->getSelector(),
12944                                                SelLocs,
12945                                                E->getReceiverType(),
12946                                                E->getMethodDecl(),
12947                                                E->getLeftLoc(),
12948                                                Args,
12949                                                E->getRightLoc());
12950   }
12951 
12952   // Instance message: transform the receiver
12953   assert(E->getReceiverKind() == ObjCMessageExpr::Instance &&
12954          "Only class and instance messages may be instantiated");
12955   ExprResult Receiver
12956     = getDerived().TransformExpr(E->getInstanceReceiver());
12957   if (Receiver.isInvalid())
12958     return ExprError();
12959 
12960   // If nothing changed, just retain the existing message send.
12961   if (!getDerived().AlwaysRebuild() &&
12962       Receiver.get() == E->getInstanceReceiver() && !ArgChanged)
12963     return SemaRef.MaybeBindToTemporary(E);
12964 
12965   // Build a new instance message send.
12966   SmallVector<SourceLocation, 16> SelLocs;
12967   E->getSelectorLocs(SelLocs);
12968   return getDerived().RebuildObjCMessageExpr(Receiver.get(),
12969                                              E->getSelector(),
12970                                              SelLocs,
12971                                              E->getMethodDecl(),
12972                                              E->getLeftLoc(),
12973                                              Args,
12974                                              E->getRightLoc());
12975 }
12976 
12977 template<typename Derived>
12978 ExprResult
12979 TreeTransform<Derived>::TransformObjCSelectorExpr(ObjCSelectorExpr *E) {
12980   return E;
12981 }
12982 
12983 template<typename Derived>
12984 ExprResult
12985 TreeTransform<Derived>::TransformObjCProtocolExpr(ObjCProtocolExpr *E) {
12986   return E;
12987 }
12988 
12989 template<typename Derived>
12990 ExprResult
12991 TreeTransform<Derived>::TransformObjCIvarRefExpr(ObjCIvarRefExpr *E) {
12992   // Transform the base expression.
12993   ExprResult Base = getDerived().TransformExpr(E->getBase());
12994   if (Base.isInvalid())
12995     return ExprError();
12996 
12997   // We don't need to transform the ivar; it will never change.
12998 
12999   // If nothing changed, just retain the existing expression.
13000   if (!getDerived().AlwaysRebuild() &&
13001       Base.get() == E->getBase())
13002     return E;
13003 
13004   return getDerived().RebuildObjCIvarRefExpr(Base.get(), E->getDecl(),
13005                                              E->getLocation(),
13006                                              E->isArrow(), E->isFreeIvar());
13007 }
13008 
13009 template<typename Derived>
13010 ExprResult
13011 TreeTransform<Derived>::TransformObjCPropertyRefExpr(ObjCPropertyRefExpr *E) {
13012   // 'super' and types never change. Property never changes. Just
13013   // retain the existing expression.
13014   if (!E->isObjectReceiver())
13015     return E;
13016 
13017   // Transform the base expression.
13018   ExprResult Base = getDerived().TransformExpr(E->getBase());
13019   if (Base.isInvalid())
13020     return ExprError();
13021 
13022   // We don't need to transform the property; it will never change.
13023 
13024   // If nothing changed, just retain the existing expression.
13025   if (!getDerived().AlwaysRebuild() &&
13026       Base.get() == E->getBase())
13027     return E;
13028 
13029   if (E->isExplicitProperty())
13030     return getDerived().RebuildObjCPropertyRefExpr(Base.get(),
13031                                                    E->getExplicitProperty(),
13032                                                    E->getLocation());
13033 
13034   return getDerived().RebuildObjCPropertyRefExpr(Base.get(),
13035                                                  SemaRef.Context.PseudoObjectTy,
13036                                                  E->getImplicitPropertyGetter(),
13037                                                  E->getImplicitPropertySetter(),
13038                                                  E->getLocation());
13039 }
13040 
13041 template<typename Derived>
13042 ExprResult
13043 TreeTransform<Derived>::TransformObjCSubscriptRefExpr(ObjCSubscriptRefExpr *E) {
13044   // Transform the base expression.
13045   ExprResult Base = getDerived().TransformExpr(E->getBaseExpr());
13046   if (Base.isInvalid())
13047     return ExprError();
13048 
13049   // Transform the key expression.
13050   ExprResult Key = getDerived().TransformExpr(E->getKeyExpr());
13051   if (Key.isInvalid())
13052     return ExprError();
13053 
13054   // If nothing changed, just retain the existing expression.
13055   if (!getDerived().AlwaysRebuild() &&
13056       Key.get() == E->getKeyExpr() && Base.get() == E->getBaseExpr())
13057     return E;
13058 
13059   return getDerived().RebuildObjCSubscriptRefExpr(E->getRBracket(),
13060                                                   Base.get(), Key.get(),
13061                                                   E->getAtIndexMethodDecl(),
13062                                                   E->setAtIndexMethodDecl());
13063 }
13064 
13065 template<typename Derived>
13066 ExprResult
13067 TreeTransform<Derived>::TransformObjCIsaExpr(ObjCIsaExpr *E) {
13068   // Transform the base expression.
13069   ExprResult Base = getDerived().TransformExpr(E->getBase());
13070   if (Base.isInvalid())
13071     return ExprError();
13072 
13073   // If nothing changed, just retain the existing expression.
13074   if (!getDerived().AlwaysRebuild() &&
13075       Base.get() == E->getBase())
13076     return E;
13077 
13078   return getDerived().RebuildObjCIsaExpr(Base.get(), E->getIsaMemberLoc(),
13079                                          E->getOpLoc(),
13080                                          E->isArrow());
13081 }
13082 
13083 template<typename Derived>
13084 ExprResult
13085 TreeTransform<Derived>::TransformShuffleVectorExpr(ShuffleVectorExpr *E) {
13086   bool ArgumentChanged = false;
13087   SmallVector<Expr*, 8> SubExprs;
13088   SubExprs.reserve(E->getNumSubExprs());
13089   if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false,
13090                                   SubExprs, &ArgumentChanged))
13091     return ExprError();
13092 
13093   if (!getDerived().AlwaysRebuild() &&
13094       !ArgumentChanged)
13095     return E;
13096 
13097   return getDerived().RebuildShuffleVectorExpr(E->getBuiltinLoc(),
13098                                                SubExprs,
13099                                                E->getRParenLoc());
13100 }
13101 
13102 template<typename Derived>
13103 ExprResult
13104 TreeTransform<Derived>::TransformConvertVectorExpr(ConvertVectorExpr *E) {
13105   ExprResult SrcExpr = getDerived().TransformExpr(E->getSrcExpr());
13106   if (SrcExpr.isInvalid())
13107     return ExprError();
13108 
13109   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo());
13110   if (!Type)
13111     return ExprError();
13112 
13113   if (!getDerived().AlwaysRebuild() &&
13114       Type == E->getTypeSourceInfo() &&
13115       SrcExpr.get() == E->getSrcExpr())
13116     return E;
13117 
13118   return getDerived().RebuildConvertVectorExpr(E->getBuiltinLoc(),
13119                                                SrcExpr.get(), Type,
13120                                                E->getRParenLoc());
13121 }
13122 
13123 template<typename Derived>
13124 ExprResult
13125 TreeTransform<Derived>::TransformBlockExpr(BlockExpr *E) {
13126   BlockDecl *oldBlock = E->getBlockDecl();
13127 
13128   SemaRef.ActOnBlockStart(E->getCaretLocation(), /*Scope=*/nullptr);
13129   BlockScopeInfo *blockScope = SemaRef.getCurBlock();
13130 
13131   blockScope->TheDecl->setIsVariadic(oldBlock->isVariadic());
13132   blockScope->TheDecl->setBlockMissingReturnType(
13133                          oldBlock->blockMissingReturnType());
13134 
13135   SmallVector<ParmVarDecl*, 4> params;
13136   SmallVector<QualType, 4> paramTypes;
13137 
13138   const FunctionProtoType *exprFunctionType = E->getFunctionType();
13139 
13140   // Parameter substitution.
13141   Sema::ExtParameterInfoBuilder extParamInfos;
13142   if (getDerived().TransformFunctionTypeParams(
13143           E->getCaretLocation(), oldBlock->parameters(), nullptr,
13144           exprFunctionType->getExtParameterInfosOrNull(), paramTypes, &params,
13145           extParamInfos)) {
13146     getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr);
13147     return ExprError();
13148   }
13149 
13150   QualType exprResultType =
13151       getDerived().TransformType(exprFunctionType->getReturnType());
13152 
13153   auto epi = exprFunctionType->getExtProtoInfo();
13154   epi.ExtParameterInfos = extParamInfos.getPointerOrNull(paramTypes.size());
13155 
13156   QualType functionType =
13157     getDerived().RebuildFunctionProtoType(exprResultType, paramTypes, epi);
13158   blockScope->FunctionType = functionType;
13159 
13160   // Set the parameters on the block decl.
13161   if (!params.empty())
13162     blockScope->TheDecl->setParams(params);
13163 
13164   if (!oldBlock->blockMissingReturnType()) {
13165     blockScope->HasImplicitReturnType = false;
13166     blockScope->ReturnType = exprResultType;
13167   }
13168 
13169   // Transform the body
13170   StmtResult body = getDerived().TransformStmt(E->getBody());
13171   if (body.isInvalid()) {
13172     getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr);
13173     return ExprError();
13174   }
13175 
13176 #ifndef NDEBUG
13177   // In builds with assertions, make sure that we captured everything we
13178   // captured before.
13179   if (!SemaRef.getDiagnostics().hasErrorOccurred()) {
13180     for (const auto &I : oldBlock->captures()) {
13181       VarDecl *oldCapture = I.getVariable();
13182 
13183       // Ignore parameter packs.
13184       if (oldCapture->isParameterPack())
13185         continue;
13186 
13187       VarDecl *newCapture =
13188         cast<VarDecl>(getDerived().TransformDecl(E->getCaretLocation(),
13189                                                  oldCapture));
13190       assert(blockScope->CaptureMap.count(newCapture));
13191     }
13192     assert(oldBlock->capturesCXXThis() == blockScope->isCXXThisCaptured());
13193   }
13194 #endif
13195 
13196   return SemaRef.ActOnBlockStmtExpr(E->getCaretLocation(), body.get(),
13197                                     /*Scope=*/nullptr);
13198 }
13199 
13200 template<typename Derived>
13201 ExprResult
13202 TreeTransform<Derived>::TransformAsTypeExpr(AsTypeExpr *E) {
13203   llvm_unreachable("Cannot transform asType expressions yet");
13204 }
13205 
13206 template<typename Derived>
13207 ExprResult
13208 TreeTransform<Derived>::TransformAtomicExpr(AtomicExpr *E) {
13209   bool ArgumentChanged = false;
13210   SmallVector<Expr*, 8> SubExprs;
13211   SubExprs.reserve(E->getNumSubExprs());
13212   if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false,
13213                                   SubExprs, &ArgumentChanged))
13214     return ExprError();
13215 
13216   if (!getDerived().AlwaysRebuild() &&
13217       !ArgumentChanged)
13218     return E;
13219 
13220   return getDerived().RebuildAtomicExpr(E->getBuiltinLoc(), SubExprs,
13221                                         E->getOp(), E->getRParenLoc());
13222 }
13223 
13224 //===----------------------------------------------------------------------===//
13225 // Type reconstruction
13226 //===----------------------------------------------------------------------===//
13227 
13228 template<typename Derived>
13229 QualType TreeTransform<Derived>::RebuildPointerType(QualType PointeeType,
13230                                                     SourceLocation Star) {
13231   return SemaRef.BuildPointerType(PointeeType, Star,
13232                                   getDerived().getBaseEntity());
13233 }
13234 
13235 template<typename Derived>
13236 QualType TreeTransform<Derived>::RebuildBlockPointerType(QualType PointeeType,
13237                                                          SourceLocation Star) {
13238   return SemaRef.BuildBlockPointerType(PointeeType, Star,
13239                                        getDerived().getBaseEntity());
13240 }
13241 
13242 template<typename Derived>
13243 QualType
13244 TreeTransform<Derived>::RebuildReferenceType(QualType ReferentType,
13245                                              bool WrittenAsLValue,
13246                                              SourceLocation Sigil) {
13247   return SemaRef.BuildReferenceType(ReferentType, WrittenAsLValue,
13248                                     Sigil, getDerived().getBaseEntity());
13249 }
13250 
13251 template<typename Derived>
13252 QualType
13253 TreeTransform<Derived>::RebuildMemberPointerType(QualType PointeeType,
13254                                                  QualType ClassType,
13255                                                  SourceLocation Sigil) {
13256   return SemaRef.BuildMemberPointerType(PointeeType, ClassType, Sigil,
13257                                         getDerived().getBaseEntity());
13258 }
13259 
13260 template<typename Derived>
13261 QualType TreeTransform<Derived>::RebuildObjCTypeParamType(
13262            const ObjCTypeParamDecl *Decl,
13263            SourceLocation ProtocolLAngleLoc,
13264            ArrayRef<ObjCProtocolDecl *> Protocols,
13265            ArrayRef<SourceLocation> ProtocolLocs,
13266            SourceLocation ProtocolRAngleLoc) {
13267   return SemaRef.BuildObjCTypeParamType(Decl,
13268                                         ProtocolLAngleLoc, Protocols,
13269                                         ProtocolLocs, ProtocolRAngleLoc,
13270                                         /*FailOnError=*/true);
13271 }
13272 
13273 template<typename Derived>
13274 QualType TreeTransform<Derived>::RebuildObjCObjectType(
13275            QualType BaseType,
13276            SourceLocation Loc,
13277            SourceLocation TypeArgsLAngleLoc,
13278            ArrayRef<TypeSourceInfo *> TypeArgs,
13279            SourceLocation TypeArgsRAngleLoc,
13280            SourceLocation ProtocolLAngleLoc,
13281            ArrayRef<ObjCProtocolDecl *> Protocols,
13282            ArrayRef<SourceLocation> ProtocolLocs,
13283            SourceLocation ProtocolRAngleLoc) {
13284   return SemaRef.BuildObjCObjectType(BaseType, Loc, TypeArgsLAngleLoc,
13285                                      TypeArgs, TypeArgsRAngleLoc,
13286                                      ProtocolLAngleLoc, Protocols, ProtocolLocs,
13287                                      ProtocolRAngleLoc,
13288                                      /*FailOnError=*/true);
13289 }
13290 
13291 template<typename Derived>
13292 QualType TreeTransform<Derived>::RebuildObjCObjectPointerType(
13293            QualType PointeeType,
13294            SourceLocation Star) {
13295   return SemaRef.Context.getObjCObjectPointerType(PointeeType);
13296 }
13297 
13298 template<typename Derived>
13299 QualType
13300 TreeTransform<Derived>::RebuildArrayType(QualType ElementType,
13301                                          ArrayType::ArraySizeModifier SizeMod,
13302                                          const llvm::APInt *Size,
13303                                          Expr *SizeExpr,
13304                                          unsigned IndexTypeQuals,
13305                                          SourceRange BracketsRange) {
13306   if (SizeExpr || !Size)
13307     return SemaRef.BuildArrayType(ElementType, SizeMod, SizeExpr,
13308                                   IndexTypeQuals, BracketsRange,
13309                                   getDerived().getBaseEntity());
13310 
13311   QualType Types[] = {
13312     SemaRef.Context.UnsignedCharTy, SemaRef.Context.UnsignedShortTy,
13313     SemaRef.Context.UnsignedIntTy, SemaRef.Context.UnsignedLongTy,
13314     SemaRef.Context.UnsignedLongLongTy, SemaRef.Context.UnsignedInt128Ty
13315   };
13316   const unsigned NumTypes = llvm::array_lengthof(Types);
13317   QualType SizeType;
13318   for (unsigned I = 0; I != NumTypes; ++I)
13319     if (Size->getBitWidth() == SemaRef.Context.getIntWidth(Types[I])) {
13320       SizeType = Types[I];
13321       break;
13322     }
13323 
13324   // Note that we can return a VariableArrayType here in the case where
13325   // the element type was a dependent VariableArrayType.
13326   IntegerLiteral *ArraySize
13327       = IntegerLiteral::Create(SemaRef.Context, *Size, SizeType,
13328                                /*FIXME*/BracketsRange.getBegin());
13329   return SemaRef.BuildArrayType(ElementType, SizeMod, ArraySize,
13330                                 IndexTypeQuals, BracketsRange,
13331                                 getDerived().getBaseEntity());
13332 }
13333 
13334 template<typename Derived>
13335 QualType
13336 TreeTransform<Derived>::RebuildConstantArrayType(QualType ElementType,
13337                                                  ArrayType::ArraySizeModifier SizeMod,
13338                                                  const llvm::APInt &Size,
13339                                                  Expr *SizeExpr,
13340                                                  unsigned IndexTypeQuals,
13341                                                  SourceRange BracketsRange) {
13342   return getDerived().RebuildArrayType(ElementType, SizeMod, &Size, SizeExpr,
13343                                         IndexTypeQuals, BracketsRange);
13344 }
13345 
13346 template<typename Derived>
13347 QualType
13348 TreeTransform<Derived>::RebuildIncompleteArrayType(QualType ElementType,
13349                                           ArrayType::ArraySizeModifier SizeMod,
13350                                                  unsigned IndexTypeQuals,
13351                                                    SourceRange BracketsRange) {
13352   return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr, nullptr,
13353                                        IndexTypeQuals, BracketsRange);
13354 }
13355 
13356 template<typename Derived>
13357 QualType
13358 TreeTransform<Derived>::RebuildVariableArrayType(QualType ElementType,
13359                                           ArrayType::ArraySizeModifier SizeMod,
13360                                                  Expr *SizeExpr,
13361                                                  unsigned IndexTypeQuals,
13362                                                  SourceRange BracketsRange) {
13363   return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr,
13364                                        SizeExpr,
13365                                        IndexTypeQuals, BracketsRange);
13366 }
13367 
13368 template<typename Derived>
13369 QualType
13370 TreeTransform<Derived>::RebuildDependentSizedArrayType(QualType ElementType,
13371                                           ArrayType::ArraySizeModifier SizeMod,
13372                                                        Expr *SizeExpr,
13373                                                        unsigned IndexTypeQuals,
13374                                                    SourceRange BracketsRange) {
13375   return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr,
13376                                        SizeExpr,
13377                                        IndexTypeQuals, BracketsRange);
13378 }
13379 
13380 template <typename Derived>
13381 QualType TreeTransform<Derived>::RebuildDependentAddressSpaceType(
13382     QualType PointeeType, Expr *AddrSpaceExpr, SourceLocation AttributeLoc) {
13383   return SemaRef.BuildAddressSpaceAttr(PointeeType, AddrSpaceExpr,
13384                                           AttributeLoc);
13385 }
13386 
13387 template <typename Derived>
13388 QualType
13389 TreeTransform<Derived>::RebuildVectorType(QualType ElementType,
13390                                           unsigned NumElements,
13391                                           VectorType::VectorKind VecKind) {
13392   // FIXME: semantic checking!
13393   return SemaRef.Context.getVectorType(ElementType, NumElements, VecKind);
13394 }
13395 
13396 template <typename Derived>
13397 QualType TreeTransform<Derived>::RebuildDependentVectorType(
13398     QualType ElementType, Expr *SizeExpr, SourceLocation AttributeLoc,
13399     VectorType::VectorKind VecKind) {
13400   return SemaRef.BuildVectorType(ElementType, SizeExpr, AttributeLoc);
13401 }
13402 
13403 template<typename Derived>
13404 QualType TreeTransform<Derived>::RebuildExtVectorType(QualType ElementType,
13405                                                       unsigned NumElements,
13406                                                  SourceLocation AttributeLoc) {
13407   llvm::APInt numElements(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy),
13408                           NumElements, true);
13409   IntegerLiteral *VectorSize
13410     = IntegerLiteral::Create(SemaRef.Context, numElements, SemaRef.Context.IntTy,
13411                              AttributeLoc);
13412   return SemaRef.BuildExtVectorType(ElementType, VectorSize, AttributeLoc);
13413 }
13414 
13415 template<typename Derived>
13416 QualType
13417 TreeTransform<Derived>::RebuildDependentSizedExtVectorType(QualType ElementType,
13418                                                            Expr *SizeExpr,
13419                                                   SourceLocation AttributeLoc) {
13420   return SemaRef.BuildExtVectorType(ElementType, SizeExpr, AttributeLoc);
13421 }
13422 
13423 template<typename Derived>
13424 QualType TreeTransform<Derived>::RebuildFunctionProtoType(
13425     QualType T,
13426     MutableArrayRef<QualType> ParamTypes,
13427     const FunctionProtoType::ExtProtoInfo &EPI) {
13428   return SemaRef.BuildFunctionType(T, ParamTypes,
13429                                    getDerived().getBaseLocation(),
13430                                    getDerived().getBaseEntity(),
13431                                    EPI);
13432 }
13433 
13434 template<typename Derived>
13435 QualType TreeTransform<Derived>::RebuildFunctionNoProtoType(QualType T) {
13436   return SemaRef.Context.getFunctionNoProtoType(T);
13437 }
13438 
13439 template<typename Derived>
13440 QualType TreeTransform<Derived>::RebuildUnresolvedUsingType(SourceLocation Loc,
13441                                                             Decl *D) {
13442   assert(D && "no decl found");
13443   if (D->isInvalidDecl()) return QualType();
13444 
13445   // FIXME: Doesn't account for ObjCInterfaceDecl!
13446   TypeDecl *Ty;
13447   if (auto *UPD = dyn_cast<UsingPackDecl>(D)) {
13448     // A valid resolved using typename pack expansion decl can have multiple
13449     // UsingDecls, but they must each have exactly one type, and it must be
13450     // the same type in every case. But we must have at least one expansion!
13451     if (UPD->expansions().empty()) {
13452       getSema().Diag(Loc, diag::err_using_pack_expansion_empty)
13453           << UPD->isCXXClassMember() << UPD;
13454       return QualType();
13455     }
13456 
13457     // We might still have some unresolved types. Try to pick a resolved type
13458     // if we can. The final instantiation will check that the remaining
13459     // unresolved types instantiate to the type we pick.
13460     QualType FallbackT;
13461     QualType T;
13462     for (auto *E : UPD->expansions()) {
13463       QualType ThisT = RebuildUnresolvedUsingType(Loc, E);
13464       if (ThisT.isNull())
13465         continue;
13466       else if (ThisT->getAs<UnresolvedUsingType>())
13467         FallbackT = ThisT;
13468       else if (T.isNull())
13469         T = ThisT;
13470       else
13471         assert(getSema().Context.hasSameType(ThisT, T) &&
13472                "mismatched resolved types in using pack expansion");
13473     }
13474     return T.isNull() ? FallbackT : T;
13475   } else if (auto *Using = dyn_cast<UsingDecl>(D)) {
13476     assert(Using->hasTypename() &&
13477            "UnresolvedUsingTypenameDecl transformed to non-typename using");
13478 
13479     // A valid resolved using typename decl points to exactly one type decl.
13480     assert(++Using->shadow_begin() == Using->shadow_end());
13481     Ty = cast<TypeDecl>((*Using->shadow_begin())->getTargetDecl());
13482   } else {
13483     assert(isa<UnresolvedUsingTypenameDecl>(D) &&
13484            "UnresolvedUsingTypenameDecl transformed to non-using decl");
13485     Ty = cast<UnresolvedUsingTypenameDecl>(D);
13486   }
13487 
13488   return SemaRef.Context.getTypeDeclType(Ty);
13489 }
13490 
13491 template<typename Derived>
13492 QualType TreeTransform<Derived>::RebuildTypeOfExprType(Expr *E,
13493                                                        SourceLocation Loc) {
13494   return SemaRef.BuildTypeofExprType(E, Loc);
13495 }
13496 
13497 template<typename Derived>
13498 QualType TreeTransform<Derived>::RebuildTypeOfType(QualType Underlying) {
13499   return SemaRef.Context.getTypeOfType(Underlying);
13500 }
13501 
13502 template<typename Derived>
13503 QualType TreeTransform<Derived>::RebuildDecltypeType(Expr *E,
13504                                                      SourceLocation Loc) {
13505   return SemaRef.BuildDecltypeType(E, Loc);
13506 }
13507 
13508 template<typename Derived>
13509 QualType TreeTransform<Derived>::RebuildUnaryTransformType(QualType BaseType,
13510                                             UnaryTransformType::UTTKind UKind,
13511                                             SourceLocation Loc) {
13512   return SemaRef.BuildUnaryTransformType(BaseType, UKind, Loc);
13513 }
13514 
13515 template<typename Derived>
13516 QualType TreeTransform<Derived>::RebuildTemplateSpecializationType(
13517                                                       TemplateName Template,
13518                                              SourceLocation TemplateNameLoc,
13519                                      TemplateArgumentListInfo &TemplateArgs) {
13520   return SemaRef.CheckTemplateIdType(Template, TemplateNameLoc, TemplateArgs);
13521 }
13522 
13523 template<typename Derived>
13524 QualType TreeTransform<Derived>::RebuildAtomicType(QualType ValueType,
13525                                                    SourceLocation KWLoc) {
13526   return SemaRef.BuildAtomicType(ValueType, KWLoc);
13527 }
13528 
13529 template<typename Derived>
13530 QualType TreeTransform<Derived>::RebuildPipeType(QualType ValueType,
13531                                                  SourceLocation KWLoc,
13532                                                  bool isReadPipe) {
13533   return isReadPipe ? SemaRef.BuildReadPipeType(ValueType, KWLoc)
13534                     : SemaRef.BuildWritePipeType(ValueType, KWLoc);
13535 }
13536 
13537 template<typename Derived>
13538 TemplateName
13539 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS,
13540                                             bool TemplateKW,
13541                                             TemplateDecl *Template) {
13542   return SemaRef.Context.getQualifiedTemplateName(SS.getScopeRep(), TemplateKW,
13543                                                   Template);
13544 }
13545 
13546 template<typename Derived>
13547 TemplateName
13548 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS,
13549                                             SourceLocation TemplateKWLoc,
13550                                             const IdentifierInfo &Name,
13551                                             SourceLocation NameLoc,
13552                                             QualType ObjectType,
13553                                             NamedDecl *FirstQualifierInScope,
13554                                             bool AllowInjectedClassName) {
13555   UnqualifiedId TemplateName;
13556   TemplateName.setIdentifier(&Name, NameLoc);
13557   Sema::TemplateTy Template;
13558   getSema().ActOnDependentTemplateName(/*Scope=*/nullptr,
13559                                        SS, TemplateKWLoc, TemplateName,
13560                                        ParsedType::make(ObjectType),
13561                                        /*EnteringContext=*/false,
13562                                        Template, AllowInjectedClassName);
13563   return Template.get();
13564 }
13565 
13566 template<typename Derived>
13567 TemplateName
13568 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS,
13569                                             SourceLocation TemplateKWLoc,
13570                                             OverloadedOperatorKind Operator,
13571                                             SourceLocation NameLoc,
13572                                             QualType ObjectType,
13573                                             bool AllowInjectedClassName) {
13574   UnqualifiedId Name;
13575   // FIXME: Bogus location information.
13576   SourceLocation SymbolLocations[3] = { NameLoc, NameLoc, NameLoc };
13577   Name.setOperatorFunctionId(NameLoc, Operator, SymbolLocations);
13578   Sema::TemplateTy Template;
13579   getSema().ActOnDependentTemplateName(/*Scope=*/nullptr,
13580                                        SS, TemplateKWLoc, Name,
13581                                        ParsedType::make(ObjectType),
13582                                        /*EnteringContext=*/false,
13583                                        Template, AllowInjectedClassName);
13584   return Template.get();
13585 }
13586 
13587 template<typename Derived>
13588 ExprResult
13589 TreeTransform<Derived>::RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op,
13590                                                    SourceLocation OpLoc,
13591                                                    Expr *OrigCallee,
13592                                                    Expr *First,
13593                                                    Expr *Second) {
13594   Expr *Callee = OrigCallee->IgnoreParenCasts();
13595   bool isPostIncDec = Second && (Op == OO_PlusPlus || Op == OO_MinusMinus);
13596 
13597   if (First->getObjectKind() == OK_ObjCProperty) {
13598     BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op);
13599     if (BinaryOperator::isAssignmentOp(Opc))
13600       return SemaRef.checkPseudoObjectAssignment(/*Scope=*/nullptr, OpLoc, Opc,
13601                                                  First, Second);
13602     ExprResult Result = SemaRef.CheckPlaceholderExpr(First);
13603     if (Result.isInvalid())
13604       return ExprError();
13605     First = Result.get();
13606   }
13607 
13608   if (Second && Second->getObjectKind() == OK_ObjCProperty) {
13609     ExprResult Result = SemaRef.CheckPlaceholderExpr(Second);
13610     if (Result.isInvalid())
13611       return ExprError();
13612     Second = Result.get();
13613   }
13614 
13615   // Determine whether this should be a builtin operation.
13616   if (Op == OO_Subscript) {
13617     if (!First->getType()->isOverloadableType() &&
13618         !Second->getType()->isOverloadableType())
13619       return getSema().CreateBuiltinArraySubscriptExpr(
13620           First, Callee->getBeginLoc(), Second, OpLoc);
13621   } else if (Op == OO_Arrow) {
13622     // -> is never a builtin operation.
13623     return SemaRef.BuildOverloadedArrowExpr(nullptr, First, OpLoc);
13624   } else if (Second == nullptr || isPostIncDec) {
13625     if (!First->getType()->isOverloadableType() ||
13626         (Op == OO_Amp && getSema().isQualifiedMemberAccess(First))) {
13627       // The argument is not of overloadable type, or this is an expression
13628       // of the form &Class::member, so try to create a built-in unary
13629       // operation.
13630       UnaryOperatorKind Opc
13631         = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec);
13632 
13633       return getSema().CreateBuiltinUnaryOp(OpLoc, Opc, First);
13634     }
13635   } else {
13636     if (!First->getType()->isOverloadableType() &&
13637         !Second->getType()->isOverloadableType()) {
13638       // Neither of the arguments is an overloadable type, so try to
13639       // create a built-in binary operation.
13640       BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op);
13641       ExprResult Result
13642         = SemaRef.CreateBuiltinBinOp(OpLoc, Opc, First, Second);
13643       if (Result.isInvalid())
13644         return ExprError();
13645 
13646       return Result;
13647     }
13648   }
13649 
13650   // Compute the transformed set of functions (and function templates) to be
13651   // used during overload resolution.
13652   UnresolvedSet<16> Functions;
13653   bool RequiresADL;
13654 
13655   if (UnresolvedLookupExpr *ULE = dyn_cast<UnresolvedLookupExpr>(Callee)) {
13656     Functions.append(ULE->decls_begin(), ULE->decls_end());
13657     // If the overload could not be resolved in the template definition
13658     // (because we had a dependent argument), ADL is performed as part of
13659     // template instantiation.
13660     RequiresADL = ULE->requiresADL();
13661   } else {
13662     // If we've resolved this to a particular non-member function, just call
13663     // that function. If we resolved it to a member function,
13664     // CreateOverloaded* will find that function for us.
13665     NamedDecl *ND = cast<DeclRefExpr>(Callee)->getDecl();
13666     if (!isa<CXXMethodDecl>(ND))
13667       Functions.addDecl(ND);
13668     RequiresADL = false;
13669   }
13670 
13671   // Add any functions found via argument-dependent lookup.
13672   Expr *Args[2] = { First, Second };
13673   unsigned NumArgs = 1 + (Second != nullptr);
13674 
13675   // Create the overloaded operator invocation for unary operators.
13676   if (NumArgs == 1 || isPostIncDec) {
13677     UnaryOperatorKind Opc
13678       = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec);
13679     return SemaRef.CreateOverloadedUnaryOp(OpLoc, Opc, Functions, First,
13680                                            RequiresADL);
13681   }
13682 
13683   if (Op == OO_Subscript) {
13684     SourceLocation LBrace;
13685     SourceLocation RBrace;
13686 
13687     if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Callee)) {
13688         DeclarationNameLoc NameLoc = DRE->getNameInfo().getInfo();
13689         LBrace = SourceLocation::getFromRawEncoding(
13690                     NameLoc.CXXOperatorName.BeginOpNameLoc);
13691         RBrace = SourceLocation::getFromRawEncoding(
13692                     NameLoc.CXXOperatorName.EndOpNameLoc);
13693     } else {
13694       LBrace = Callee->getBeginLoc();
13695       RBrace = OpLoc;
13696     }
13697 
13698     return SemaRef.CreateOverloadedArraySubscriptExpr(LBrace, RBrace,
13699                                                       First, Second);
13700   }
13701 
13702   // Create the overloaded operator invocation for binary operators.
13703   BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op);
13704   ExprResult Result = SemaRef.CreateOverloadedBinOp(
13705       OpLoc, Opc, Functions, Args[0], Args[1], RequiresADL);
13706   if (Result.isInvalid())
13707     return ExprError();
13708 
13709   return Result;
13710 }
13711 
13712 template<typename Derived>
13713 ExprResult
13714 TreeTransform<Derived>::RebuildCXXPseudoDestructorExpr(Expr *Base,
13715                                                      SourceLocation OperatorLoc,
13716                                                        bool isArrow,
13717                                                        CXXScopeSpec &SS,
13718                                                      TypeSourceInfo *ScopeType,
13719                                                        SourceLocation CCLoc,
13720                                                        SourceLocation TildeLoc,
13721                                         PseudoDestructorTypeStorage Destroyed) {
13722   QualType BaseType = Base->getType();
13723   if (Base->isTypeDependent() || Destroyed.getIdentifier() ||
13724       (!isArrow && !BaseType->getAs<RecordType>()) ||
13725       (isArrow && BaseType->getAs<PointerType>() &&
13726        !BaseType->castAs<PointerType>()->getPointeeType()
13727                                               ->template getAs<RecordType>())){
13728     // This pseudo-destructor expression is still a pseudo-destructor.
13729     return SemaRef.BuildPseudoDestructorExpr(
13730         Base, OperatorLoc, isArrow ? tok::arrow : tok::period, SS, ScopeType,
13731         CCLoc, TildeLoc, Destroyed);
13732   }
13733 
13734   TypeSourceInfo *DestroyedType = Destroyed.getTypeSourceInfo();
13735   DeclarationName Name(SemaRef.Context.DeclarationNames.getCXXDestructorName(
13736                  SemaRef.Context.getCanonicalType(DestroyedType->getType())));
13737   DeclarationNameInfo NameInfo(Name, Destroyed.getLocation());
13738   NameInfo.setNamedTypeInfo(DestroyedType);
13739 
13740   // The scope type is now known to be a valid nested name specifier
13741   // component. Tack it on to the end of the nested name specifier.
13742   if (ScopeType) {
13743     if (!ScopeType->getType()->getAs<TagType>()) {
13744       getSema().Diag(ScopeType->getTypeLoc().getBeginLoc(),
13745                      diag::err_expected_class_or_namespace)
13746           << ScopeType->getType() << getSema().getLangOpts().CPlusPlus;
13747       return ExprError();
13748     }
13749     SS.Extend(SemaRef.Context, SourceLocation(), ScopeType->getTypeLoc(),
13750               CCLoc);
13751   }
13752 
13753   SourceLocation TemplateKWLoc; // FIXME: retrieve it from caller.
13754   return getSema().BuildMemberReferenceExpr(Base, BaseType,
13755                                             OperatorLoc, isArrow,
13756                                             SS, TemplateKWLoc,
13757                                             /*FIXME: FirstQualifier*/ nullptr,
13758                                             NameInfo,
13759                                             /*TemplateArgs*/ nullptr,
13760                                             /*S*/nullptr);
13761 }
13762 
13763 template<typename Derived>
13764 StmtResult
13765 TreeTransform<Derived>::TransformCapturedStmt(CapturedStmt *S) {
13766   SourceLocation Loc = S->getBeginLoc();
13767   CapturedDecl *CD = S->getCapturedDecl();
13768   unsigned NumParams = CD->getNumParams();
13769   unsigned ContextParamPos = CD->getContextParamPosition();
13770   SmallVector<Sema::CapturedParamNameType, 4> Params;
13771   for (unsigned I = 0; I < NumParams; ++I) {
13772     if (I != ContextParamPos) {
13773       Params.push_back(
13774              std::make_pair(
13775                   CD->getParam(I)->getName(),
13776                   getDerived().TransformType(CD->getParam(I)->getType())));
13777     } else {
13778       Params.push_back(std::make_pair(StringRef(), QualType()));
13779     }
13780   }
13781   getSema().ActOnCapturedRegionStart(Loc, /*CurScope*/nullptr,
13782                                      S->getCapturedRegionKind(), Params);
13783   StmtResult Body;
13784   {
13785     Sema::CompoundScopeRAII CompoundScope(getSema());
13786     Body = getDerived().TransformStmt(S->getCapturedStmt());
13787   }
13788 
13789   if (Body.isInvalid()) {
13790     getSema().ActOnCapturedRegionError();
13791     return StmtError();
13792   }
13793 
13794   return getSema().ActOnCapturedRegionEnd(Body.get());
13795 }
13796 
13797 } // end namespace clang
13798 
13799 #endif // LLVM_CLANG_LIB_SEMA_TREETRANSFORM_H
13800