1 //===------- TreeTransform.h - Semantic Tree Transformation -----*- C++ -*-===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //===----------------------------------------------------------------------===//
7 //
8 //  This file implements a semantic tree transformation that takes a given
9 //  AST and rebuilds it, possibly transforming some nodes in the process.
10 //
11 //===----------------------------------------------------------------------===//
12 
13 #ifndef LLVM_CLANG_LIB_SEMA_TREETRANSFORM_H
14 #define LLVM_CLANG_LIB_SEMA_TREETRANSFORM_H
15 
16 #include "CoroutineStmtBuilder.h"
17 #include "TypeLocBuilder.h"
18 #include "clang/AST/Decl.h"
19 #include "clang/AST/DeclObjC.h"
20 #include "clang/AST/DeclTemplate.h"
21 #include "clang/AST/Expr.h"
22 #include "clang/AST/ExprConcepts.h"
23 #include "clang/AST/ExprCXX.h"
24 #include "clang/AST/ExprObjC.h"
25 #include "clang/AST/ExprOpenMP.h"
26 #include "clang/AST/OpenMPClause.h"
27 #include "clang/AST/Stmt.h"
28 #include "clang/AST/StmtCXX.h"
29 #include "clang/AST/StmtObjC.h"
30 #include "clang/AST/StmtOpenMP.h"
31 #include "clang/Sema/Designator.h"
32 #include "clang/Sema/Lookup.h"
33 #include "clang/Sema/Ownership.h"
34 #include "clang/Sema/ParsedTemplate.h"
35 #include "clang/Sema/ScopeInfo.h"
36 #include "clang/Sema/SemaDiagnostic.h"
37 #include "clang/Sema/SemaInternal.h"
38 #include "llvm/ADT/ArrayRef.h"
39 #include "llvm/Support/ErrorHandling.h"
40 #include <algorithm>
41 
42 using namespace llvm::omp;
43 
44 namespace clang {
45 using namespace sema;
46 
47 /// A semantic tree transformation that allows one to transform one
48 /// abstract syntax tree into another.
49 ///
50 /// A new tree transformation is defined by creating a new subclass \c X of
51 /// \c TreeTransform<X> and then overriding certain operations to provide
52 /// behavior specific to that transformation. For example, template
53 /// instantiation is implemented as a tree transformation where the
54 /// transformation of TemplateTypeParmType nodes involves substituting the
55 /// template arguments for their corresponding template parameters; a similar
56 /// transformation is performed for non-type template parameters and
57 /// template template parameters.
58 ///
59 /// This tree-transformation template uses static polymorphism to allow
60 /// subclasses to customize any of its operations. Thus, a subclass can
61 /// override any of the transformation or rebuild operators by providing an
62 /// operation with the same signature as the default implementation. The
63 /// overriding function should not be virtual.
64 ///
65 /// Semantic tree transformations are split into two stages, either of which
66 /// can be replaced by a subclass. The "transform" step transforms an AST node
67 /// or the parts of an AST node using the various transformation functions,
68 /// then passes the pieces on to the "rebuild" step, which constructs a new AST
69 /// node of the appropriate kind from the pieces. The default transformation
70 /// routines recursively transform the operands to composite AST nodes (e.g.,
71 /// the pointee type of a PointerType node) and, if any of those operand nodes
72 /// were changed by the transformation, invokes the rebuild operation to create
73 /// a new AST node.
74 ///
75 /// Subclasses can customize the transformation at various levels. The
76 /// most coarse-grained transformations involve replacing TransformType(),
77 /// TransformExpr(), TransformDecl(), TransformNestedNameSpecifierLoc(),
78 /// TransformTemplateName(), or TransformTemplateArgument() with entirely
79 /// new implementations.
80 ///
81 /// For more fine-grained transformations, subclasses can replace any of the
82 /// \c TransformXXX functions (where XXX is the name of an AST node, e.g.,
83 /// PointerType, StmtExpr) to alter the transformation. As mentioned previously,
84 /// replacing TransformTemplateTypeParmType() allows template instantiation
85 /// to substitute template arguments for their corresponding template
86 /// parameters. Additionally, subclasses can override the \c RebuildXXX
87 /// functions to control how AST nodes are rebuilt when their operands change.
88 /// By default, \c TreeTransform will invoke semantic analysis to rebuild
89 /// AST nodes. However, certain other tree transformations (e.g, cloning) may
90 /// be able to use more efficient rebuild steps.
91 ///
92 /// There are a handful of other functions that can be overridden, allowing one
93 /// to avoid traversing nodes that don't need any transformation
94 /// (\c AlreadyTransformed()), force rebuilding AST nodes even when their
95 /// operands have not changed (\c AlwaysRebuild()), and customize the
96 /// default locations and entity names used for type-checking
97 /// (\c getBaseLocation(), \c getBaseEntity()).
98 template<typename Derived>
99 class TreeTransform {
100   /// Private RAII object that helps us forget and then re-remember
101   /// the template argument corresponding to a partially-substituted parameter
102   /// pack.
103   class ForgetPartiallySubstitutedPackRAII {
104     Derived &Self;
105     TemplateArgument Old;
106 
107   public:
108     ForgetPartiallySubstitutedPackRAII(Derived &Self) : Self(Self) {
109       Old = Self.ForgetPartiallySubstitutedPack();
110     }
111 
112     ~ForgetPartiallySubstitutedPackRAII() {
113       Self.RememberPartiallySubstitutedPack(Old);
114     }
115   };
116 
117 protected:
118   Sema &SemaRef;
119 
120   /// The set of local declarations that have been transformed, for
121   /// cases where we are forced to build new declarations within the transformer
122   /// rather than in the subclass (e.g., lambda closure types).
123   llvm::DenseMap<Decl *, Decl *> TransformedLocalDecls;
124 
125 public:
126   /// Initializes a new tree transformer.
127   TreeTransform(Sema &SemaRef) : SemaRef(SemaRef) { }
128 
129   /// Retrieves a reference to the derived class.
130   Derived &getDerived() { return static_cast<Derived&>(*this); }
131 
132   /// Retrieves a reference to the derived class.
133   const Derived &getDerived() const {
134     return static_cast<const Derived&>(*this);
135   }
136 
137   static inline ExprResult Owned(Expr *E) { return E; }
138   static inline StmtResult Owned(Stmt *S) { return S; }
139 
140   /// Retrieves a reference to the semantic analysis object used for
141   /// this tree transform.
142   Sema &getSema() const { return SemaRef; }
143 
144   /// Whether the transformation should always rebuild AST nodes, even
145   /// if none of the children have changed.
146   ///
147   /// Subclasses may override this function to specify when the transformation
148   /// should rebuild all AST nodes.
149   ///
150   /// We must always rebuild all AST nodes when performing variadic template
151   /// pack expansion, in order to avoid violating the AST invariant that each
152   /// statement node appears at most once in its containing declaration.
153   bool AlwaysRebuild() { return SemaRef.ArgumentPackSubstitutionIndex != -1; }
154 
155   /// Whether the transformation is forming an expression or statement that
156   /// replaces the original. In this case, we'll reuse mangling numbers from
157   /// existing lambdas.
158   bool ReplacingOriginal() { return false; }
159 
160   /// Returns the location of the entity being transformed, if that
161   /// information was not available elsewhere in the AST.
162   ///
163   /// By default, returns no source-location information. Subclasses can
164   /// provide an alternative implementation that provides better location
165   /// information.
166   SourceLocation getBaseLocation() { return SourceLocation(); }
167 
168   /// Returns the name of the entity being transformed, if that
169   /// information was not available elsewhere in the AST.
170   ///
171   /// By default, returns an empty name. Subclasses can provide an alternative
172   /// implementation with a more precise name.
173   DeclarationName getBaseEntity() { return DeclarationName(); }
174 
175   /// Sets the "base" location and entity when that
176   /// information is known based on another transformation.
177   ///
178   /// By default, the source location and entity are ignored. Subclasses can
179   /// override this function to provide a customized implementation.
180   void setBase(SourceLocation Loc, DeclarationName Entity) { }
181 
182   /// RAII object that temporarily sets the base location and entity
183   /// used for reporting diagnostics in types.
184   class TemporaryBase {
185     TreeTransform &Self;
186     SourceLocation OldLocation;
187     DeclarationName OldEntity;
188 
189   public:
190     TemporaryBase(TreeTransform &Self, SourceLocation Location,
191                   DeclarationName Entity) : Self(Self) {
192       OldLocation = Self.getDerived().getBaseLocation();
193       OldEntity = Self.getDerived().getBaseEntity();
194 
195       if (Location.isValid())
196         Self.getDerived().setBase(Location, Entity);
197     }
198 
199     ~TemporaryBase() {
200       Self.getDerived().setBase(OldLocation, OldEntity);
201     }
202   };
203 
204   /// Determine whether the given type \p T has already been
205   /// transformed.
206   ///
207   /// Subclasses can provide an alternative implementation of this routine
208   /// to short-circuit evaluation when it is known that a given type will
209   /// not change. For example, template instantiation need not traverse
210   /// non-dependent types.
211   bool AlreadyTransformed(QualType T) {
212     return T.isNull();
213   }
214 
215   /// Determine whether the given call argument should be dropped, e.g.,
216   /// because it is a default argument.
217   ///
218   /// Subclasses can provide an alternative implementation of this routine to
219   /// determine which kinds of call arguments get dropped. By default,
220   /// CXXDefaultArgument nodes are dropped (prior to transformation).
221   bool DropCallArgument(Expr *E) {
222     return E->isDefaultArgument();
223   }
224 
225   /// Determine whether we should expand a pack expansion with the
226   /// given set of parameter packs into separate arguments by repeatedly
227   /// transforming the pattern.
228   ///
229   /// By default, the transformer never tries to expand pack expansions.
230   /// Subclasses can override this routine to provide different behavior.
231   ///
232   /// \param EllipsisLoc The location of the ellipsis that identifies the
233   /// pack expansion.
234   ///
235   /// \param PatternRange The source range that covers the entire pattern of
236   /// the pack expansion.
237   ///
238   /// \param Unexpanded The set of unexpanded parameter packs within the
239   /// pattern.
240   ///
241   /// \param ShouldExpand Will be set to \c true if the transformer should
242   /// expand the corresponding pack expansions into separate arguments. When
243   /// set, \c NumExpansions must also be set.
244   ///
245   /// \param RetainExpansion Whether the caller should add an unexpanded
246   /// pack expansion after all of the expanded arguments. This is used
247   /// when extending explicitly-specified template argument packs per
248   /// C++0x [temp.arg.explicit]p9.
249   ///
250   /// \param NumExpansions The number of separate arguments that will be in
251   /// the expanded form of the corresponding pack expansion. This is both an
252   /// input and an output parameter, which can be set by the caller if the
253   /// number of expansions is known a priori (e.g., due to a prior substitution)
254   /// and will be set by the callee when the number of expansions is known.
255   /// The callee must set this value when \c ShouldExpand is \c true; it may
256   /// set this value in other cases.
257   ///
258   /// \returns true if an error occurred (e.g., because the parameter packs
259   /// are to be instantiated with arguments of different lengths), false
260   /// otherwise. If false, \c ShouldExpand (and possibly \c NumExpansions)
261   /// must be set.
262   bool TryExpandParameterPacks(SourceLocation EllipsisLoc,
263                                SourceRange PatternRange,
264                                ArrayRef<UnexpandedParameterPack> Unexpanded,
265                                bool &ShouldExpand,
266                                bool &RetainExpansion,
267                                Optional<unsigned> &NumExpansions) {
268     ShouldExpand = false;
269     return false;
270   }
271 
272   /// "Forget" about the partially-substituted pack template argument,
273   /// when performing an instantiation that must preserve the parameter pack
274   /// use.
275   ///
276   /// This routine is meant to be overridden by the template instantiator.
277   TemplateArgument ForgetPartiallySubstitutedPack() {
278     return TemplateArgument();
279   }
280 
281   /// "Remember" the partially-substituted pack template argument
282   /// after performing an instantiation that must preserve the parameter pack
283   /// use.
284   ///
285   /// This routine is meant to be overridden by the template instantiator.
286   void RememberPartiallySubstitutedPack(TemplateArgument Arg) { }
287 
288   /// Note to the derived class when a function parameter pack is
289   /// being expanded.
290   void ExpandingFunctionParameterPack(ParmVarDecl *Pack) { }
291 
292   /// Transforms the given type into another type.
293   ///
294   /// By default, this routine transforms a type by creating a
295   /// TypeSourceInfo for it and delegating to the appropriate
296   /// function.  This is expensive, but we don't mind, because
297   /// this method is deprecated anyway;  all users should be
298   /// switched to storing TypeSourceInfos.
299   ///
300   /// \returns the transformed type.
301   QualType TransformType(QualType T);
302 
303   /// Transforms the given type-with-location into a new
304   /// type-with-location.
305   ///
306   /// By default, this routine transforms a type by delegating to the
307   /// appropriate TransformXXXType to build a new type.  Subclasses
308   /// may override this function (to take over all type
309   /// transformations) or some set of the TransformXXXType functions
310   /// to alter the transformation.
311   TypeSourceInfo *TransformType(TypeSourceInfo *DI);
312 
313   /// Transform the given type-with-location into a new
314   /// type, collecting location information in the given builder
315   /// as necessary.
316   ///
317   QualType TransformType(TypeLocBuilder &TLB, TypeLoc TL);
318 
319   /// Transform a type that is permitted to produce a
320   /// DeducedTemplateSpecializationType.
321   ///
322   /// This is used in the (relatively rare) contexts where it is acceptable
323   /// for transformation to produce a class template type with deduced
324   /// template arguments.
325   /// @{
326   QualType TransformTypeWithDeducedTST(QualType T);
327   TypeSourceInfo *TransformTypeWithDeducedTST(TypeSourceInfo *DI);
328   /// @}
329 
330   /// The reason why the value of a statement is not discarded, if any.
331   enum StmtDiscardKind {
332     SDK_Discarded,
333     SDK_NotDiscarded,
334     SDK_StmtExprResult,
335   };
336 
337   /// Transform the given statement.
338   ///
339   /// By default, this routine transforms a statement by delegating to the
340   /// appropriate TransformXXXStmt function to transform a specific kind of
341   /// statement or the TransformExpr() function to transform an expression.
342   /// Subclasses may override this function to transform statements using some
343   /// other mechanism.
344   ///
345   /// \returns the transformed statement.
346   StmtResult TransformStmt(Stmt *S, StmtDiscardKind SDK = SDK_Discarded);
347 
348   /// Transform the given statement.
349   ///
350   /// By default, this routine transforms a statement by delegating to the
351   /// appropriate TransformOMPXXXClause function to transform a specific kind
352   /// of clause. Subclasses may override this function to transform statements
353   /// using some other mechanism.
354   ///
355   /// \returns the transformed OpenMP clause.
356   OMPClause *TransformOMPClause(OMPClause *S);
357 
358   /// Transform the given attribute.
359   ///
360   /// By default, this routine transforms a statement by delegating to the
361   /// appropriate TransformXXXAttr function to transform a specific kind
362   /// of attribute. Subclasses may override this function to transform
363   /// attributed statements using some other mechanism.
364   ///
365   /// \returns the transformed attribute
366   const Attr *TransformAttr(const Attr *S);
367 
368 /// Transform the specified attribute.
369 ///
370 /// Subclasses should override the transformation of attributes with a pragma
371 /// spelling to transform expressions stored within the attribute.
372 ///
373 /// \returns the transformed attribute.
374 #define ATTR(X)
375 #define PRAGMA_SPELLING_ATTR(X)                                                \
376   const X##Attr *Transform##X##Attr(const X##Attr *R) { return R; }
377 #include "clang/Basic/AttrList.inc"
378 
379   /// Transform the given expression.
380   ///
381   /// By default, this routine transforms an expression by delegating to the
382   /// appropriate TransformXXXExpr function to build a new expression.
383   /// Subclasses may override this function to transform expressions using some
384   /// other mechanism.
385   ///
386   /// \returns the transformed expression.
387   ExprResult TransformExpr(Expr *E);
388 
389   /// Transform the given initializer.
390   ///
391   /// By default, this routine transforms an initializer by stripping off the
392   /// semantic nodes added by initialization, then passing the result to
393   /// TransformExpr or TransformExprs.
394   ///
395   /// \returns the transformed initializer.
396   ExprResult TransformInitializer(Expr *Init, bool NotCopyInit);
397 
398   /// Transform the given list of expressions.
399   ///
400   /// This routine transforms a list of expressions by invoking
401   /// \c TransformExpr() for each subexpression. However, it also provides
402   /// support for variadic templates by expanding any pack expansions (if the
403   /// derived class permits such expansion) along the way. When pack expansions
404   /// are present, the number of outputs may not equal the number of inputs.
405   ///
406   /// \param Inputs The set of expressions to be transformed.
407   ///
408   /// \param NumInputs The number of expressions in \c Inputs.
409   ///
410   /// \param IsCall If \c true, then this transform is being performed on
411   /// function-call arguments, and any arguments that should be dropped, will
412   /// be.
413   ///
414   /// \param Outputs The transformed input expressions will be added to this
415   /// vector.
416   ///
417   /// \param ArgChanged If non-NULL, will be set \c true if any argument changed
418   /// due to transformation.
419   ///
420   /// \returns true if an error occurred, false otherwise.
421   bool TransformExprs(Expr *const *Inputs, unsigned NumInputs, bool IsCall,
422                       SmallVectorImpl<Expr *> &Outputs,
423                       bool *ArgChanged = nullptr);
424 
425   /// Transform the given declaration, which is referenced from a type
426   /// or expression.
427   ///
428   /// By default, acts as the identity function on declarations, unless the
429   /// transformer has had to transform the declaration itself. Subclasses
430   /// may override this function to provide alternate behavior.
431   Decl *TransformDecl(SourceLocation Loc, Decl *D) {
432     llvm::DenseMap<Decl *, Decl *>::iterator Known
433       = TransformedLocalDecls.find(D);
434     if (Known != TransformedLocalDecls.end())
435       return Known->second;
436 
437     return D;
438   }
439 
440   /// Transform the specified condition.
441   ///
442   /// By default, this transforms the variable and expression and rebuilds
443   /// the condition.
444   Sema::ConditionResult TransformCondition(SourceLocation Loc, VarDecl *Var,
445                                            Expr *Expr,
446                                            Sema::ConditionKind Kind);
447 
448   /// Transform the attributes associated with the given declaration and
449   /// place them on the new declaration.
450   ///
451   /// By default, this operation does nothing. Subclasses may override this
452   /// behavior to transform attributes.
453   void transformAttrs(Decl *Old, Decl *New) { }
454 
455   /// Note that a local declaration has been transformed by this
456   /// transformer.
457   ///
458   /// Local declarations are typically transformed via a call to
459   /// TransformDefinition. However, in some cases (e.g., lambda expressions),
460   /// the transformer itself has to transform the declarations. This routine
461   /// can be overridden by a subclass that keeps track of such mappings.
462   void transformedLocalDecl(Decl *Old, ArrayRef<Decl *> New) {
463     assert(New.size() == 1 &&
464            "must override transformedLocalDecl if performing pack expansion");
465     TransformedLocalDecls[Old] = New.front();
466   }
467 
468   /// Transform the definition of the given declaration.
469   ///
470   /// By default, invokes TransformDecl() to transform the declaration.
471   /// Subclasses may override this function to provide alternate behavior.
472   Decl *TransformDefinition(SourceLocation Loc, Decl *D) {
473     return getDerived().TransformDecl(Loc, D);
474   }
475 
476   /// Transform the given declaration, which was the first part of a
477   /// nested-name-specifier in a member access expression.
478   ///
479   /// This specific declaration transformation only applies to the first
480   /// identifier in a nested-name-specifier of a member access expression, e.g.,
481   /// the \c T in \c x->T::member
482   ///
483   /// By default, invokes TransformDecl() to transform the declaration.
484   /// Subclasses may override this function to provide alternate behavior.
485   NamedDecl *TransformFirstQualifierInScope(NamedDecl *D, SourceLocation Loc) {
486     return cast_or_null<NamedDecl>(getDerived().TransformDecl(Loc, D));
487   }
488 
489   /// Transform the set of declarations in an OverloadExpr.
490   bool TransformOverloadExprDecls(OverloadExpr *Old, bool RequiresADL,
491                                   LookupResult &R);
492 
493   /// Transform the given nested-name-specifier with source-location
494   /// information.
495   ///
496   /// By default, transforms all of the types and declarations within the
497   /// nested-name-specifier. Subclasses may override this function to provide
498   /// alternate behavior.
499   NestedNameSpecifierLoc
500   TransformNestedNameSpecifierLoc(NestedNameSpecifierLoc NNS,
501                                   QualType ObjectType = QualType(),
502                                   NamedDecl *FirstQualifierInScope = nullptr);
503 
504   /// Transform the given declaration name.
505   ///
506   /// By default, transforms the types of conversion function, constructor,
507   /// and destructor names and then (if needed) rebuilds the declaration name.
508   /// Identifiers and selectors are returned unmodified. Sublcasses may
509   /// override this function to provide alternate behavior.
510   DeclarationNameInfo
511   TransformDeclarationNameInfo(const DeclarationNameInfo &NameInfo);
512 
513   bool TransformRequiresExprRequirements(ArrayRef<concepts::Requirement *> Reqs,
514       llvm::SmallVectorImpl<concepts::Requirement *> &Transformed);
515   concepts::TypeRequirement *
516   TransformTypeRequirement(concepts::TypeRequirement *Req);
517   concepts::ExprRequirement *
518   TransformExprRequirement(concepts::ExprRequirement *Req);
519   concepts::NestedRequirement *
520   TransformNestedRequirement(concepts::NestedRequirement *Req);
521 
522   /// Transform the given template name.
523   ///
524   /// \param SS The nested-name-specifier that qualifies the template
525   /// name. This nested-name-specifier must already have been transformed.
526   ///
527   /// \param Name The template name to transform.
528   ///
529   /// \param NameLoc The source location of the template name.
530   ///
531   /// \param ObjectType If we're translating a template name within a member
532   /// access expression, this is the type of the object whose member template
533   /// is being referenced.
534   ///
535   /// \param FirstQualifierInScope If the first part of a nested-name-specifier
536   /// also refers to a name within the current (lexical) scope, this is the
537   /// declaration it refers to.
538   ///
539   /// By default, transforms the template name by transforming the declarations
540   /// and nested-name-specifiers that occur within the template name.
541   /// Subclasses may override this function to provide alternate behavior.
542   TemplateName
543   TransformTemplateName(CXXScopeSpec &SS, TemplateName Name,
544                         SourceLocation NameLoc,
545                         QualType ObjectType = QualType(),
546                         NamedDecl *FirstQualifierInScope = nullptr,
547                         bool AllowInjectedClassName = false);
548 
549   /// Transform the given template argument.
550   ///
551   /// By default, this operation transforms the type, expression, or
552   /// declaration stored within the template argument and constructs a
553   /// new template argument from the transformed result. Subclasses may
554   /// override this function to provide alternate behavior.
555   ///
556   /// Returns true if there was an error.
557   bool TransformTemplateArgument(const TemplateArgumentLoc &Input,
558                                  TemplateArgumentLoc &Output,
559                                  bool Uneval = false);
560 
561   /// Transform the given set of template arguments.
562   ///
563   /// By default, this operation transforms all of the template arguments
564   /// in the input set using \c TransformTemplateArgument(), and appends
565   /// the transformed arguments to the output list.
566   ///
567   /// Note that this overload of \c TransformTemplateArguments() is merely
568   /// a convenience function. Subclasses that wish to override this behavior
569   /// should override the iterator-based member template version.
570   ///
571   /// \param Inputs The set of template arguments to be transformed.
572   ///
573   /// \param NumInputs The number of template arguments in \p Inputs.
574   ///
575   /// \param Outputs The set of transformed template arguments output by this
576   /// routine.
577   ///
578   /// Returns true if an error occurred.
579   bool TransformTemplateArguments(const TemplateArgumentLoc *Inputs,
580                                   unsigned NumInputs,
581                                   TemplateArgumentListInfo &Outputs,
582                                   bool Uneval = false) {
583     return TransformTemplateArguments(Inputs, Inputs + NumInputs, Outputs,
584                                       Uneval);
585   }
586 
587   /// Transform the given set of template arguments.
588   ///
589   /// By default, this operation transforms all of the template arguments
590   /// in the input set using \c TransformTemplateArgument(), and appends
591   /// the transformed arguments to the output list.
592   ///
593   /// \param First An iterator to the first template argument.
594   ///
595   /// \param Last An iterator one step past the last template argument.
596   ///
597   /// \param Outputs The set of transformed template arguments output by this
598   /// routine.
599   ///
600   /// Returns true if an error occurred.
601   template<typename InputIterator>
602   bool TransformTemplateArguments(InputIterator First,
603                                   InputIterator Last,
604                                   TemplateArgumentListInfo &Outputs,
605                                   bool Uneval = false);
606 
607   /// Fakes up a TemplateArgumentLoc for a given TemplateArgument.
608   void InventTemplateArgumentLoc(const TemplateArgument &Arg,
609                                  TemplateArgumentLoc &ArgLoc);
610 
611   /// Fakes up a TypeSourceInfo for a type.
612   TypeSourceInfo *InventTypeSourceInfo(QualType T) {
613     return SemaRef.Context.getTrivialTypeSourceInfo(T,
614                        getDerived().getBaseLocation());
615   }
616 
617 #define ABSTRACT_TYPELOC(CLASS, PARENT)
618 #define TYPELOC(CLASS, PARENT)                                   \
619   QualType Transform##CLASS##Type(TypeLocBuilder &TLB, CLASS##TypeLoc T);
620 #include "clang/AST/TypeLocNodes.def"
621 
622   template<typename Fn>
623   QualType TransformFunctionProtoType(TypeLocBuilder &TLB,
624                                       FunctionProtoTypeLoc TL,
625                                       CXXRecordDecl *ThisContext,
626                                       Qualifiers ThisTypeQuals,
627                                       Fn TransformExceptionSpec);
628 
629   bool TransformExceptionSpec(SourceLocation Loc,
630                               FunctionProtoType::ExceptionSpecInfo &ESI,
631                               SmallVectorImpl<QualType> &Exceptions,
632                               bool &Changed);
633 
634   StmtResult TransformSEHHandler(Stmt *Handler);
635 
636   QualType
637   TransformTemplateSpecializationType(TypeLocBuilder &TLB,
638                                       TemplateSpecializationTypeLoc TL,
639                                       TemplateName Template);
640 
641   QualType
642   TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB,
643                                       DependentTemplateSpecializationTypeLoc TL,
644                                                TemplateName Template,
645                                                CXXScopeSpec &SS);
646 
647   QualType TransformDependentTemplateSpecializationType(
648       TypeLocBuilder &TLB, DependentTemplateSpecializationTypeLoc TL,
649       NestedNameSpecifierLoc QualifierLoc);
650 
651   /// Transforms the parameters of a function type into the
652   /// given vectors.
653   ///
654   /// The result vectors should be kept in sync; null entries in the
655   /// variables vector are acceptable.
656   ///
657   /// Return true on error.
658   bool TransformFunctionTypeParams(
659       SourceLocation Loc, ArrayRef<ParmVarDecl *> Params,
660       const QualType *ParamTypes,
661       const FunctionProtoType::ExtParameterInfo *ParamInfos,
662       SmallVectorImpl<QualType> &PTypes, SmallVectorImpl<ParmVarDecl *> *PVars,
663       Sema::ExtParameterInfoBuilder &PInfos);
664 
665   /// Transforms a single function-type parameter.  Return null
666   /// on error.
667   ///
668   /// \param indexAdjustment - A number to add to the parameter's
669   ///   scope index;  can be negative
670   ParmVarDecl *TransformFunctionTypeParam(ParmVarDecl *OldParm,
671                                           int indexAdjustment,
672                                           Optional<unsigned> NumExpansions,
673                                           bool ExpectParameterPack);
674 
675   /// Transform the body of a lambda-expression.
676   StmtResult TransformLambdaBody(LambdaExpr *E, Stmt *Body);
677   /// Alternative implementation of TransformLambdaBody that skips transforming
678   /// the body.
679   StmtResult SkipLambdaBody(LambdaExpr *E, Stmt *Body);
680 
681   QualType TransformReferenceType(TypeLocBuilder &TLB, ReferenceTypeLoc TL);
682 
683   StmtResult TransformCompoundStmt(CompoundStmt *S, bool IsStmtExpr);
684   ExprResult TransformCXXNamedCastExpr(CXXNamedCastExpr *E);
685 
686   TemplateParameterList *TransformTemplateParameterList(
687         TemplateParameterList *TPL) {
688     return TPL;
689   }
690 
691   ExprResult TransformAddressOfOperand(Expr *E);
692 
693   ExprResult TransformDependentScopeDeclRefExpr(DependentScopeDeclRefExpr *E,
694                                                 bool IsAddressOfOperand,
695                                                 TypeSourceInfo **RecoveryTSI);
696 
697   ExprResult TransformParenDependentScopeDeclRefExpr(
698       ParenExpr *PE, DependentScopeDeclRefExpr *DRE, bool IsAddressOfOperand,
699       TypeSourceInfo **RecoveryTSI);
700 
701   StmtResult TransformOMPExecutableDirective(OMPExecutableDirective *S);
702 
703 // FIXME: We use LLVM_ATTRIBUTE_NOINLINE because inlining causes a ridiculous
704 // amount of stack usage with clang.
705 #define STMT(Node, Parent)                        \
706   LLVM_ATTRIBUTE_NOINLINE \
707   StmtResult Transform##Node(Node *S);
708 #define VALUESTMT(Node, Parent)                   \
709   LLVM_ATTRIBUTE_NOINLINE \
710   StmtResult Transform##Node(Node *S, StmtDiscardKind SDK);
711 #define EXPR(Node, Parent)                        \
712   LLVM_ATTRIBUTE_NOINLINE \
713   ExprResult Transform##Node(Node *E);
714 #define ABSTRACT_STMT(Stmt)
715 #include "clang/AST/StmtNodes.inc"
716 
717 #define OPENMP_CLAUSE(Name, Class)                        \
718   LLVM_ATTRIBUTE_NOINLINE \
719   OMPClause *Transform ## Class(Class *S);
720 #include "clang/Basic/OpenMPKinds.def"
721 
722   /// Build a new qualified type given its unqualified type and type location.
723   ///
724   /// By default, this routine adds type qualifiers only to types that can
725   /// have qualifiers, and silently suppresses those qualifiers that are not
726   /// permitted. Subclasses may override this routine to provide different
727   /// behavior.
728   QualType RebuildQualifiedType(QualType T, QualifiedTypeLoc TL);
729 
730   /// Build a new pointer type given its pointee type.
731   ///
732   /// By default, performs semantic analysis when building the pointer type.
733   /// Subclasses may override this routine to provide different behavior.
734   QualType RebuildPointerType(QualType PointeeType, SourceLocation Sigil);
735 
736   /// Build a new block pointer type given its pointee type.
737   ///
738   /// By default, performs semantic analysis when building the block pointer
739   /// type. Subclasses may override this routine to provide different behavior.
740   QualType RebuildBlockPointerType(QualType PointeeType, SourceLocation Sigil);
741 
742   /// Build a new reference type given the type it references.
743   ///
744   /// By default, performs semantic analysis when building the
745   /// reference type. Subclasses may override this routine to provide
746   /// different behavior.
747   ///
748   /// \param LValue whether the type was written with an lvalue sigil
749   /// or an rvalue sigil.
750   QualType RebuildReferenceType(QualType ReferentType,
751                                 bool LValue,
752                                 SourceLocation Sigil);
753 
754   /// Build a new member pointer type given the pointee type and the
755   /// class type it refers into.
756   ///
757   /// By default, performs semantic analysis when building the member pointer
758   /// type. Subclasses may override this routine to provide different behavior.
759   QualType RebuildMemberPointerType(QualType PointeeType, QualType ClassType,
760                                     SourceLocation Sigil);
761 
762   QualType RebuildObjCTypeParamType(const ObjCTypeParamDecl *Decl,
763                                     SourceLocation ProtocolLAngleLoc,
764                                     ArrayRef<ObjCProtocolDecl *> Protocols,
765                                     ArrayRef<SourceLocation> ProtocolLocs,
766                                     SourceLocation ProtocolRAngleLoc);
767 
768   /// Build an Objective-C object type.
769   ///
770   /// By default, performs semantic analysis when building the object type.
771   /// Subclasses may override this routine to provide different behavior.
772   QualType RebuildObjCObjectType(QualType BaseType,
773                                  SourceLocation Loc,
774                                  SourceLocation TypeArgsLAngleLoc,
775                                  ArrayRef<TypeSourceInfo *> TypeArgs,
776                                  SourceLocation TypeArgsRAngleLoc,
777                                  SourceLocation ProtocolLAngleLoc,
778                                  ArrayRef<ObjCProtocolDecl *> Protocols,
779                                  ArrayRef<SourceLocation> ProtocolLocs,
780                                  SourceLocation ProtocolRAngleLoc);
781 
782   /// Build a new Objective-C object pointer type given the pointee type.
783   ///
784   /// By default, directly builds the pointer type, with no additional semantic
785   /// analysis.
786   QualType RebuildObjCObjectPointerType(QualType PointeeType,
787                                         SourceLocation Star);
788 
789   /// Build a new array type given the element type, size
790   /// modifier, size of the array (if known), size expression, and index type
791   /// qualifiers.
792   ///
793   /// By default, performs semantic analysis when building the array type.
794   /// Subclasses may override this routine to provide different behavior.
795   /// Also by default, all of the other Rebuild*Array
796   QualType RebuildArrayType(QualType ElementType,
797                             ArrayType::ArraySizeModifier SizeMod,
798                             const llvm::APInt *Size,
799                             Expr *SizeExpr,
800                             unsigned IndexTypeQuals,
801                             SourceRange BracketsRange);
802 
803   /// Build a new constant array type given the element type, size
804   /// modifier, (known) size of the array, and index type qualifiers.
805   ///
806   /// By default, performs semantic analysis when building the array type.
807   /// Subclasses may override this routine to provide different behavior.
808   QualType RebuildConstantArrayType(QualType ElementType,
809                                     ArrayType::ArraySizeModifier SizeMod,
810                                     const llvm::APInt &Size,
811                                     Expr *SizeExpr,
812                                     unsigned IndexTypeQuals,
813                                     SourceRange BracketsRange);
814 
815   /// Build a new incomplete array type given the element type, size
816   /// modifier, and index type qualifiers.
817   ///
818   /// By default, performs semantic analysis when building the array type.
819   /// Subclasses may override this routine to provide different behavior.
820   QualType RebuildIncompleteArrayType(QualType ElementType,
821                                       ArrayType::ArraySizeModifier SizeMod,
822                                       unsigned IndexTypeQuals,
823                                       SourceRange BracketsRange);
824 
825   /// Build a new variable-length array type given the element type,
826   /// size modifier, size expression, and index type qualifiers.
827   ///
828   /// By default, performs semantic analysis when building the array type.
829   /// Subclasses may override this routine to provide different behavior.
830   QualType RebuildVariableArrayType(QualType ElementType,
831                                     ArrayType::ArraySizeModifier SizeMod,
832                                     Expr *SizeExpr,
833                                     unsigned IndexTypeQuals,
834                                     SourceRange BracketsRange);
835 
836   /// Build a new dependent-sized array type given the element type,
837   /// size modifier, size expression, and index type qualifiers.
838   ///
839   /// By default, performs semantic analysis when building the array type.
840   /// Subclasses may override this routine to provide different behavior.
841   QualType RebuildDependentSizedArrayType(QualType ElementType,
842                                           ArrayType::ArraySizeModifier SizeMod,
843                                           Expr *SizeExpr,
844                                           unsigned IndexTypeQuals,
845                                           SourceRange BracketsRange);
846 
847   /// Build a new vector type given the element type and
848   /// number of elements.
849   ///
850   /// By default, performs semantic analysis when building the vector type.
851   /// Subclasses may override this routine to provide different behavior.
852   QualType RebuildVectorType(QualType ElementType, unsigned NumElements,
853                              VectorType::VectorKind VecKind);
854 
855   /// Build a new potentially dependently-sized extended vector type
856   /// given the element type and number of elements.
857   ///
858   /// By default, performs semantic analysis when building the vector type.
859   /// Subclasses may override this routine to provide different behavior.
860   QualType RebuildDependentVectorType(QualType ElementType, Expr *SizeExpr,
861                                            SourceLocation AttributeLoc,
862                                            VectorType::VectorKind);
863 
864   /// Build a new extended vector type given the element type and
865   /// number of elements.
866   ///
867   /// By default, performs semantic analysis when building the vector type.
868   /// Subclasses may override this routine to provide different behavior.
869   QualType RebuildExtVectorType(QualType ElementType, unsigned NumElements,
870                                 SourceLocation AttributeLoc);
871 
872   /// Build a new potentially dependently-sized extended vector type
873   /// given the element type and number of elements.
874   ///
875   /// By default, performs semantic analysis when building the vector type.
876   /// Subclasses may override this routine to provide different behavior.
877   QualType RebuildDependentSizedExtVectorType(QualType ElementType,
878                                               Expr *SizeExpr,
879                                               SourceLocation AttributeLoc);
880 
881   /// Build a new DependentAddressSpaceType or return the pointee
882   /// type variable with the correct address space (retrieved from
883   /// AddrSpaceExpr) applied to it. The former will be returned in cases
884   /// where the address space remains dependent.
885   ///
886   /// By default, performs semantic analysis when building the type with address
887   /// space applied. Subclasses may override this routine to provide different
888   /// behavior.
889   QualType RebuildDependentAddressSpaceType(QualType PointeeType,
890                                             Expr *AddrSpaceExpr,
891                                             SourceLocation AttributeLoc);
892 
893   /// Build a new function type.
894   ///
895   /// By default, performs semantic analysis when building the function type.
896   /// Subclasses may override this routine to provide different behavior.
897   QualType RebuildFunctionProtoType(QualType T,
898                                     MutableArrayRef<QualType> ParamTypes,
899                                     const FunctionProtoType::ExtProtoInfo &EPI);
900 
901   /// Build a new unprototyped function type.
902   QualType RebuildFunctionNoProtoType(QualType ResultType);
903 
904   /// Rebuild an unresolved typename type, given the decl that
905   /// the UnresolvedUsingTypenameDecl was transformed to.
906   QualType RebuildUnresolvedUsingType(SourceLocation NameLoc, Decl *D);
907 
908   /// Build a new typedef type.
909   QualType RebuildTypedefType(TypedefNameDecl *Typedef) {
910     return SemaRef.Context.getTypeDeclType(Typedef);
911   }
912 
913   /// Build a new MacroDefined type.
914   QualType RebuildMacroQualifiedType(QualType T,
915                                      const IdentifierInfo *MacroII) {
916     return SemaRef.Context.getMacroQualifiedType(T, MacroII);
917   }
918 
919   /// Build a new class/struct/union type.
920   QualType RebuildRecordType(RecordDecl *Record) {
921     return SemaRef.Context.getTypeDeclType(Record);
922   }
923 
924   /// Build a new Enum type.
925   QualType RebuildEnumType(EnumDecl *Enum) {
926     return SemaRef.Context.getTypeDeclType(Enum);
927   }
928 
929   /// Build a new typeof(expr) type.
930   ///
931   /// By default, performs semantic analysis when building the typeof type.
932   /// Subclasses may override this routine to provide different behavior.
933   QualType RebuildTypeOfExprType(Expr *Underlying, SourceLocation Loc);
934 
935   /// Build a new typeof(type) type.
936   ///
937   /// By default, builds a new TypeOfType with the given underlying type.
938   QualType RebuildTypeOfType(QualType Underlying);
939 
940   /// Build a new unary transform type.
941   QualType RebuildUnaryTransformType(QualType BaseType,
942                                      UnaryTransformType::UTTKind UKind,
943                                      SourceLocation Loc);
944 
945   /// Build a new C++11 decltype type.
946   ///
947   /// By default, performs semantic analysis when building the decltype type.
948   /// Subclasses may override this routine to provide different behavior.
949   QualType RebuildDecltypeType(Expr *Underlying, SourceLocation Loc);
950 
951   /// Build a new C++11 auto type.
952   ///
953   /// By default, builds a new AutoType with the given deduced type.
954   QualType RebuildAutoType(QualType Deduced, AutoTypeKeyword Keyword,
955                            ConceptDecl *TypeConstraintConcept,
956                            ArrayRef<TemplateArgument> TypeConstraintArgs) {
957     // Note, IsDependent is always false here: we implicitly convert an 'auto'
958     // which has been deduced to a dependent type into an undeduced 'auto', so
959     // that we'll retry deduction after the transformation.
960     return SemaRef.Context.getAutoType(Deduced, Keyword,
961                                        /*IsDependent*/ false, /*IsPack=*/false,
962                                        TypeConstraintConcept,
963                                        TypeConstraintArgs);
964   }
965 
966   /// By default, builds a new DeducedTemplateSpecializationType with the given
967   /// deduced type.
968   QualType RebuildDeducedTemplateSpecializationType(TemplateName Template,
969       QualType Deduced) {
970     return SemaRef.Context.getDeducedTemplateSpecializationType(
971         Template, Deduced, /*IsDependent*/ false);
972   }
973 
974   /// Build a new template specialization type.
975   ///
976   /// By default, performs semantic analysis when building the template
977   /// specialization type. Subclasses may override this routine to provide
978   /// different behavior.
979   QualType RebuildTemplateSpecializationType(TemplateName Template,
980                                              SourceLocation TemplateLoc,
981                                              TemplateArgumentListInfo &Args);
982 
983   /// Build a new parenthesized type.
984   ///
985   /// By default, builds a new ParenType type from the inner type.
986   /// Subclasses may override this routine to provide different behavior.
987   QualType RebuildParenType(QualType InnerType) {
988     return SemaRef.BuildParenType(InnerType);
989   }
990 
991   /// Build a new qualified name type.
992   ///
993   /// By default, builds a new ElaboratedType type from the keyword,
994   /// the nested-name-specifier and the named type.
995   /// Subclasses may override this routine to provide different behavior.
996   QualType RebuildElaboratedType(SourceLocation KeywordLoc,
997                                  ElaboratedTypeKeyword Keyword,
998                                  NestedNameSpecifierLoc QualifierLoc,
999                                  QualType Named) {
1000     return SemaRef.Context.getElaboratedType(Keyword,
1001                                          QualifierLoc.getNestedNameSpecifier(),
1002                                              Named);
1003   }
1004 
1005   /// Build a new typename type that refers to a template-id.
1006   ///
1007   /// By default, builds a new DependentNameType type from the
1008   /// nested-name-specifier and the given type. Subclasses may override
1009   /// this routine to provide different behavior.
1010   QualType RebuildDependentTemplateSpecializationType(
1011                                           ElaboratedTypeKeyword Keyword,
1012                                           NestedNameSpecifierLoc QualifierLoc,
1013                                           SourceLocation TemplateKWLoc,
1014                                           const IdentifierInfo *Name,
1015                                           SourceLocation NameLoc,
1016                                           TemplateArgumentListInfo &Args,
1017                                           bool AllowInjectedClassName) {
1018     // Rebuild the template name.
1019     // TODO: avoid TemplateName abstraction
1020     CXXScopeSpec SS;
1021     SS.Adopt(QualifierLoc);
1022     TemplateName InstName = getDerived().RebuildTemplateName(
1023         SS, TemplateKWLoc, *Name, NameLoc, QualType(), nullptr,
1024         AllowInjectedClassName);
1025 
1026     if (InstName.isNull())
1027       return QualType();
1028 
1029     // If it's still dependent, make a dependent specialization.
1030     if (InstName.getAsDependentTemplateName())
1031       return SemaRef.Context.getDependentTemplateSpecializationType(Keyword,
1032                                           QualifierLoc.getNestedNameSpecifier(),
1033                                                                     Name,
1034                                                                     Args);
1035 
1036     // Otherwise, make an elaborated type wrapping a non-dependent
1037     // specialization.
1038     QualType T =
1039     getDerived().RebuildTemplateSpecializationType(InstName, NameLoc, Args);
1040     if (T.isNull()) return QualType();
1041 
1042     if (Keyword == ETK_None && QualifierLoc.getNestedNameSpecifier() == nullptr)
1043       return T;
1044 
1045     return SemaRef.Context.getElaboratedType(Keyword,
1046                                        QualifierLoc.getNestedNameSpecifier(),
1047                                              T);
1048   }
1049 
1050   /// Build a new typename type that refers to an identifier.
1051   ///
1052   /// By default, performs semantic analysis when building the typename type
1053   /// (or elaborated type). Subclasses may override this routine to provide
1054   /// different behavior.
1055   QualType RebuildDependentNameType(ElaboratedTypeKeyword Keyword,
1056                                     SourceLocation KeywordLoc,
1057                                     NestedNameSpecifierLoc QualifierLoc,
1058                                     const IdentifierInfo *Id,
1059                                     SourceLocation IdLoc,
1060                                     bool DeducedTSTContext) {
1061     CXXScopeSpec SS;
1062     SS.Adopt(QualifierLoc);
1063 
1064     if (QualifierLoc.getNestedNameSpecifier()->isDependent()) {
1065       // If the name is still dependent, just build a new dependent name type.
1066       if (!SemaRef.computeDeclContext(SS))
1067         return SemaRef.Context.getDependentNameType(Keyword,
1068                                           QualifierLoc.getNestedNameSpecifier(),
1069                                                     Id);
1070     }
1071 
1072     if (Keyword == ETK_None || Keyword == ETK_Typename) {
1073       return SemaRef.CheckTypenameType(Keyword, KeywordLoc, QualifierLoc,
1074                                        *Id, IdLoc, DeducedTSTContext);
1075     }
1076 
1077     TagTypeKind Kind = TypeWithKeyword::getTagTypeKindForKeyword(Keyword);
1078 
1079     // We had a dependent elaborated-type-specifier that has been transformed
1080     // into a non-dependent elaborated-type-specifier. Find the tag we're
1081     // referring to.
1082     LookupResult Result(SemaRef, Id, IdLoc, Sema::LookupTagName);
1083     DeclContext *DC = SemaRef.computeDeclContext(SS, false);
1084     if (!DC)
1085       return QualType();
1086 
1087     if (SemaRef.RequireCompleteDeclContext(SS, DC))
1088       return QualType();
1089 
1090     TagDecl *Tag = nullptr;
1091     SemaRef.LookupQualifiedName(Result, DC);
1092     switch (Result.getResultKind()) {
1093       case LookupResult::NotFound:
1094       case LookupResult::NotFoundInCurrentInstantiation:
1095         break;
1096 
1097       case LookupResult::Found:
1098         Tag = Result.getAsSingle<TagDecl>();
1099         break;
1100 
1101       case LookupResult::FoundOverloaded:
1102       case LookupResult::FoundUnresolvedValue:
1103         llvm_unreachable("Tag lookup cannot find non-tags");
1104 
1105       case LookupResult::Ambiguous:
1106         // Let the LookupResult structure handle ambiguities.
1107         return QualType();
1108     }
1109 
1110     if (!Tag) {
1111       // Check where the name exists but isn't a tag type and use that to emit
1112       // better diagnostics.
1113       LookupResult Result(SemaRef, Id, IdLoc, Sema::LookupTagName);
1114       SemaRef.LookupQualifiedName(Result, DC);
1115       switch (Result.getResultKind()) {
1116         case LookupResult::Found:
1117         case LookupResult::FoundOverloaded:
1118         case LookupResult::FoundUnresolvedValue: {
1119           NamedDecl *SomeDecl = Result.getRepresentativeDecl();
1120           Sema::NonTagKind NTK = SemaRef.getNonTagTypeDeclKind(SomeDecl, Kind);
1121           SemaRef.Diag(IdLoc, diag::err_tag_reference_non_tag) << SomeDecl
1122                                                                << NTK << Kind;
1123           SemaRef.Diag(SomeDecl->getLocation(), diag::note_declared_at);
1124           break;
1125         }
1126         default:
1127           SemaRef.Diag(IdLoc, diag::err_not_tag_in_scope)
1128               << Kind << Id << DC << QualifierLoc.getSourceRange();
1129           break;
1130       }
1131       return QualType();
1132     }
1133 
1134     if (!SemaRef.isAcceptableTagRedeclaration(Tag, Kind, /*isDefinition*/false,
1135                                               IdLoc, Id)) {
1136       SemaRef.Diag(KeywordLoc, diag::err_use_with_wrong_tag) << Id;
1137       SemaRef.Diag(Tag->getLocation(), diag::note_previous_use);
1138       return QualType();
1139     }
1140 
1141     // Build the elaborated-type-specifier type.
1142     QualType T = SemaRef.Context.getTypeDeclType(Tag);
1143     return SemaRef.Context.getElaboratedType(Keyword,
1144                                          QualifierLoc.getNestedNameSpecifier(),
1145                                              T);
1146   }
1147 
1148   /// Build a new pack expansion type.
1149   ///
1150   /// By default, builds a new PackExpansionType type from the given pattern.
1151   /// Subclasses may override this routine to provide different behavior.
1152   QualType RebuildPackExpansionType(QualType Pattern,
1153                                     SourceRange PatternRange,
1154                                     SourceLocation EllipsisLoc,
1155                                     Optional<unsigned> NumExpansions) {
1156     return getSema().CheckPackExpansion(Pattern, PatternRange, EllipsisLoc,
1157                                         NumExpansions);
1158   }
1159 
1160   /// Build a new atomic type given its value type.
1161   ///
1162   /// By default, performs semantic analysis when building the atomic type.
1163   /// Subclasses may override this routine to provide different behavior.
1164   QualType RebuildAtomicType(QualType ValueType, SourceLocation KWLoc);
1165 
1166   /// Build a new pipe type given its value type.
1167   QualType RebuildPipeType(QualType ValueType, SourceLocation KWLoc,
1168                            bool isReadPipe);
1169 
1170   /// Build a new template name given a nested name specifier, a flag
1171   /// indicating whether the "template" keyword was provided, and the template
1172   /// that the template name refers to.
1173   ///
1174   /// By default, builds the new template name directly. Subclasses may override
1175   /// this routine to provide different behavior.
1176   TemplateName RebuildTemplateName(CXXScopeSpec &SS,
1177                                    bool TemplateKW,
1178                                    TemplateDecl *Template);
1179 
1180   /// Build a new template name given a nested name specifier and the
1181   /// name that is referred to as a template.
1182   ///
1183   /// By default, performs semantic analysis to determine whether the name can
1184   /// be resolved to a specific template, then builds the appropriate kind of
1185   /// template name. Subclasses may override this routine to provide different
1186   /// behavior.
1187   TemplateName RebuildTemplateName(CXXScopeSpec &SS,
1188                                    SourceLocation TemplateKWLoc,
1189                                    const IdentifierInfo &Name,
1190                                    SourceLocation NameLoc, QualType ObjectType,
1191                                    NamedDecl *FirstQualifierInScope,
1192                                    bool AllowInjectedClassName);
1193 
1194   /// Build a new template name given a nested name specifier and the
1195   /// overloaded operator name that is referred to as a template.
1196   ///
1197   /// By default, performs semantic analysis to determine whether the name can
1198   /// be resolved to a specific template, then builds the appropriate kind of
1199   /// template name. Subclasses may override this routine to provide different
1200   /// behavior.
1201   TemplateName RebuildTemplateName(CXXScopeSpec &SS,
1202                                    SourceLocation TemplateKWLoc,
1203                                    OverloadedOperatorKind Operator,
1204                                    SourceLocation NameLoc, QualType ObjectType,
1205                                    bool AllowInjectedClassName);
1206 
1207   /// Build a new template name given a template template parameter pack
1208   /// and the
1209   ///
1210   /// By default, performs semantic analysis to determine whether the name can
1211   /// be resolved to a specific template, then builds the appropriate kind of
1212   /// template name. Subclasses may override this routine to provide different
1213   /// behavior.
1214   TemplateName RebuildTemplateName(TemplateTemplateParmDecl *Param,
1215                                    const TemplateArgument &ArgPack) {
1216     return getSema().Context.getSubstTemplateTemplateParmPack(Param, ArgPack);
1217   }
1218 
1219   /// Build a new compound statement.
1220   ///
1221   /// By default, performs semantic analysis to build the new statement.
1222   /// Subclasses may override this routine to provide different behavior.
1223   StmtResult RebuildCompoundStmt(SourceLocation LBraceLoc,
1224                                        MultiStmtArg Statements,
1225                                        SourceLocation RBraceLoc,
1226                                        bool IsStmtExpr) {
1227     return getSema().ActOnCompoundStmt(LBraceLoc, RBraceLoc, Statements,
1228                                        IsStmtExpr);
1229   }
1230 
1231   /// Build a new case statement.
1232   ///
1233   /// By default, performs semantic analysis to build the new statement.
1234   /// Subclasses may override this routine to provide different behavior.
1235   StmtResult RebuildCaseStmt(SourceLocation CaseLoc,
1236                                    Expr *LHS,
1237                                    SourceLocation EllipsisLoc,
1238                                    Expr *RHS,
1239                                    SourceLocation ColonLoc) {
1240     return getSema().ActOnCaseStmt(CaseLoc, LHS, EllipsisLoc, RHS,
1241                                    ColonLoc);
1242   }
1243 
1244   /// Attach the body to a new case statement.
1245   ///
1246   /// By default, performs semantic analysis to build the new statement.
1247   /// Subclasses may override this routine to provide different behavior.
1248   StmtResult RebuildCaseStmtBody(Stmt *S, Stmt *Body) {
1249     getSema().ActOnCaseStmtBody(S, Body);
1250     return S;
1251   }
1252 
1253   /// Build a new default statement.
1254   ///
1255   /// By default, performs semantic analysis to build the new statement.
1256   /// Subclasses may override this routine to provide different behavior.
1257   StmtResult RebuildDefaultStmt(SourceLocation DefaultLoc,
1258                                       SourceLocation ColonLoc,
1259                                       Stmt *SubStmt) {
1260     return getSema().ActOnDefaultStmt(DefaultLoc, ColonLoc, SubStmt,
1261                                       /*CurScope=*/nullptr);
1262   }
1263 
1264   /// Build a new label statement.
1265   ///
1266   /// By default, performs semantic analysis to build the new statement.
1267   /// Subclasses may override this routine to provide different behavior.
1268   StmtResult RebuildLabelStmt(SourceLocation IdentLoc, LabelDecl *L,
1269                               SourceLocation ColonLoc, Stmt *SubStmt) {
1270     return SemaRef.ActOnLabelStmt(IdentLoc, L, ColonLoc, SubStmt);
1271   }
1272 
1273   /// Build a new label statement.
1274   ///
1275   /// By default, performs semantic analysis to build the new statement.
1276   /// Subclasses may override this routine to provide different behavior.
1277   StmtResult RebuildAttributedStmt(SourceLocation AttrLoc,
1278                                    ArrayRef<const Attr*> Attrs,
1279                                    Stmt *SubStmt) {
1280     return SemaRef.ActOnAttributedStmt(AttrLoc, Attrs, SubStmt);
1281   }
1282 
1283   /// Build a new "if" statement.
1284   ///
1285   /// By default, performs semantic analysis to build the new statement.
1286   /// Subclasses may override this routine to provide different behavior.
1287   StmtResult RebuildIfStmt(SourceLocation IfLoc, bool IsConstexpr,
1288                            Sema::ConditionResult Cond, Stmt *Init, Stmt *Then,
1289                            SourceLocation ElseLoc, Stmt *Else) {
1290     return getSema().ActOnIfStmt(IfLoc, IsConstexpr, Init, Cond, Then,
1291                                  ElseLoc, Else);
1292   }
1293 
1294   /// Start building a new switch statement.
1295   ///
1296   /// By default, performs semantic analysis to build the new statement.
1297   /// Subclasses may override this routine to provide different behavior.
1298   StmtResult RebuildSwitchStmtStart(SourceLocation SwitchLoc, Stmt *Init,
1299                                     Sema::ConditionResult Cond) {
1300     return getSema().ActOnStartOfSwitchStmt(SwitchLoc, Init, Cond);
1301   }
1302 
1303   /// Attach the body to the switch statement.
1304   ///
1305   /// By default, performs semantic analysis to build the new statement.
1306   /// Subclasses may override this routine to provide different behavior.
1307   StmtResult RebuildSwitchStmtBody(SourceLocation SwitchLoc,
1308                                    Stmt *Switch, Stmt *Body) {
1309     return getSema().ActOnFinishSwitchStmt(SwitchLoc, Switch, Body);
1310   }
1311 
1312   /// Build a new while statement.
1313   ///
1314   /// By default, performs semantic analysis to build the new statement.
1315   /// Subclasses may override this routine to provide different behavior.
1316   StmtResult RebuildWhileStmt(SourceLocation WhileLoc,
1317                               Sema::ConditionResult Cond, Stmt *Body) {
1318     return getSema().ActOnWhileStmt(WhileLoc, Cond, Body);
1319   }
1320 
1321   /// Build a new do-while statement.
1322   ///
1323   /// By default, performs semantic analysis to build the new statement.
1324   /// Subclasses may override this routine to provide different behavior.
1325   StmtResult RebuildDoStmt(SourceLocation DoLoc, Stmt *Body,
1326                            SourceLocation WhileLoc, SourceLocation LParenLoc,
1327                            Expr *Cond, SourceLocation RParenLoc) {
1328     return getSema().ActOnDoStmt(DoLoc, Body, WhileLoc, LParenLoc,
1329                                  Cond, RParenLoc);
1330   }
1331 
1332   /// Build a new for statement.
1333   ///
1334   /// By default, performs semantic analysis to build the new statement.
1335   /// Subclasses may override this routine to provide different behavior.
1336   StmtResult RebuildForStmt(SourceLocation ForLoc, SourceLocation LParenLoc,
1337                             Stmt *Init, Sema::ConditionResult Cond,
1338                             Sema::FullExprArg Inc, SourceLocation RParenLoc,
1339                             Stmt *Body) {
1340     return getSema().ActOnForStmt(ForLoc, LParenLoc, Init, Cond,
1341                                   Inc, RParenLoc, Body);
1342   }
1343 
1344   /// Build a new goto statement.
1345   ///
1346   /// By default, performs semantic analysis to build the new statement.
1347   /// Subclasses may override this routine to provide different behavior.
1348   StmtResult RebuildGotoStmt(SourceLocation GotoLoc, SourceLocation LabelLoc,
1349                              LabelDecl *Label) {
1350     return getSema().ActOnGotoStmt(GotoLoc, LabelLoc, Label);
1351   }
1352 
1353   /// Build a new indirect goto statement.
1354   ///
1355   /// By default, performs semantic analysis to build the new statement.
1356   /// Subclasses may override this routine to provide different behavior.
1357   StmtResult RebuildIndirectGotoStmt(SourceLocation GotoLoc,
1358                                      SourceLocation StarLoc,
1359                                      Expr *Target) {
1360     return getSema().ActOnIndirectGotoStmt(GotoLoc, StarLoc, Target);
1361   }
1362 
1363   /// Build a new return statement.
1364   ///
1365   /// By default, performs semantic analysis to build the new statement.
1366   /// Subclasses may override this routine to provide different behavior.
1367   StmtResult RebuildReturnStmt(SourceLocation ReturnLoc, Expr *Result) {
1368     return getSema().BuildReturnStmt(ReturnLoc, Result);
1369   }
1370 
1371   /// Build a new declaration statement.
1372   ///
1373   /// By default, performs semantic analysis to build the new statement.
1374   /// Subclasses may override this routine to provide different behavior.
1375   StmtResult RebuildDeclStmt(MutableArrayRef<Decl *> Decls,
1376                              SourceLocation StartLoc, SourceLocation EndLoc) {
1377     Sema::DeclGroupPtrTy DG = getSema().BuildDeclaratorGroup(Decls);
1378     return getSema().ActOnDeclStmt(DG, StartLoc, EndLoc);
1379   }
1380 
1381   /// Build a new inline asm statement.
1382   ///
1383   /// By default, performs semantic analysis to build the new statement.
1384   /// Subclasses may override this routine to provide different behavior.
1385   StmtResult RebuildGCCAsmStmt(SourceLocation AsmLoc, bool IsSimple,
1386                                bool IsVolatile, unsigned NumOutputs,
1387                                unsigned NumInputs, IdentifierInfo **Names,
1388                                MultiExprArg Constraints, MultiExprArg Exprs,
1389                                Expr *AsmString, MultiExprArg Clobbers,
1390                                unsigned NumLabels,
1391                                SourceLocation RParenLoc) {
1392     return getSema().ActOnGCCAsmStmt(AsmLoc, IsSimple, IsVolatile, NumOutputs,
1393                                      NumInputs, Names, Constraints, Exprs,
1394                                      AsmString, Clobbers, NumLabels, RParenLoc);
1395   }
1396 
1397   /// Build a new MS style inline asm statement.
1398   ///
1399   /// By default, performs semantic analysis to build the new statement.
1400   /// Subclasses may override this routine to provide different behavior.
1401   StmtResult RebuildMSAsmStmt(SourceLocation AsmLoc, SourceLocation LBraceLoc,
1402                               ArrayRef<Token> AsmToks,
1403                               StringRef AsmString,
1404                               unsigned NumOutputs, unsigned NumInputs,
1405                               ArrayRef<StringRef> Constraints,
1406                               ArrayRef<StringRef> Clobbers,
1407                               ArrayRef<Expr*> Exprs,
1408                               SourceLocation EndLoc) {
1409     return getSema().ActOnMSAsmStmt(AsmLoc, LBraceLoc, AsmToks, AsmString,
1410                                     NumOutputs, NumInputs,
1411                                     Constraints, Clobbers, Exprs, EndLoc);
1412   }
1413 
1414   /// Build a new co_return statement.
1415   ///
1416   /// By default, performs semantic analysis to build the new statement.
1417   /// Subclasses may override this routine to provide different behavior.
1418   StmtResult RebuildCoreturnStmt(SourceLocation CoreturnLoc, Expr *Result,
1419                                  bool IsImplicit) {
1420     return getSema().BuildCoreturnStmt(CoreturnLoc, Result, IsImplicit);
1421   }
1422 
1423   /// Build a new co_await expression.
1424   ///
1425   /// By default, performs semantic analysis to build the new expression.
1426   /// Subclasses may override this routine to provide different behavior.
1427   ExprResult RebuildCoawaitExpr(SourceLocation CoawaitLoc, Expr *Result,
1428                                 bool IsImplicit) {
1429     return getSema().BuildResolvedCoawaitExpr(CoawaitLoc, Result, IsImplicit);
1430   }
1431 
1432   /// Build a new co_await expression.
1433   ///
1434   /// By default, performs semantic analysis to build the new expression.
1435   /// Subclasses may override this routine to provide different behavior.
1436   ExprResult RebuildDependentCoawaitExpr(SourceLocation CoawaitLoc,
1437                                          Expr *Result,
1438                                          UnresolvedLookupExpr *Lookup) {
1439     return getSema().BuildUnresolvedCoawaitExpr(CoawaitLoc, Result, Lookup);
1440   }
1441 
1442   /// Build a new co_yield expression.
1443   ///
1444   /// By default, performs semantic analysis to build the new expression.
1445   /// Subclasses may override this routine to provide different behavior.
1446   ExprResult RebuildCoyieldExpr(SourceLocation CoyieldLoc, Expr *Result) {
1447     return getSema().BuildCoyieldExpr(CoyieldLoc, Result);
1448   }
1449 
1450   StmtResult RebuildCoroutineBodyStmt(CoroutineBodyStmt::CtorArgs Args) {
1451     return getSema().BuildCoroutineBodyStmt(Args);
1452   }
1453 
1454   /// Build a new Objective-C \@try statement.
1455   ///
1456   /// By default, performs semantic analysis to build the new statement.
1457   /// Subclasses may override this routine to provide different behavior.
1458   StmtResult RebuildObjCAtTryStmt(SourceLocation AtLoc,
1459                                         Stmt *TryBody,
1460                                         MultiStmtArg CatchStmts,
1461                                         Stmt *Finally) {
1462     return getSema().ActOnObjCAtTryStmt(AtLoc, TryBody, CatchStmts,
1463                                         Finally);
1464   }
1465 
1466   /// Rebuild an Objective-C exception declaration.
1467   ///
1468   /// By default, performs semantic analysis to build the new declaration.
1469   /// Subclasses may override this routine to provide different behavior.
1470   VarDecl *RebuildObjCExceptionDecl(VarDecl *ExceptionDecl,
1471                                     TypeSourceInfo *TInfo, QualType T) {
1472     return getSema().BuildObjCExceptionDecl(TInfo, T,
1473                                             ExceptionDecl->getInnerLocStart(),
1474                                             ExceptionDecl->getLocation(),
1475                                             ExceptionDecl->getIdentifier());
1476   }
1477 
1478   /// Build a new Objective-C \@catch statement.
1479   ///
1480   /// By default, performs semantic analysis to build the new statement.
1481   /// Subclasses may override this routine to provide different behavior.
1482   StmtResult RebuildObjCAtCatchStmt(SourceLocation AtLoc,
1483                                           SourceLocation RParenLoc,
1484                                           VarDecl *Var,
1485                                           Stmt *Body) {
1486     return getSema().ActOnObjCAtCatchStmt(AtLoc, RParenLoc,
1487                                           Var, Body);
1488   }
1489 
1490   /// Build a new Objective-C \@finally statement.
1491   ///
1492   /// By default, performs semantic analysis to build the new statement.
1493   /// Subclasses may override this routine to provide different behavior.
1494   StmtResult RebuildObjCAtFinallyStmt(SourceLocation AtLoc,
1495                                             Stmt *Body) {
1496     return getSema().ActOnObjCAtFinallyStmt(AtLoc, Body);
1497   }
1498 
1499   /// Build a new Objective-C \@throw statement.
1500   ///
1501   /// By default, performs semantic analysis to build the new statement.
1502   /// Subclasses may override this routine to provide different behavior.
1503   StmtResult RebuildObjCAtThrowStmt(SourceLocation AtLoc,
1504                                           Expr *Operand) {
1505     return getSema().BuildObjCAtThrowStmt(AtLoc, Operand);
1506   }
1507 
1508   /// Build a new OpenMP executable directive.
1509   ///
1510   /// By default, performs semantic analysis to build the new statement.
1511   /// Subclasses may override this routine to provide different behavior.
1512   StmtResult RebuildOMPExecutableDirective(OpenMPDirectiveKind Kind,
1513                                            DeclarationNameInfo DirName,
1514                                            OpenMPDirectiveKind CancelRegion,
1515                                            ArrayRef<OMPClause *> Clauses,
1516                                            Stmt *AStmt, SourceLocation StartLoc,
1517                                            SourceLocation EndLoc) {
1518     return getSema().ActOnOpenMPExecutableDirective(
1519         Kind, DirName, CancelRegion, Clauses, AStmt, StartLoc, EndLoc);
1520   }
1521 
1522   /// Build a new OpenMP 'if' clause.
1523   ///
1524   /// By default, performs semantic analysis to build the new OpenMP clause.
1525   /// Subclasses may override this routine to provide different behavior.
1526   OMPClause *RebuildOMPIfClause(OpenMPDirectiveKind NameModifier,
1527                                 Expr *Condition, SourceLocation StartLoc,
1528                                 SourceLocation LParenLoc,
1529                                 SourceLocation NameModifierLoc,
1530                                 SourceLocation ColonLoc,
1531                                 SourceLocation EndLoc) {
1532     return getSema().ActOnOpenMPIfClause(NameModifier, Condition, StartLoc,
1533                                          LParenLoc, NameModifierLoc, ColonLoc,
1534                                          EndLoc);
1535   }
1536 
1537   /// Build a new OpenMP 'final' clause.
1538   ///
1539   /// By default, performs semantic analysis to build the new OpenMP clause.
1540   /// Subclasses may override this routine to provide different behavior.
1541   OMPClause *RebuildOMPFinalClause(Expr *Condition, SourceLocation StartLoc,
1542                                    SourceLocation LParenLoc,
1543                                    SourceLocation EndLoc) {
1544     return getSema().ActOnOpenMPFinalClause(Condition, StartLoc, LParenLoc,
1545                                             EndLoc);
1546   }
1547 
1548   /// Build a new OpenMP 'num_threads' clause.
1549   ///
1550   /// By default, performs semantic analysis to build the new OpenMP clause.
1551   /// Subclasses may override this routine to provide different behavior.
1552   OMPClause *RebuildOMPNumThreadsClause(Expr *NumThreads,
1553                                         SourceLocation StartLoc,
1554                                         SourceLocation LParenLoc,
1555                                         SourceLocation EndLoc) {
1556     return getSema().ActOnOpenMPNumThreadsClause(NumThreads, StartLoc,
1557                                                  LParenLoc, EndLoc);
1558   }
1559 
1560   /// Build a new OpenMP 'safelen' clause.
1561   ///
1562   /// By default, performs semantic analysis to build the new OpenMP clause.
1563   /// Subclasses may override this routine to provide different behavior.
1564   OMPClause *RebuildOMPSafelenClause(Expr *Len, SourceLocation StartLoc,
1565                                      SourceLocation LParenLoc,
1566                                      SourceLocation EndLoc) {
1567     return getSema().ActOnOpenMPSafelenClause(Len, StartLoc, LParenLoc, EndLoc);
1568   }
1569 
1570   /// Build a new OpenMP 'simdlen' clause.
1571   ///
1572   /// By default, performs semantic analysis to build the new OpenMP clause.
1573   /// Subclasses may override this routine to provide different behavior.
1574   OMPClause *RebuildOMPSimdlenClause(Expr *Len, SourceLocation StartLoc,
1575                                      SourceLocation LParenLoc,
1576                                      SourceLocation EndLoc) {
1577     return getSema().ActOnOpenMPSimdlenClause(Len, StartLoc, LParenLoc, EndLoc);
1578   }
1579 
1580   /// Build a new OpenMP 'allocator' clause.
1581   ///
1582   /// By default, performs semantic analysis to build the new OpenMP clause.
1583   /// Subclasses may override this routine to provide different behavior.
1584   OMPClause *RebuildOMPAllocatorClause(Expr *A, SourceLocation StartLoc,
1585                                        SourceLocation LParenLoc,
1586                                        SourceLocation EndLoc) {
1587     return getSema().ActOnOpenMPAllocatorClause(A, StartLoc, LParenLoc, EndLoc);
1588   }
1589 
1590   /// Build a new OpenMP 'collapse' clause.
1591   ///
1592   /// By default, performs semantic analysis to build the new OpenMP clause.
1593   /// Subclasses may override this routine to provide different behavior.
1594   OMPClause *RebuildOMPCollapseClause(Expr *Num, SourceLocation StartLoc,
1595                                       SourceLocation LParenLoc,
1596                                       SourceLocation EndLoc) {
1597     return getSema().ActOnOpenMPCollapseClause(Num, StartLoc, LParenLoc,
1598                                                EndLoc);
1599   }
1600 
1601   /// Build a new OpenMP 'default' clause.
1602   ///
1603   /// By default, performs semantic analysis to build the new OpenMP clause.
1604   /// Subclasses may override this routine to provide different behavior.
1605   OMPClause *RebuildOMPDefaultClause(OpenMPDefaultClauseKind Kind,
1606                                      SourceLocation KindKwLoc,
1607                                      SourceLocation StartLoc,
1608                                      SourceLocation LParenLoc,
1609                                      SourceLocation EndLoc) {
1610     return getSema().ActOnOpenMPDefaultClause(Kind, KindKwLoc,
1611                                               StartLoc, LParenLoc, EndLoc);
1612   }
1613 
1614   /// Build a new OpenMP 'proc_bind' clause.
1615   ///
1616   /// By default, performs semantic analysis to build the new OpenMP clause.
1617   /// Subclasses may override this routine to provide different behavior.
1618   OMPClause *RebuildOMPProcBindClause(ProcBindKind Kind,
1619                                       SourceLocation KindKwLoc,
1620                                       SourceLocation StartLoc,
1621                                       SourceLocation LParenLoc,
1622                                       SourceLocation EndLoc) {
1623     return getSema().ActOnOpenMPProcBindClause(Kind, KindKwLoc,
1624                                                StartLoc, LParenLoc, EndLoc);
1625   }
1626 
1627   /// Build a new OpenMP 'schedule' clause.
1628   ///
1629   /// By default, performs semantic analysis to build the new OpenMP clause.
1630   /// Subclasses may override this routine to provide different behavior.
1631   OMPClause *RebuildOMPScheduleClause(
1632       OpenMPScheduleClauseModifier M1, OpenMPScheduleClauseModifier M2,
1633       OpenMPScheduleClauseKind Kind, Expr *ChunkSize, SourceLocation StartLoc,
1634       SourceLocation LParenLoc, SourceLocation M1Loc, SourceLocation M2Loc,
1635       SourceLocation KindLoc, SourceLocation CommaLoc, SourceLocation EndLoc) {
1636     return getSema().ActOnOpenMPScheduleClause(
1637         M1, M2, Kind, ChunkSize, StartLoc, LParenLoc, M1Loc, M2Loc, KindLoc,
1638         CommaLoc, EndLoc);
1639   }
1640 
1641   /// Build a new OpenMP 'ordered' clause.
1642   ///
1643   /// By default, performs semantic analysis to build the new OpenMP clause.
1644   /// Subclasses may override this routine to provide different behavior.
1645   OMPClause *RebuildOMPOrderedClause(SourceLocation StartLoc,
1646                                      SourceLocation EndLoc,
1647                                      SourceLocation LParenLoc, Expr *Num) {
1648     return getSema().ActOnOpenMPOrderedClause(StartLoc, EndLoc, LParenLoc, Num);
1649   }
1650 
1651   /// Build a new OpenMP 'private' clause.
1652   ///
1653   /// By default, performs semantic analysis to build the new OpenMP clause.
1654   /// Subclasses may override this routine to provide different behavior.
1655   OMPClause *RebuildOMPPrivateClause(ArrayRef<Expr *> VarList,
1656                                      SourceLocation StartLoc,
1657                                      SourceLocation LParenLoc,
1658                                      SourceLocation EndLoc) {
1659     return getSema().ActOnOpenMPPrivateClause(VarList, StartLoc, LParenLoc,
1660                                               EndLoc);
1661   }
1662 
1663   /// Build a new OpenMP 'firstprivate' clause.
1664   ///
1665   /// By default, performs semantic analysis to build the new OpenMP clause.
1666   /// Subclasses may override this routine to provide different behavior.
1667   OMPClause *RebuildOMPFirstprivateClause(ArrayRef<Expr *> VarList,
1668                                           SourceLocation StartLoc,
1669                                           SourceLocation LParenLoc,
1670                                           SourceLocation EndLoc) {
1671     return getSema().ActOnOpenMPFirstprivateClause(VarList, StartLoc, LParenLoc,
1672                                                    EndLoc);
1673   }
1674 
1675   /// Build a new OpenMP 'lastprivate' clause.
1676   ///
1677   /// By default, performs semantic analysis to build the new OpenMP clause.
1678   /// Subclasses may override this routine to provide different behavior.
1679   OMPClause *RebuildOMPLastprivateClause(ArrayRef<Expr *> VarList,
1680                                          OpenMPLastprivateModifier LPKind,
1681                                          SourceLocation LPKindLoc,
1682                                          SourceLocation ColonLoc,
1683                                          SourceLocation StartLoc,
1684                                          SourceLocation LParenLoc,
1685                                          SourceLocation EndLoc) {
1686     return getSema().ActOnOpenMPLastprivateClause(
1687         VarList, LPKind, LPKindLoc, ColonLoc, StartLoc, LParenLoc, EndLoc);
1688   }
1689 
1690   /// Build a new OpenMP 'shared' clause.
1691   ///
1692   /// By default, performs semantic analysis to build the new OpenMP clause.
1693   /// Subclasses may override this routine to provide different behavior.
1694   OMPClause *RebuildOMPSharedClause(ArrayRef<Expr *> VarList,
1695                                     SourceLocation StartLoc,
1696                                     SourceLocation LParenLoc,
1697                                     SourceLocation EndLoc) {
1698     return getSema().ActOnOpenMPSharedClause(VarList, StartLoc, LParenLoc,
1699                                              EndLoc);
1700   }
1701 
1702   /// Build a new OpenMP 'reduction' clause.
1703   ///
1704   /// By default, performs semantic analysis to build the new statement.
1705   /// Subclasses may override this routine to provide different behavior.
1706   OMPClause *RebuildOMPReductionClause(ArrayRef<Expr *> VarList,
1707                                        SourceLocation StartLoc,
1708                                        SourceLocation LParenLoc,
1709                                        SourceLocation ColonLoc,
1710                                        SourceLocation EndLoc,
1711                                        CXXScopeSpec &ReductionIdScopeSpec,
1712                                        const DeclarationNameInfo &ReductionId,
1713                                        ArrayRef<Expr *> UnresolvedReductions) {
1714     return getSema().ActOnOpenMPReductionClause(
1715         VarList, StartLoc, LParenLoc, ColonLoc, EndLoc, ReductionIdScopeSpec,
1716         ReductionId, UnresolvedReductions);
1717   }
1718 
1719   /// Build a new OpenMP 'task_reduction' clause.
1720   ///
1721   /// By default, performs semantic analysis to build the new statement.
1722   /// Subclasses may override this routine to provide different behavior.
1723   OMPClause *RebuildOMPTaskReductionClause(
1724       ArrayRef<Expr *> VarList, SourceLocation StartLoc,
1725       SourceLocation LParenLoc, SourceLocation ColonLoc, SourceLocation EndLoc,
1726       CXXScopeSpec &ReductionIdScopeSpec,
1727       const DeclarationNameInfo &ReductionId,
1728       ArrayRef<Expr *> UnresolvedReductions) {
1729     return getSema().ActOnOpenMPTaskReductionClause(
1730         VarList, StartLoc, LParenLoc, ColonLoc, EndLoc, ReductionIdScopeSpec,
1731         ReductionId, UnresolvedReductions);
1732   }
1733 
1734   /// Build a new OpenMP 'in_reduction' clause.
1735   ///
1736   /// By default, performs semantic analysis to build the new statement.
1737   /// Subclasses may override this routine to provide different behavior.
1738   OMPClause *
1739   RebuildOMPInReductionClause(ArrayRef<Expr *> VarList, SourceLocation StartLoc,
1740                               SourceLocation LParenLoc, SourceLocation ColonLoc,
1741                               SourceLocation EndLoc,
1742                               CXXScopeSpec &ReductionIdScopeSpec,
1743                               const DeclarationNameInfo &ReductionId,
1744                               ArrayRef<Expr *> UnresolvedReductions) {
1745     return getSema().ActOnOpenMPInReductionClause(
1746         VarList, StartLoc, LParenLoc, ColonLoc, EndLoc, ReductionIdScopeSpec,
1747         ReductionId, UnresolvedReductions);
1748   }
1749 
1750   /// Build a new OpenMP 'linear' clause.
1751   ///
1752   /// By default, performs semantic analysis to build the new OpenMP clause.
1753   /// Subclasses may override this routine to provide different behavior.
1754   OMPClause *RebuildOMPLinearClause(ArrayRef<Expr *> VarList, Expr *Step,
1755                                     SourceLocation StartLoc,
1756                                     SourceLocation LParenLoc,
1757                                     OpenMPLinearClauseKind Modifier,
1758                                     SourceLocation ModifierLoc,
1759                                     SourceLocation ColonLoc,
1760                                     SourceLocation EndLoc) {
1761     return getSema().ActOnOpenMPLinearClause(VarList, Step, StartLoc, LParenLoc,
1762                                              Modifier, ModifierLoc, ColonLoc,
1763                                              EndLoc);
1764   }
1765 
1766   /// Build a new OpenMP 'aligned' clause.
1767   ///
1768   /// By default, performs semantic analysis to build the new OpenMP clause.
1769   /// Subclasses may override this routine to provide different behavior.
1770   OMPClause *RebuildOMPAlignedClause(ArrayRef<Expr *> VarList, Expr *Alignment,
1771                                      SourceLocation StartLoc,
1772                                      SourceLocation LParenLoc,
1773                                      SourceLocation ColonLoc,
1774                                      SourceLocation EndLoc) {
1775     return getSema().ActOnOpenMPAlignedClause(VarList, Alignment, StartLoc,
1776                                               LParenLoc, ColonLoc, EndLoc);
1777   }
1778 
1779   /// Build a new OpenMP 'copyin' clause.
1780   ///
1781   /// By default, performs semantic analysis to build the new OpenMP clause.
1782   /// Subclasses may override this routine to provide different behavior.
1783   OMPClause *RebuildOMPCopyinClause(ArrayRef<Expr *> VarList,
1784                                     SourceLocation StartLoc,
1785                                     SourceLocation LParenLoc,
1786                                     SourceLocation EndLoc) {
1787     return getSema().ActOnOpenMPCopyinClause(VarList, StartLoc, LParenLoc,
1788                                              EndLoc);
1789   }
1790 
1791   /// Build a new OpenMP 'copyprivate' clause.
1792   ///
1793   /// By default, performs semantic analysis to build the new OpenMP clause.
1794   /// Subclasses may override this routine to provide different behavior.
1795   OMPClause *RebuildOMPCopyprivateClause(ArrayRef<Expr *> VarList,
1796                                          SourceLocation StartLoc,
1797                                          SourceLocation LParenLoc,
1798                                          SourceLocation EndLoc) {
1799     return getSema().ActOnOpenMPCopyprivateClause(VarList, StartLoc, LParenLoc,
1800                                                   EndLoc);
1801   }
1802 
1803   /// Build a new OpenMP 'flush' pseudo clause.
1804   ///
1805   /// By default, performs semantic analysis to build the new OpenMP clause.
1806   /// Subclasses may override this routine to provide different behavior.
1807   OMPClause *RebuildOMPFlushClause(ArrayRef<Expr *> VarList,
1808                                    SourceLocation StartLoc,
1809                                    SourceLocation LParenLoc,
1810                                    SourceLocation EndLoc) {
1811     return getSema().ActOnOpenMPFlushClause(VarList, StartLoc, LParenLoc,
1812                                             EndLoc);
1813   }
1814 
1815   /// Build a new OpenMP 'depend' pseudo clause.
1816   ///
1817   /// By default, performs semantic analysis to build the new OpenMP clause.
1818   /// Subclasses may override this routine to provide different behavior.
1819   OMPClause *
1820   RebuildOMPDependClause(OpenMPDependClauseKind DepKind, SourceLocation DepLoc,
1821                          SourceLocation ColonLoc, ArrayRef<Expr *> VarList,
1822                          SourceLocation StartLoc, SourceLocation LParenLoc,
1823                          SourceLocation EndLoc) {
1824     return getSema().ActOnOpenMPDependClause(DepKind, DepLoc, ColonLoc, VarList,
1825                                              StartLoc, LParenLoc, EndLoc);
1826   }
1827 
1828   /// Build a new OpenMP 'device' clause.
1829   ///
1830   /// By default, performs semantic analysis to build the new statement.
1831   /// Subclasses may override this routine to provide different behavior.
1832   OMPClause *RebuildOMPDeviceClause(Expr *Device, SourceLocation StartLoc,
1833                                     SourceLocation LParenLoc,
1834                                     SourceLocation EndLoc) {
1835     return getSema().ActOnOpenMPDeviceClause(Device, StartLoc, LParenLoc,
1836                                              EndLoc);
1837   }
1838 
1839   /// Build a new OpenMP 'map' clause.
1840   ///
1841   /// By default, performs semantic analysis to build the new OpenMP clause.
1842   /// Subclasses may override this routine to provide different behavior.
1843   OMPClause *RebuildOMPMapClause(
1844       ArrayRef<OpenMPMapModifierKind> MapTypeModifiers,
1845       ArrayRef<SourceLocation> MapTypeModifiersLoc,
1846       CXXScopeSpec MapperIdScopeSpec, DeclarationNameInfo MapperId,
1847       OpenMPMapClauseKind MapType, bool IsMapTypeImplicit,
1848       SourceLocation MapLoc, SourceLocation ColonLoc, ArrayRef<Expr *> VarList,
1849       const OMPVarListLocTy &Locs, ArrayRef<Expr *> UnresolvedMappers) {
1850     return getSema().ActOnOpenMPMapClause(MapTypeModifiers, MapTypeModifiersLoc,
1851                                           MapperIdScopeSpec, MapperId, MapType,
1852                                           IsMapTypeImplicit, MapLoc, ColonLoc,
1853                                           VarList, Locs, UnresolvedMappers);
1854   }
1855 
1856   /// Build a new OpenMP 'allocate' clause.
1857   ///
1858   /// By default, performs semantic analysis to build the new OpenMP clause.
1859   /// Subclasses may override this routine to provide different behavior.
1860   OMPClause *RebuildOMPAllocateClause(Expr *Allocate, ArrayRef<Expr *> VarList,
1861                                       SourceLocation StartLoc,
1862                                       SourceLocation LParenLoc,
1863                                       SourceLocation ColonLoc,
1864                                       SourceLocation EndLoc) {
1865     return getSema().ActOnOpenMPAllocateClause(Allocate, VarList, StartLoc,
1866                                                LParenLoc, ColonLoc, EndLoc);
1867   }
1868 
1869   /// Build a new OpenMP 'num_teams' clause.
1870   ///
1871   /// By default, performs semantic analysis to build the new statement.
1872   /// Subclasses may override this routine to provide different behavior.
1873   OMPClause *RebuildOMPNumTeamsClause(Expr *NumTeams, SourceLocation StartLoc,
1874                                       SourceLocation LParenLoc,
1875                                       SourceLocation EndLoc) {
1876     return getSema().ActOnOpenMPNumTeamsClause(NumTeams, StartLoc, LParenLoc,
1877                                                EndLoc);
1878   }
1879 
1880   /// Build a new OpenMP 'thread_limit' clause.
1881   ///
1882   /// By default, performs semantic analysis to build the new statement.
1883   /// Subclasses may override this routine to provide different behavior.
1884   OMPClause *RebuildOMPThreadLimitClause(Expr *ThreadLimit,
1885                                          SourceLocation StartLoc,
1886                                          SourceLocation LParenLoc,
1887                                          SourceLocation EndLoc) {
1888     return getSema().ActOnOpenMPThreadLimitClause(ThreadLimit, StartLoc,
1889                                                   LParenLoc, EndLoc);
1890   }
1891 
1892   /// Build a new OpenMP 'priority' clause.
1893   ///
1894   /// By default, performs semantic analysis to build the new statement.
1895   /// Subclasses may override this routine to provide different behavior.
1896   OMPClause *RebuildOMPPriorityClause(Expr *Priority, SourceLocation StartLoc,
1897                                       SourceLocation LParenLoc,
1898                                       SourceLocation EndLoc) {
1899     return getSema().ActOnOpenMPPriorityClause(Priority, StartLoc, LParenLoc,
1900                                                EndLoc);
1901   }
1902 
1903   /// Build a new OpenMP 'grainsize' clause.
1904   ///
1905   /// By default, performs semantic analysis to build the new statement.
1906   /// Subclasses may override this routine to provide different behavior.
1907   OMPClause *RebuildOMPGrainsizeClause(Expr *Grainsize, SourceLocation StartLoc,
1908                                        SourceLocation LParenLoc,
1909                                        SourceLocation EndLoc) {
1910     return getSema().ActOnOpenMPGrainsizeClause(Grainsize, StartLoc, LParenLoc,
1911                                                 EndLoc);
1912   }
1913 
1914   /// Build a new OpenMP 'num_tasks' clause.
1915   ///
1916   /// By default, performs semantic analysis to build the new statement.
1917   /// Subclasses may override this routine to provide different behavior.
1918   OMPClause *RebuildOMPNumTasksClause(Expr *NumTasks, SourceLocation StartLoc,
1919                                       SourceLocation LParenLoc,
1920                                       SourceLocation EndLoc) {
1921     return getSema().ActOnOpenMPNumTasksClause(NumTasks, StartLoc, LParenLoc,
1922                                                EndLoc);
1923   }
1924 
1925   /// Build a new OpenMP 'hint' clause.
1926   ///
1927   /// By default, performs semantic analysis to build the new statement.
1928   /// Subclasses may override this routine to provide different behavior.
1929   OMPClause *RebuildOMPHintClause(Expr *Hint, SourceLocation StartLoc,
1930                                   SourceLocation LParenLoc,
1931                                   SourceLocation EndLoc) {
1932     return getSema().ActOnOpenMPHintClause(Hint, StartLoc, LParenLoc, EndLoc);
1933   }
1934 
1935   /// Build a new OpenMP 'dist_schedule' clause.
1936   ///
1937   /// By default, performs semantic analysis to build the new OpenMP clause.
1938   /// Subclasses may override this routine to provide different behavior.
1939   OMPClause *
1940   RebuildOMPDistScheduleClause(OpenMPDistScheduleClauseKind Kind,
1941                                Expr *ChunkSize, SourceLocation StartLoc,
1942                                SourceLocation LParenLoc, SourceLocation KindLoc,
1943                                SourceLocation CommaLoc, SourceLocation EndLoc) {
1944     return getSema().ActOnOpenMPDistScheduleClause(
1945         Kind, ChunkSize, StartLoc, LParenLoc, KindLoc, CommaLoc, EndLoc);
1946   }
1947 
1948   /// Build a new OpenMP 'to' clause.
1949   ///
1950   /// By default, performs semantic analysis to build the new statement.
1951   /// Subclasses may override this routine to provide different behavior.
1952   OMPClause *RebuildOMPToClause(ArrayRef<Expr *> VarList,
1953                                 CXXScopeSpec &MapperIdScopeSpec,
1954                                 DeclarationNameInfo &MapperId,
1955                                 const OMPVarListLocTy &Locs,
1956                                 ArrayRef<Expr *> UnresolvedMappers) {
1957     return getSema().ActOnOpenMPToClause(VarList, MapperIdScopeSpec, MapperId,
1958                                          Locs, UnresolvedMappers);
1959   }
1960 
1961   /// Build a new OpenMP 'from' clause.
1962   ///
1963   /// By default, performs semantic analysis to build the new statement.
1964   /// Subclasses may override this routine to provide different behavior.
1965   OMPClause *RebuildOMPFromClause(ArrayRef<Expr *> VarList,
1966                                   CXXScopeSpec &MapperIdScopeSpec,
1967                                   DeclarationNameInfo &MapperId,
1968                                   const OMPVarListLocTy &Locs,
1969                                   ArrayRef<Expr *> UnresolvedMappers) {
1970     return getSema().ActOnOpenMPFromClause(VarList, MapperIdScopeSpec, MapperId,
1971                                            Locs, UnresolvedMappers);
1972   }
1973 
1974   /// Build a new OpenMP 'use_device_ptr' clause.
1975   ///
1976   /// By default, performs semantic analysis to build the new OpenMP clause.
1977   /// Subclasses may override this routine to provide different behavior.
1978   OMPClause *RebuildOMPUseDevicePtrClause(ArrayRef<Expr *> VarList,
1979                                           const OMPVarListLocTy &Locs) {
1980     return getSema().ActOnOpenMPUseDevicePtrClause(VarList, Locs);
1981   }
1982 
1983   /// Build a new OpenMP 'is_device_ptr' clause.
1984   ///
1985   /// By default, performs semantic analysis to build the new OpenMP clause.
1986   /// Subclasses may override this routine to provide different behavior.
1987   OMPClause *RebuildOMPIsDevicePtrClause(ArrayRef<Expr *> VarList,
1988                                          const OMPVarListLocTy &Locs) {
1989     return getSema().ActOnOpenMPIsDevicePtrClause(VarList, Locs);
1990   }
1991 
1992   /// Build a new OpenMP 'defaultmap' clause.
1993   ///
1994   /// By default, performs semantic analysis to build the new OpenMP clause.
1995   /// Subclasses may override this routine to provide different behavior.
1996   OMPClause *RebuildOMPDefaultmapClause(OpenMPDefaultmapClauseModifier M,
1997                                         OpenMPDefaultmapClauseKind Kind,
1998                                         SourceLocation StartLoc,
1999                                         SourceLocation LParenLoc,
2000                                         SourceLocation MLoc,
2001                                         SourceLocation KindLoc,
2002                                         SourceLocation EndLoc) {
2003     return getSema().ActOnOpenMPDefaultmapClause(M, Kind, StartLoc, LParenLoc,
2004                                                  MLoc, KindLoc, EndLoc);
2005   }
2006 
2007   /// Build a new OpenMP 'nontemporal' clause.
2008   ///
2009   /// By default, performs semantic analysis to build the new OpenMP clause.
2010   /// Subclasses may override this routine to provide different behavior.
2011   OMPClause *RebuildOMPNontemporalClause(ArrayRef<Expr *> VarList,
2012                                          SourceLocation StartLoc,
2013                                          SourceLocation LParenLoc,
2014                                          SourceLocation EndLoc) {
2015     return getSema().ActOnOpenMPNontemporalClause(VarList, StartLoc, LParenLoc,
2016                                                   EndLoc);
2017   }
2018 
2019   /// Build a new OpenMP 'order' clause.
2020   ///
2021   /// By default, performs semantic analysis to build the new OpenMP clause.
2022   /// Subclasses may override this routine to provide different behavior.
2023   OMPClause *RebuildOMPOrderClause(OpenMPOrderClauseKind Kind,
2024                                    SourceLocation KindKwLoc,
2025                                    SourceLocation StartLoc,
2026                                    SourceLocation LParenLoc,
2027                                    SourceLocation EndLoc) {
2028     return getSema().ActOnOpenMPOrderClause(Kind, KindKwLoc, StartLoc,
2029                                             LParenLoc, EndLoc);
2030   }
2031 
2032   /// Rebuild the operand to an Objective-C \@synchronized statement.
2033   ///
2034   /// By default, performs semantic analysis to build the new statement.
2035   /// Subclasses may override this routine to provide different behavior.
2036   ExprResult RebuildObjCAtSynchronizedOperand(SourceLocation atLoc,
2037                                               Expr *object) {
2038     return getSema().ActOnObjCAtSynchronizedOperand(atLoc, object);
2039   }
2040 
2041   /// Build a new Objective-C \@synchronized statement.
2042   ///
2043   /// By default, performs semantic analysis to build the new statement.
2044   /// Subclasses may override this routine to provide different behavior.
2045   StmtResult RebuildObjCAtSynchronizedStmt(SourceLocation AtLoc,
2046                                            Expr *Object, Stmt *Body) {
2047     return getSema().ActOnObjCAtSynchronizedStmt(AtLoc, Object, Body);
2048   }
2049 
2050   /// Build a new Objective-C \@autoreleasepool statement.
2051   ///
2052   /// By default, performs semantic analysis to build the new statement.
2053   /// Subclasses may override this routine to provide different behavior.
2054   StmtResult RebuildObjCAutoreleasePoolStmt(SourceLocation AtLoc,
2055                                             Stmt *Body) {
2056     return getSema().ActOnObjCAutoreleasePoolStmt(AtLoc, Body);
2057   }
2058 
2059   /// Build a new Objective-C fast enumeration statement.
2060   ///
2061   /// By default, performs semantic analysis to build the new statement.
2062   /// Subclasses may override this routine to provide different behavior.
2063   StmtResult RebuildObjCForCollectionStmt(SourceLocation ForLoc,
2064                                           Stmt *Element,
2065                                           Expr *Collection,
2066                                           SourceLocation RParenLoc,
2067                                           Stmt *Body) {
2068     StmtResult ForEachStmt = getSema().ActOnObjCForCollectionStmt(ForLoc,
2069                                                 Element,
2070                                                 Collection,
2071                                                 RParenLoc);
2072     if (ForEachStmt.isInvalid())
2073       return StmtError();
2074 
2075     return getSema().FinishObjCForCollectionStmt(ForEachStmt.get(), Body);
2076   }
2077 
2078   /// Build a new C++ exception declaration.
2079   ///
2080   /// By default, performs semantic analysis to build the new decaration.
2081   /// Subclasses may override this routine to provide different behavior.
2082   VarDecl *RebuildExceptionDecl(VarDecl *ExceptionDecl,
2083                                 TypeSourceInfo *Declarator,
2084                                 SourceLocation StartLoc,
2085                                 SourceLocation IdLoc,
2086                                 IdentifierInfo *Id) {
2087     VarDecl *Var = getSema().BuildExceptionDeclaration(nullptr, Declarator,
2088                                                        StartLoc, IdLoc, Id);
2089     if (Var)
2090       getSema().CurContext->addDecl(Var);
2091     return Var;
2092   }
2093 
2094   /// Build a new C++ catch statement.
2095   ///
2096   /// By default, performs semantic analysis to build the new statement.
2097   /// Subclasses may override this routine to provide different behavior.
2098   StmtResult RebuildCXXCatchStmt(SourceLocation CatchLoc,
2099                                  VarDecl *ExceptionDecl,
2100                                  Stmt *Handler) {
2101     return Owned(new (getSema().Context) CXXCatchStmt(CatchLoc, ExceptionDecl,
2102                                                       Handler));
2103   }
2104 
2105   /// Build a new C++ try statement.
2106   ///
2107   /// By default, performs semantic analysis to build the new statement.
2108   /// Subclasses may override this routine to provide different behavior.
2109   StmtResult RebuildCXXTryStmt(SourceLocation TryLoc, Stmt *TryBlock,
2110                                ArrayRef<Stmt *> Handlers) {
2111     return getSema().ActOnCXXTryBlock(TryLoc, TryBlock, Handlers);
2112   }
2113 
2114   /// Build a new C++0x range-based for statement.
2115   ///
2116   /// By default, performs semantic analysis to build the new statement.
2117   /// Subclasses may override this routine to provide different behavior.
2118   StmtResult RebuildCXXForRangeStmt(SourceLocation ForLoc,
2119                                     SourceLocation CoawaitLoc, Stmt *Init,
2120                                     SourceLocation ColonLoc, Stmt *Range,
2121                                     Stmt *Begin, Stmt *End, Expr *Cond,
2122                                     Expr *Inc, Stmt *LoopVar,
2123                                     SourceLocation RParenLoc) {
2124     // If we've just learned that the range is actually an Objective-C
2125     // collection, treat this as an Objective-C fast enumeration loop.
2126     if (DeclStmt *RangeStmt = dyn_cast<DeclStmt>(Range)) {
2127       if (RangeStmt->isSingleDecl()) {
2128         if (VarDecl *RangeVar = dyn_cast<VarDecl>(RangeStmt->getSingleDecl())) {
2129           if (RangeVar->isInvalidDecl())
2130             return StmtError();
2131 
2132           Expr *RangeExpr = RangeVar->getInit();
2133           if (!RangeExpr->isTypeDependent() &&
2134               RangeExpr->getType()->isObjCObjectPointerType()) {
2135             // FIXME: Support init-statements in Objective-C++20 ranged for
2136             // statement.
2137             if (Init) {
2138               return SemaRef.Diag(Init->getBeginLoc(),
2139                                   diag::err_objc_for_range_init_stmt)
2140                          << Init->getSourceRange();
2141             }
2142             return getSema().ActOnObjCForCollectionStmt(ForLoc, LoopVar,
2143                                                         RangeExpr, RParenLoc);
2144           }
2145         }
2146       }
2147     }
2148 
2149     return getSema().BuildCXXForRangeStmt(ForLoc, CoawaitLoc, Init, ColonLoc,
2150                                           Range, Begin, End, Cond, Inc, LoopVar,
2151                                           RParenLoc, Sema::BFRK_Rebuild);
2152   }
2153 
2154   /// Build a new C++0x range-based for statement.
2155   ///
2156   /// By default, performs semantic analysis to build the new statement.
2157   /// Subclasses may override this routine to provide different behavior.
2158   StmtResult RebuildMSDependentExistsStmt(SourceLocation KeywordLoc,
2159                                           bool IsIfExists,
2160                                           NestedNameSpecifierLoc QualifierLoc,
2161                                           DeclarationNameInfo NameInfo,
2162                                           Stmt *Nested) {
2163     return getSema().BuildMSDependentExistsStmt(KeywordLoc, IsIfExists,
2164                                                 QualifierLoc, NameInfo, Nested);
2165   }
2166 
2167   /// Attach body to a C++0x range-based for statement.
2168   ///
2169   /// By default, performs semantic analysis to finish the new statement.
2170   /// Subclasses may override this routine to provide different behavior.
2171   StmtResult FinishCXXForRangeStmt(Stmt *ForRange, Stmt *Body) {
2172     return getSema().FinishCXXForRangeStmt(ForRange, Body);
2173   }
2174 
2175   StmtResult RebuildSEHTryStmt(bool IsCXXTry, SourceLocation TryLoc,
2176                                Stmt *TryBlock, Stmt *Handler) {
2177     return getSema().ActOnSEHTryBlock(IsCXXTry, TryLoc, TryBlock, Handler);
2178   }
2179 
2180   StmtResult RebuildSEHExceptStmt(SourceLocation Loc, Expr *FilterExpr,
2181                                   Stmt *Block) {
2182     return getSema().ActOnSEHExceptBlock(Loc, FilterExpr, Block);
2183   }
2184 
2185   StmtResult RebuildSEHFinallyStmt(SourceLocation Loc, Stmt *Block) {
2186     return SEHFinallyStmt::Create(getSema().getASTContext(), Loc, Block);
2187   }
2188 
2189   /// Build a new predefined expression.
2190   ///
2191   /// By default, performs semantic analysis to build the new expression.
2192   /// Subclasses may override this routine to provide different behavior.
2193   ExprResult RebuildPredefinedExpr(SourceLocation Loc,
2194                                    PredefinedExpr::IdentKind IK) {
2195     return getSema().BuildPredefinedExpr(Loc, IK);
2196   }
2197 
2198   /// Build a new expression that references a declaration.
2199   ///
2200   /// By default, performs semantic analysis to build the new expression.
2201   /// Subclasses may override this routine to provide different behavior.
2202   ExprResult RebuildDeclarationNameExpr(const CXXScopeSpec &SS,
2203                                         LookupResult &R,
2204                                         bool RequiresADL) {
2205     return getSema().BuildDeclarationNameExpr(SS, R, RequiresADL);
2206   }
2207 
2208 
2209   /// Build a new expression that references a declaration.
2210   ///
2211   /// By default, performs semantic analysis to build the new expression.
2212   /// Subclasses may override this routine to provide different behavior.
2213   ExprResult RebuildDeclRefExpr(NestedNameSpecifierLoc QualifierLoc,
2214                                 ValueDecl *VD,
2215                                 const DeclarationNameInfo &NameInfo,
2216                                 NamedDecl *Found,
2217                                 TemplateArgumentListInfo *TemplateArgs) {
2218     CXXScopeSpec SS;
2219     SS.Adopt(QualifierLoc);
2220     return getSema().BuildDeclarationNameExpr(SS, NameInfo, VD, Found,
2221                                               TemplateArgs);
2222   }
2223 
2224   /// Build a new expression in parentheses.
2225   ///
2226   /// By default, performs semantic analysis to build the new expression.
2227   /// Subclasses may override this routine to provide different behavior.
2228   ExprResult RebuildParenExpr(Expr *SubExpr, SourceLocation LParen,
2229                                     SourceLocation RParen) {
2230     return getSema().ActOnParenExpr(LParen, RParen, SubExpr);
2231   }
2232 
2233   /// Build a new pseudo-destructor expression.
2234   ///
2235   /// By default, performs semantic analysis to build the new expression.
2236   /// Subclasses may override this routine to provide different behavior.
2237   ExprResult RebuildCXXPseudoDestructorExpr(Expr *Base,
2238                                             SourceLocation OperatorLoc,
2239                                             bool isArrow,
2240                                             CXXScopeSpec &SS,
2241                                             TypeSourceInfo *ScopeType,
2242                                             SourceLocation CCLoc,
2243                                             SourceLocation TildeLoc,
2244                                         PseudoDestructorTypeStorage Destroyed);
2245 
2246   /// Build a new unary operator expression.
2247   ///
2248   /// By default, performs semantic analysis to build the new expression.
2249   /// Subclasses may override this routine to provide different behavior.
2250   ExprResult RebuildUnaryOperator(SourceLocation OpLoc,
2251                                         UnaryOperatorKind Opc,
2252                                         Expr *SubExpr) {
2253     return getSema().BuildUnaryOp(/*Scope=*/nullptr, OpLoc, Opc, SubExpr);
2254   }
2255 
2256   /// Build a new builtin offsetof expression.
2257   ///
2258   /// By default, performs semantic analysis to build the new expression.
2259   /// Subclasses may override this routine to provide different behavior.
2260   ExprResult RebuildOffsetOfExpr(SourceLocation OperatorLoc,
2261                                  TypeSourceInfo *Type,
2262                                  ArrayRef<Sema::OffsetOfComponent> Components,
2263                                  SourceLocation RParenLoc) {
2264     return getSema().BuildBuiltinOffsetOf(OperatorLoc, Type, Components,
2265                                           RParenLoc);
2266   }
2267 
2268   /// Build a new sizeof, alignof or vec_step expression with a
2269   /// type argument.
2270   ///
2271   /// By default, performs semantic analysis to build the new expression.
2272   /// Subclasses may override this routine to provide different behavior.
2273   ExprResult RebuildUnaryExprOrTypeTrait(TypeSourceInfo *TInfo,
2274                                          SourceLocation OpLoc,
2275                                          UnaryExprOrTypeTrait ExprKind,
2276                                          SourceRange R) {
2277     return getSema().CreateUnaryExprOrTypeTraitExpr(TInfo, OpLoc, ExprKind, R);
2278   }
2279 
2280   /// Build a new sizeof, alignof or vec step expression with an
2281   /// expression argument.
2282   ///
2283   /// By default, performs semantic analysis to build the new expression.
2284   /// Subclasses may override this routine to provide different behavior.
2285   ExprResult RebuildUnaryExprOrTypeTrait(Expr *SubExpr, SourceLocation OpLoc,
2286                                          UnaryExprOrTypeTrait ExprKind,
2287                                          SourceRange R) {
2288     ExprResult Result
2289       = getSema().CreateUnaryExprOrTypeTraitExpr(SubExpr, OpLoc, ExprKind);
2290     if (Result.isInvalid())
2291       return ExprError();
2292 
2293     return Result;
2294   }
2295 
2296   /// Build a new array subscript expression.
2297   ///
2298   /// By default, performs semantic analysis to build the new expression.
2299   /// Subclasses may override this routine to provide different behavior.
2300   ExprResult RebuildArraySubscriptExpr(Expr *LHS,
2301                                              SourceLocation LBracketLoc,
2302                                              Expr *RHS,
2303                                              SourceLocation RBracketLoc) {
2304     return getSema().ActOnArraySubscriptExpr(/*Scope=*/nullptr, LHS,
2305                                              LBracketLoc, RHS,
2306                                              RBracketLoc);
2307   }
2308 
2309   /// Build a new array section expression.
2310   ///
2311   /// By default, performs semantic analysis to build the new expression.
2312   /// Subclasses may override this routine to provide different behavior.
2313   ExprResult RebuildOMPArraySectionExpr(Expr *Base, SourceLocation LBracketLoc,
2314                                         Expr *LowerBound,
2315                                         SourceLocation ColonLoc, Expr *Length,
2316                                         SourceLocation RBracketLoc) {
2317     return getSema().ActOnOMPArraySectionExpr(Base, LBracketLoc, LowerBound,
2318                                               ColonLoc, Length, RBracketLoc);
2319   }
2320 
2321   /// Build a new call expression.
2322   ///
2323   /// By default, performs semantic analysis to build the new expression.
2324   /// Subclasses may override this routine to provide different behavior.
2325   ExprResult RebuildCallExpr(Expr *Callee, SourceLocation LParenLoc,
2326                                    MultiExprArg Args,
2327                                    SourceLocation RParenLoc,
2328                                    Expr *ExecConfig = nullptr) {
2329     return getSema().BuildCallExpr(/*Scope=*/nullptr, Callee, LParenLoc, Args,
2330                                    RParenLoc, ExecConfig);
2331   }
2332 
2333   /// Build a new member access expression.
2334   ///
2335   /// By default, performs semantic analysis to build the new expression.
2336   /// Subclasses may override this routine to provide different behavior.
2337   ExprResult RebuildMemberExpr(Expr *Base, SourceLocation OpLoc,
2338                                bool isArrow,
2339                                NestedNameSpecifierLoc QualifierLoc,
2340                                SourceLocation TemplateKWLoc,
2341                                const DeclarationNameInfo &MemberNameInfo,
2342                                ValueDecl *Member,
2343                                NamedDecl *FoundDecl,
2344                         const TemplateArgumentListInfo *ExplicitTemplateArgs,
2345                                NamedDecl *FirstQualifierInScope) {
2346     ExprResult BaseResult = getSema().PerformMemberExprBaseConversion(Base,
2347                                                                       isArrow);
2348     if (!Member->getDeclName()) {
2349       // We have a reference to an unnamed field.  This is always the
2350       // base of an anonymous struct/union member access, i.e. the
2351       // field is always of record type.
2352       assert(Member->getType()->isRecordType() &&
2353              "unnamed member not of record type?");
2354 
2355       BaseResult =
2356         getSema().PerformObjectMemberConversion(BaseResult.get(),
2357                                                 QualifierLoc.getNestedNameSpecifier(),
2358                                                 FoundDecl, Member);
2359       if (BaseResult.isInvalid())
2360         return ExprError();
2361       Base = BaseResult.get();
2362 
2363       CXXScopeSpec EmptySS;
2364       return getSema().BuildFieldReferenceExpr(
2365           Base, isArrow, OpLoc, EmptySS, cast<FieldDecl>(Member),
2366           DeclAccessPair::make(FoundDecl, FoundDecl->getAccess()), MemberNameInfo);
2367     }
2368 
2369     CXXScopeSpec SS;
2370     SS.Adopt(QualifierLoc);
2371 
2372     Base = BaseResult.get();
2373     QualType BaseType = Base->getType();
2374 
2375     if (isArrow && !BaseType->isPointerType())
2376       return ExprError();
2377 
2378     // FIXME: this involves duplicating earlier analysis in a lot of
2379     // cases; we should avoid this when possible.
2380     LookupResult R(getSema(), MemberNameInfo, Sema::LookupMemberName);
2381     R.addDecl(FoundDecl);
2382     R.resolveKind();
2383 
2384     return getSema().BuildMemberReferenceExpr(Base, BaseType, OpLoc, isArrow,
2385                                               SS, TemplateKWLoc,
2386                                               FirstQualifierInScope,
2387                                               R, ExplicitTemplateArgs,
2388                                               /*S*/nullptr);
2389   }
2390 
2391   /// Build a new binary operator expression.
2392   ///
2393   /// By default, performs semantic analysis to build the new expression.
2394   /// Subclasses may override this routine to provide different behavior.
2395   ExprResult RebuildBinaryOperator(SourceLocation OpLoc,
2396                                          BinaryOperatorKind Opc,
2397                                          Expr *LHS, Expr *RHS) {
2398     return getSema().BuildBinOp(/*Scope=*/nullptr, OpLoc, Opc, LHS, RHS);
2399   }
2400 
2401   /// Build a new rewritten operator expression.
2402   ///
2403   /// By default, performs semantic analysis to build the new expression.
2404   /// Subclasses may override this routine to provide different behavior.
2405   ExprResult RebuildCXXRewrittenBinaryOperator(
2406       SourceLocation OpLoc, BinaryOperatorKind Opcode,
2407       const UnresolvedSetImpl &UnqualLookups, Expr *LHS, Expr *RHS) {
2408     return getSema().CreateOverloadedBinOp(OpLoc, Opcode, UnqualLookups, LHS,
2409                                            RHS, /*RequiresADL*/false);
2410   }
2411 
2412   /// Build a new conditional operator expression.
2413   ///
2414   /// By default, performs semantic analysis to build the new expression.
2415   /// Subclasses may override this routine to provide different behavior.
2416   ExprResult RebuildConditionalOperator(Expr *Cond,
2417                                         SourceLocation QuestionLoc,
2418                                         Expr *LHS,
2419                                         SourceLocation ColonLoc,
2420                                         Expr *RHS) {
2421     return getSema().ActOnConditionalOp(QuestionLoc, ColonLoc, Cond,
2422                                         LHS, RHS);
2423   }
2424 
2425   /// Build a new C-style cast expression.
2426   ///
2427   /// By default, performs semantic analysis to build the new expression.
2428   /// Subclasses may override this routine to provide different behavior.
2429   ExprResult RebuildCStyleCastExpr(SourceLocation LParenLoc,
2430                                          TypeSourceInfo *TInfo,
2431                                          SourceLocation RParenLoc,
2432                                          Expr *SubExpr) {
2433     return getSema().BuildCStyleCastExpr(LParenLoc, TInfo, RParenLoc,
2434                                          SubExpr);
2435   }
2436 
2437   /// Build a new compound literal expression.
2438   ///
2439   /// By default, performs semantic analysis to build the new expression.
2440   /// Subclasses may override this routine to provide different behavior.
2441   ExprResult RebuildCompoundLiteralExpr(SourceLocation LParenLoc,
2442                                               TypeSourceInfo *TInfo,
2443                                               SourceLocation RParenLoc,
2444                                               Expr *Init) {
2445     return getSema().BuildCompoundLiteralExpr(LParenLoc, TInfo, RParenLoc,
2446                                               Init);
2447   }
2448 
2449   /// Build a new extended vector element access expression.
2450   ///
2451   /// By default, performs semantic analysis to build the new expression.
2452   /// Subclasses may override this routine to provide different behavior.
2453   ExprResult RebuildExtVectorElementExpr(Expr *Base,
2454                                                SourceLocation OpLoc,
2455                                                SourceLocation AccessorLoc,
2456                                                IdentifierInfo &Accessor) {
2457 
2458     CXXScopeSpec SS;
2459     DeclarationNameInfo NameInfo(&Accessor, AccessorLoc);
2460     return getSema().BuildMemberReferenceExpr(Base, Base->getType(),
2461                                               OpLoc, /*IsArrow*/ false,
2462                                               SS, SourceLocation(),
2463                                               /*FirstQualifierInScope*/ nullptr,
2464                                               NameInfo,
2465                                               /* TemplateArgs */ nullptr,
2466                                               /*S*/ nullptr);
2467   }
2468 
2469   /// Build a new initializer list expression.
2470   ///
2471   /// By default, performs semantic analysis to build the new expression.
2472   /// Subclasses may override this routine to provide different behavior.
2473   ExprResult RebuildInitList(SourceLocation LBraceLoc,
2474                              MultiExprArg Inits,
2475                              SourceLocation RBraceLoc) {
2476     return SemaRef.BuildInitList(LBraceLoc, Inits, RBraceLoc);
2477   }
2478 
2479   /// Build a new designated initializer expression.
2480   ///
2481   /// By default, performs semantic analysis to build the new expression.
2482   /// Subclasses may override this routine to provide different behavior.
2483   ExprResult RebuildDesignatedInitExpr(Designation &Desig,
2484                                              MultiExprArg ArrayExprs,
2485                                              SourceLocation EqualOrColonLoc,
2486                                              bool GNUSyntax,
2487                                              Expr *Init) {
2488     ExprResult Result
2489       = SemaRef.ActOnDesignatedInitializer(Desig, EqualOrColonLoc, GNUSyntax,
2490                                            Init);
2491     if (Result.isInvalid())
2492       return ExprError();
2493 
2494     return Result;
2495   }
2496 
2497   /// Build a new value-initialized expression.
2498   ///
2499   /// By default, builds the implicit value initialization without performing
2500   /// any semantic analysis. Subclasses may override this routine to provide
2501   /// different behavior.
2502   ExprResult RebuildImplicitValueInitExpr(QualType T) {
2503     return new (SemaRef.Context) ImplicitValueInitExpr(T);
2504   }
2505 
2506   /// Build a new \c va_arg expression.
2507   ///
2508   /// By default, performs semantic analysis to build the new expression.
2509   /// Subclasses may override this routine to provide different behavior.
2510   ExprResult RebuildVAArgExpr(SourceLocation BuiltinLoc,
2511                                     Expr *SubExpr, TypeSourceInfo *TInfo,
2512                                     SourceLocation RParenLoc) {
2513     return getSema().BuildVAArgExpr(BuiltinLoc,
2514                                     SubExpr, TInfo,
2515                                     RParenLoc);
2516   }
2517 
2518   /// Build a new expression list in parentheses.
2519   ///
2520   /// By default, performs semantic analysis to build the new expression.
2521   /// Subclasses may override this routine to provide different behavior.
2522   ExprResult RebuildParenListExpr(SourceLocation LParenLoc,
2523                                   MultiExprArg SubExprs,
2524                                   SourceLocation RParenLoc) {
2525     return getSema().ActOnParenListExpr(LParenLoc, RParenLoc, SubExprs);
2526   }
2527 
2528   /// Build a new address-of-label expression.
2529   ///
2530   /// By default, performs semantic analysis, using the name of the label
2531   /// rather than attempting to map the label statement itself.
2532   /// Subclasses may override this routine to provide different behavior.
2533   ExprResult RebuildAddrLabelExpr(SourceLocation AmpAmpLoc,
2534                                   SourceLocation LabelLoc, LabelDecl *Label) {
2535     return getSema().ActOnAddrLabel(AmpAmpLoc, LabelLoc, Label);
2536   }
2537 
2538   /// Build a new GNU statement expression.
2539   ///
2540   /// By default, performs semantic analysis to build the new expression.
2541   /// Subclasses may override this routine to provide different behavior.
2542   ExprResult RebuildStmtExpr(SourceLocation LParenLoc,
2543                                    Stmt *SubStmt,
2544                                    SourceLocation RParenLoc) {
2545     return getSema().ActOnStmtExpr(LParenLoc, SubStmt, RParenLoc);
2546   }
2547 
2548   /// Build a new __builtin_choose_expr expression.
2549   ///
2550   /// By default, performs semantic analysis to build the new expression.
2551   /// Subclasses may override this routine to provide different behavior.
2552   ExprResult RebuildChooseExpr(SourceLocation BuiltinLoc,
2553                                      Expr *Cond, Expr *LHS, Expr *RHS,
2554                                      SourceLocation RParenLoc) {
2555     return SemaRef.ActOnChooseExpr(BuiltinLoc,
2556                                    Cond, LHS, RHS,
2557                                    RParenLoc);
2558   }
2559 
2560   /// Build a new generic selection expression.
2561   ///
2562   /// By default, performs semantic analysis to build the new expression.
2563   /// Subclasses may override this routine to provide different behavior.
2564   ExprResult RebuildGenericSelectionExpr(SourceLocation KeyLoc,
2565                                          SourceLocation DefaultLoc,
2566                                          SourceLocation RParenLoc,
2567                                          Expr *ControllingExpr,
2568                                          ArrayRef<TypeSourceInfo *> Types,
2569                                          ArrayRef<Expr *> Exprs) {
2570     return getSema().CreateGenericSelectionExpr(KeyLoc, DefaultLoc, RParenLoc,
2571                                                 ControllingExpr, Types, Exprs);
2572   }
2573 
2574   /// Build a new overloaded operator call expression.
2575   ///
2576   /// By default, performs semantic analysis to build the new expression.
2577   /// The semantic analysis provides the behavior of template instantiation,
2578   /// copying with transformations that turn what looks like an overloaded
2579   /// operator call into a use of a builtin operator, performing
2580   /// argument-dependent lookup, etc. Subclasses may override this routine to
2581   /// provide different behavior.
2582   ExprResult RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op,
2583                                               SourceLocation OpLoc,
2584                                               Expr *Callee,
2585                                               Expr *First,
2586                                               Expr *Second);
2587 
2588   /// Build a new C++ "named" cast expression, such as static_cast or
2589   /// reinterpret_cast.
2590   ///
2591   /// By default, this routine dispatches to one of the more-specific routines
2592   /// for a particular named case, e.g., RebuildCXXStaticCastExpr().
2593   /// Subclasses may override this routine to provide different behavior.
2594   ExprResult RebuildCXXNamedCastExpr(SourceLocation OpLoc,
2595                                            Stmt::StmtClass Class,
2596                                            SourceLocation LAngleLoc,
2597                                            TypeSourceInfo *TInfo,
2598                                            SourceLocation RAngleLoc,
2599                                            SourceLocation LParenLoc,
2600                                            Expr *SubExpr,
2601                                            SourceLocation RParenLoc) {
2602     switch (Class) {
2603     case Stmt::CXXStaticCastExprClass:
2604       return getDerived().RebuildCXXStaticCastExpr(OpLoc, LAngleLoc, TInfo,
2605                                                    RAngleLoc, LParenLoc,
2606                                                    SubExpr, RParenLoc);
2607 
2608     case Stmt::CXXDynamicCastExprClass:
2609       return getDerived().RebuildCXXDynamicCastExpr(OpLoc, LAngleLoc, TInfo,
2610                                                     RAngleLoc, LParenLoc,
2611                                                     SubExpr, RParenLoc);
2612 
2613     case Stmt::CXXReinterpretCastExprClass:
2614       return getDerived().RebuildCXXReinterpretCastExpr(OpLoc, LAngleLoc, TInfo,
2615                                                         RAngleLoc, LParenLoc,
2616                                                         SubExpr,
2617                                                         RParenLoc);
2618 
2619     case Stmt::CXXConstCastExprClass:
2620       return getDerived().RebuildCXXConstCastExpr(OpLoc, LAngleLoc, TInfo,
2621                                                    RAngleLoc, LParenLoc,
2622                                                    SubExpr, RParenLoc);
2623 
2624     default:
2625       llvm_unreachable("Invalid C++ named cast");
2626     }
2627   }
2628 
2629   /// Build a new C++ static_cast expression.
2630   ///
2631   /// By default, performs semantic analysis to build the new expression.
2632   /// Subclasses may override this routine to provide different behavior.
2633   ExprResult RebuildCXXStaticCastExpr(SourceLocation OpLoc,
2634                                             SourceLocation LAngleLoc,
2635                                             TypeSourceInfo *TInfo,
2636                                             SourceLocation RAngleLoc,
2637                                             SourceLocation LParenLoc,
2638                                             Expr *SubExpr,
2639                                             SourceLocation RParenLoc) {
2640     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_static_cast,
2641                                        TInfo, SubExpr,
2642                                        SourceRange(LAngleLoc, RAngleLoc),
2643                                        SourceRange(LParenLoc, RParenLoc));
2644   }
2645 
2646   /// Build a new C++ dynamic_cast expression.
2647   ///
2648   /// By default, performs semantic analysis to build the new expression.
2649   /// Subclasses may override this routine to provide different behavior.
2650   ExprResult RebuildCXXDynamicCastExpr(SourceLocation OpLoc,
2651                                              SourceLocation LAngleLoc,
2652                                              TypeSourceInfo *TInfo,
2653                                              SourceLocation RAngleLoc,
2654                                              SourceLocation LParenLoc,
2655                                              Expr *SubExpr,
2656                                              SourceLocation RParenLoc) {
2657     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_dynamic_cast,
2658                                        TInfo, SubExpr,
2659                                        SourceRange(LAngleLoc, RAngleLoc),
2660                                        SourceRange(LParenLoc, RParenLoc));
2661   }
2662 
2663   /// Build a new C++ reinterpret_cast expression.
2664   ///
2665   /// By default, performs semantic analysis to build the new expression.
2666   /// Subclasses may override this routine to provide different behavior.
2667   ExprResult RebuildCXXReinterpretCastExpr(SourceLocation OpLoc,
2668                                                  SourceLocation LAngleLoc,
2669                                                  TypeSourceInfo *TInfo,
2670                                                  SourceLocation RAngleLoc,
2671                                                  SourceLocation LParenLoc,
2672                                                  Expr *SubExpr,
2673                                                  SourceLocation RParenLoc) {
2674     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_reinterpret_cast,
2675                                        TInfo, SubExpr,
2676                                        SourceRange(LAngleLoc, RAngleLoc),
2677                                        SourceRange(LParenLoc, RParenLoc));
2678   }
2679 
2680   /// Build a new C++ const_cast expression.
2681   ///
2682   /// By default, performs semantic analysis to build the new expression.
2683   /// Subclasses may override this routine to provide different behavior.
2684   ExprResult RebuildCXXConstCastExpr(SourceLocation OpLoc,
2685                                            SourceLocation LAngleLoc,
2686                                            TypeSourceInfo *TInfo,
2687                                            SourceLocation RAngleLoc,
2688                                            SourceLocation LParenLoc,
2689                                            Expr *SubExpr,
2690                                            SourceLocation RParenLoc) {
2691     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_const_cast,
2692                                        TInfo, SubExpr,
2693                                        SourceRange(LAngleLoc, RAngleLoc),
2694                                        SourceRange(LParenLoc, RParenLoc));
2695   }
2696 
2697   /// Build a new C++ functional-style cast expression.
2698   ///
2699   /// By default, performs semantic analysis to build the new expression.
2700   /// Subclasses may override this routine to provide different behavior.
2701   ExprResult RebuildCXXFunctionalCastExpr(TypeSourceInfo *TInfo,
2702                                           SourceLocation LParenLoc,
2703                                           Expr *Sub,
2704                                           SourceLocation RParenLoc,
2705                                           bool ListInitialization) {
2706     return getSema().BuildCXXTypeConstructExpr(TInfo, LParenLoc,
2707                                                MultiExprArg(&Sub, 1), RParenLoc,
2708                                                ListInitialization);
2709   }
2710 
2711   /// Build a new C++ __builtin_bit_cast expression.
2712   ///
2713   /// By default, performs semantic analysis to build the new expression.
2714   /// Subclasses may override this routine to provide different behavior.
2715   ExprResult RebuildBuiltinBitCastExpr(SourceLocation KWLoc,
2716                                        TypeSourceInfo *TSI, Expr *Sub,
2717                                        SourceLocation RParenLoc) {
2718     return getSema().BuildBuiltinBitCastExpr(KWLoc, TSI, Sub, RParenLoc);
2719   }
2720 
2721   /// Build a new C++ typeid(type) expression.
2722   ///
2723   /// By default, performs semantic analysis to build the new expression.
2724   /// Subclasses may override this routine to provide different behavior.
2725   ExprResult RebuildCXXTypeidExpr(QualType TypeInfoType,
2726                                         SourceLocation TypeidLoc,
2727                                         TypeSourceInfo *Operand,
2728                                         SourceLocation RParenLoc) {
2729     return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand,
2730                                     RParenLoc);
2731   }
2732 
2733 
2734   /// Build a new C++ typeid(expr) expression.
2735   ///
2736   /// By default, performs semantic analysis to build the new expression.
2737   /// Subclasses may override this routine to provide different behavior.
2738   ExprResult RebuildCXXTypeidExpr(QualType TypeInfoType,
2739                                         SourceLocation TypeidLoc,
2740                                         Expr *Operand,
2741                                         SourceLocation RParenLoc) {
2742     return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand,
2743                                     RParenLoc);
2744   }
2745 
2746   /// Build a new C++ __uuidof(type) expression.
2747   ///
2748   /// By default, performs semantic analysis to build the new expression.
2749   /// Subclasses may override this routine to provide different behavior.
2750   ExprResult RebuildCXXUuidofExpr(QualType TypeInfoType,
2751                                         SourceLocation TypeidLoc,
2752                                         TypeSourceInfo *Operand,
2753                                         SourceLocation RParenLoc) {
2754     return getSema().BuildCXXUuidof(TypeInfoType, TypeidLoc, Operand,
2755                                     RParenLoc);
2756   }
2757 
2758   /// Build a new C++ __uuidof(expr) expression.
2759   ///
2760   /// By default, performs semantic analysis to build the new expression.
2761   /// Subclasses may override this routine to provide different behavior.
2762   ExprResult RebuildCXXUuidofExpr(QualType TypeInfoType,
2763                                         SourceLocation TypeidLoc,
2764                                         Expr *Operand,
2765                                         SourceLocation RParenLoc) {
2766     return getSema().BuildCXXUuidof(TypeInfoType, TypeidLoc, Operand,
2767                                     RParenLoc);
2768   }
2769 
2770   /// Build a new C++ "this" expression.
2771   ///
2772   /// By default, builds a new "this" expression without performing any
2773   /// semantic analysis. Subclasses may override this routine to provide
2774   /// different behavior.
2775   ExprResult RebuildCXXThisExpr(SourceLocation ThisLoc,
2776                                 QualType ThisType,
2777                                 bool isImplicit) {
2778     return getSema().BuildCXXThisExpr(ThisLoc, ThisType, isImplicit);
2779   }
2780 
2781   /// Build a new C++ throw expression.
2782   ///
2783   /// By default, performs semantic analysis to build the new expression.
2784   /// Subclasses may override this routine to provide different behavior.
2785   ExprResult RebuildCXXThrowExpr(SourceLocation ThrowLoc, Expr *Sub,
2786                                  bool IsThrownVariableInScope) {
2787     return getSema().BuildCXXThrow(ThrowLoc, Sub, IsThrownVariableInScope);
2788   }
2789 
2790   /// Build a new C++ default-argument expression.
2791   ///
2792   /// By default, builds a new default-argument expression, which does not
2793   /// require any semantic analysis. Subclasses may override this routine to
2794   /// provide different behavior.
2795   ExprResult RebuildCXXDefaultArgExpr(SourceLocation Loc, ParmVarDecl *Param) {
2796     return CXXDefaultArgExpr::Create(getSema().Context, Loc, Param,
2797                                      getSema().CurContext);
2798   }
2799 
2800   /// Build a new C++11 default-initialization expression.
2801   ///
2802   /// By default, builds a new default field initialization expression, which
2803   /// does not require any semantic analysis. Subclasses may override this
2804   /// routine to provide different behavior.
2805   ExprResult RebuildCXXDefaultInitExpr(SourceLocation Loc,
2806                                        FieldDecl *Field) {
2807     return CXXDefaultInitExpr::Create(getSema().Context, Loc, Field,
2808                                       getSema().CurContext);
2809   }
2810 
2811   /// Build a new C++ zero-initialization expression.
2812   ///
2813   /// By default, performs semantic analysis to build the new expression.
2814   /// Subclasses may override this routine to provide different behavior.
2815   ExprResult RebuildCXXScalarValueInitExpr(TypeSourceInfo *TSInfo,
2816                                            SourceLocation LParenLoc,
2817                                            SourceLocation RParenLoc) {
2818     return getSema().BuildCXXTypeConstructExpr(
2819         TSInfo, LParenLoc, None, RParenLoc, /*ListInitialization=*/false);
2820   }
2821 
2822   /// Build a new C++ "new" expression.
2823   ///
2824   /// By default, performs semantic analysis to build the new expression.
2825   /// Subclasses may override this routine to provide different behavior.
2826   ExprResult RebuildCXXNewExpr(SourceLocation StartLoc,
2827                                bool UseGlobal,
2828                                SourceLocation PlacementLParen,
2829                                MultiExprArg PlacementArgs,
2830                                SourceLocation PlacementRParen,
2831                                SourceRange TypeIdParens,
2832                                QualType AllocatedType,
2833                                TypeSourceInfo *AllocatedTypeInfo,
2834                                Optional<Expr *> ArraySize,
2835                                SourceRange DirectInitRange,
2836                                Expr *Initializer) {
2837     return getSema().BuildCXXNew(StartLoc, UseGlobal,
2838                                  PlacementLParen,
2839                                  PlacementArgs,
2840                                  PlacementRParen,
2841                                  TypeIdParens,
2842                                  AllocatedType,
2843                                  AllocatedTypeInfo,
2844                                  ArraySize,
2845                                  DirectInitRange,
2846                                  Initializer);
2847   }
2848 
2849   /// Build a new C++ "delete" expression.
2850   ///
2851   /// By default, performs semantic analysis to build the new expression.
2852   /// Subclasses may override this routine to provide different behavior.
2853   ExprResult RebuildCXXDeleteExpr(SourceLocation StartLoc,
2854                                         bool IsGlobalDelete,
2855                                         bool IsArrayForm,
2856                                         Expr *Operand) {
2857     return getSema().ActOnCXXDelete(StartLoc, IsGlobalDelete, IsArrayForm,
2858                                     Operand);
2859   }
2860 
2861   /// Build a new type trait expression.
2862   ///
2863   /// By default, performs semantic analysis to build the new expression.
2864   /// Subclasses may override this routine to provide different behavior.
2865   ExprResult RebuildTypeTrait(TypeTrait Trait,
2866                               SourceLocation StartLoc,
2867                               ArrayRef<TypeSourceInfo *> Args,
2868                               SourceLocation RParenLoc) {
2869     return getSema().BuildTypeTrait(Trait, StartLoc, Args, RParenLoc);
2870   }
2871 
2872   /// Build a new array type trait expression.
2873   ///
2874   /// By default, performs semantic analysis to build the new expression.
2875   /// Subclasses may override this routine to provide different behavior.
2876   ExprResult RebuildArrayTypeTrait(ArrayTypeTrait Trait,
2877                                    SourceLocation StartLoc,
2878                                    TypeSourceInfo *TSInfo,
2879                                    Expr *DimExpr,
2880                                    SourceLocation RParenLoc) {
2881     return getSema().BuildArrayTypeTrait(Trait, StartLoc, TSInfo, DimExpr, RParenLoc);
2882   }
2883 
2884   /// Build a new expression trait expression.
2885   ///
2886   /// By default, performs semantic analysis to build the new expression.
2887   /// Subclasses may override this routine to provide different behavior.
2888   ExprResult RebuildExpressionTrait(ExpressionTrait Trait,
2889                                    SourceLocation StartLoc,
2890                                    Expr *Queried,
2891                                    SourceLocation RParenLoc) {
2892     return getSema().BuildExpressionTrait(Trait, StartLoc, Queried, RParenLoc);
2893   }
2894 
2895   /// Build a new (previously unresolved) declaration reference
2896   /// expression.
2897   ///
2898   /// By default, performs semantic analysis to build the new expression.
2899   /// Subclasses may override this routine to provide different behavior.
2900   ExprResult RebuildDependentScopeDeclRefExpr(
2901                                           NestedNameSpecifierLoc QualifierLoc,
2902                                           SourceLocation TemplateKWLoc,
2903                                        const DeclarationNameInfo &NameInfo,
2904                               const TemplateArgumentListInfo *TemplateArgs,
2905                                           bool IsAddressOfOperand,
2906                                           TypeSourceInfo **RecoveryTSI) {
2907     CXXScopeSpec SS;
2908     SS.Adopt(QualifierLoc);
2909 
2910     if (TemplateArgs || TemplateKWLoc.isValid())
2911       return getSema().BuildQualifiedTemplateIdExpr(SS, TemplateKWLoc, NameInfo,
2912                                                     TemplateArgs);
2913 
2914     return getSema().BuildQualifiedDeclarationNameExpr(
2915         SS, NameInfo, IsAddressOfOperand, /*S*/nullptr, RecoveryTSI);
2916   }
2917 
2918   /// Build a new template-id expression.
2919   ///
2920   /// By default, performs semantic analysis to build the new expression.
2921   /// Subclasses may override this routine to provide different behavior.
2922   ExprResult RebuildTemplateIdExpr(const CXXScopeSpec &SS,
2923                                    SourceLocation TemplateKWLoc,
2924                                    LookupResult &R,
2925                                    bool RequiresADL,
2926                               const TemplateArgumentListInfo *TemplateArgs) {
2927     return getSema().BuildTemplateIdExpr(SS, TemplateKWLoc, R, RequiresADL,
2928                                          TemplateArgs);
2929   }
2930 
2931   /// Build a new object-construction expression.
2932   ///
2933   /// By default, performs semantic analysis to build the new expression.
2934   /// Subclasses may override this routine to provide different behavior.
2935   ExprResult RebuildCXXConstructExpr(QualType T,
2936                                      SourceLocation Loc,
2937                                      CXXConstructorDecl *Constructor,
2938                                      bool IsElidable,
2939                                      MultiExprArg Args,
2940                                      bool HadMultipleCandidates,
2941                                      bool ListInitialization,
2942                                      bool StdInitListInitialization,
2943                                      bool RequiresZeroInit,
2944                              CXXConstructExpr::ConstructionKind ConstructKind,
2945                                      SourceRange ParenRange) {
2946     SmallVector<Expr*, 8> ConvertedArgs;
2947     if (getSema().CompleteConstructorCall(Constructor, Args, Loc,
2948                                           ConvertedArgs))
2949       return ExprError();
2950 
2951     return getSema().BuildCXXConstructExpr(Loc, T, Constructor,
2952                                            IsElidable,
2953                                            ConvertedArgs,
2954                                            HadMultipleCandidates,
2955                                            ListInitialization,
2956                                            StdInitListInitialization,
2957                                            RequiresZeroInit, ConstructKind,
2958                                            ParenRange);
2959   }
2960 
2961   /// Build a new implicit construction via inherited constructor
2962   /// expression.
2963   ExprResult RebuildCXXInheritedCtorInitExpr(QualType T, SourceLocation Loc,
2964                                              CXXConstructorDecl *Constructor,
2965                                              bool ConstructsVBase,
2966                                              bool InheritedFromVBase) {
2967     return new (getSema().Context) CXXInheritedCtorInitExpr(
2968         Loc, T, Constructor, ConstructsVBase, InheritedFromVBase);
2969   }
2970 
2971   /// Build a new object-construction expression.
2972   ///
2973   /// By default, performs semantic analysis to build the new expression.
2974   /// Subclasses may override this routine to provide different behavior.
2975   ExprResult RebuildCXXTemporaryObjectExpr(TypeSourceInfo *TSInfo,
2976                                            SourceLocation LParenOrBraceLoc,
2977                                            MultiExprArg Args,
2978                                            SourceLocation RParenOrBraceLoc,
2979                                            bool ListInitialization) {
2980     return getSema().BuildCXXTypeConstructExpr(
2981         TSInfo, LParenOrBraceLoc, Args, RParenOrBraceLoc, ListInitialization);
2982   }
2983 
2984   /// Build a new object-construction expression.
2985   ///
2986   /// By default, performs semantic analysis to build the new expression.
2987   /// Subclasses may override this routine to provide different behavior.
2988   ExprResult RebuildCXXUnresolvedConstructExpr(TypeSourceInfo *TSInfo,
2989                                                SourceLocation LParenLoc,
2990                                                MultiExprArg Args,
2991                                                SourceLocation RParenLoc,
2992                                                bool ListInitialization) {
2993     return getSema().BuildCXXTypeConstructExpr(TSInfo, LParenLoc, Args,
2994                                                RParenLoc, ListInitialization);
2995   }
2996 
2997   /// Build a new member reference expression.
2998   ///
2999   /// By default, performs semantic analysis to build the new expression.
3000   /// Subclasses may override this routine to provide different behavior.
3001   ExprResult RebuildCXXDependentScopeMemberExpr(Expr *BaseE,
3002                                                 QualType BaseType,
3003                                                 bool IsArrow,
3004                                                 SourceLocation OperatorLoc,
3005                                           NestedNameSpecifierLoc QualifierLoc,
3006                                                 SourceLocation TemplateKWLoc,
3007                                             NamedDecl *FirstQualifierInScope,
3008                                    const DeclarationNameInfo &MemberNameInfo,
3009                               const TemplateArgumentListInfo *TemplateArgs) {
3010     CXXScopeSpec SS;
3011     SS.Adopt(QualifierLoc);
3012 
3013     return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType,
3014                                             OperatorLoc, IsArrow,
3015                                             SS, TemplateKWLoc,
3016                                             FirstQualifierInScope,
3017                                             MemberNameInfo,
3018                                             TemplateArgs, /*S*/nullptr);
3019   }
3020 
3021   /// Build a new member reference expression.
3022   ///
3023   /// By default, performs semantic analysis to build the new expression.
3024   /// Subclasses may override this routine to provide different behavior.
3025   ExprResult RebuildUnresolvedMemberExpr(Expr *BaseE, QualType BaseType,
3026                                          SourceLocation OperatorLoc,
3027                                          bool IsArrow,
3028                                          NestedNameSpecifierLoc QualifierLoc,
3029                                          SourceLocation TemplateKWLoc,
3030                                          NamedDecl *FirstQualifierInScope,
3031                                          LookupResult &R,
3032                                 const TemplateArgumentListInfo *TemplateArgs) {
3033     CXXScopeSpec SS;
3034     SS.Adopt(QualifierLoc);
3035 
3036     return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType,
3037                                             OperatorLoc, IsArrow,
3038                                             SS, TemplateKWLoc,
3039                                             FirstQualifierInScope,
3040                                             R, TemplateArgs, /*S*/nullptr);
3041   }
3042 
3043   /// Build a new noexcept expression.
3044   ///
3045   /// By default, performs semantic analysis to build the new expression.
3046   /// Subclasses may override this routine to provide different behavior.
3047   ExprResult RebuildCXXNoexceptExpr(SourceRange Range, Expr *Arg) {
3048     return SemaRef.BuildCXXNoexceptExpr(Range.getBegin(), Arg, Range.getEnd());
3049   }
3050 
3051   /// Build a new expression to compute the length of a parameter pack.
3052   ExprResult RebuildSizeOfPackExpr(SourceLocation OperatorLoc,
3053                                    NamedDecl *Pack,
3054                                    SourceLocation PackLoc,
3055                                    SourceLocation RParenLoc,
3056                                    Optional<unsigned> Length,
3057                                    ArrayRef<TemplateArgument> PartialArgs) {
3058     return SizeOfPackExpr::Create(SemaRef.Context, OperatorLoc, Pack, PackLoc,
3059                                   RParenLoc, Length, PartialArgs);
3060   }
3061 
3062   /// Build a new expression representing a call to a source location
3063   ///  builtin.
3064   ///
3065   /// By default, performs semantic analysis to build the new expression.
3066   /// Subclasses may override this routine to provide different behavior.
3067   ExprResult RebuildSourceLocExpr(SourceLocExpr::IdentKind Kind,
3068                                   SourceLocation BuiltinLoc,
3069                                   SourceLocation RPLoc,
3070                                   DeclContext *ParentContext) {
3071     return getSema().BuildSourceLocExpr(Kind, BuiltinLoc, RPLoc, ParentContext);
3072   }
3073 
3074   /// Build a new Objective-C boxed expression.
3075   ///
3076   /// By default, performs semantic analysis to build the new expression.
3077   /// Subclasses may override this routine to provide different behavior.
3078   ExprResult RebuildConceptSpecializationExpr(NestedNameSpecifierLoc NNS,
3079       SourceLocation TemplateKWLoc, DeclarationNameInfo ConceptNameInfo,
3080       NamedDecl *FoundDecl, ConceptDecl *NamedConcept,
3081       TemplateArgumentListInfo *TALI) {
3082     CXXScopeSpec SS;
3083     SS.Adopt(NNS);
3084     ExprResult Result = getSema().CheckConceptTemplateId(SS, TemplateKWLoc,
3085                                                          ConceptNameInfo,
3086                                                          FoundDecl,
3087                                                          NamedConcept, TALI);
3088     if (Result.isInvalid())
3089       return ExprError();
3090     return Result;
3091   }
3092 
3093   /// \brief Build a new requires expression.
3094   ///
3095   /// By default, performs semantic analysis to build the new expression.
3096   /// Subclasses may override this routine to provide different behavior.
3097   ExprResult RebuildRequiresExpr(SourceLocation RequiresKWLoc,
3098                                  RequiresExprBodyDecl *Body,
3099                                  ArrayRef<ParmVarDecl *> LocalParameters,
3100                                  ArrayRef<concepts::Requirement *> Requirements,
3101                                  SourceLocation ClosingBraceLoc) {
3102     return RequiresExpr::Create(SemaRef.Context, RequiresKWLoc, Body,
3103                                 LocalParameters, Requirements, ClosingBraceLoc);
3104   }
3105 
3106   concepts::TypeRequirement *
3107   RebuildTypeRequirement(
3108       concepts::Requirement::SubstitutionDiagnostic *SubstDiag) {
3109     return SemaRef.BuildTypeRequirement(SubstDiag);
3110   }
3111 
3112   concepts::TypeRequirement *RebuildTypeRequirement(TypeSourceInfo *T) {
3113     return SemaRef.BuildTypeRequirement(T);
3114   }
3115 
3116   concepts::ExprRequirement *
3117   RebuildExprRequirement(
3118       concepts::Requirement::SubstitutionDiagnostic *SubstDiag, bool IsSimple,
3119       SourceLocation NoexceptLoc,
3120       concepts::ExprRequirement::ReturnTypeRequirement Ret) {
3121     return SemaRef.BuildExprRequirement(SubstDiag, IsSimple, NoexceptLoc,
3122                                         std::move(Ret));
3123   }
3124 
3125   concepts::ExprRequirement *
3126   RebuildExprRequirement(Expr *E, bool IsSimple, SourceLocation NoexceptLoc,
3127                          concepts::ExprRequirement::ReturnTypeRequirement Ret) {
3128     return SemaRef.BuildExprRequirement(E, IsSimple, NoexceptLoc,
3129                                         std::move(Ret));
3130   }
3131 
3132   concepts::NestedRequirement *
3133   RebuildNestedRequirement(
3134       concepts::Requirement::SubstitutionDiagnostic *SubstDiag) {
3135     return SemaRef.BuildNestedRequirement(SubstDiag);
3136   }
3137 
3138   concepts::NestedRequirement *RebuildNestedRequirement(Expr *Constraint) {
3139     return SemaRef.BuildNestedRequirement(Constraint);
3140   }
3141 
3142   /// \brief Build a new Objective-C boxed expression.
3143   ///
3144   /// By default, performs semantic analysis to build the new expression.
3145   /// Subclasses may override this routine to provide different behavior.
3146   ExprResult RebuildObjCBoxedExpr(SourceRange SR, Expr *ValueExpr) {
3147     return getSema().BuildObjCBoxedExpr(SR, ValueExpr);
3148   }
3149 
3150   /// Build a new Objective-C array literal.
3151   ///
3152   /// By default, performs semantic analysis to build the new expression.
3153   /// Subclasses may override this routine to provide different behavior.
3154   ExprResult RebuildObjCArrayLiteral(SourceRange Range,
3155                                      Expr **Elements, unsigned NumElements) {
3156     return getSema().BuildObjCArrayLiteral(Range,
3157                                            MultiExprArg(Elements, NumElements));
3158   }
3159 
3160   ExprResult RebuildObjCSubscriptRefExpr(SourceLocation RB,
3161                                          Expr *Base, Expr *Key,
3162                                          ObjCMethodDecl *getterMethod,
3163                                          ObjCMethodDecl *setterMethod) {
3164     return  getSema().BuildObjCSubscriptExpression(RB, Base, Key,
3165                                                    getterMethod, setterMethod);
3166   }
3167 
3168   /// Build a new Objective-C dictionary literal.
3169   ///
3170   /// By default, performs semantic analysis to build the new expression.
3171   /// Subclasses may override this routine to provide different behavior.
3172   ExprResult RebuildObjCDictionaryLiteral(SourceRange Range,
3173                               MutableArrayRef<ObjCDictionaryElement> Elements) {
3174     return getSema().BuildObjCDictionaryLiteral(Range, Elements);
3175   }
3176 
3177   /// Build a new Objective-C \@encode expression.
3178   ///
3179   /// By default, performs semantic analysis to build the new expression.
3180   /// Subclasses may override this routine to provide different behavior.
3181   ExprResult RebuildObjCEncodeExpr(SourceLocation AtLoc,
3182                                          TypeSourceInfo *EncodeTypeInfo,
3183                                          SourceLocation RParenLoc) {
3184     return SemaRef.BuildObjCEncodeExpression(AtLoc, EncodeTypeInfo, RParenLoc);
3185   }
3186 
3187   /// Build a new Objective-C class message.
3188   ExprResult RebuildObjCMessageExpr(TypeSourceInfo *ReceiverTypeInfo,
3189                                           Selector Sel,
3190                                           ArrayRef<SourceLocation> SelectorLocs,
3191                                           ObjCMethodDecl *Method,
3192                                           SourceLocation LBracLoc,
3193                                           MultiExprArg Args,
3194                                           SourceLocation RBracLoc) {
3195     return SemaRef.BuildClassMessage(ReceiverTypeInfo,
3196                                      ReceiverTypeInfo->getType(),
3197                                      /*SuperLoc=*/SourceLocation(),
3198                                      Sel, Method, LBracLoc, SelectorLocs,
3199                                      RBracLoc, Args);
3200   }
3201 
3202   /// Build a new Objective-C instance message.
3203   ExprResult RebuildObjCMessageExpr(Expr *Receiver,
3204                                           Selector Sel,
3205                                           ArrayRef<SourceLocation> SelectorLocs,
3206                                           ObjCMethodDecl *Method,
3207                                           SourceLocation LBracLoc,
3208                                           MultiExprArg Args,
3209                                           SourceLocation RBracLoc) {
3210     return SemaRef.BuildInstanceMessage(Receiver,
3211                                         Receiver->getType(),
3212                                         /*SuperLoc=*/SourceLocation(),
3213                                         Sel, Method, LBracLoc, SelectorLocs,
3214                                         RBracLoc, Args);
3215   }
3216 
3217   /// Build a new Objective-C instance/class message to 'super'.
3218   ExprResult RebuildObjCMessageExpr(SourceLocation SuperLoc,
3219                                     Selector Sel,
3220                                     ArrayRef<SourceLocation> SelectorLocs,
3221                                     QualType SuperType,
3222                                     ObjCMethodDecl *Method,
3223                                     SourceLocation LBracLoc,
3224                                     MultiExprArg Args,
3225                                     SourceLocation RBracLoc) {
3226     return Method->isInstanceMethod() ? SemaRef.BuildInstanceMessage(nullptr,
3227                                           SuperType,
3228                                           SuperLoc,
3229                                           Sel, Method, LBracLoc, SelectorLocs,
3230                                           RBracLoc, Args)
3231                                       : SemaRef.BuildClassMessage(nullptr,
3232                                           SuperType,
3233                                           SuperLoc,
3234                                           Sel, Method, LBracLoc, SelectorLocs,
3235                                           RBracLoc, Args);
3236 
3237 
3238   }
3239 
3240   /// Build a new Objective-C ivar reference expression.
3241   ///
3242   /// By default, performs semantic analysis to build the new expression.
3243   /// Subclasses may override this routine to provide different behavior.
3244   ExprResult RebuildObjCIvarRefExpr(Expr *BaseArg, ObjCIvarDecl *Ivar,
3245                                           SourceLocation IvarLoc,
3246                                           bool IsArrow, bool IsFreeIvar) {
3247     CXXScopeSpec SS;
3248     DeclarationNameInfo NameInfo(Ivar->getDeclName(), IvarLoc);
3249     ExprResult Result = getSema().BuildMemberReferenceExpr(
3250         BaseArg, BaseArg->getType(),
3251         /*FIXME:*/ IvarLoc, IsArrow, SS, SourceLocation(),
3252         /*FirstQualifierInScope=*/nullptr, NameInfo,
3253         /*TemplateArgs=*/nullptr,
3254         /*S=*/nullptr);
3255     if (IsFreeIvar && Result.isUsable())
3256       cast<ObjCIvarRefExpr>(Result.get())->setIsFreeIvar(IsFreeIvar);
3257     return Result;
3258   }
3259 
3260   /// Build a new Objective-C property reference expression.
3261   ///
3262   /// By default, performs semantic analysis to build the new expression.
3263   /// Subclasses may override this routine to provide different behavior.
3264   ExprResult RebuildObjCPropertyRefExpr(Expr *BaseArg,
3265                                         ObjCPropertyDecl *Property,
3266                                         SourceLocation PropertyLoc) {
3267     CXXScopeSpec SS;
3268     DeclarationNameInfo NameInfo(Property->getDeclName(), PropertyLoc);
3269     return getSema().BuildMemberReferenceExpr(BaseArg, BaseArg->getType(),
3270                                               /*FIXME:*/PropertyLoc,
3271                                               /*IsArrow=*/false,
3272                                               SS, SourceLocation(),
3273                                               /*FirstQualifierInScope=*/nullptr,
3274                                               NameInfo,
3275                                               /*TemplateArgs=*/nullptr,
3276                                               /*S=*/nullptr);
3277   }
3278 
3279   /// Build a new Objective-C property reference expression.
3280   ///
3281   /// By default, performs semantic analysis to build the new expression.
3282   /// Subclasses may override this routine to provide different behavior.
3283   ExprResult RebuildObjCPropertyRefExpr(Expr *Base, QualType T,
3284                                         ObjCMethodDecl *Getter,
3285                                         ObjCMethodDecl *Setter,
3286                                         SourceLocation PropertyLoc) {
3287     // Since these expressions can only be value-dependent, we do not
3288     // need to perform semantic analysis again.
3289     return Owned(
3290       new (getSema().Context) ObjCPropertyRefExpr(Getter, Setter, T,
3291                                                   VK_LValue, OK_ObjCProperty,
3292                                                   PropertyLoc, Base));
3293   }
3294 
3295   /// Build a new Objective-C "isa" expression.
3296   ///
3297   /// By default, performs semantic analysis to build the new expression.
3298   /// Subclasses may override this routine to provide different behavior.
3299   ExprResult RebuildObjCIsaExpr(Expr *BaseArg, SourceLocation IsaLoc,
3300                                 SourceLocation OpLoc, bool IsArrow) {
3301     CXXScopeSpec SS;
3302     DeclarationNameInfo NameInfo(&getSema().Context.Idents.get("isa"), IsaLoc);
3303     return getSema().BuildMemberReferenceExpr(BaseArg, BaseArg->getType(),
3304                                               OpLoc, IsArrow,
3305                                               SS, SourceLocation(),
3306                                               /*FirstQualifierInScope=*/nullptr,
3307                                               NameInfo,
3308                                               /*TemplateArgs=*/nullptr,
3309                                               /*S=*/nullptr);
3310   }
3311 
3312   /// Build a new shuffle vector expression.
3313   ///
3314   /// By default, performs semantic analysis to build the new expression.
3315   /// Subclasses may override this routine to provide different behavior.
3316   ExprResult RebuildShuffleVectorExpr(SourceLocation BuiltinLoc,
3317                                       MultiExprArg SubExprs,
3318                                       SourceLocation RParenLoc) {
3319     // Find the declaration for __builtin_shufflevector
3320     const IdentifierInfo &Name
3321       = SemaRef.Context.Idents.get("__builtin_shufflevector");
3322     TranslationUnitDecl *TUDecl = SemaRef.Context.getTranslationUnitDecl();
3323     DeclContext::lookup_result Lookup = TUDecl->lookup(DeclarationName(&Name));
3324     assert(!Lookup.empty() && "No __builtin_shufflevector?");
3325 
3326     // Build a reference to the __builtin_shufflevector builtin
3327     FunctionDecl *Builtin = cast<FunctionDecl>(Lookup.front());
3328     Expr *Callee = new (SemaRef.Context)
3329         DeclRefExpr(SemaRef.Context, Builtin, false,
3330                     SemaRef.Context.BuiltinFnTy, VK_RValue, BuiltinLoc);
3331     QualType CalleePtrTy = SemaRef.Context.getPointerType(Builtin->getType());
3332     Callee = SemaRef.ImpCastExprToType(Callee, CalleePtrTy,
3333                                        CK_BuiltinFnToFnPtr).get();
3334 
3335     // Build the CallExpr
3336     ExprResult TheCall = CallExpr::Create(
3337         SemaRef.Context, Callee, SubExprs, Builtin->getCallResultType(),
3338         Expr::getValueKindForType(Builtin->getReturnType()), RParenLoc);
3339 
3340     // Type-check the __builtin_shufflevector expression.
3341     return SemaRef.SemaBuiltinShuffleVector(cast<CallExpr>(TheCall.get()));
3342   }
3343 
3344   /// Build a new convert vector expression.
3345   ExprResult RebuildConvertVectorExpr(SourceLocation BuiltinLoc,
3346                                       Expr *SrcExpr, TypeSourceInfo *DstTInfo,
3347                                       SourceLocation RParenLoc) {
3348     return SemaRef.SemaConvertVectorExpr(SrcExpr, DstTInfo,
3349                                          BuiltinLoc, RParenLoc);
3350   }
3351 
3352   /// Build a new template argument pack expansion.
3353   ///
3354   /// By default, performs semantic analysis to build a new pack expansion
3355   /// for a template argument. Subclasses may override this routine to provide
3356   /// different behavior.
3357   TemplateArgumentLoc RebuildPackExpansion(TemplateArgumentLoc Pattern,
3358                                            SourceLocation EllipsisLoc,
3359                                            Optional<unsigned> NumExpansions) {
3360     switch (Pattern.getArgument().getKind()) {
3361     case TemplateArgument::Expression: {
3362       ExprResult Result
3363         = getSema().CheckPackExpansion(Pattern.getSourceExpression(),
3364                                        EllipsisLoc, NumExpansions);
3365       if (Result.isInvalid())
3366         return TemplateArgumentLoc();
3367 
3368       return TemplateArgumentLoc(Result.get(), Result.get());
3369     }
3370 
3371     case TemplateArgument::Template:
3372       return TemplateArgumentLoc(TemplateArgument(
3373                                           Pattern.getArgument().getAsTemplate(),
3374                                                   NumExpansions),
3375                                  Pattern.getTemplateQualifierLoc(),
3376                                  Pattern.getTemplateNameLoc(),
3377                                  EllipsisLoc);
3378 
3379     case TemplateArgument::Null:
3380     case TemplateArgument::Integral:
3381     case TemplateArgument::Declaration:
3382     case TemplateArgument::Pack:
3383     case TemplateArgument::TemplateExpansion:
3384     case TemplateArgument::NullPtr:
3385       llvm_unreachable("Pack expansion pattern has no parameter packs");
3386 
3387     case TemplateArgument::Type:
3388       if (TypeSourceInfo *Expansion
3389             = getSema().CheckPackExpansion(Pattern.getTypeSourceInfo(),
3390                                            EllipsisLoc,
3391                                            NumExpansions))
3392         return TemplateArgumentLoc(TemplateArgument(Expansion->getType()),
3393                                    Expansion);
3394       break;
3395     }
3396 
3397     return TemplateArgumentLoc();
3398   }
3399 
3400   /// Build a new expression pack expansion.
3401   ///
3402   /// By default, performs semantic analysis to build a new pack expansion
3403   /// for an expression. Subclasses may override this routine to provide
3404   /// different behavior.
3405   ExprResult RebuildPackExpansion(Expr *Pattern, SourceLocation EllipsisLoc,
3406                                   Optional<unsigned> NumExpansions) {
3407     return getSema().CheckPackExpansion(Pattern, EllipsisLoc, NumExpansions);
3408   }
3409 
3410   /// Build a new C++1z fold-expression.
3411   ///
3412   /// By default, performs semantic analysis in order to build a new fold
3413   /// expression.
3414   ExprResult RebuildCXXFoldExpr(SourceLocation LParenLoc, Expr *LHS,
3415                                 BinaryOperatorKind Operator,
3416                                 SourceLocation EllipsisLoc, Expr *RHS,
3417                                 SourceLocation RParenLoc,
3418                                 Optional<unsigned> NumExpansions) {
3419     return getSema().BuildCXXFoldExpr(LParenLoc, LHS, Operator, EllipsisLoc,
3420                                       RHS, RParenLoc, NumExpansions);
3421   }
3422 
3423   /// Build an empty C++1z fold-expression with the given operator.
3424   ///
3425   /// By default, produces the fallback value for the fold-expression, or
3426   /// produce an error if there is no fallback value.
3427   ExprResult RebuildEmptyCXXFoldExpr(SourceLocation EllipsisLoc,
3428                                      BinaryOperatorKind Operator) {
3429     return getSema().BuildEmptyCXXFoldExpr(EllipsisLoc, Operator);
3430   }
3431 
3432   /// Build a new atomic operation expression.
3433   ///
3434   /// By default, performs semantic analysis to build the new expression.
3435   /// Subclasses may override this routine to provide different behavior.
3436   ExprResult RebuildAtomicExpr(SourceLocation BuiltinLoc, MultiExprArg SubExprs,
3437                                AtomicExpr::AtomicOp Op,
3438                                SourceLocation RParenLoc) {
3439     // Use this for all of the locations, since we don't know the difference
3440     // between the call and the expr at this point.
3441     SourceRange Range{BuiltinLoc, RParenLoc};
3442     return getSema().BuildAtomicExpr(Range, Range, RParenLoc, SubExprs, Op,
3443                                      Sema::AtomicArgumentOrder::AST);
3444   }
3445 
3446 private:
3447   TypeLoc TransformTypeInObjectScope(TypeLoc TL,
3448                                      QualType ObjectType,
3449                                      NamedDecl *FirstQualifierInScope,
3450                                      CXXScopeSpec &SS);
3451 
3452   TypeSourceInfo *TransformTypeInObjectScope(TypeSourceInfo *TSInfo,
3453                                              QualType ObjectType,
3454                                              NamedDecl *FirstQualifierInScope,
3455                                              CXXScopeSpec &SS);
3456 
3457   TypeSourceInfo *TransformTSIInObjectScope(TypeLoc TL, QualType ObjectType,
3458                                             NamedDecl *FirstQualifierInScope,
3459                                             CXXScopeSpec &SS);
3460 
3461   QualType TransformDependentNameType(TypeLocBuilder &TLB,
3462                                       DependentNameTypeLoc TL,
3463                                       bool DeducibleTSTContext);
3464 };
3465 
3466 template <typename Derived>
3467 StmtResult TreeTransform<Derived>::TransformStmt(Stmt *S, StmtDiscardKind SDK) {
3468   if (!S)
3469     return S;
3470 
3471   switch (S->getStmtClass()) {
3472   case Stmt::NoStmtClass: break;
3473 
3474   // Transform individual statement nodes
3475   // Pass SDK into statements that can produce a value
3476 #define STMT(Node, Parent)                                              \
3477   case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(S));
3478 #define VALUESTMT(Node, Parent)                                         \
3479   case Stmt::Node##Class:                                               \
3480     return getDerived().Transform##Node(cast<Node>(S), SDK);
3481 #define ABSTRACT_STMT(Node)
3482 #define EXPR(Node, Parent)
3483 #include "clang/AST/StmtNodes.inc"
3484 
3485   // Transform expressions by calling TransformExpr.
3486 #define STMT(Node, Parent)
3487 #define ABSTRACT_STMT(Stmt)
3488 #define EXPR(Node, Parent) case Stmt::Node##Class:
3489 #include "clang/AST/StmtNodes.inc"
3490     {
3491       ExprResult E = getDerived().TransformExpr(cast<Expr>(S));
3492 
3493       if (SDK == SDK_StmtExprResult)
3494         E = getSema().ActOnStmtExprResult(E);
3495       return getSema().ActOnExprStmt(E, SDK == SDK_Discarded);
3496     }
3497   }
3498 
3499   return S;
3500 }
3501 
3502 template<typename Derived>
3503 OMPClause *TreeTransform<Derived>::TransformOMPClause(OMPClause *S) {
3504   if (!S)
3505     return S;
3506 
3507   switch (S->getClauseKind()) {
3508   default: break;
3509   // Transform individual clause nodes
3510 #define OPENMP_CLAUSE(Name, Class)                                             \
3511   case OMPC_ ## Name :                                                         \
3512     return getDerived().Transform ## Class(cast<Class>(S));
3513 #include "clang/Basic/OpenMPKinds.def"
3514   }
3515 
3516   return S;
3517 }
3518 
3519 
3520 template<typename Derived>
3521 ExprResult TreeTransform<Derived>::TransformExpr(Expr *E) {
3522   if (!E)
3523     return E;
3524 
3525   switch (E->getStmtClass()) {
3526     case Stmt::NoStmtClass: break;
3527 #define STMT(Node, Parent) case Stmt::Node##Class: break;
3528 #define ABSTRACT_STMT(Stmt)
3529 #define EXPR(Node, Parent)                                              \
3530     case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(E));
3531 #include "clang/AST/StmtNodes.inc"
3532   }
3533 
3534   return E;
3535 }
3536 
3537 template<typename Derived>
3538 ExprResult TreeTransform<Derived>::TransformInitializer(Expr *Init,
3539                                                         bool NotCopyInit) {
3540   // Initializers are instantiated like expressions, except that various outer
3541   // layers are stripped.
3542   if (!Init)
3543     return Init;
3544 
3545   if (auto *FE = dyn_cast<FullExpr>(Init))
3546     Init = FE->getSubExpr();
3547 
3548   if (auto *AIL = dyn_cast<ArrayInitLoopExpr>(Init))
3549     Init = AIL->getCommonExpr();
3550 
3551   if (MaterializeTemporaryExpr *MTE = dyn_cast<MaterializeTemporaryExpr>(Init))
3552     Init = MTE->getSubExpr();
3553 
3554   while (CXXBindTemporaryExpr *Binder = dyn_cast<CXXBindTemporaryExpr>(Init))
3555     Init = Binder->getSubExpr();
3556 
3557   if (ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(Init))
3558     Init = ICE->getSubExprAsWritten();
3559 
3560   if (CXXStdInitializerListExpr *ILE =
3561           dyn_cast<CXXStdInitializerListExpr>(Init))
3562     return TransformInitializer(ILE->getSubExpr(), NotCopyInit);
3563 
3564   // If this is copy-initialization, we only need to reconstruct
3565   // InitListExprs. Other forms of copy-initialization will be a no-op if
3566   // the initializer is already the right type.
3567   CXXConstructExpr *Construct = dyn_cast<CXXConstructExpr>(Init);
3568   if (!NotCopyInit && !(Construct && Construct->isListInitialization()))
3569     return getDerived().TransformExpr(Init);
3570 
3571   // Revert value-initialization back to empty parens.
3572   if (CXXScalarValueInitExpr *VIE = dyn_cast<CXXScalarValueInitExpr>(Init)) {
3573     SourceRange Parens = VIE->getSourceRange();
3574     return getDerived().RebuildParenListExpr(Parens.getBegin(), None,
3575                                              Parens.getEnd());
3576   }
3577 
3578   // FIXME: We shouldn't build ImplicitValueInitExprs for direct-initialization.
3579   if (isa<ImplicitValueInitExpr>(Init))
3580     return getDerived().RebuildParenListExpr(SourceLocation(), None,
3581                                              SourceLocation());
3582 
3583   // Revert initialization by constructor back to a parenthesized or braced list
3584   // of expressions. Any other form of initializer can just be reused directly.
3585   if (!Construct || isa<CXXTemporaryObjectExpr>(Construct))
3586     return getDerived().TransformExpr(Init);
3587 
3588   // If the initialization implicitly converted an initializer list to a
3589   // std::initializer_list object, unwrap the std::initializer_list too.
3590   if (Construct && Construct->isStdInitListInitialization())
3591     return TransformInitializer(Construct->getArg(0), NotCopyInit);
3592 
3593   // Enter a list-init context if this was list initialization.
3594   EnterExpressionEvaluationContext Context(
3595       getSema(), EnterExpressionEvaluationContext::InitList,
3596       Construct->isListInitialization());
3597 
3598   SmallVector<Expr*, 8> NewArgs;
3599   bool ArgChanged = false;
3600   if (getDerived().TransformExprs(Construct->getArgs(), Construct->getNumArgs(),
3601                                   /*IsCall*/true, NewArgs, &ArgChanged))
3602     return ExprError();
3603 
3604   // If this was list initialization, revert to syntactic list form.
3605   if (Construct->isListInitialization())
3606     return getDerived().RebuildInitList(Construct->getBeginLoc(), NewArgs,
3607                                         Construct->getEndLoc());
3608 
3609   // Build a ParenListExpr to represent anything else.
3610   SourceRange Parens = Construct->getParenOrBraceRange();
3611   if (Parens.isInvalid()) {
3612     // This was a variable declaration's initialization for which no initializer
3613     // was specified.
3614     assert(NewArgs.empty() &&
3615            "no parens or braces but have direct init with arguments?");
3616     return ExprEmpty();
3617   }
3618   return getDerived().RebuildParenListExpr(Parens.getBegin(), NewArgs,
3619                                            Parens.getEnd());
3620 }
3621 
3622 template<typename Derived>
3623 bool TreeTransform<Derived>::TransformExprs(Expr *const *Inputs,
3624                                             unsigned NumInputs,
3625                                             bool IsCall,
3626                                       SmallVectorImpl<Expr *> &Outputs,
3627                                             bool *ArgChanged) {
3628   for (unsigned I = 0; I != NumInputs; ++I) {
3629     // If requested, drop call arguments that need to be dropped.
3630     if (IsCall && getDerived().DropCallArgument(Inputs[I])) {
3631       if (ArgChanged)
3632         *ArgChanged = true;
3633 
3634       break;
3635     }
3636 
3637     if (PackExpansionExpr *Expansion = dyn_cast<PackExpansionExpr>(Inputs[I])) {
3638       Expr *Pattern = Expansion->getPattern();
3639 
3640       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
3641       getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
3642       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
3643 
3644       // Determine whether the set of unexpanded parameter packs can and should
3645       // be expanded.
3646       bool Expand = true;
3647       bool RetainExpansion = false;
3648       Optional<unsigned> OrigNumExpansions = Expansion->getNumExpansions();
3649       Optional<unsigned> NumExpansions = OrigNumExpansions;
3650       if (getDerived().TryExpandParameterPacks(Expansion->getEllipsisLoc(),
3651                                                Pattern->getSourceRange(),
3652                                                Unexpanded,
3653                                                Expand, RetainExpansion,
3654                                                NumExpansions))
3655         return true;
3656 
3657       if (!Expand) {
3658         // The transform has determined that we should perform a simple
3659         // transformation on the pack expansion, producing another pack
3660         // expansion.
3661         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
3662         ExprResult OutPattern = getDerived().TransformExpr(Pattern);
3663         if (OutPattern.isInvalid())
3664           return true;
3665 
3666         ExprResult Out = getDerived().RebuildPackExpansion(OutPattern.get(),
3667                                                 Expansion->getEllipsisLoc(),
3668                                                            NumExpansions);
3669         if (Out.isInvalid())
3670           return true;
3671 
3672         if (ArgChanged)
3673           *ArgChanged = true;
3674         Outputs.push_back(Out.get());
3675         continue;
3676       }
3677 
3678       // Record right away that the argument was changed.  This needs
3679       // to happen even if the array expands to nothing.
3680       if (ArgChanged) *ArgChanged = true;
3681 
3682       // The transform has determined that we should perform an elementwise
3683       // expansion of the pattern. Do so.
3684       for (unsigned I = 0; I != *NumExpansions; ++I) {
3685         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
3686         ExprResult Out = getDerived().TransformExpr(Pattern);
3687         if (Out.isInvalid())
3688           return true;
3689 
3690         if (Out.get()->containsUnexpandedParameterPack()) {
3691           Out = getDerived().RebuildPackExpansion(
3692               Out.get(), Expansion->getEllipsisLoc(), OrigNumExpansions);
3693           if (Out.isInvalid())
3694             return true;
3695         }
3696 
3697         Outputs.push_back(Out.get());
3698       }
3699 
3700       // If we're supposed to retain a pack expansion, do so by temporarily
3701       // forgetting the partially-substituted parameter pack.
3702       if (RetainExpansion) {
3703         ForgetPartiallySubstitutedPackRAII Forget(getDerived());
3704 
3705         ExprResult Out = getDerived().TransformExpr(Pattern);
3706         if (Out.isInvalid())
3707           return true;
3708 
3709         Out = getDerived().RebuildPackExpansion(
3710             Out.get(), Expansion->getEllipsisLoc(), OrigNumExpansions);
3711         if (Out.isInvalid())
3712           return true;
3713 
3714         Outputs.push_back(Out.get());
3715       }
3716 
3717       continue;
3718     }
3719 
3720     ExprResult Result =
3721       IsCall ? getDerived().TransformInitializer(Inputs[I], /*DirectInit*/false)
3722              : getDerived().TransformExpr(Inputs[I]);
3723     if (Result.isInvalid())
3724       return true;
3725 
3726     if (Result.get() != Inputs[I] && ArgChanged)
3727       *ArgChanged = true;
3728 
3729     Outputs.push_back(Result.get());
3730   }
3731 
3732   return false;
3733 }
3734 
3735 template <typename Derived>
3736 Sema::ConditionResult TreeTransform<Derived>::TransformCondition(
3737     SourceLocation Loc, VarDecl *Var, Expr *Expr, Sema::ConditionKind Kind) {
3738   if (Var) {
3739     VarDecl *ConditionVar = cast_or_null<VarDecl>(
3740         getDerived().TransformDefinition(Var->getLocation(), Var));
3741 
3742     if (!ConditionVar)
3743       return Sema::ConditionError();
3744 
3745     return getSema().ActOnConditionVariable(ConditionVar, Loc, Kind);
3746   }
3747 
3748   if (Expr) {
3749     ExprResult CondExpr = getDerived().TransformExpr(Expr);
3750 
3751     if (CondExpr.isInvalid())
3752       return Sema::ConditionError();
3753 
3754     return getSema().ActOnCondition(nullptr, Loc, CondExpr.get(), Kind);
3755   }
3756 
3757   return Sema::ConditionResult();
3758 }
3759 
3760 template<typename Derived>
3761 NestedNameSpecifierLoc
3762 TreeTransform<Derived>::TransformNestedNameSpecifierLoc(
3763                                                     NestedNameSpecifierLoc NNS,
3764                                                      QualType ObjectType,
3765                                              NamedDecl *FirstQualifierInScope) {
3766   SmallVector<NestedNameSpecifierLoc, 4> Qualifiers;
3767   for (NestedNameSpecifierLoc Qualifier = NNS; Qualifier;
3768        Qualifier = Qualifier.getPrefix())
3769     Qualifiers.push_back(Qualifier);
3770 
3771   CXXScopeSpec SS;
3772   while (!Qualifiers.empty()) {
3773     NestedNameSpecifierLoc Q = Qualifiers.pop_back_val();
3774     NestedNameSpecifier *QNNS = Q.getNestedNameSpecifier();
3775 
3776     switch (QNNS->getKind()) {
3777     case NestedNameSpecifier::Identifier: {
3778       Sema::NestedNameSpecInfo IdInfo(QNNS->getAsIdentifier(),
3779                           Q.getLocalBeginLoc(), Q.getLocalEndLoc(), ObjectType);
3780       if (SemaRef.BuildCXXNestedNameSpecifier(/*Scope=*/nullptr, IdInfo, false,
3781                                               SS, FirstQualifierInScope, false))
3782         return NestedNameSpecifierLoc();
3783     }
3784       break;
3785 
3786     case NestedNameSpecifier::Namespace: {
3787       NamespaceDecl *NS
3788         = cast_or_null<NamespaceDecl>(
3789                                     getDerived().TransformDecl(
3790                                                           Q.getLocalBeginLoc(),
3791                                                        QNNS->getAsNamespace()));
3792       SS.Extend(SemaRef.Context, NS, Q.getLocalBeginLoc(), Q.getLocalEndLoc());
3793       break;
3794     }
3795 
3796     case NestedNameSpecifier::NamespaceAlias: {
3797       NamespaceAliasDecl *Alias
3798         = cast_or_null<NamespaceAliasDecl>(
3799                       getDerived().TransformDecl(Q.getLocalBeginLoc(),
3800                                                  QNNS->getAsNamespaceAlias()));
3801       SS.Extend(SemaRef.Context, Alias, Q.getLocalBeginLoc(),
3802                 Q.getLocalEndLoc());
3803       break;
3804     }
3805 
3806     case NestedNameSpecifier::Global:
3807       // There is no meaningful transformation that one could perform on the
3808       // global scope.
3809       SS.MakeGlobal(SemaRef.Context, Q.getBeginLoc());
3810       break;
3811 
3812     case NestedNameSpecifier::Super: {
3813       CXXRecordDecl *RD =
3814           cast_or_null<CXXRecordDecl>(getDerived().TransformDecl(
3815               SourceLocation(), QNNS->getAsRecordDecl()));
3816       SS.MakeSuper(SemaRef.Context, RD, Q.getBeginLoc(), Q.getEndLoc());
3817       break;
3818     }
3819 
3820     case NestedNameSpecifier::TypeSpecWithTemplate:
3821     case NestedNameSpecifier::TypeSpec: {
3822       TypeLoc TL = TransformTypeInObjectScope(Q.getTypeLoc(), ObjectType,
3823                                               FirstQualifierInScope, SS);
3824 
3825       if (!TL)
3826         return NestedNameSpecifierLoc();
3827 
3828       if (TL.getType()->isDependentType() || TL.getType()->isRecordType() ||
3829           (SemaRef.getLangOpts().CPlusPlus11 &&
3830            TL.getType()->isEnumeralType())) {
3831         assert(!TL.getType().hasLocalQualifiers() &&
3832                "Can't get cv-qualifiers here");
3833         if (TL.getType()->isEnumeralType())
3834           SemaRef.Diag(TL.getBeginLoc(),
3835                        diag::warn_cxx98_compat_enum_nested_name_spec);
3836         SS.Extend(SemaRef.Context, /*FIXME:*/SourceLocation(), TL,
3837                   Q.getLocalEndLoc());
3838         break;
3839       }
3840       // If the nested-name-specifier is an invalid type def, don't emit an
3841       // error because a previous error should have already been emitted.
3842       TypedefTypeLoc TTL = TL.getAs<TypedefTypeLoc>();
3843       if (!TTL || !TTL.getTypedefNameDecl()->isInvalidDecl()) {
3844         SemaRef.Diag(TL.getBeginLoc(), diag::err_nested_name_spec_non_tag)
3845           << TL.getType() << SS.getRange();
3846       }
3847       return NestedNameSpecifierLoc();
3848     }
3849     }
3850 
3851     // The qualifier-in-scope and object type only apply to the leftmost entity.
3852     FirstQualifierInScope = nullptr;
3853     ObjectType = QualType();
3854   }
3855 
3856   // Don't rebuild the nested-name-specifier if we don't have to.
3857   if (SS.getScopeRep() == NNS.getNestedNameSpecifier() &&
3858       !getDerived().AlwaysRebuild())
3859     return NNS;
3860 
3861   // If we can re-use the source-location data from the original
3862   // nested-name-specifier, do so.
3863   if (SS.location_size() == NNS.getDataLength() &&
3864       memcmp(SS.location_data(), NNS.getOpaqueData(), SS.location_size()) == 0)
3865     return NestedNameSpecifierLoc(SS.getScopeRep(), NNS.getOpaqueData());
3866 
3867   // Allocate new nested-name-specifier location information.
3868   return SS.getWithLocInContext(SemaRef.Context);
3869 }
3870 
3871 template<typename Derived>
3872 DeclarationNameInfo
3873 TreeTransform<Derived>
3874 ::TransformDeclarationNameInfo(const DeclarationNameInfo &NameInfo) {
3875   DeclarationName Name = NameInfo.getName();
3876   if (!Name)
3877     return DeclarationNameInfo();
3878 
3879   switch (Name.getNameKind()) {
3880   case DeclarationName::Identifier:
3881   case DeclarationName::ObjCZeroArgSelector:
3882   case DeclarationName::ObjCOneArgSelector:
3883   case DeclarationName::ObjCMultiArgSelector:
3884   case DeclarationName::CXXOperatorName:
3885   case DeclarationName::CXXLiteralOperatorName:
3886   case DeclarationName::CXXUsingDirective:
3887     return NameInfo;
3888 
3889   case DeclarationName::CXXDeductionGuideName: {
3890     TemplateDecl *OldTemplate = Name.getCXXDeductionGuideTemplate();
3891     TemplateDecl *NewTemplate = cast_or_null<TemplateDecl>(
3892         getDerived().TransformDecl(NameInfo.getLoc(), OldTemplate));
3893     if (!NewTemplate)
3894       return DeclarationNameInfo();
3895 
3896     DeclarationNameInfo NewNameInfo(NameInfo);
3897     NewNameInfo.setName(
3898         SemaRef.Context.DeclarationNames.getCXXDeductionGuideName(NewTemplate));
3899     return NewNameInfo;
3900   }
3901 
3902   case DeclarationName::CXXConstructorName:
3903   case DeclarationName::CXXDestructorName:
3904   case DeclarationName::CXXConversionFunctionName: {
3905     TypeSourceInfo *NewTInfo;
3906     CanQualType NewCanTy;
3907     if (TypeSourceInfo *OldTInfo = NameInfo.getNamedTypeInfo()) {
3908       NewTInfo = getDerived().TransformType(OldTInfo);
3909       if (!NewTInfo)
3910         return DeclarationNameInfo();
3911       NewCanTy = SemaRef.Context.getCanonicalType(NewTInfo->getType());
3912     }
3913     else {
3914       NewTInfo = nullptr;
3915       TemporaryBase Rebase(*this, NameInfo.getLoc(), Name);
3916       QualType NewT = getDerived().TransformType(Name.getCXXNameType());
3917       if (NewT.isNull())
3918         return DeclarationNameInfo();
3919       NewCanTy = SemaRef.Context.getCanonicalType(NewT);
3920     }
3921 
3922     DeclarationName NewName
3923       = SemaRef.Context.DeclarationNames.getCXXSpecialName(Name.getNameKind(),
3924                                                            NewCanTy);
3925     DeclarationNameInfo NewNameInfo(NameInfo);
3926     NewNameInfo.setName(NewName);
3927     NewNameInfo.setNamedTypeInfo(NewTInfo);
3928     return NewNameInfo;
3929   }
3930   }
3931 
3932   llvm_unreachable("Unknown name kind.");
3933 }
3934 
3935 template<typename Derived>
3936 TemplateName
3937 TreeTransform<Derived>::TransformTemplateName(CXXScopeSpec &SS,
3938                                               TemplateName Name,
3939                                               SourceLocation NameLoc,
3940                                               QualType ObjectType,
3941                                               NamedDecl *FirstQualifierInScope,
3942                                               bool AllowInjectedClassName) {
3943   if (QualifiedTemplateName *QTN = Name.getAsQualifiedTemplateName()) {
3944     TemplateDecl *Template = QTN->getTemplateDecl();
3945     assert(Template && "qualified template name must refer to a template");
3946 
3947     TemplateDecl *TransTemplate
3948       = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc,
3949                                                               Template));
3950     if (!TransTemplate)
3951       return TemplateName();
3952 
3953     if (!getDerived().AlwaysRebuild() &&
3954         SS.getScopeRep() == QTN->getQualifier() &&
3955         TransTemplate == Template)
3956       return Name;
3957 
3958     return getDerived().RebuildTemplateName(SS, QTN->hasTemplateKeyword(),
3959                                             TransTemplate);
3960   }
3961 
3962   if (DependentTemplateName *DTN = Name.getAsDependentTemplateName()) {
3963     if (SS.getScopeRep()) {
3964       // These apply to the scope specifier, not the template.
3965       ObjectType = QualType();
3966       FirstQualifierInScope = nullptr;
3967     }
3968 
3969     if (!getDerived().AlwaysRebuild() &&
3970         SS.getScopeRep() == DTN->getQualifier() &&
3971         ObjectType.isNull())
3972       return Name;
3973 
3974     // FIXME: Preserve the location of the "template" keyword.
3975     SourceLocation TemplateKWLoc = NameLoc;
3976 
3977     if (DTN->isIdentifier()) {
3978       return getDerived().RebuildTemplateName(SS,
3979                                               TemplateKWLoc,
3980                                               *DTN->getIdentifier(),
3981                                               NameLoc,
3982                                               ObjectType,
3983                                               FirstQualifierInScope,
3984                                               AllowInjectedClassName);
3985     }
3986 
3987     return getDerived().RebuildTemplateName(SS, TemplateKWLoc,
3988                                             DTN->getOperator(), NameLoc,
3989                                             ObjectType, AllowInjectedClassName);
3990   }
3991 
3992   if (TemplateDecl *Template = Name.getAsTemplateDecl()) {
3993     TemplateDecl *TransTemplate
3994       = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc,
3995                                                               Template));
3996     if (!TransTemplate)
3997       return TemplateName();
3998 
3999     if (!getDerived().AlwaysRebuild() &&
4000         TransTemplate == Template)
4001       return Name;
4002 
4003     return TemplateName(TransTemplate);
4004   }
4005 
4006   if (SubstTemplateTemplateParmPackStorage *SubstPack
4007       = Name.getAsSubstTemplateTemplateParmPack()) {
4008     TemplateTemplateParmDecl *TransParam
4009     = cast_or_null<TemplateTemplateParmDecl>(
4010             getDerived().TransformDecl(NameLoc, SubstPack->getParameterPack()));
4011     if (!TransParam)
4012       return TemplateName();
4013 
4014     if (!getDerived().AlwaysRebuild() &&
4015         TransParam == SubstPack->getParameterPack())
4016       return Name;
4017 
4018     return getDerived().RebuildTemplateName(TransParam,
4019                                             SubstPack->getArgumentPack());
4020   }
4021 
4022   // These should be getting filtered out before they reach the AST.
4023   llvm_unreachable("overloaded function decl survived to here");
4024 }
4025 
4026 template<typename Derived>
4027 void TreeTransform<Derived>::InventTemplateArgumentLoc(
4028                                          const TemplateArgument &Arg,
4029                                          TemplateArgumentLoc &Output) {
4030   SourceLocation Loc = getDerived().getBaseLocation();
4031   switch (Arg.getKind()) {
4032   case TemplateArgument::Null:
4033     llvm_unreachable("null template argument in TreeTransform");
4034     break;
4035 
4036   case TemplateArgument::Type:
4037     Output = TemplateArgumentLoc(Arg,
4038                SemaRef.Context.getTrivialTypeSourceInfo(Arg.getAsType(), Loc));
4039 
4040     break;
4041 
4042   case TemplateArgument::Template:
4043   case TemplateArgument::TemplateExpansion: {
4044     NestedNameSpecifierLocBuilder Builder;
4045     TemplateName Template = Arg.getAsTemplateOrTemplatePattern();
4046     if (DependentTemplateName *DTN = Template.getAsDependentTemplateName())
4047       Builder.MakeTrivial(SemaRef.Context, DTN->getQualifier(), Loc);
4048     else if (QualifiedTemplateName *QTN = Template.getAsQualifiedTemplateName())
4049       Builder.MakeTrivial(SemaRef.Context, QTN->getQualifier(), Loc);
4050 
4051     if (Arg.getKind() == TemplateArgument::Template)
4052       Output = TemplateArgumentLoc(Arg,
4053                                    Builder.getWithLocInContext(SemaRef.Context),
4054                                    Loc);
4055     else
4056       Output = TemplateArgumentLoc(Arg,
4057                                    Builder.getWithLocInContext(SemaRef.Context),
4058                                    Loc, Loc);
4059 
4060     break;
4061   }
4062 
4063   case TemplateArgument::Expression:
4064     Output = TemplateArgumentLoc(Arg, Arg.getAsExpr());
4065     break;
4066 
4067   case TemplateArgument::Declaration:
4068   case TemplateArgument::Integral:
4069   case TemplateArgument::Pack:
4070   case TemplateArgument::NullPtr:
4071     Output = TemplateArgumentLoc(Arg, TemplateArgumentLocInfo());
4072     break;
4073   }
4074 }
4075 
4076 template<typename Derived>
4077 bool TreeTransform<Derived>::TransformTemplateArgument(
4078                                          const TemplateArgumentLoc &Input,
4079                                          TemplateArgumentLoc &Output, bool Uneval) {
4080   const TemplateArgument &Arg = Input.getArgument();
4081   switch (Arg.getKind()) {
4082   case TemplateArgument::Null:
4083   case TemplateArgument::Integral:
4084   case TemplateArgument::Pack:
4085   case TemplateArgument::Declaration:
4086   case TemplateArgument::NullPtr:
4087     llvm_unreachable("Unexpected TemplateArgument");
4088 
4089   case TemplateArgument::Type: {
4090     TypeSourceInfo *DI = Input.getTypeSourceInfo();
4091     if (!DI)
4092       DI = InventTypeSourceInfo(Input.getArgument().getAsType());
4093 
4094     DI = getDerived().TransformType(DI);
4095     if (!DI) return true;
4096 
4097     Output = TemplateArgumentLoc(TemplateArgument(DI->getType()), DI);
4098     return false;
4099   }
4100 
4101   case TemplateArgument::Template: {
4102     NestedNameSpecifierLoc QualifierLoc = Input.getTemplateQualifierLoc();
4103     if (QualifierLoc) {
4104       QualifierLoc = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc);
4105       if (!QualifierLoc)
4106         return true;
4107     }
4108 
4109     CXXScopeSpec SS;
4110     SS.Adopt(QualifierLoc);
4111     TemplateName Template
4112       = getDerived().TransformTemplateName(SS, Arg.getAsTemplate(),
4113                                            Input.getTemplateNameLoc());
4114     if (Template.isNull())
4115       return true;
4116 
4117     Output = TemplateArgumentLoc(TemplateArgument(Template), QualifierLoc,
4118                                  Input.getTemplateNameLoc());
4119     return false;
4120   }
4121 
4122   case TemplateArgument::TemplateExpansion:
4123     llvm_unreachable("Caller should expand pack expansions");
4124 
4125   case TemplateArgument::Expression: {
4126     // Template argument expressions are constant expressions.
4127     EnterExpressionEvaluationContext Unevaluated(
4128         getSema(),
4129         Uneval ? Sema::ExpressionEvaluationContext::Unevaluated
4130                : Sema::ExpressionEvaluationContext::ConstantEvaluated,
4131         /*LambdaContextDecl=*/nullptr, /*ExprContext=*/
4132         Sema::ExpressionEvaluationContextRecord::EK_TemplateArgument);
4133 
4134     Expr *InputExpr = Input.getSourceExpression();
4135     if (!InputExpr) InputExpr = Input.getArgument().getAsExpr();
4136 
4137     ExprResult E = getDerived().TransformExpr(InputExpr);
4138     E = SemaRef.ActOnConstantExpression(E);
4139     if (E.isInvalid()) return true;
4140     Output = TemplateArgumentLoc(TemplateArgument(E.get()), E.get());
4141     return false;
4142   }
4143   }
4144 
4145   // Work around bogus GCC warning
4146   return true;
4147 }
4148 
4149 /// Iterator adaptor that invents template argument location information
4150 /// for each of the template arguments in its underlying iterator.
4151 template<typename Derived, typename InputIterator>
4152 class TemplateArgumentLocInventIterator {
4153   TreeTransform<Derived> &Self;
4154   InputIterator Iter;
4155 
4156 public:
4157   typedef TemplateArgumentLoc value_type;
4158   typedef TemplateArgumentLoc reference;
4159   typedef typename std::iterator_traits<InputIterator>::difference_type
4160     difference_type;
4161   typedef std::input_iterator_tag iterator_category;
4162 
4163   class pointer {
4164     TemplateArgumentLoc Arg;
4165 
4166   public:
4167     explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { }
4168 
4169     const TemplateArgumentLoc *operator->() const { return &Arg; }
4170   };
4171 
4172   TemplateArgumentLocInventIterator() { }
4173 
4174   explicit TemplateArgumentLocInventIterator(TreeTransform<Derived> &Self,
4175                                              InputIterator Iter)
4176     : Self(Self), Iter(Iter) { }
4177 
4178   TemplateArgumentLocInventIterator &operator++() {
4179     ++Iter;
4180     return *this;
4181   }
4182 
4183   TemplateArgumentLocInventIterator operator++(int) {
4184     TemplateArgumentLocInventIterator Old(*this);
4185     ++(*this);
4186     return Old;
4187   }
4188 
4189   reference operator*() const {
4190     TemplateArgumentLoc Result;
4191     Self.InventTemplateArgumentLoc(*Iter, Result);
4192     return Result;
4193   }
4194 
4195   pointer operator->() const { return pointer(**this); }
4196 
4197   friend bool operator==(const TemplateArgumentLocInventIterator &X,
4198                          const TemplateArgumentLocInventIterator &Y) {
4199     return X.Iter == Y.Iter;
4200   }
4201 
4202   friend bool operator!=(const TemplateArgumentLocInventIterator &X,
4203                          const TemplateArgumentLocInventIterator &Y) {
4204     return X.Iter != Y.Iter;
4205   }
4206 };
4207 
4208 template<typename Derived>
4209 template<typename InputIterator>
4210 bool TreeTransform<Derived>::TransformTemplateArguments(
4211     InputIterator First, InputIterator Last, TemplateArgumentListInfo &Outputs,
4212     bool Uneval) {
4213   for (; First != Last; ++First) {
4214     TemplateArgumentLoc Out;
4215     TemplateArgumentLoc In = *First;
4216 
4217     if (In.getArgument().getKind() == TemplateArgument::Pack) {
4218       // Unpack argument packs, which we translate them into separate
4219       // arguments.
4220       // FIXME: We could do much better if we could guarantee that the
4221       // TemplateArgumentLocInfo for the pack expansion would be usable for
4222       // all of the template arguments in the argument pack.
4223       typedef TemplateArgumentLocInventIterator<Derived,
4224                                                 TemplateArgument::pack_iterator>
4225         PackLocIterator;
4226       if (TransformTemplateArguments(PackLocIterator(*this,
4227                                                  In.getArgument().pack_begin()),
4228                                      PackLocIterator(*this,
4229                                                    In.getArgument().pack_end()),
4230                                      Outputs, Uneval))
4231         return true;
4232 
4233       continue;
4234     }
4235 
4236     if (In.getArgument().isPackExpansion()) {
4237       // We have a pack expansion, for which we will be substituting into
4238       // the pattern.
4239       SourceLocation Ellipsis;
4240       Optional<unsigned> OrigNumExpansions;
4241       TemplateArgumentLoc Pattern
4242         = getSema().getTemplateArgumentPackExpansionPattern(
4243               In, Ellipsis, OrigNumExpansions);
4244 
4245       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
4246       getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
4247       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
4248 
4249       // Determine whether the set of unexpanded parameter packs can and should
4250       // be expanded.
4251       bool Expand = true;
4252       bool RetainExpansion = false;
4253       Optional<unsigned> NumExpansions = OrigNumExpansions;
4254       if (getDerived().TryExpandParameterPacks(Ellipsis,
4255                                                Pattern.getSourceRange(),
4256                                                Unexpanded,
4257                                                Expand,
4258                                                RetainExpansion,
4259                                                NumExpansions))
4260         return true;
4261 
4262       if (!Expand) {
4263         // The transform has determined that we should perform a simple
4264         // transformation on the pack expansion, producing another pack
4265         // expansion.
4266         TemplateArgumentLoc OutPattern;
4267         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
4268         if (getDerived().TransformTemplateArgument(Pattern, OutPattern, Uneval))
4269           return true;
4270 
4271         Out = getDerived().RebuildPackExpansion(OutPattern, Ellipsis,
4272                                                 NumExpansions);
4273         if (Out.getArgument().isNull())
4274           return true;
4275 
4276         Outputs.addArgument(Out);
4277         continue;
4278       }
4279 
4280       // The transform has determined that we should perform an elementwise
4281       // expansion of the pattern. Do so.
4282       for (unsigned I = 0; I != *NumExpansions; ++I) {
4283         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
4284 
4285         if (getDerived().TransformTemplateArgument(Pattern, Out, Uneval))
4286           return true;
4287 
4288         if (Out.getArgument().containsUnexpandedParameterPack()) {
4289           Out = getDerived().RebuildPackExpansion(Out, Ellipsis,
4290                                                   OrigNumExpansions);
4291           if (Out.getArgument().isNull())
4292             return true;
4293         }
4294 
4295         Outputs.addArgument(Out);
4296       }
4297 
4298       // If we're supposed to retain a pack expansion, do so by temporarily
4299       // forgetting the partially-substituted parameter pack.
4300       if (RetainExpansion) {
4301         ForgetPartiallySubstitutedPackRAII Forget(getDerived());
4302 
4303         if (getDerived().TransformTemplateArgument(Pattern, Out, Uneval))
4304           return true;
4305 
4306         Out = getDerived().RebuildPackExpansion(Out, Ellipsis,
4307                                                 OrigNumExpansions);
4308         if (Out.getArgument().isNull())
4309           return true;
4310 
4311         Outputs.addArgument(Out);
4312       }
4313 
4314       continue;
4315     }
4316 
4317     // The simple case:
4318     if (getDerived().TransformTemplateArgument(In, Out, Uneval))
4319       return true;
4320 
4321     Outputs.addArgument(Out);
4322   }
4323 
4324   return false;
4325 
4326 }
4327 
4328 //===----------------------------------------------------------------------===//
4329 // Type transformation
4330 //===----------------------------------------------------------------------===//
4331 
4332 template<typename Derived>
4333 QualType TreeTransform<Derived>::TransformType(QualType T) {
4334   if (getDerived().AlreadyTransformed(T))
4335     return T;
4336 
4337   // Temporary workaround.  All of these transformations should
4338   // eventually turn into transformations on TypeLocs.
4339   TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(T,
4340                                                 getDerived().getBaseLocation());
4341 
4342   TypeSourceInfo *NewDI = getDerived().TransformType(DI);
4343 
4344   if (!NewDI)
4345     return QualType();
4346 
4347   return NewDI->getType();
4348 }
4349 
4350 template<typename Derived>
4351 TypeSourceInfo *TreeTransform<Derived>::TransformType(TypeSourceInfo *DI) {
4352   // Refine the base location to the type's location.
4353   TemporaryBase Rebase(*this, DI->getTypeLoc().getBeginLoc(),
4354                        getDerived().getBaseEntity());
4355   if (getDerived().AlreadyTransformed(DI->getType()))
4356     return DI;
4357 
4358   TypeLocBuilder TLB;
4359 
4360   TypeLoc TL = DI->getTypeLoc();
4361   TLB.reserve(TL.getFullDataSize());
4362 
4363   QualType Result = getDerived().TransformType(TLB, TL);
4364   if (Result.isNull())
4365     return nullptr;
4366 
4367   return TLB.getTypeSourceInfo(SemaRef.Context, Result);
4368 }
4369 
4370 template<typename Derived>
4371 QualType
4372 TreeTransform<Derived>::TransformType(TypeLocBuilder &TLB, TypeLoc T) {
4373   switch (T.getTypeLocClass()) {
4374 #define ABSTRACT_TYPELOC(CLASS, PARENT)
4375 #define TYPELOC(CLASS, PARENT)                                                 \
4376   case TypeLoc::CLASS:                                                         \
4377     return getDerived().Transform##CLASS##Type(TLB,                            \
4378                                                T.castAs<CLASS##TypeLoc>());
4379 #include "clang/AST/TypeLocNodes.def"
4380   }
4381 
4382   llvm_unreachable("unhandled type loc!");
4383 }
4384 
4385 template<typename Derived>
4386 QualType TreeTransform<Derived>::TransformTypeWithDeducedTST(QualType T) {
4387   if (!isa<DependentNameType>(T))
4388     return TransformType(T);
4389 
4390   if (getDerived().AlreadyTransformed(T))
4391     return T;
4392   TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(T,
4393                                                 getDerived().getBaseLocation());
4394   TypeSourceInfo *NewDI = getDerived().TransformTypeWithDeducedTST(DI);
4395   return NewDI ? NewDI->getType() : QualType();
4396 }
4397 
4398 template<typename Derived>
4399 TypeSourceInfo *
4400 TreeTransform<Derived>::TransformTypeWithDeducedTST(TypeSourceInfo *DI) {
4401   if (!isa<DependentNameType>(DI->getType()))
4402     return TransformType(DI);
4403 
4404   // Refine the base location to the type's location.
4405   TemporaryBase Rebase(*this, DI->getTypeLoc().getBeginLoc(),
4406                        getDerived().getBaseEntity());
4407   if (getDerived().AlreadyTransformed(DI->getType()))
4408     return DI;
4409 
4410   TypeLocBuilder TLB;
4411 
4412   TypeLoc TL = DI->getTypeLoc();
4413   TLB.reserve(TL.getFullDataSize());
4414 
4415   auto QTL = TL.getAs<QualifiedTypeLoc>();
4416   if (QTL)
4417     TL = QTL.getUnqualifiedLoc();
4418 
4419   auto DNTL = TL.castAs<DependentNameTypeLoc>();
4420 
4421   QualType Result = getDerived().TransformDependentNameType(
4422       TLB, DNTL, /*DeducedTSTContext*/true);
4423   if (Result.isNull())
4424     return nullptr;
4425 
4426   if (QTL) {
4427     Result = getDerived().RebuildQualifiedType(Result, QTL);
4428     if (Result.isNull())
4429       return nullptr;
4430     TLB.TypeWasModifiedSafely(Result);
4431   }
4432 
4433   return TLB.getTypeSourceInfo(SemaRef.Context, Result);
4434 }
4435 
4436 template<typename Derived>
4437 QualType
4438 TreeTransform<Derived>::TransformQualifiedType(TypeLocBuilder &TLB,
4439                                                QualifiedTypeLoc T) {
4440   QualType Result = getDerived().TransformType(TLB, T.getUnqualifiedLoc());
4441   if (Result.isNull())
4442     return QualType();
4443 
4444   Result = getDerived().RebuildQualifiedType(Result, T);
4445 
4446   if (Result.isNull())
4447     return QualType();
4448 
4449   // RebuildQualifiedType might have updated the type, but not in a way
4450   // that invalidates the TypeLoc. (There's no location information for
4451   // qualifiers.)
4452   TLB.TypeWasModifiedSafely(Result);
4453 
4454   return Result;
4455 }
4456 
4457 template <typename Derived>
4458 QualType TreeTransform<Derived>::RebuildQualifiedType(QualType T,
4459                                                       QualifiedTypeLoc TL) {
4460 
4461   SourceLocation Loc = TL.getBeginLoc();
4462   Qualifiers Quals = TL.getType().getLocalQualifiers();
4463 
4464   if (((T.getAddressSpace() != LangAS::Default &&
4465         Quals.getAddressSpace() != LangAS::Default)) &&
4466       T.getAddressSpace() != Quals.getAddressSpace()) {
4467     SemaRef.Diag(Loc, diag::err_address_space_mismatch_templ_inst)
4468         << TL.getType() << T;
4469     return QualType();
4470   }
4471 
4472   // C++ [dcl.fct]p7:
4473   //   [When] adding cv-qualifications on top of the function type [...] the
4474   //   cv-qualifiers are ignored.
4475   if (T->isFunctionType()) {
4476     T = SemaRef.getASTContext().getAddrSpaceQualType(T,
4477                                                      Quals.getAddressSpace());
4478     return T;
4479   }
4480 
4481   // C++ [dcl.ref]p1:
4482   //   when the cv-qualifiers are introduced through the use of a typedef-name
4483   //   or decltype-specifier [...] the cv-qualifiers are ignored.
4484   // Note that [dcl.ref]p1 lists all cases in which cv-qualifiers can be
4485   // applied to a reference type.
4486   if (T->isReferenceType()) {
4487     // The only qualifier that applies to a reference type is restrict.
4488     if (!Quals.hasRestrict())
4489       return T;
4490     Quals = Qualifiers::fromCVRMask(Qualifiers::Restrict);
4491   }
4492 
4493   // Suppress Objective-C lifetime qualifiers if they don't make sense for the
4494   // resulting type.
4495   if (Quals.hasObjCLifetime()) {
4496     if (!T->isObjCLifetimeType() && !T->isDependentType())
4497       Quals.removeObjCLifetime();
4498     else if (T.getObjCLifetime()) {
4499       // Objective-C ARC:
4500       //   A lifetime qualifier applied to a substituted template parameter
4501       //   overrides the lifetime qualifier from the template argument.
4502       const AutoType *AutoTy;
4503       if (const SubstTemplateTypeParmType *SubstTypeParam
4504                                 = dyn_cast<SubstTemplateTypeParmType>(T)) {
4505         QualType Replacement = SubstTypeParam->getReplacementType();
4506         Qualifiers Qs = Replacement.getQualifiers();
4507         Qs.removeObjCLifetime();
4508         Replacement = SemaRef.Context.getQualifiedType(
4509             Replacement.getUnqualifiedType(), Qs);
4510         T = SemaRef.Context.getSubstTemplateTypeParmType(
4511             SubstTypeParam->getReplacedParameter(), Replacement);
4512       } else if ((AutoTy = dyn_cast<AutoType>(T)) && AutoTy->isDeduced()) {
4513         // 'auto' types behave the same way as template parameters.
4514         QualType Deduced = AutoTy->getDeducedType();
4515         Qualifiers Qs = Deduced.getQualifiers();
4516         Qs.removeObjCLifetime();
4517         Deduced =
4518             SemaRef.Context.getQualifiedType(Deduced.getUnqualifiedType(), Qs);
4519         T = SemaRef.Context.getAutoType(Deduced, AutoTy->getKeyword(),
4520                                         AutoTy->isDependentType(),
4521                                         /*isPack=*/false,
4522                                         AutoTy->getTypeConstraintConcept(),
4523                                         AutoTy->getTypeConstraintArguments());
4524       } else {
4525         // Otherwise, complain about the addition of a qualifier to an
4526         // already-qualified type.
4527         // FIXME: Why is this check not in Sema::BuildQualifiedType?
4528         SemaRef.Diag(Loc, diag::err_attr_objc_ownership_redundant) << T;
4529         Quals.removeObjCLifetime();
4530       }
4531     }
4532   }
4533 
4534   return SemaRef.BuildQualifiedType(T, Loc, Quals);
4535 }
4536 
4537 template<typename Derived>
4538 TypeLoc
4539 TreeTransform<Derived>::TransformTypeInObjectScope(TypeLoc TL,
4540                                                    QualType ObjectType,
4541                                                    NamedDecl *UnqualLookup,
4542                                                    CXXScopeSpec &SS) {
4543   if (getDerived().AlreadyTransformed(TL.getType()))
4544     return TL;
4545 
4546   TypeSourceInfo *TSI =
4547       TransformTSIInObjectScope(TL, ObjectType, UnqualLookup, SS);
4548   if (TSI)
4549     return TSI->getTypeLoc();
4550   return TypeLoc();
4551 }
4552 
4553 template<typename Derived>
4554 TypeSourceInfo *
4555 TreeTransform<Derived>::TransformTypeInObjectScope(TypeSourceInfo *TSInfo,
4556                                                    QualType ObjectType,
4557                                                    NamedDecl *UnqualLookup,
4558                                                    CXXScopeSpec &SS) {
4559   if (getDerived().AlreadyTransformed(TSInfo->getType()))
4560     return TSInfo;
4561 
4562   return TransformTSIInObjectScope(TSInfo->getTypeLoc(), ObjectType,
4563                                    UnqualLookup, SS);
4564 }
4565 
4566 template <typename Derived>
4567 TypeSourceInfo *TreeTransform<Derived>::TransformTSIInObjectScope(
4568     TypeLoc TL, QualType ObjectType, NamedDecl *UnqualLookup,
4569     CXXScopeSpec &SS) {
4570   QualType T = TL.getType();
4571   assert(!getDerived().AlreadyTransformed(T));
4572 
4573   TypeLocBuilder TLB;
4574   QualType Result;
4575 
4576   if (isa<TemplateSpecializationType>(T)) {
4577     TemplateSpecializationTypeLoc SpecTL =
4578         TL.castAs<TemplateSpecializationTypeLoc>();
4579 
4580     TemplateName Template = getDerived().TransformTemplateName(
4581         SS, SpecTL.getTypePtr()->getTemplateName(), SpecTL.getTemplateNameLoc(),
4582         ObjectType, UnqualLookup, /*AllowInjectedClassName*/true);
4583     if (Template.isNull())
4584       return nullptr;
4585 
4586     Result = getDerived().TransformTemplateSpecializationType(TLB, SpecTL,
4587                                                               Template);
4588   } else if (isa<DependentTemplateSpecializationType>(T)) {
4589     DependentTemplateSpecializationTypeLoc SpecTL =
4590         TL.castAs<DependentTemplateSpecializationTypeLoc>();
4591 
4592     TemplateName Template
4593       = getDerived().RebuildTemplateName(SS,
4594                                          SpecTL.getTemplateKeywordLoc(),
4595                                          *SpecTL.getTypePtr()->getIdentifier(),
4596                                          SpecTL.getTemplateNameLoc(),
4597                                          ObjectType, UnqualLookup,
4598                                          /*AllowInjectedClassName*/true);
4599     if (Template.isNull())
4600       return nullptr;
4601 
4602     Result = getDerived().TransformDependentTemplateSpecializationType(TLB,
4603                                                                        SpecTL,
4604                                                                        Template,
4605                                                                        SS);
4606   } else {
4607     // Nothing special needs to be done for these.
4608     Result = getDerived().TransformType(TLB, TL);
4609   }
4610 
4611   if (Result.isNull())
4612     return nullptr;
4613 
4614   return TLB.getTypeSourceInfo(SemaRef.Context, Result);
4615 }
4616 
4617 template <class TyLoc> static inline
4618 QualType TransformTypeSpecType(TypeLocBuilder &TLB, TyLoc T) {
4619   TyLoc NewT = TLB.push<TyLoc>(T.getType());
4620   NewT.setNameLoc(T.getNameLoc());
4621   return T.getType();
4622 }
4623 
4624 template<typename Derived>
4625 QualType TreeTransform<Derived>::TransformBuiltinType(TypeLocBuilder &TLB,
4626                                                       BuiltinTypeLoc T) {
4627   BuiltinTypeLoc NewT = TLB.push<BuiltinTypeLoc>(T.getType());
4628   NewT.setBuiltinLoc(T.getBuiltinLoc());
4629   if (T.needsExtraLocalData())
4630     NewT.getWrittenBuiltinSpecs() = T.getWrittenBuiltinSpecs();
4631   return T.getType();
4632 }
4633 
4634 template<typename Derived>
4635 QualType TreeTransform<Derived>::TransformComplexType(TypeLocBuilder &TLB,
4636                                                       ComplexTypeLoc T) {
4637   // FIXME: recurse?
4638   return TransformTypeSpecType(TLB, T);
4639 }
4640 
4641 template <typename Derived>
4642 QualType TreeTransform<Derived>::TransformAdjustedType(TypeLocBuilder &TLB,
4643                                                        AdjustedTypeLoc TL) {
4644   // Adjustments applied during transformation are handled elsewhere.
4645   return getDerived().TransformType(TLB, TL.getOriginalLoc());
4646 }
4647 
4648 template<typename Derived>
4649 QualType TreeTransform<Derived>::TransformDecayedType(TypeLocBuilder &TLB,
4650                                                       DecayedTypeLoc TL) {
4651   QualType OriginalType = getDerived().TransformType(TLB, TL.getOriginalLoc());
4652   if (OriginalType.isNull())
4653     return QualType();
4654 
4655   QualType Result = TL.getType();
4656   if (getDerived().AlwaysRebuild() ||
4657       OriginalType != TL.getOriginalLoc().getType())
4658     Result = SemaRef.Context.getDecayedType(OriginalType);
4659   TLB.push<DecayedTypeLoc>(Result);
4660   // Nothing to set for DecayedTypeLoc.
4661   return Result;
4662 }
4663 
4664 template<typename Derived>
4665 QualType TreeTransform<Derived>::TransformPointerType(TypeLocBuilder &TLB,
4666                                                       PointerTypeLoc TL) {
4667   QualType PointeeType
4668     = getDerived().TransformType(TLB, TL.getPointeeLoc());
4669   if (PointeeType.isNull())
4670     return QualType();
4671 
4672   QualType Result = TL.getType();
4673   if (PointeeType->getAs<ObjCObjectType>()) {
4674     // A dependent pointer type 'T *' has is being transformed such
4675     // that an Objective-C class type is being replaced for 'T'. The
4676     // resulting pointer type is an ObjCObjectPointerType, not a
4677     // PointerType.
4678     Result = SemaRef.Context.getObjCObjectPointerType(PointeeType);
4679 
4680     ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result);
4681     NewT.setStarLoc(TL.getStarLoc());
4682     return Result;
4683   }
4684 
4685   if (getDerived().AlwaysRebuild() ||
4686       PointeeType != TL.getPointeeLoc().getType()) {
4687     Result = getDerived().RebuildPointerType(PointeeType, TL.getSigilLoc());
4688     if (Result.isNull())
4689       return QualType();
4690   }
4691 
4692   // Objective-C ARC can add lifetime qualifiers to the type that we're
4693   // pointing to.
4694   TLB.TypeWasModifiedSafely(Result->getPointeeType());
4695 
4696   PointerTypeLoc NewT = TLB.push<PointerTypeLoc>(Result);
4697   NewT.setSigilLoc(TL.getSigilLoc());
4698   return Result;
4699 }
4700 
4701 template<typename Derived>
4702 QualType
4703 TreeTransform<Derived>::TransformBlockPointerType(TypeLocBuilder &TLB,
4704                                                   BlockPointerTypeLoc TL) {
4705   QualType PointeeType
4706     = getDerived().TransformType(TLB, TL.getPointeeLoc());
4707   if (PointeeType.isNull())
4708     return QualType();
4709 
4710   QualType Result = TL.getType();
4711   if (getDerived().AlwaysRebuild() ||
4712       PointeeType != TL.getPointeeLoc().getType()) {
4713     Result = getDerived().RebuildBlockPointerType(PointeeType,
4714                                                   TL.getSigilLoc());
4715     if (Result.isNull())
4716       return QualType();
4717   }
4718 
4719   BlockPointerTypeLoc NewT = TLB.push<BlockPointerTypeLoc>(Result);
4720   NewT.setSigilLoc(TL.getSigilLoc());
4721   return Result;
4722 }
4723 
4724 /// Transforms a reference type.  Note that somewhat paradoxically we
4725 /// don't care whether the type itself is an l-value type or an r-value
4726 /// type;  we only care if the type was *written* as an l-value type
4727 /// or an r-value type.
4728 template<typename Derived>
4729 QualType
4730 TreeTransform<Derived>::TransformReferenceType(TypeLocBuilder &TLB,
4731                                                ReferenceTypeLoc TL) {
4732   const ReferenceType *T = TL.getTypePtr();
4733 
4734   // Note that this works with the pointee-as-written.
4735   QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
4736   if (PointeeType.isNull())
4737     return QualType();
4738 
4739   QualType Result = TL.getType();
4740   if (getDerived().AlwaysRebuild() ||
4741       PointeeType != T->getPointeeTypeAsWritten()) {
4742     Result = getDerived().RebuildReferenceType(PointeeType,
4743                                                T->isSpelledAsLValue(),
4744                                                TL.getSigilLoc());
4745     if (Result.isNull())
4746       return QualType();
4747   }
4748 
4749   // Objective-C ARC can add lifetime qualifiers to the type that we're
4750   // referring to.
4751   TLB.TypeWasModifiedSafely(
4752       Result->castAs<ReferenceType>()->getPointeeTypeAsWritten());
4753 
4754   // r-value references can be rebuilt as l-value references.
4755   ReferenceTypeLoc NewTL;
4756   if (isa<LValueReferenceType>(Result))
4757     NewTL = TLB.push<LValueReferenceTypeLoc>(Result);
4758   else
4759     NewTL = TLB.push<RValueReferenceTypeLoc>(Result);
4760   NewTL.setSigilLoc(TL.getSigilLoc());
4761 
4762   return Result;
4763 }
4764 
4765 template<typename Derived>
4766 QualType
4767 TreeTransform<Derived>::TransformLValueReferenceType(TypeLocBuilder &TLB,
4768                                                  LValueReferenceTypeLoc TL) {
4769   return TransformReferenceType(TLB, TL);
4770 }
4771 
4772 template<typename Derived>
4773 QualType
4774 TreeTransform<Derived>::TransformRValueReferenceType(TypeLocBuilder &TLB,
4775                                                  RValueReferenceTypeLoc TL) {
4776   return TransformReferenceType(TLB, TL);
4777 }
4778 
4779 template<typename Derived>
4780 QualType
4781 TreeTransform<Derived>::TransformMemberPointerType(TypeLocBuilder &TLB,
4782                                                    MemberPointerTypeLoc TL) {
4783   QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
4784   if (PointeeType.isNull())
4785     return QualType();
4786 
4787   TypeSourceInfo* OldClsTInfo = TL.getClassTInfo();
4788   TypeSourceInfo *NewClsTInfo = nullptr;
4789   if (OldClsTInfo) {
4790     NewClsTInfo = getDerived().TransformType(OldClsTInfo);
4791     if (!NewClsTInfo)
4792       return QualType();
4793   }
4794 
4795   const MemberPointerType *T = TL.getTypePtr();
4796   QualType OldClsType = QualType(T->getClass(), 0);
4797   QualType NewClsType;
4798   if (NewClsTInfo)
4799     NewClsType = NewClsTInfo->getType();
4800   else {
4801     NewClsType = getDerived().TransformType(OldClsType);
4802     if (NewClsType.isNull())
4803       return QualType();
4804   }
4805 
4806   QualType Result = TL.getType();
4807   if (getDerived().AlwaysRebuild() ||
4808       PointeeType != T->getPointeeType() ||
4809       NewClsType != OldClsType) {
4810     Result = getDerived().RebuildMemberPointerType(PointeeType, NewClsType,
4811                                                    TL.getStarLoc());
4812     if (Result.isNull())
4813       return QualType();
4814   }
4815 
4816   // If we had to adjust the pointee type when building a member pointer, make
4817   // sure to push TypeLoc info for it.
4818   const MemberPointerType *MPT = Result->getAs<MemberPointerType>();
4819   if (MPT && PointeeType != MPT->getPointeeType()) {
4820     assert(isa<AdjustedType>(MPT->getPointeeType()));
4821     TLB.push<AdjustedTypeLoc>(MPT->getPointeeType());
4822   }
4823 
4824   MemberPointerTypeLoc NewTL = TLB.push<MemberPointerTypeLoc>(Result);
4825   NewTL.setSigilLoc(TL.getSigilLoc());
4826   NewTL.setClassTInfo(NewClsTInfo);
4827 
4828   return Result;
4829 }
4830 
4831 template<typename Derived>
4832 QualType
4833 TreeTransform<Derived>::TransformConstantArrayType(TypeLocBuilder &TLB,
4834                                                    ConstantArrayTypeLoc TL) {
4835   const ConstantArrayType *T = TL.getTypePtr();
4836   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
4837   if (ElementType.isNull())
4838     return QualType();
4839 
4840   // Prefer the expression from the TypeLoc;  the other may have been uniqued.
4841   Expr *OldSize = TL.getSizeExpr();
4842   if (!OldSize)
4843     OldSize = const_cast<Expr*>(T->getSizeExpr());
4844   Expr *NewSize = nullptr;
4845   if (OldSize) {
4846     EnterExpressionEvaluationContext Unevaluated(
4847         SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
4848     NewSize = getDerived().TransformExpr(OldSize).template getAs<Expr>();
4849     NewSize = SemaRef.ActOnConstantExpression(NewSize).get();
4850   }
4851 
4852   QualType Result = TL.getType();
4853   if (getDerived().AlwaysRebuild() ||
4854       ElementType != T->getElementType() ||
4855       (T->getSizeExpr() && NewSize != OldSize)) {
4856     Result = getDerived().RebuildConstantArrayType(ElementType,
4857                                                    T->getSizeModifier(),
4858                                                    T->getSize(), NewSize,
4859                                              T->getIndexTypeCVRQualifiers(),
4860                                                    TL.getBracketsRange());
4861     if (Result.isNull())
4862       return QualType();
4863   }
4864 
4865   // We might have either a ConstantArrayType or a VariableArrayType now:
4866   // a ConstantArrayType is allowed to have an element type which is a
4867   // VariableArrayType if the type is dependent.  Fortunately, all array
4868   // types have the same location layout.
4869   ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result);
4870   NewTL.setLBracketLoc(TL.getLBracketLoc());
4871   NewTL.setRBracketLoc(TL.getRBracketLoc());
4872   NewTL.setSizeExpr(NewSize);
4873 
4874   return Result;
4875 }
4876 
4877 template<typename Derived>
4878 QualType TreeTransform<Derived>::TransformIncompleteArrayType(
4879                                               TypeLocBuilder &TLB,
4880                                               IncompleteArrayTypeLoc TL) {
4881   const IncompleteArrayType *T = TL.getTypePtr();
4882   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
4883   if (ElementType.isNull())
4884     return QualType();
4885 
4886   QualType Result = TL.getType();
4887   if (getDerived().AlwaysRebuild() ||
4888       ElementType != T->getElementType()) {
4889     Result = getDerived().RebuildIncompleteArrayType(ElementType,
4890                                                      T->getSizeModifier(),
4891                                            T->getIndexTypeCVRQualifiers(),
4892                                                      TL.getBracketsRange());
4893     if (Result.isNull())
4894       return QualType();
4895   }
4896 
4897   IncompleteArrayTypeLoc NewTL = TLB.push<IncompleteArrayTypeLoc>(Result);
4898   NewTL.setLBracketLoc(TL.getLBracketLoc());
4899   NewTL.setRBracketLoc(TL.getRBracketLoc());
4900   NewTL.setSizeExpr(nullptr);
4901 
4902   return Result;
4903 }
4904 
4905 template<typename Derived>
4906 QualType
4907 TreeTransform<Derived>::TransformVariableArrayType(TypeLocBuilder &TLB,
4908                                                    VariableArrayTypeLoc TL) {
4909   const VariableArrayType *T = TL.getTypePtr();
4910   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
4911   if (ElementType.isNull())
4912     return QualType();
4913 
4914   ExprResult SizeResult;
4915   {
4916     EnterExpressionEvaluationContext Context(
4917         SemaRef, Sema::ExpressionEvaluationContext::PotentiallyEvaluated);
4918     SizeResult = getDerived().TransformExpr(T->getSizeExpr());
4919   }
4920   if (SizeResult.isInvalid())
4921     return QualType();
4922   SizeResult =
4923       SemaRef.ActOnFinishFullExpr(SizeResult.get(), /*DiscardedValue*/ false);
4924   if (SizeResult.isInvalid())
4925     return QualType();
4926 
4927   Expr *Size = SizeResult.get();
4928 
4929   QualType Result = TL.getType();
4930   if (getDerived().AlwaysRebuild() ||
4931       ElementType != T->getElementType() ||
4932       Size != T->getSizeExpr()) {
4933     Result = getDerived().RebuildVariableArrayType(ElementType,
4934                                                    T->getSizeModifier(),
4935                                                    Size,
4936                                              T->getIndexTypeCVRQualifiers(),
4937                                                    TL.getBracketsRange());
4938     if (Result.isNull())
4939       return QualType();
4940   }
4941 
4942   // We might have constant size array now, but fortunately it has the same
4943   // location layout.
4944   ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result);
4945   NewTL.setLBracketLoc(TL.getLBracketLoc());
4946   NewTL.setRBracketLoc(TL.getRBracketLoc());
4947   NewTL.setSizeExpr(Size);
4948 
4949   return Result;
4950 }
4951 
4952 template<typename Derived>
4953 QualType
4954 TreeTransform<Derived>::TransformDependentSizedArrayType(TypeLocBuilder &TLB,
4955                                              DependentSizedArrayTypeLoc TL) {
4956   const DependentSizedArrayType *T = TL.getTypePtr();
4957   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
4958   if (ElementType.isNull())
4959     return QualType();
4960 
4961   // Array bounds are constant expressions.
4962   EnterExpressionEvaluationContext Unevaluated(
4963       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
4964 
4965   // Prefer the expression from the TypeLoc;  the other may have been uniqued.
4966   Expr *origSize = TL.getSizeExpr();
4967   if (!origSize) origSize = T->getSizeExpr();
4968 
4969   ExprResult sizeResult
4970     = getDerived().TransformExpr(origSize);
4971   sizeResult = SemaRef.ActOnConstantExpression(sizeResult);
4972   if (sizeResult.isInvalid())
4973     return QualType();
4974 
4975   Expr *size = sizeResult.get();
4976 
4977   QualType Result = TL.getType();
4978   if (getDerived().AlwaysRebuild() ||
4979       ElementType != T->getElementType() ||
4980       size != origSize) {
4981     Result = getDerived().RebuildDependentSizedArrayType(ElementType,
4982                                                          T->getSizeModifier(),
4983                                                          size,
4984                                                 T->getIndexTypeCVRQualifiers(),
4985                                                         TL.getBracketsRange());
4986     if (Result.isNull())
4987       return QualType();
4988   }
4989 
4990   // We might have any sort of array type now, but fortunately they
4991   // all have the same location layout.
4992   ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result);
4993   NewTL.setLBracketLoc(TL.getLBracketLoc());
4994   NewTL.setRBracketLoc(TL.getRBracketLoc());
4995   NewTL.setSizeExpr(size);
4996 
4997   return Result;
4998 }
4999 
5000 template <typename Derived>
5001 QualType TreeTransform<Derived>::TransformDependentVectorType(
5002     TypeLocBuilder &TLB, DependentVectorTypeLoc TL) {
5003   const DependentVectorType *T = TL.getTypePtr();
5004   QualType ElementType = getDerived().TransformType(T->getElementType());
5005   if (ElementType.isNull())
5006     return QualType();
5007 
5008   EnterExpressionEvaluationContext Unevaluated(
5009       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
5010 
5011   ExprResult Size = getDerived().TransformExpr(T->getSizeExpr());
5012   Size = SemaRef.ActOnConstantExpression(Size);
5013   if (Size.isInvalid())
5014     return QualType();
5015 
5016   QualType Result = TL.getType();
5017   if (getDerived().AlwaysRebuild() || ElementType != T->getElementType() ||
5018       Size.get() != T->getSizeExpr()) {
5019     Result = getDerived().RebuildDependentVectorType(
5020         ElementType, Size.get(), T->getAttributeLoc(), T->getVectorKind());
5021     if (Result.isNull())
5022       return QualType();
5023   }
5024 
5025   // Result might be dependent or not.
5026   if (isa<DependentVectorType>(Result)) {
5027     DependentVectorTypeLoc NewTL =
5028         TLB.push<DependentVectorTypeLoc>(Result);
5029     NewTL.setNameLoc(TL.getNameLoc());
5030   } else {
5031     VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result);
5032     NewTL.setNameLoc(TL.getNameLoc());
5033   }
5034 
5035   return Result;
5036 }
5037 
5038 template<typename Derived>
5039 QualType TreeTransform<Derived>::TransformDependentSizedExtVectorType(
5040                                       TypeLocBuilder &TLB,
5041                                       DependentSizedExtVectorTypeLoc TL) {
5042   const DependentSizedExtVectorType *T = TL.getTypePtr();
5043 
5044   // FIXME: ext vector locs should be nested
5045   QualType ElementType = getDerived().TransformType(T->getElementType());
5046   if (ElementType.isNull())
5047     return QualType();
5048 
5049   // Vector sizes are constant expressions.
5050   EnterExpressionEvaluationContext Unevaluated(
5051       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
5052 
5053   ExprResult Size = getDerived().TransformExpr(T->getSizeExpr());
5054   Size = SemaRef.ActOnConstantExpression(Size);
5055   if (Size.isInvalid())
5056     return QualType();
5057 
5058   QualType Result = TL.getType();
5059   if (getDerived().AlwaysRebuild() ||
5060       ElementType != T->getElementType() ||
5061       Size.get() != T->getSizeExpr()) {
5062     Result = getDerived().RebuildDependentSizedExtVectorType(ElementType,
5063                                                              Size.get(),
5064                                                          T->getAttributeLoc());
5065     if (Result.isNull())
5066       return QualType();
5067   }
5068 
5069   // Result might be dependent or not.
5070   if (isa<DependentSizedExtVectorType>(Result)) {
5071     DependentSizedExtVectorTypeLoc NewTL
5072       = TLB.push<DependentSizedExtVectorTypeLoc>(Result);
5073     NewTL.setNameLoc(TL.getNameLoc());
5074   } else {
5075     ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result);
5076     NewTL.setNameLoc(TL.getNameLoc());
5077   }
5078 
5079   return Result;
5080 }
5081 
5082 template <typename Derived>
5083 QualType TreeTransform<Derived>::TransformDependentAddressSpaceType(
5084     TypeLocBuilder &TLB, DependentAddressSpaceTypeLoc TL) {
5085   const DependentAddressSpaceType *T = TL.getTypePtr();
5086 
5087   QualType pointeeType = getDerived().TransformType(T->getPointeeType());
5088 
5089   if (pointeeType.isNull())
5090     return QualType();
5091 
5092   // Address spaces are constant expressions.
5093   EnterExpressionEvaluationContext Unevaluated(
5094       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
5095 
5096   ExprResult AddrSpace = getDerived().TransformExpr(T->getAddrSpaceExpr());
5097   AddrSpace = SemaRef.ActOnConstantExpression(AddrSpace);
5098   if (AddrSpace.isInvalid())
5099     return QualType();
5100 
5101   QualType Result = TL.getType();
5102   if (getDerived().AlwaysRebuild() || pointeeType != T->getPointeeType() ||
5103       AddrSpace.get() != T->getAddrSpaceExpr()) {
5104     Result = getDerived().RebuildDependentAddressSpaceType(
5105         pointeeType, AddrSpace.get(), T->getAttributeLoc());
5106     if (Result.isNull())
5107       return QualType();
5108   }
5109 
5110   // Result might be dependent or not.
5111   if (isa<DependentAddressSpaceType>(Result)) {
5112     DependentAddressSpaceTypeLoc NewTL =
5113         TLB.push<DependentAddressSpaceTypeLoc>(Result);
5114 
5115     NewTL.setAttrOperandParensRange(TL.getAttrOperandParensRange());
5116     NewTL.setAttrExprOperand(TL.getAttrExprOperand());
5117     NewTL.setAttrNameLoc(TL.getAttrNameLoc());
5118 
5119   } else {
5120     TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(
5121         Result, getDerived().getBaseLocation());
5122     TransformType(TLB, DI->getTypeLoc());
5123   }
5124 
5125   return Result;
5126 }
5127 
5128 template <typename Derived>
5129 QualType TreeTransform<Derived>::TransformVectorType(TypeLocBuilder &TLB,
5130                                                      VectorTypeLoc TL) {
5131   const VectorType *T = TL.getTypePtr();
5132   QualType ElementType = getDerived().TransformType(T->getElementType());
5133   if (ElementType.isNull())
5134     return QualType();
5135 
5136   QualType Result = TL.getType();
5137   if (getDerived().AlwaysRebuild() ||
5138       ElementType != T->getElementType()) {
5139     Result = getDerived().RebuildVectorType(ElementType, T->getNumElements(),
5140                                             T->getVectorKind());
5141     if (Result.isNull())
5142       return QualType();
5143   }
5144 
5145   VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result);
5146   NewTL.setNameLoc(TL.getNameLoc());
5147 
5148   return Result;
5149 }
5150 
5151 template<typename Derived>
5152 QualType TreeTransform<Derived>::TransformExtVectorType(TypeLocBuilder &TLB,
5153                                                         ExtVectorTypeLoc TL) {
5154   const VectorType *T = TL.getTypePtr();
5155   QualType ElementType = getDerived().TransformType(T->getElementType());
5156   if (ElementType.isNull())
5157     return QualType();
5158 
5159   QualType Result = TL.getType();
5160   if (getDerived().AlwaysRebuild() ||
5161       ElementType != T->getElementType()) {
5162     Result = getDerived().RebuildExtVectorType(ElementType,
5163                                                T->getNumElements(),
5164                                                /*FIXME*/ SourceLocation());
5165     if (Result.isNull())
5166       return QualType();
5167   }
5168 
5169   ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result);
5170   NewTL.setNameLoc(TL.getNameLoc());
5171 
5172   return Result;
5173 }
5174 
5175 template <typename Derived>
5176 ParmVarDecl *TreeTransform<Derived>::TransformFunctionTypeParam(
5177     ParmVarDecl *OldParm, int indexAdjustment, Optional<unsigned> NumExpansions,
5178     bool ExpectParameterPack) {
5179   TypeSourceInfo *OldDI = OldParm->getTypeSourceInfo();
5180   TypeSourceInfo *NewDI = nullptr;
5181 
5182   if (NumExpansions && isa<PackExpansionType>(OldDI->getType())) {
5183     // If we're substituting into a pack expansion type and we know the
5184     // length we want to expand to, just substitute for the pattern.
5185     TypeLoc OldTL = OldDI->getTypeLoc();
5186     PackExpansionTypeLoc OldExpansionTL = OldTL.castAs<PackExpansionTypeLoc>();
5187 
5188     TypeLocBuilder TLB;
5189     TypeLoc NewTL = OldDI->getTypeLoc();
5190     TLB.reserve(NewTL.getFullDataSize());
5191 
5192     QualType Result = getDerived().TransformType(TLB,
5193                                                OldExpansionTL.getPatternLoc());
5194     if (Result.isNull())
5195       return nullptr;
5196 
5197     Result = RebuildPackExpansionType(Result,
5198                                 OldExpansionTL.getPatternLoc().getSourceRange(),
5199                                       OldExpansionTL.getEllipsisLoc(),
5200                                       NumExpansions);
5201     if (Result.isNull())
5202       return nullptr;
5203 
5204     PackExpansionTypeLoc NewExpansionTL
5205       = TLB.push<PackExpansionTypeLoc>(Result);
5206     NewExpansionTL.setEllipsisLoc(OldExpansionTL.getEllipsisLoc());
5207     NewDI = TLB.getTypeSourceInfo(SemaRef.Context, Result);
5208   } else
5209     NewDI = getDerived().TransformType(OldDI);
5210   if (!NewDI)
5211     return nullptr;
5212 
5213   if (NewDI == OldDI && indexAdjustment == 0)
5214     return OldParm;
5215 
5216   ParmVarDecl *newParm = ParmVarDecl::Create(SemaRef.Context,
5217                                              OldParm->getDeclContext(),
5218                                              OldParm->getInnerLocStart(),
5219                                              OldParm->getLocation(),
5220                                              OldParm->getIdentifier(),
5221                                              NewDI->getType(),
5222                                              NewDI,
5223                                              OldParm->getStorageClass(),
5224                                              /* DefArg */ nullptr);
5225   newParm->setScopeInfo(OldParm->getFunctionScopeDepth(),
5226                         OldParm->getFunctionScopeIndex() + indexAdjustment);
5227   return newParm;
5228 }
5229 
5230 template <typename Derived>
5231 bool TreeTransform<Derived>::TransformFunctionTypeParams(
5232     SourceLocation Loc, ArrayRef<ParmVarDecl *> Params,
5233     const QualType *ParamTypes,
5234     const FunctionProtoType::ExtParameterInfo *ParamInfos,
5235     SmallVectorImpl<QualType> &OutParamTypes,
5236     SmallVectorImpl<ParmVarDecl *> *PVars,
5237     Sema::ExtParameterInfoBuilder &PInfos) {
5238   int indexAdjustment = 0;
5239 
5240   unsigned NumParams = Params.size();
5241   for (unsigned i = 0; i != NumParams; ++i) {
5242     if (ParmVarDecl *OldParm = Params[i]) {
5243       assert(OldParm->getFunctionScopeIndex() == i);
5244 
5245       Optional<unsigned> NumExpansions;
5246       ParmVarDecl *NewParm = nullptr;
5247       if (OldParm->isParameterPack()) {
5248         // We have a function parameter pack that may need to be expanded.
5249         SmallVector<UnexpandedParameterPack, 2> Unexpanded;
5250 
5251         // Find the parameter packs that could be expanded.
5252         TypeLoc TL = OldParm->getTypeSourceInfo()->getTypeLoc();
5253         PackExpansionTypeLoc ExpansionTL = TL.castAs<PackExpansionTypeLoc>();
5254         TypeLoc Pattern = ExpansionTL.getPatternLoc();
5255         SemaRef.collectUnexpandedParameterPacks(Pattern, Unexpanded);
5256 
5257         // Determine whether we should expand the parameter packs.
5258         bool ShouldExpand = false;
5259         bool RetainExpansion = false;
5260         Optional<unsigned> OrigNumExpansions;
5261         if (Unexpanded.size() > 0) {
5262           OrigNumExpansions = ExpansionTL.getTypePtr()->getNumExpansions();
5263           NumExpansions = OrigNumExpansions;
5264           if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(),
5265                                                    Pattern.getSourceRange(),
5266                                                    Unexpanded,
5267                                                    ShouldExpand,
5268                                                    RetainExpansion,
5269                                                    NumExpansions)) {
5270             return true;
5271           }
5272         } else {
5273 #ifndef NDEBUG
5274           const AutoType *AT =
5275               Pattern.getType().getTypePtr()->getContainedAutoType();
5276           assert((AT && (!AT->isDeduced() || AT->getDeducedType().isNull())) &&
5277                  "Could not find parameter packs or undeduced auto type!");
5278 #endif
5279         }
5280 
5281         if (ShouldExpand) {
5282           // Expand the function parameter pack into multiple, separate
5283           // parameters.
5284           getDerived().ExpandingFunctionParameterPack(OldParm);
5285           for (unsigned I = 0; I != *NumExpansions; ++I) {
5286             Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
5287             ParmVarDecl *NewParm
5288               = getDerived().TransformFunctionTypeParam(OldParm,
5289                                                         indexAdjustment++,
5290                                                         OrigNumExpansions,
5291                                                 /*ExpectParameterPack=*/false);
5292             if (!NewParm)
5293               return true;
5294 
5295             if (ParamInfos)
5296               PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5297             OutParamTypes.push_back(NewParm->getType());
5298             if (PVars)
5299               PVars->push_back(NewParm);
5300           }
5301 
5302           // If we're supposed to retain a pack expansion, do so by temporarily
5303           // forgetting the partially-substituted parameter pack.
5304           if (RetainExpansion) {
5305             ForgetPartiallySubstitutedPackRAII Forget(getDerived());
5306             ParmVarDecl *NewParm
5307               = getDerived().TransformFunctionTypeParam(OldParm,
5308                                                         indexAdjustment++,
5309                                                         OrigNumExpansions,
5310                                                 /*ExpectParameterPack=*/false);
5311             if (!NewParm)
5312               return true;
5313 
5314             if (ParamInfos)
5315               PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5316             OutParamTypes.push_back(NewParm->getType());
5317             if (PVars)
5318               PVars->push_back(NewParm);
5319           }
5320 
5321           // The next parameter should have the same adjustment as the
5322           // last thing we pushed, but we post-incremented indexAdjustment
5323           // on every push.  Also, if we push nothing, the adjustment should
5324           // go down by one.
5325           indexAdjustment--;
5326 
5327           // We're done with the pack expansion.
5328           continue;
5329         }
5330 
5331         // We'll substitute the parameter now without expanding the pack
5332         // expansion.
5333         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
5334         NewParm = getDerived().TransformFunctionTypeParam(OldParm,
5335                                                           indexAdjustment,
5336                                                           NumExpansions,
5337                                                   /*ExpectParameterPack=*/true);
5338         assert(NewParm->isParameterPack() &&
5339                "Parameter pack no longer a parameter pack after "
5340                "transformation.");
5341       } else {
5342         NewParm = getDerived().TransformFunctionTypeParam(
5343             OldParm, indexAdjustment, None, /*ExpectParameterPack=*/ false);
5344       }
5345 
5346       if (!NewParm)
5347         return true;
5348 
5349       if (ParamInfos)
5350         PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5351       OutParamTypes.push_back(NewParm->getType());
5352       if (PVars)
5353         PVars->push_back(NewParm);
5354       continue;
5355     }
5356 
5357     // Deal with the possibility that we don't have a parameter
5358     // declaration for this parameter.
5359     QualType OldType = ParamTypes[i];
5360     bool IsPackExpansion = false;
5361     Optional<unsigned> NumExpansions;
5362     QualType NewType;
5363     if (const PackExpansionType *Expansion
5364                                        = dyn_cast<PackExpansionType>(OldType)) {
5365       // We have a function parameter pack that may need to be expanded.
5366       QualType Pattern = Expansion->getPattern();
5367       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
5368       getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
5369 
5370       // Determine whether we should expand the parameter packs.
5371       bool ShouldExpand = false;
5372       bool RetainExpansion = false;
5373       if (getDerived().TryExpandParameterPacks(Loc, SourceRange(),
5374                                                Unexpanded,
5375                                                ShouldExpand,
5376                                                RetainExpansion,
5377                                                NumExpansions)) {
5378         return true;
5379       }
5380 
5381       if (ShouldExpand) {
5382         // Expand the function parameter pack into multiple, separate
5383         // parameters.
5384         for (unsigned I = 0; I != *NumExpansions; ++I) {
5385           Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
5386           QualType NewType = getDerived().TransformType(Pattern);
5387           if (NewType.isNull())
5388             return true;
5389 
5390           if (NewType->containsUnexpandedParameterPack()) {
5391             NewType =
5392                 getSema().getASTContext().getPackExpansionType(NewType, None);
5393 
5394             if (NewType.isNull())
5395               return true;
5396           }
5397 
5398           if (ParamInfos)
5399             PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5400           OutParamTypes.push_back(NewType);
5401           if (PVars)
5402             PVars->push_back(nullptr);
5403         }
5404 
5405         // We're done with the pack expansion.
5406         continue;
5407       }
5408 
5409       // If we're supposed to retain a pack expansion, do so by temporarily
5410       // forgetting the partially-substituted parameter pack.
5411       if (RetainExpansion) {
5412         ForgetPartiallySubstitutedPackRAII Forget(getDerived());
5413         QualType NewType = getDerived().TransformType(Pattern);
5414         if (NewType.isNull())
5415           return true;
5416 
5417         if (ParamInfos)
5418           PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5419         OutParamTypes.push_back(NewType);
5420         if (PVars)
5421           PVars->push_back(nullptr);
5422       }
5423 
5424       // We'll substitute the parameter now without expanding the pack
5425       // expansion.
5426       OldType = Expansion->getPattern();
5427       IsPackExpansion = true;
5428       Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
5429       NewType = getDerived().TransformType(OldType);
5430     } else {
5431       NewType = getDerived().TransformType(OldType);
5432     }
5433 
5434     if (NewType.isNull())
5435       return true;
5436 
5437     if (IsPackExpansion)
5438       NewType = getSema().Context.getPackExpansionType(NewType,
5439                                                        NumExpansions);
5440 
5441     if (ParamInfos)
5442       PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5443     OutParamTypes.push_back(NewType);
5444     if (PVars)
5445       PVars->push_back(nullptr);
5446   }
5447 
5448 #ifndef NDEBUG
5449   if (PVars) {
5450     for (unsigned i = 0, e = PVars->size(); i != e; ++i)
5451       if (ParmVarDecl *parm = (*PVars)[i])
5452         assert(parm->getFunctionScopeIndex() == i);
5453   }
5454 #endif
5455 
5456   return false;
5457 }
5458 
5459 template<typename Derived>
5460 QualType
5461 TreeTransform<Derived>::TransformFunctionProtoType(TypeLocBuilder &TLB,
5462                                                    FunctionProtoTypeLoc TL) {
5463   SmallVector<QualType, 4> ExceptionStorage;
5464   TreeTransform *This = this; // Work around gcc.gnu.org/PR56135.
5465   return getDerived().TransformFunctionProtoType(
5466       TLB, TL, nullptr, Qualifiers(),
5467       [&](FunctionProtoType::ExceptionSpecInfo &ESI, bool &Changed) {
5468         return This->TransformExceptionSpec(TL.getBeginLoc(), ESI,
5469                                             ExceptionStorage, Changed);
5470       });
5471 }
5472 
5473 template<typename Derived> template<typename Fn>
5474 QualType TreeTransform<Derived>::TransformFunctionProtoType(
5475     TypeLocBuilder &TLB, FunctionProtoTypeLoc TL, CXXRecordDecl *ThisContext,
5476     Qualifiers ThisTypeQuals, Fn TransformExceptionSpec) {
5477 
5478   // Transform the parameters and return type.
5479   //
5480   // We are required to instantiate the params and return type in source order.
5481   // When the function has a trailing return type, we instantiate the
5482   // parameters before the return type,  since the return type can then refer
5483   // to the parameters themselves (via decltype, sizeof, etc.).
5484   //
5485   SmallVector<QualType, 4> ParamTypes;
5486   SmallVector<ParmVarDecl*, 4> ParamDecls;
5487   Sema::ExtParameterInfoBuilder ExtParamInfos;
5488   const FunctionProtoType *T = TL.getTypePtr();
5489 
5490   QualType ResultType;
5491 
5492   if (T->hasTrailingReturn()) {
5493     if (getDerived().TransformFunctionTypeParams(
5494             TL.getBeginLoc(), TL.getParams(),
5495             TL.getTypePtr()->param_type_begin(),
5496             T->getExtParameterInfosOrNull(),
5497             ParamTypes, &ParamDecls, ExtParamInfos))
5498       return QualType();
5499 
5500     {
5501       // C++11 [expr.prim.general]p3:
5502       //   If a declaration declares a member function or member function
5503       //   template of a class X, the expression this is a prvalue of type
5504       //   "pointer to cv-qualifier-seq X" between the optional cv-qualifer-seq
5505       //   and the end of the function-definition, member-declarator, or
5506       //   declarator.
5507       Sema::CXXThisScopeRAII ThisScope(SemaRef, ThisContext, ThisTypeQuals);
5508 
5509       ResultType = getDerived().TransformType(TLB, TL.getReturnLoc());
5510       if (ResultType.isNull())
5511         return QualType();
5512     }
5513   }
5514   else {
5515     ResultType = getDerived().TransformType(TLB, TL.getReturnLoc());
5516     if (ResultType.isNull())
5517       return QualType();
5518 
5519     if (getDerived().TransformFunctionTypeParams(
5520             TL.getBeginLoc(), TL.getParams(),
5521             TL.getTypePtr()->param_type_begin(),
5522             T->getExtParameterInfosOrNull(),
5523             ParamTypes, &ParamDecls, ExtParamInfos))
5524       return QualType();
5525   }
5526 
5527   FunctionProtoType::ExtProtoInfo EPI = T->getExtProtoInfo();
5528 
5529   bool EPIChanged = false;
5530   if (TransformExceptionSpec(EPI.ExceptionSpec, EPIChanged))
5531     return QualType();
5532 
5533   // Handle extended parameter information.
5534   if (auto NewExtParamInfos =
5535         ExtParamInfos.getPointerOrNull(ParamTypes.size())) {
5536     if (!EPI.ExtParameterInfos ||
5537         llvm::makeArrayRef(EPI.ExtParameterInfos, TL.getNumParams())
5538           != llvm::makeArrayRef(NewExtParamInfos, ParamTypes.size())) {
5539       EPIChanged = true;
5540     }
5541     EPI.ExtParameterInfos = NewExtParamInfos;
5542   } else if (EPI.ExtParameterInfos) {
5543     EPIChanged = true;
5544     EPI.ExtParameterInfos = nullptr;
5545   }
5546 
5547   QualType Result = TL.getType();
5548   if (getDerived().AlwaysRebuild() || ResultType != T->getReturnType() ||
5549       T->getParamTypes() != llvm::makeArrayRef(ParamTypes) || EPIChanged) {
5550     Result = getDerived().RebuildFunctionProtoType(ResultType, ParamTypes, EPI);
5551     if (Result.isNull())
5552       return QualType();
5553   }
5554 
5555   FunctionProtoTypeLoc NewTL = TLB.push<FunctionProtoTypeLoc>(Result);
5556   NewTL.setLocalRangeBegin(TL.getLocalRangeBegin());
5557   NewTL.setLParenLoc(TL.getLParenLoc());
5558   NewTL.setRParenLoc(TL.getRParenLoc());
5559   NewTL.setExceptionSpecRange(TL.getExceptionSpecRange());
5560   NewTL.setLocalRangeEnd(TL.getLocalRangeEnd());
5561   for (unsigned i = 0, e = NewTL.getNumParams(); i != e; ++i)
5562     NewTL.setParam(i, ParamDecls[i]);
5563 
5564   return Result;
5565 }
5566 
5567 template<typename Derived>
5568 bool TreeTransform<Derived>::TransformExceptionSpec(
5569     SourceLocation Loc, FunctionProtoType::ExceptionSpecInfo &ESI,
5570     SmallVectorImpl<QualType> &Exceptions, bool &Changed) {
5571   assert(ESI.Type != EST_Uninstantiated && ESI.Type != EST_Unevaluated);
5572 
5573   // Instantiate a dynamic noexcept expression, if any.
5574   if (isComputedNoexcept(ESI.Type)) {
5575     EnterExpressionEvaluationContext Unevaluated(
5576         getSema(), Sema::ExpressionEvaluationContext::ConstantEvaluated);
5577     ExprResult NoexceptExpr = getDerived().TransformExpr(ESI.NoexceptExpr);
5578     if (NoexceptExpr.isInvalid())
5579       return true;
5580 
5581     ExceptionSpecificationType EST = ESI.Type;
5582     NoexceptExpr =
5583         getSema().ActOnNoexceptSpec(Loc, NoexceptExpr.get(), EST);
5584     if (NoexceptExpr.isInvalid())
5585       return true;
5586 
5587     if (ESI.NoexceptExpr != NoexceptExpr.get() || EST != ESI.Type)
5588       Changed = true;
5589     ESI.NoexceptExpr = NoexceptExpr.get();
5590     ESI.Type = EST;
5591   }
5592 
5593   if (ESI.Type != EST_Dynamic)
5594     return false;
5595 
5596   // Instantiate a dynamic exception specification's type.
5597   for (QualType T : ESI.Exceptions) {
5598     if (const PackExpansionType *PackExpansion =
5599             T->getAs<PackExpansionType>()) {
5600       Changed = true;
5601 
5602       // We have a pack expansion. Instantiate it.
5603       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
5604       SemaRef.collectUnexpandedParameterPacks(PackExpansion->getPattern(),
5605                                               Unexpanded);
5606       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
5607 
5608       // Determine whether the set of unexpanded parameter packs can and
5609       // should
5610       // be expanded.
5611       bool Expand = false;
5612       bool RetainExpansion = false;
5613       Optional<unsigned> NumExpansions = PackExpansion->getNumExpansions();
5614       // FIXME: Track the location of the ellipsis (and track source location
5615       // information for the types in the exception specification in general).
5616       if (getDerived().TryExpandParameterPacks(
5617               Loc, SourceRange(), Unexpanded, Expand,
5618               RetainExpansion, NumExpansions))
5619         return true;
5620 
5621       if (!Expand) {
5622         // We can't expand this pack expansion into separate arguments yet;
5623         // just substitute into the pattern and create a new pack expansion
5624         // type.
5625         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
5626         QualType U = getDerived().TransformType(PackExpansion->getPattern());
5627         if (U.isNull())
5628           return true;
5629 
5630         U = SemaRef.Context.getPackExpansionType(U, NumExpansions);
5631         Exceptions.push_back(U);
5632         continue;
5633       }
5634 
5635       // Substitute into the pack expansion pattern for each slice of the
5636       // pack.
5637       for (unsigned ArgIdx = 0; ArgIdx != *NumExpansions; ++ArgIdx) {
5638         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), ArgIdx);
5639 
5640         QualType U = getDerived().TransformType(PackExpansion->getPattern());
5641         if (U.isNull() || SemaRef.CheckSpecifiedExceptionType(U, Loc))
5642           return true;
5643 
5644         Exceptions.push_back(U);
5645       }
5646     } else {
5647       QualType U = getDerived().TransformType(T);
5648       if (U.isNull() || SemaRef.CheckSpecifiedExceptionType(U, Loc))
5649         return true;
5650       if (T != U)
5651         Changed = true;
5652 
5653       Exceptions.push_back(U);
5654     }
5655   }
5656 
5657   ESI.Exceptions = Exceptions;
5658   if (ESI.Exceptions.empty())
5659     ESI.Type = EST_DynamicNone;
5660   return false;
5661 }
5662 
5663 template<typename Derived>
5664 QualType TreeTransform<Derived>::TransformFunctionNoProtoType(
5665                                                  TypeLocBuilder &TLB,
5666                                                  FunctionNoProtoTypeLoc TL) {
5667   const FunctionNoProtoType *T = TL.getTypePtr();
5668   QualType ResultType = getDerived().TransformType(TLB, TL.getReturnLoc());
5669   if (ResultType.isNull())
5670     return QualType();
5671 
5672   QualType Result = TL.getType();
5673   if (getDerived().AlwaysRebuild() || ResultType != T->getReturnType())
5674     Result = getDerived().RebuildFunctionNoProtoType(ResultType);
5675 
5676   FunctionNoProtoTypeLoc NewTL = TLB.push<FunctionNoProtoTypeLoc>(Result);
5677   NewTL.setLocalRangeBegin(TL.getLocalRangeBegin());
5678   NewTL.setLParenLoc(TL.getLParenLoc());
5679   NewTL.setRParenLoc(TL.getRParenLoc());
5680   NewTL.setLocalRangeEnd(TL.getLocalRangeEnd());
5681 
5682   return Result;
5683 }
5684 
5685 template<typename Derived> QualType
5686 TreeTransform<Derived>::TransformUnresolvedUsingType(TypeLocBuilder &TLB,
5687                                                  UnresolvedUsingTypeLoc TL) {
5688   const UnresolvedUsingType *T = TL.getTypePtr();
5689   Decl *D = getDerived().TransformDecl(TL.getNameLoc(), T->getDecl());
5690   if (!D)
5691     return QualType();
5692 
5693   QualType Result = TL.getType();
5694   if (getDerived().AlwaysRebuild() || D != T->getDecl()) {
5695     Result = getDerived().RebuildUnresolvedUsingType(TL.getNameLoc(), D);
5696     if (Result.isNull())
5697       return QualType();
5698   }
5699 
5700   // We might get an arbitrary type spec type back.  We should at
5701   // least always get a type spec type, though.
5702   TypeSpecTypeLoc NewTL = TLB.pushTypeSpec(Result);
5703   NewTL.setNameLoc(TL.getNameLoc());
5704 
5705   return Result;
5706 }
5707 
5708 template<typename Derived>
5709 QualType TreeTransform<Derived>::TransformTypedefType(TypeLocBuilder &TLB,
5710                                                       TypedefTypeLoc TL) {
5711   const TypedefType *T = TL.getTypePtr();
5712   TypedefNameDecl *Typedef
5713     = cast_or_null<TypedefNameDecl>(getDerived().TransformDecl(TL.getNameLoc(),
5714                                                                T->getDecl()));
5715   if (!Typedef)
5716     return QualType();
5717 
5718   QualType Result = TL.getType();
5719   if (getDerived().AlwaysRebuild() ||
5720       Typedef != T->getDecl()) {
5721     Result = getDerived().RebuildTypedefType(Typedef);
5722     if (Result.isNull())
5723       return QualType();
5724   }
5725 
5726   TypedefTypeLoc NewTL = TLB.push<TypedefTypeLoc>(Result);
5727   NewTL.setNameLoc(TL.getNameLoc());
5728 
5729   return Result;
5730 }
5731 
5732 template<typename Derived>
5733 QualType TreeTransform<Derived>::TransformTypeOfExprType(TypeLocBuilder &TLB,
5734                                                       TypeOfExprTypeLoc TL) {
5735   // typeof expressions are not potentially evaluated contexts
5736   EnterExpressionEvaluationContext Unevaluated(
5737       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated,
5738       Sema::ReuseLambdaContextDecl);
5739 
5740   ExprResult E = getDerived().TransformExpr(TL.getUnderlyingExpr());
5741   if (E.isInvalid())
5742     return QualType();
5743 
5744   E = SemaRef.HandleExprEvaluationContextForTypeof(E.get());
5745   if (E.isInvalid())
5746     return QualType();
5747 
5748   QualType Result = TL.getType();
5749   if (getDerived().AlwaysRebuild() ||
5750       E.get() != TL.getUnderlyingExpr()) {
5751     Result = getDerived().RebuildTypeOfExprType(E.get(), TL.getTypeofLoc());
5752     if (Result.isNull())
5753       return QualType();
5754   }
5755   else E.get();
5756 
5757   TypeOfExprTypeLoc NewTL = TLB.push<TypeOfExprTypeLoc>(Result);
5758   NewTL.setTypeofLoc(TL.getTypeofLoc());
5759   NewTL.setLParenLoc(TL.getLParenLoc());
5760   NewTL.setRParenLoc(TL.getRParenLoc());
5761 
5762   return Result;
5763 }
5764 
5765 template<typename Derived>
5766 QualType TreeTransform<Derived>::TransformTypeOfType(TypeLocBuilder &TLB,
5767                                                      TypeOfTypeLoc TL) {
5768   TypeSourceInfo* Old_Under_TI = TL.getUnderlyingTInfo();
5769   TypeSourceInfo* New_Under_TI = getDerived().TransformType(Old_Under_TI);
5770   if (!New_Under_TI)
5771     return QualType();
5772 
5773   QualType Result = TL.getType();
5774   if (getDerived().AlwaysRebuild() || New_Under_TI != Old_Under_TI) {
5775     Result = getDerived().RebuildTypeOfType(New_Under_TI->getType());
5776     if (Result.isNull())
5777       return QualType();
5778   }
5779 
5780   TypeOfTypeLoc NewTL = TLB.push<TypeOfTypeLoc>(Result);
5781   NewTL.setTypeofLoc(TL.getTypeofLoc());
5782   NewTL.setLParenLoc(TL.getLParenLoc());
5783   NewTL.setRParenLoc(TL.getRParenLoc());
5784   NewTL.setUnderlyingTInfo(New_Under_TI);
5785 
5786   return Result;
5787 }
5788 
5789 template<typename Derived>
5790 QualType TreeTransform<Derived>::TransformDecltypeType(TypeLocBuilder &TLB,
5791                                                        DecltypeTypeLoc TL) {
5792   const DecltypeType *T = TL.getTypePtr();
5793 
5794   // decltype expressions are not potentially evaluated contexts
5795   EnterExpressionEvaluationContext Unevaluated(
5796       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, nullptr,
5797       Sema::ExpressionEvaluationContextRecord::EK_Decltype);
5798 
5799   ExprResult E = getDerived().TransformExpr(T->getUnderlyingExpr());
5800   if (E.isInvalid())
5801     return QualType();
5802 
5803   E = getSema().ActOnDecltypeExpression(E.get());
5804   if (E.isInvalid())
5805     return QualType();
5806 
5807   QualType Result = TL.getType();
5808   if (getDerived().AlwaysRebuild() ||
5809       E.get() != T->getUnderlyingExpr()) {
5810     Result = getDerived().RebuildDecltypeType(E.get(), TL.getNameLoc());
5811     if (Result.isNull())
5812       return QualType();
5813   }
5814   else E.get();
5815 
5816   DecltypeTypeLoc NewTL = TLB.push<DecltypeTypeLoc>(Result);
5817   NewTL.setNameLoc(TL.getNameLoc());
5818 
5819   return Result;
5820 }
5821 
5822 template<typename Derived>
5823 QualType TreeTransform<Derived>::TransformUnaryTransformType(
5824                                                             TypeLocBuilder &TLB,
5825                                                      UnaryTransformTypeLoc TL) {
5826   QualType Result = TL.getType();
5827   if (Result->isDependentType()) {
5828     const UnaryTransformType *T = TL.getTypePtr();
5829     QualType NewBase =
5830       getDerived().TransformType(TL.getUnderlyingTInfo())->getType();
5831     Result = getDerived().RebuildUnaryTransformType(NewBase,
5832                                                     T->getUTTKind(),
5833                                                     TL.getKWLoc());
5834     if (Result.isNull())
5835       return QualType();
5836   }
5837 
5838   UnaryTransformTypeLoc NewTL = TLB.push<UnaryTransformTypeLoc>(Result);
5839   NewTL.setKWLoc(TL.getKWLoc());
5840   NewTL.setParensRange(TL.getParensRange());
5841   NewTL.setUnderlyingTInfo(TL.getUnderlyingTInfo());
5842   return Result;
5843 }
5844 
5845 template<typename Derived>
5846 QualType TreeTransform<Derived>::TransformDeducedTemplateSpecializationType(
5847     TypeLocBuilder &TLB, DeducedTemplateSpecializationTypeLoc TL) {
5848   const DeducedTemplateSpecializationType *T = TL.getTypePtr();
5849 
5850   CXXScopeSpec SS;
5851   TemplateName TemplateName = getDerived().TransformTemplateName(
5852       SS, T->getTemplateName(), TL.getTemplateNameLoc());
5853   if (TemplateName.isNull())
5854     return QualType();
5855 
5856   QualType OldDeduced = T->getDeducedType();
5857   QualType NewDeduced;
5858   if (!OldDeduced.isNull()) {
5859     NewDeduced = getDerived().TransformType(OldDeduced);
5860     if (NewDeduced.isNull())
5861       return QualType();
5862   }
5863 
5864   QualType Result = getDerived().RebuildDeducedTemplateSpecializationType(
5865       TemplateName, NewDeduced);
5866   if (Result.isNull())
5867     return QualType();
5868 
5869   DeducedTemplateSpecializationTypeLoc NewTL =
5870       TLB.push<DeducedTemplateSpecializationTypeLoc>(Result);
5871   NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
5872 
5873   return Result;
5874 }
5875 
5876 template<typename Derived>
5877 QualType TreeTransform<Derived>::TransformRecordType(TypeLocBuilder &TLB,
5878                                                      RecordTypeLoc TL) {
5879   const RecordType *T = TL.getTypePtr();
5880   RecordDecl *Record
5881     = cast_or_null<RecordDecl>(getDerived().TransformDecl(TL.getNameLoc(),
5882                                                           T->getDecl()));
5883   if (!Record)
5884     return QualType();
5885 
5886   QualType Result = TL.getType();
5887   if (getDerived().AlwaysRebuild() ||
5888       Record != T->getDecl()) {
5889     Result = getDerived().RebuildRecordType(Record);
5890     if (Result.isNull())
5891       return QualType();
5892   }
5893 
5894   RecordTypeLoc NewTL = TLB.push<RecordTypeLoc>(Result);
5895   NewTL.setNameLoc(TL.getNameLoc());
5896 
5897   return Result;
5898 }
5899 
5900 template<typename Derived>
5901 QualType TreeTransform<Derived>::TransformEnumType(TypeLocBuilder &TLB,
5902                                                    EnumTypeLoc TL) {
5903   const EnumType *T = TL.getTypePtr();
5904   EnumDecl *Enum
5905     = cast_or_null<EnumDecl>(getDerived().TransformDecl(TL.getNameLoc(),
5906                                                         T->getDecl()));
5907   if (!Enum)
5908     return QualType();
5909 
5910   QualType Result = TL.getType();
5911   if (getDerived().AlwaysRebuild() ||
5912       Enum != T->getDecl()) {
5913     Result = getDerived().RebuildEnumType(Enum);
5914     if (Result.isNull())
5915       return QualType();
5916   }
5917 
5918   EnumTypeLoc NewTL = TLB.push<EnumTypeLoc>(Result);
5919   NewTL.setNameLoc(TL.getNameLoc());
5920 
5921   return Result;
5922 }
5923 
5924 template<typename Derived>
5925 QualType TreeTransform<Derived>::TransformInjectedClassNameType(
5926                                          TypeLocBuilder &TLB,
5927                                          InjectedClassNameTypeLoc TL) {
5928   Decl *D = getDerived().TransformDecl(TL.getNameLoc(),
5929                                        TL.getTypePtr()->getDecl());
5930   if (!D) return QualType();
5931 
5932   QualType T = SemaRef.Context.getTypeDeclType(cast<TypeDecl>(D));
5933   TLB.pushTypeSpec(T).setNameLoc(TL.getNameLoc());
5934   return T;
5935 }
5936 
5937 template<typename Derived>
5938 QualType TreeTransform<Derived>::TransformTemplateTypeParmType(
5939                                                 TypeLocBuilder &TLB,
5940                                                 TemplateTypeParmTypeLoc TL) {
5941   return TransformTypeSpecType(TLB, TL);
5942 }
5943 
5944 template<typename Derived>
5945 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmType(
5946                                          TypeLocBuilder &TLB,
5947                                          SubstTemplateTypeParmTypeLoc TL) {
5948   const SubstTemplateTypeParmType *T = TL.getTypePtr();
5949 
5950   // Substitute into the replacement type, which itself might involve something
5951   // that needs to be transformed. This only tends to occur with default
5952   // template arguments of template template parameters.
5953   TemporaryBase Rebase(*this, TL.getNameLoc(), DeclarationName());
5954   QualType Replacement = getDerived().TransformType(T->getReplacementType());
5955   if (Replacement.isNull())
5956     return QualType();
5957 
5958   // Always canonicalize the replacement type.
5959   Replacement = SemaRef.Context.getCanonicalType(Replacement);
5960   QualType Result
5961     = SemaRef.Context.getSubstTemplateTypeParmType(T->getReplacedParameter(),
5962                                                    Replacement);
5963 
5964   // Propagate type-source information.
5965   SubstTemplateTypeParmTypeLoc NewTL
5966     = TLB.push<SubstTemplateTypeParmTypeLoc>(Result);
5967   NewTL.setNameLoc(TL.getNameLoc());
5968   return Result;
5969 
5970 }
5971 
5972 template<typename Derived>
5973 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmPackType(
5974                                           TypeLocBuilder &TLB,
5975                                           SubstTemplateTypeParmPackTypeLoc TL) {
5976   return TransformTypeSpecType(TLB, TL);
5977 }
5978 
5979 template<typename Derived>
5980 QualType TreeTransform<Derived>::TransformTemplateSpecializationType(
5981                                                         TypeLocBuilder &TLB,
5982                                            TemplateSpecializationTypeLoc TL) {
5983   const TemplateSpecializationType *T = TL.getTypePtr();
5984 
5985   // The nested-name-specifier never matters in a TemplateSpecializationType,
5986   // because we can't have a dependent nested-name-specifier anyway.
5987   CXXScopeSpec SS;
5988   TemplateName Template
5989     = getDerived().TransformTemplateName(SS, T->getTemplateName(),
5990                                          TL.getTemplateNameLoc());
5991   if (Template.isNull())
5992     return QualType();
5993 
5994   return getDerived().TransformTemplateSpecializationType(TLB, TL, Template);
5995 }
5996 
5997 template<typename Derived>
5998 QualType TreeTransform<Derived>::TransformAtomicType(TypeLocBuilder &TLB,
5999                                                      AtomicTypeLoc TL) {
6000   QualType ValueType = getDerived().TransformType(TLB, TL.getValueLoc());
6001   if (ValueType.isNull())
6002     return QualType();
6003 
6004   QualType Result = TL.getType();
6005   if (getDerived().AlwaysRebuild() ||
6006       ValueType != TL.getValueLoc().getType()) {
6007     Result = getDerived().RebuildAtomicType(ValueType, TL.getKWLoc());
6008     if (Result.isNull())
6009       return QualType();
6010   }
6011 
6012   AtomicTypeLoc NewTL = TLB.push<AtomicTypeLoc>(Result);
6013   NewTL.setKWLoc(TL.getKWLoc());
6014   NewTL.setLParenLoc(TL.getLParenLoc());
6015   NewTL.setRParenLoc(TL.getRParenLoc());
6016 
6017   return Result;
6018 }
6019 
6020 template <typename Derived>
6021 QualType TreeTransform<Derived>::TransformPipeType(TypeLocBuilder &TLB,
6022                                                    PipeTypeLoc TL) {
6023   QualType ValueType = getDerived().TransformType(TLB, TL.getValueLoc());
6024   if (ValueType.isNull())
6025     return QualType();
6026 
6027   QualType Result = TL.getType();
6028   if (getDerived().AlwaysRebuild() || ValueType != TL.getValueLoc().getType()) {
6029     const PipeType *PT = Result->castAs<PipeType>();
6030     bool isReadPipe = PT->isReadOnly();
6031     Result = getDerived().RebuildPipeType(ValueType, TL.getKWLoc(), isReadPipe);
6032     if (Result.isNull())
6033       return QualType();
6034   }
6035 
6036   PipeTypeLoc NewTL = TLB.push<PipeTypeLoc>(Result);
6037   NewTL.setKWLoc(TL.getKWLoc());
6038 
6039   return Result;
6040 }
6041 
6042   /// Simple iterator that traverses the template arguments in a
6043   /// container that provides a \c getArgLoc() member function.
6044   ///
6045   /// This iterator is intended to be used with the iterator form of
6046   /// \c TreeTransform<Derived>::TransformTemplateArguments().
6047   template<typename ArgLocContainer>
6048   class TemplateArgumentLocContainerIterator {
6049     ArgLocContainer *Container;
6050     unsigned Index;
6051 
6052   public:
6053     typedef TemplateArgumentLoc value_type;
6054     typedef TemplateArgumentLoc reference;
6055     typedef int difference_type;
6056     typedef std::input_iterator_tag iterator_category;
6057 
6058     class pointer {
6059       TemplateArgumentLoc Arg;
6060 
6061     public:
6062       explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { }
6063 
6064       const TemplateArgumentLoc *operator->() const {
6065         return &Arg;
6066       }
6067     };
6068 
6069 
6070     TemplateArgumentLocContainerIterator() {}
6071 
6072     TemplateArgumentLocContainerIterator(ArgLocContainer &Container,
6073                                  unsigned Index)
6074       : Container(&Container), Index(Index) { }
6075 
6076     TemplateArgumentLocContainerIterator &operator++() {
6077       ++Index;
6078       return *this;
6079     }
6080 
6081     TemplateArgumentLocContainerIterator operator++(int) {
6082       TemplateArgumentLocContainerIterator Old(*this);
6083       ++(*this);
6084       return Old;
6085     }
6086 
6087     TemplateArgumentLoc operator*() const {
6088       return Container->getArgLoc(Index);
6089     }
6090 
6091     pointer operator->() const {
6092       return pointer(Container->getArgLoc(Index));
6093     }
6094 
6095     friend bool operator==(const TemplateArgumentLocContainerIterator &X,
6096                            const TemplateArgumentLocContainerIterator &Y) {
6097       return X.Container == Y.Container && X.Index == Y.Index;
6098     }
6099 
6100     friend bool operator!=(const TemplateArgumentLocContainerIterator &X,
6101                            const TemplateArgumentLocContainerIterator &Y) {
6102       return !(X == Y);
6103     }
6104   };
6105 
6106 template<typename Derived>
6107 QualType TreeTransform<Derived>::TransformAutoType(TypeLocBuilder &TLB,
6108                                                    AutoTypeLoc TL) {
6109   const AutoType *T = TL.getTypePtr();
6110   QualType OldDeduced = T->getDeducedType();
6111   QualType NewDeduced;
6112   if (!OldDeduced.isNull()) {
6113     NewDeduced = getDerived().TransformType(OldDeduced);
6114     if (NewDeduced.isNull())
6115       return QualType();
6116   }
6117 
6118   ConceptDecl *NewCD = nullptr;
6119   TemplateArgumentListInfo NewTemplateArgs;
6120   NestedNameSpecifierLoc NewNestedNameSpec;
6121   if (TL.getTypePtr()->isConstrained()) {
6122     NewCD = cast_or_null<ConceptDecl>(
6123         getDerived().TransformDecl(
6124             TL.getConceptNameLoc(),
6125             TL.getTypePtr()->getTypeConstraintConcept()));
6126 
6127     NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
6128     NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
6129     typedef TemplateArgumentLocContainerIterator<AutoTypeLoc> ArgIterator;
6130     if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
6131                                                 ArgIterator(TL,
6132                                                             TL.getNumArgs()),
6133                                                 NewTemplateArgs))
6134       return QualType();
6135 
6136     if (TL.getNestedNameSpecifierLoc()) {
6137       NewNestedNameSpec
6138         = getDerived().TransformNestedNameSpecifierLoc(
6139             TL.getNestedNameSpecifierLoc());
6140       if (!NewNestedNameSpec)
6141         return QualType();
6142     }
6143   }
6144 
6145   QualType Result = TL.getType();
6146   if (getDerived().AlwaysRebuild() || NewDeduced != OldDeduced ||
6147       T->isDependentType()) {
6148     llvm::SmallVector<TemplateArgument, 4> NewArgList;
6149     NewArgList.reserve(NewArgList.size());
6150     for (const auto &ArgLoc : NewTemplateArgs.arguments())
6151       NewArgList.push_back(ArgLoc.getArgument());
6152     Result = getDerived().RebuildAutoType(NewDeduced, T->getKeyword(), NewCD,
6153                                           NewArgList);
6154     if (Result.isNull())
6155       return QualType();
6156   }
6157 
6158   AutoTypeLoc NewTL = TLB.push<AutoTypeLoc>(Result);
6159   NewTL.setNameLoc(TL.getNameLoc());
6160   NewTL.setNestedNameSpecifierLoc(NewNestedNameSpec);
6161   NewTL.setTemplateKWLoc(TL.getTemplateKWLoc());
6162   NewTL.setConceptNameLoc(TL.getConceptNameLoc());
6163   NewTL.setFoundDecl(TL.getFoundDecl());
6164   NewTL.setLAngleLoc(TL.getLAngleLoc());
6165   NewTL.setRAngleLoc(TL.getRAngleLoc());
6166   for (unsigned I = 0; I < TL.getNumArgs(); ++I)
6167     NewTL.setArgLocInfo(I, NewTemplateArgs.arguments()[I].getLocInfo());
6168 
6169   return Result;
6170 }
6171 
6172 template <typename Derived>
6173 QualType TreeTransform<Derived>::TransformTemplateSpecializationType(
6174                                                         TypeLocBuilder &TLB,
6175                                            TemplateSpecializationTypeLoc TL,
6176                                                       TemplateName Template) {
6177   TemplateArgumentListInfo NewTemplateArgs;
6178   NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
6179   NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
6180   typedef TemplateArgumentLocContainerIterator<TemplateSpecializationTypeLoc>
6181     ArgIterator;
6182   if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
6183                                               ArgIterator(TL, TL.getNumArgs()),
6184                                               NewTemplateArgs))
6185     return QualType();
6186 
6187   // FIXME: maybe don't rebuild if all the template arguments are the same.
6188 
6189   QualType Result =
6190     getDerived().RebuildTemplateSpecializationType(Template,
6191                                                    TL.getTemplateNameLoc(),
6192                                                    NewTemplateArgs);
6193 
6194   if (!Result.isNull()) {
6195     // Specializations of template template parameters are represented as
6196     // TemplateSpecializationTypes, and substitution of type alias templates
6197     // within a dependent context can transform them into
6198     // DependentTemplateSpecializationTypes.
6199     if (isa<DependentTemplateSpecializationType>(Result)) {
6200       DependentTemplateSpecializationTypeLoc NewTL
6201         = TLB.push<DependentTemplateSpecializationTypeLoc>(Result);
6202       NewTL.setElaboratedKeywordLoc(SourceLocation());
6203       NewTL.setQualifierLoc(NestedNameSpecifierLoc());
6204       NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6205       NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6206       NewTL.setLAngleLoc(TL.getLAngleLoc());
6207       NewTL.setRAngleLoc(TL.getRAngleLoc());
6208       for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
6209         NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
6210       return Result;
6211     }
6212 
6213     TemplateSpecializationTypeLoc NewTL
6214       = TLB.push<TemplateSpecializationTypeLoc>(Result);
6215     NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6216     NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6217     NewTL.setLAngleLoc(TL.getLAngleLoc());
6218     NewTL.setRAngleLoc(TL.getRAngleLoc());
6219     for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
6220       NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
6221   }
6222 
6223   return Result;
6224 }
6225 
6226 template <typename Derived>
6227 QualType TreeTransform<Derived>::TransformDependentTemplateSpecializationType(
6228                                      TypeLocBuilder &TLB,
6229                                      DependentTemplateSpecializationTypeLoc TL,
6230                                      TemplateName Template,
6231                                      CXXScopeSpec &SS) {
6232   TemplateArgumentListInfo NewTemplateArgs;
6233   NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
6234   NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
6235   typedef TemplateArgumentLocContainerIterator<
6236             DependentTemplateSpecializationTypeLoc> ArgIterator;
6237   if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
6238                                               ArgIterator(TL, TL.getNumArgs()),
6239                                               NewTemplateArgs))
6240     return QualType();
6241 
6242   // FIXME: maybe don't rebuild if all the template arguments are the same.
6243 
6244   if (DependentTemplateName *DTN = Template.getAsDependentTemplateName()) {
6245     QualType Result
6246       = getSema().Context.getDependentTemplateSpecializationType(
6247                                                 TL.getTypePtr()->getKeyword(),
6248                                                          DTN->getQualifier(),
6249                                                          DTN->getIdentifier(),
6250                                                                NewTemplateArgs);
6251 
6252     DependentTemplateSpecializationTypeLoc NewTL
6253       = TLB.push<DependentTemplateSpecializationTypeLoc>(Result);
6254     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6255     NewTL.setQualifierLoc(SS.getWithLocInContext(SemaRef.Context));
6256     NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6257     NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6258     NewTL.setLAngleLoc(TL.getLAngleLoc());
6259     NewTL.setRAngleLoc(TL.getRAngleLoc());
6260     for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
6261       NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
6262     return Result;
6263   }
6264 
6265   QualType Result
6266     = getDerived().RebuildTemplateSpecializationType(Template,
6267                                                      TL.getTemplateNameLoc(),
6268                                                      NewTemplateArgs);
6269 
6270   if (!Result.isNull()) {
6271     /// FIXME: Wrap this in an elaborated-type-specifier?
6272     TemplateSpecializationTypeLoc NewTL
6273       = TLB.push<TemplateSpecializationTypeLoc>(Result);
6274     NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6275     NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6276     NewTL.setLAngleLoc(TL.getLAngleLoc());
6277     NewTL.setRAngleLoc(TL.getRAngleLoc());
6278     for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
6279       NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
6280   }
6281 
6282   return Result;
6283 }
6284 
6285 template<typename Derived>
6286 QualType
6287 TreeTransform<Derived>::TransformElaboratedType(TypeLocBuilder &TLB,
6288                                                 ElaboratedTypeLoc TL) {
6289   const ElaboratedType *T = TL.getTypePtr();
6290 
6291   NestedNameSpecifierLoc QualifierLoc;
6292   // NOTE: the qualifier in an ElaboratedType is optional.
6293   if (TL.getQualifierLoc()) {
6294     QualifierLoc
6295       = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc());
6296     if (!QualifierLoc)
6297       return QualType();
6298   }
6299 
6300   QualType NamedT = getDerived().TransformType(TLB, TL.getNamedTypeLoc());
6301   if (NamedT.isNull())
6302     return QualType();
6303 
6304   // C++0x [dcl.type.elab]p2:
6305   //   If the identifier resolves to a typedef-name or the simple-template-id
6306   //   resolves to an alias template specialization, the
6307   //   elaborated-type-specifier is ill-formed.
6308   if (T->getKeyword() != ETK_None && T->getKeyword() != ETK_Typename) {
6309     if (const TemplateSpecializationType *TST =
6310           NamedT->getAs<TemplateSpecializationType>()) {
6311       TemplateName Template = TST->getTemplateName();
6312       if (TypeAliasTemplateDecl *TAT = dyn_cast_or_null<TypeAliasTemplateDecl>(
6313               Template.getAsTemplateDecl())) {
6314         SemaRef.Diag(TL.getNamedTypeLoc().getBeginLoc(),
6315                      diag::err_tag_reference_non_tag)
6316             << TAT << Sema::NTK_TypeAliasTemplate
6317             << ElaboratedType::getTagTypeKindForKeyword(T->getKeyword());
6318         SemaRef.Diag(TAT->getLocation(), diag::note_declared_at);
6319       }
6320     }
6321   }
6322 
6323   QualType Result = TL.getType();
6324   if (getDerived().AlwaysRebuild() ||
6325       QualifierLoc != TL.getQualifierLoc() ||
6326       NamedT != T->getNamedType()) {
6327     Result = getDerived().RebuildElaboratedType(TL.getElaboratedKeywordLoc(),
6328                                                 T->getKeyword(),
6329                                                 QualifierLoc, NamedT);
6330     if (Result.isNull())
6331       return QualType();
6332   }
6333 
6334   ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
6335   NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6336   NewTL.setQualifierLoc(QualifierLoc);
6337   return Result;
6338 }
6339 
6340 template<typename Derived>
6341 QualType TreeTransform<Derived>::TransformAttributedType(
6342                                                 TypeLocBuilder &TLB,
6343                                                 AttributedTypeLoc TL) {
6344   const AttributedType *oldType = TL.getTypePtr();
6345   QualType modifiedType = getDerived().TransformType(TLB, TL.getModifiedLoc());
6346   if (modifiedType.isNull())
6347     return QualType();
6348 
6349   // oldAttr can be null if we started with a QualType rather than a TypeLoc.
6350   const Attr *oldAttr = TL.getAttr();
6351   const Attr *newAttr = oldAttr ? getDerived().TransformAttr(oldAttr) : nullptr;
6352   if (oldAttr && !newAttr)
6353     return QualType();
6354 
6355   QualType result = TL.getType();
6356 
6357   // FIXME: dependent operand expressions?
6358   if (getDerived().AlwaysRebuild() ||
6359       modifiedType != oldType->getModifiedType()) {
6360     // TODO: this is really lame; we should really be rebuilding the
6361     // equivalent type from first principles.
6362     QualType equivalentType
6363       = getDerived().TransformType(oldType->getEquivalentType());
6364     if (equivalentType.isNull())
6365       return QualType();
6366 
6367     // Check whether we can add nullability; it is only represented as
6368     // type sugar, and therefore cannot be diagnosed in any other way.
6369     if (auto nullability = oldType->getImmediateNullability()) {
6370       if (!modifiedType->canHaveNullability()) {
6371         SemaRef.Diag(TL.getAttr()->getLocation(),
6372                      diag::err_nullability_nonpointer)
6373             << DiagNullabilityKind(*nullability, false) << modifiedType;
6374         return QualType();
6375       }
6376     }
6377 
6378     result = SemaRef.Context.getAttributedType(TL.getAttrKind(),
6379                                                modifiedType,
6380                                                equivalentType);
6381   }
6382 
6383   AttributedTypeLoc newTL = TLB.push<AttributedTypeLoc>(result);
6384   newTL.setAttr(newAttr);
6385   return result;
6386 }
6387 
6388 template<typename Derived>
6389 QualType
6390 TreeTransform<Derived>::TransformParenType(TypeLocBuilder &TLB,
6391                                            ParenTypeLoc TL) {
6392   QualType Inner = getDerived().TransformType(TLB, TL.getInnerLoc());
6393   if (Inner.isNull())
6394     return QualType();
6395 
6396   QualType Result = TL.getType();
6397   if (getDerived().AlwaysRebuild() ||
6398       Inner != TL.getInnerLoc().getType()) {
6399     Result = getDerived().RebuildParenType(Inner);
6400     if (Result.isNull())
6401       return QualType();
6402   }
6403 
6404   ParenTypeLoc NewTL = TLB.push<ParenTypeLoc>(Result);
6405   NewTL.setLParenLoc(TL.getLParenLoc());
6406   NewTL.setRParenLoc(TL.getRParenLoc());
6407   return Result;
6408 }
6409 
6410 template <typename Derived>
6411 QualType
6412 TreeTransform<Derived>::TransformMacroQualifiedType(TypeLocBuilder &TLB,
6413                                                     MacroQualifiedTypeLoc TL) {
6414   QualType Inner = getDerived().TransformType(TLB, TL.getInnerLoc());
6415   if (Inner.isNull())
6416     return QualType();
6417 
6418   QualType Result = TL.getType();
6419   if (getDerived().AlwaysRebuild() || Inner != TL.getInnerLoc().getType()) {
6420     Result =
6421         getDerived().RebuildMacroQualifiedType(Inner, TL.getMacroIdentifier());
6422     if (Result.isNull())
6423       return QualType();
6424   }
6425 
6426   MacroQualifiedTypeLoc NewTL = TLB.push<MacroQualifiedTypeLoc>(Result);
6427   NewTL.setExpansionLoc(TL.getExpansionLoc());
6428   return Result;
6429 }
6430 
6431 template<typename Derived>
6432 QualType TreeTransform<Derived>::TransformDependentNameType(
6433     TypeLocBuilder &TLB, DependentNameTypeLoc TL) {
6434   return TransformDependentNameType(TLB, TL, false);
6435 }
6436 
6437 template<typename Derived>
6438 QualType TreeTransform<Derived>::TransformDependentNameType(
6439     TypeLocBuilder &TLB, DependentNameTypeLoc TL, bool DeducedTSTContext) {
6440   const DependentNameType *T = TL.getTypePtr();
6441 
6442   NestedNameSpecifierLoc QualifierLoc
6443     = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc());
6444   if (!QualifierLoc)
6445     return QualType();
6446 
6447   QualType Result
6448     = getDerived().RebuildDependentNameType(T->getKeyword(),
6449                                             TL.getElaboratedKeywordLoc(),
6450                                             QualifierLoc,
6451                                             T->getIdentifier(),
6452                                             TL.getNameLoc(),
6453                                             DeducedTSTContext);
6454   if (Result.isNull())
6455     return QualType();
6456 
6457   if (const ElaboratedType* ElabT = Result->getAs<ElaboratedType>()) {
6458     QualType NamedT = ElabT->getNamedType();
6459     TLB.pushTypeSpec(NamedT).setNameLoc(TL.getNameLoc());
6460 
6461     ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
6462     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6463     NewTL.setQualifierLoc(QualifierLoc);
6464   } else {
6465     DependentNameTypeLoc NewTL = TLB.push<DependentNameTypeLoc>(Result);
6466     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6467     NewTL.setQualifierLoc(QualifierLoc);
6468     NewTL.setNameLoc(TL.getNameLoc());
6469   }
6470   return Result;
6471 }
6472 
6473 template<typename Derived>
6474 QualType TreeTransform<Derived>::
6475           TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB,
6476                                  DependentTemplateSpecializationTypeLoc TL) {
6477   NestedNameSpecifierLoc QualifierLoc;
6478   if (TL.getQualifierLoc()) {
6479     QualifierLoc
6480       = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc());
6481     if (!QualifierLoc)
6482       return QualType();
6483   }
6484 
6485   return getDerived()
6486            .TransformDependentTemplateSpecializationType(TLB, TL, QualifierLoc);
6487 }
6488 
6489 template<typename Derived>
6490 QualType TreeTransform<Derived>::
6491 TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB,
6492                                    DependentTemplateSpecializationTypeLoc TL,
6493                                        NestedNameSpecifierLoc QualifierLoc) {
6494   const DependentTemplateSpecializationType *T = TL.getTypePtr();
6495 
6496   TemplateArgumentListInfo NewTemplateArgs;
6497   NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
6498   NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
6499 
6500   typedef TemplateArgumentLocContainerIterator<
6501   DependentTemplateSpecializationTypeLoc> ArgIterator;
6502   if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
6503                                               ArgIterator(TL, TL.getNumArgs()),
6504                                               NewTemplateArgs))
6505     return QualType();
6506 
6507   QualType Result = getDerived().RebuildDependentTemplateSpecializationType(
6508       T->getKeyword(), QualifierLoc, TL.getTemplateKeywordLoc(),
6509       T->getIdentifier(), TL.getTemplateNameLoc(), NewTemplateArgs,
6510       /*AllowInjectedClassName*/ false);
6511   if (Result.isNull())
6512     return QualType();
6513 
6514   if (const ElaboratedType *ElabT = dyn_cast<ElaboratedType>(Result)) {
6515     QualType NamedT = ElabT->getNamedType();
6516 
6517     // Copy information relevant to the template specialization.
6518     TemplateSpecializationTypeLoc NamedTL
6519       = TLB.push<TemplateSpecializationTypeLoc>(NamedT);
6520     NamedTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6521     NamedTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6522     NamedTL.setLAngleLoc(TL.getLAngleLoc());
6523     NamedTL.setRAngleLoc(TL.getRAngleLoc());
6524     for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I)
6525       NamedTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo());
6526 
6527     // Copy information relevant to the elaborated type.
6528     ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
6529     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6530     NewTL.setQualifierLoc(QualifierLoc);
6531   } else if (isa<DependentTemplateSpecializationType>(Result)) {
6532     DependentTemplateSpecializationTypeLoc SpecTL
6533       = TLB.push<DependentTemplateSpecializationTypeLoc>(Result);
6534     SpecTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6535     SpecTL.setQualifierLoc(QualifierLoc);
6536     SpecTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6537     SpecTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6538     SpecTL.setLAngleLoc(TL.getLAngleLoc());
6539     SpecTL.setRAngleLoc(TL.getRAngleLoc());
6540     for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I)
6541       SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo());
6542   } else {
6543     TemplateSpecializationTypeLoc SpecTL
6544       = TLB.push<TemplateSpecializationTypeLoc>(Result);
6545     SpecTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6546     SpecTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6547     SpecTL.setLAngleLoc(TL.getLAngleLoc());
6548     SpecTL.setRAngleLoc(TL.getRAngleLoc());
6549     for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I)
6550       SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo());
6551   }
6552   return Result;
6553 }
6554 
6555 template<typename Derived>
6556 QualType TreeTransform<Derived>::TransformPackExpansionType(TypeLocBuilder &TLB,
6557                                                       PackExpansionTypeLoc TL) {
6558   QualType Pattern
6559     = getDerived().TransformType(TLB, TL.getPatternLoc());
6560   if (Pattern.isNull())
6561     return QualType();
6562 
6563   QualType Result = TL.getType();
6564   if (getDerived().AlwaysRebuild() ||
6565       Pattern != TL.getPatternLoc().getType()) {
6566     Result = getDerived().RebuildPackExpansionType(Pattern,
6567                                            TL.getPatternLoc().getSourceRange(),
6568                                                    TL.getEllipsisLoc(),
6569                                            TL.getTypePtr()->getNumExpansions());
6570     if (Result.isNull())
6571       return QualType();
6572   }
6573 
6574   PackExpansionTypeLoc NewT = TLB.push<PackExpansionTypeLoc>(Result);
6575   NewT.setEllipsisLoc(TL.getEllipsisLoc());
6576   return Result;
6577 }
6578 
6579 template<typename Derived>
6580 QualType
6581 TreeTransform<Derived>::TransformObjCInterfaceType(TypeLocBuilder &TLB,
6582                                                    ObjCInterfaceTypeLoc TL) {
6583   // ObjCInterfaceType is never dependent.
6584   TLB.pushFullCopy(TL);
6585   return TL.getType();
6586 }
6587 
6588 template<typename Derived>
6589 QualType
6590 TreeTransform<Derived>::TransformObjCTypeParamType(TypeLocBuilder &TLB,
6591                                                    ObjCTypeParamTypeLoc TL) {
6592   const ObjCTypeParamType *T = TL.getTypePtr();
6593   ObjCTypeParamDecl *OTP = cast_or_null<ObjCTypeParamDecl>(
6594       getDerived().TransformDecl(T->getDecl()->getLocation(), T->getDecl()));
6595   if (!OTP)
6596     return QualType();
6597 
6598   QualType Result = TL.getType();
6599   if (getDerived().AlwaysRebuild() ||
6600       OTP != T->getDecl()) {
6601     Result = getDerived().RebuildObjCTypeParamType(OTP,
6602                  TL.getProtocolLAngleLoc(),
6603                  llvm::makeArrayRef(TL.getTypePtr()->qual_begin(),
6604                                     TL.getNumProtocols()),
6605                  TL.getProtocolLocs(),
6606                  TL.getProtocolRAngleLoc());
6607     if (Result.isNull())
6608       return QualType();
6609   }
6610 
6611   ObjCTypeParamTypeLoc NewTL = TLB.push<ObjCTypeParamTypeLoc>(Result);
6612   if (TL.getNumProtocols()) {
6613     NewTL.setProtocolLAngleLoc(TL.getProtocolLAngleLoc());
6614     for (unsigned i = 0, n = TL.getNumProtocols(); i != n; ++i)
6615       NewTL.setProtocolLoc(i, TL.getProtocolLoc(i));
6616     NewTL.setProtocolRAngleLoc(TL.getProtocolRAngleLoc());
6617   }
6618   return Result;
6619 }
6620 
6621 template<typename Derived>
6622 QualType
6623 TreeTransform<Derived>::TransformObjCObjectType(TypeLocBuilder &TLB,
6624                                                 ObjCObjectTypeLoc TL) {
6625   // Transform base type.
6626   QualType BaseType = getDerived().TransformType(TLB, TL.getBaseLoc());
6627   if (BaseType.isNull())
6628     return QualType();
6629 
6630   bool AnyChanged = BaseType != TL.getBaseLoc().getType();
6631 
6632   // Transform type arguments.
6633   SmallVector<TypeSourceInfo *, 4> NewTypeArgInfos;
6634   for (unsigned i = 0, n = TL.getNumTypeArgs(); i != n; ++i) {
6635     TypeSourceInfo *TypeArgInfo = TL.getTypeArgTInfo(i);
6636     TypeLoc TypeArgLoc = TypeArgInfo->getTypeLoc();
6637     QualType TypeArg = TypeArgInfo->getType();
6638     if (auto PackExpansionLoc = TypeArgLoc.getAs<PackExpansionTypeLoc>()) {
6639       AnyChanged = true;
6640 
6641       // We have a pack expansion. Instantiate it.
6642       const auto *PackExpansion = PackExpansionLoc.getType()
6643                                     ->castAs<PackExpansionType>();
6644       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
6645       SemaRef.collectUnexpandedParameterPacks(PackExpansion->getPattern(),
6646                                               Unexpanded);
6647       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
6648 
6649       // Determine whether the set of unexpanded parameter packs can
6650       // and should be expanded.
6651       TypeLoc PatternLoc = PackExpansionLoc.getPatternLoc();
6652       bool Expand = false;
6653       bool RetainExpansion = false;
6654       Optional<unsigned> NumExpansions = PackExpansion->getNumExpansions();
6655       if (getDerived().TryExpandParameterPacks(
6656             PackExpansionLoc.getEllipsisLoc(), PatternLoc.getSourceRange(),
6657             Unexpanded, Expand, RetainExpansion, NumExpansions))
6658         return QualType();
6659 
6660       if (!Expand) {
6661         // We can't expand this pack expansion into separate arguments yet;
6662         // just substitute into the pattern and create a new pack expansion
6663         // type.
6664         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
6665 
6666         TypeLocBuilder TypeArgBuilder;
6667         TypeArgBuilder.reserve(PatternLoc.getFullDataSize());
6668         QualType NewPatternType = getDerived().TransformType(TypeArgBuilder,
6669                                                              PatternLoc);
6670         if (NewPatternType.isNull())
6671           return QualType();
6672 
6673         QualType NewExpansionType = SemaRef.Context.getPackExpansionType(
6674                                       NewPatternType, NumExpansions);
6675         auto NewExpansionLoc = TLB.push<PackExpansionTypeLoc>(NewExpansionType);
6676         NewExpansionLoc.setEllipsisLoc(PackExpansionLoc.getEllipsisLoc());
6677         NewTypeArgInfos.push_back(
6678           TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewExpansionType));
6679         continue;
6680       }
6681 
6682       // Substitute into the pack expansion pattern for each slice of the
6683       // pack.
6684       for (unsigned ArgIdx = 0; ArgIdx != *NumExpansions; ++ArgIdx) {
6685         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), ArgIdx);
6686 
6687         TypeLocBuilder TypeArgBuilder;
6688         TypeArgBuilder.reserve(PatternLoc.getFullDataSize());
6689 
6690         QualType NewTypeArg = getDerived().TransformType(TypeArgBuilder,
6691                                                          PatternLoc);
6692         if (NewTypeArg.isNull())
6693           return QualType();
6694 
6695         NewTypeArgInfos.push_back(
6696           TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewTypeArg));
6697       }
6698 
6699       continue;
6700     }
6701 
6702     TypeLocBuilder TypeArgBuilder;
6703     TypeArgBuilder.reserve(TypeArgLoc.getFullDataSize());
6704     QualType NewTypeArg = getDerived().TransformType(TypeArgBuilder, TypeArgLoc);
6705     if (NewTypeArg.isNull())
6706       return QualType();
6707 
6708     // If nothing changed, just keep the old TypeSourceInfo.
6709     if (NewTypeArg == TypeArg) {
6710       NewTypeArgInfos.push_back(TypeArgInfo);
6711       continue;
6712     }
6713 
6714     NewTypeArgInfos.push_back(
6715       TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewTypeArg));
6716     AnyChanged = true;
6717   }
6718 
6719   QualType Result = TL.getType();
6720   if (getDerived().AlwaysRebuild() || AnyChanged) {
6721     // Rebuild the type.
6722     Result = getDerived().RebuildObjCObjectType(
6723         BaseType, TL.getBeginLoc(), TL.getTypeArgsLAngleLoc(), NewTypeArgInfos,
6724         TL.getTypeArgsRAngleLoc(), TL.getProtocolLAngleLoc(),
6725         llvm::makeArrayRef(TL.getTypePtr()->qual_begin(), TL.getNumProtocols()),
6726         TL.getProtocolLocs(), TL.getProtocolRAngleLoc());
6727 
6728     if (Result.isNull())
6729       return QualType();
6730   }
6731 
6732   ObjCObjectTypeLoc NewT = TLB.push<ObjCObjectTypeLoc>(Result);
6733   NewT.setHasBaseTypeAsWritten(true);
6734   NewT.setTypeArgsLAngleLoc(TL.getTypeArgsLAngleLoc());
6735   for (unsigned i = 0, n = TL.getNumTypeArgs(); i != n; ++i)
6736     NewT.setTypeArgTInfo(i, NewTypeArgInfos[i]);
6737   NewT.setTypeArgsRAngleLoc(TL.getTypeArgsRAngleLoc());
6738   NewT.setProtocolLAngleLoc(TL.getProtocolLAngleLoc());
6739   for (unsigned i = 0, n = TL.getNumProtocols(); i != n; ++i)
6740     NewT.setProtocolLoc(i, TL.getProtocolLoc(i));
6741   NewT.setProtocolRAngleLoc(TL.getProtocolRAngleLoc());
6742   return Result;
6743 }
6744 
6745 template<typename Derived>
6746 QualType
6747 TreeTransform<Derived>::TransformObjCObjectPointerType(TypeLocBuilder &TLB,
6748                                                ObjCObjectPointerTypeLoc TL) {
6749   QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
6750   if (PointeeType.isNull())
6751     return QualType();
6752 
6753   QualType Result = TL.getType();
6754   if (getDerived().AlwaysRebuild() ||
6755       PointeeType != TL.getPointeeLoc().getType()) {
6756     Result = getDerived().RebuildObjCObjectPointerType(PointeeType,
6757                                                        TL.getStarLoc());
6758     if (Result.isNull())
6759       return QualType();
6760   }
6761 
6762   ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result);
6763   NewT.setStarLoc(TL.getStarLoc());
6764   return Result;
6765 }
6766 
6767 //===----------------------------------------------------------------------===//
6768 // Statement transformation
6769 //===----------------------------------------------------------------------===//
6770 template<typename Derived>
6771 StmtResult
6772 TreeTransform<Derived>::TransformNullStmt(NullStmt *S) {
6773   return S;
6774 }
6775 
6776 template<typename Derived>
6777 StmtResult
6778 TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S) {
6779   return getDerived().TransformCompoundStmt(S, false);
6780 }
6781 
6782 template<typename Derived>
6783 StmtResult
6784 TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S,
6785                                               bool IsStmtExpr) {
6786   Sema::CompoundScopeRAII CompoundScope(getSema());
6787 
6788   const Stmt *ExprResult = S->getStmtExprResult();
6789   bool SubStmtInvalid = false;
6790   bool SubStmtChanged = false;
6791   SmallVector<Stmt*, 8> Statements;
6792   for (auto *B : S->body()) {
6793     StmtResult Result = getDerived().TransformStmt(
6794         B, IsStmtExpr && B == ExprResult ? SDK_StmtExprResult : SDK_Discarded);
6795 
6796     if (Result.isInvalid()) {
6797       // Immediately fail if this was a DeclStmt, since it's very
6798       // likely that this will cause problems for future statements.
6799       if (isa<DeclStmt>(B))
6800         return StmtError();
6801 
6802       // Otherwise, just keep processing substatements and fail later.
6803       SubStmtInvalid = true;
6804       continue;
6805     }
6806 
6807     SubStmtChanged = SubStmtChanged || Result.get() != B;
6808     Statements.push_back(Result.getAs<Stmt>());
6809   }
6810 
6811   if (SubStmtInvalid)
6812     return StmtError();
6813 
6814   if (!getDerived().AlwaysRebuild() &&
6815       !SubStmtChanged)
6816     return S;
6817 
6818   return getDerived().RebuildCompoundStmt(S->getLBracLoc(),
6819                                           Statements,
6820                                           S->getRBracLoc(),
6821                                           IsStmtExpr);
6822 }
6823 
6824 template<typename Derived>
6825 StmtResult
6826 TreeTransform<Derived>::TransformCaseStmt(CaseStmt *S) {
6827   ExprResult LHS, RHS;
6828   {
6829     EnterExpressionEvaluationContext Unevaluated(
6830         SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
6831 
6832     // Transform the left-hand case value.
6833     LHS = getDerived().TransformExpr(S->getLHS());
6834     LHS = SemaRef.ActOnCaseExpr(S->getCaseLoc(), LHS);
6835     if (LHS.isInvalid())
6836       return StmtError();
6837 
6838     // Transform the right-hand case value (for the GNU case-range extension).
6839     RHS = getDerived().TransformExpr(S->getRHS());
6840     RHS = SemaRef.ActOnCaseExpr(S->getCaseLoc(), RHS);
6841     if (RHS.isInvalid())
6842       return StmtError();
6843   }
6844 
6845   // Build the case statement.
6846   // Case statements are always rebuilt so that they will attached to their
6847   // transformed switch statement.
6848   StmtResult Case = getDerived().RebuildCaseStmt(S->getCaseLoc(),
6849                                                        LHS.get(),
6850                                                        S->getEllipsisLoc(),
6851                                                        RHS.get(),
6852                                                        S->getColonLoc());
6853   if (Case.isInvalid())
6854     return StmtError();
6855 
6856   // Transform the statement following the case
6857   StmtResult SubStmt =
6858       getDerived().TransformStmt(S->getSubStmt());
6859   if (SubStmt.isInvalid())
6860     return StmtError();
6861 
6862   // Attach the body to the case statement
6863   return getDerived().RebuildCaseStmtBody(Case.get(), SubStmt.get());
6864 }
6865 
6866 template <typename Derived>
6867 StmtResult TreeTransform<Derived>::TransformDefaultStmt(DefaultStmt *S) {
6868   // Transform the statement following the default case
6869   StmtResult SubStmt =
6870       getDerived().TransformStmt(S->getSubStmt());
6871   if (SubStmt.isInvalid())
6872     return StmtError();
6873 
6874   // Default statements are always rebuilt
6875   return getDerived().RebuildDefaultStmt(S->getDefaultLoc(), S->getColonLoc(),
6876                                          SubStmt.get());
6877 }
6878 
6879 template<typename Derived>
6880 StmtResult
6881 TreeTransform<Derived>::TransformLabelStmt(LabelStmt *S, StmtDiscardKind SDK) {
6882   StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt(), SDK);
6883   if (SubStmt.isInvalid())
6884     return StmtError();
6885 
6886   Decl *LD = getDerived().TransformDecl(S->getDecl()->getLocation(),
6887                                         S->getDecl());
6888   if (!LD)
6889     return StmtError();
6890 
6891   // If we're transforming "in-place" (we're not creating new local
6892   // declarations), assume we're replacing the old label statement
6893   // and clear out the reference to it.
6894   if (LD == S->getDecl())
6895     S->getDecl()->setStmt(nullptr);
6896 
6897   // FIXME: Pass the real colon location in.
6898   return getDerived().RebuildLabelStmt(S->getIdentLoc(),
6899                                        cast<LabelDecl>(LD), SourceLocation(),
6900                                        SubStmt.get());
6901 }
6902 
6903 template <typename Derived>
6904 const Attr *TreeTransform<Derived>::TransformAttr(const Attr *R) {
6905   if (!R)
6906     return R;
6907 
6908   switch (R->getKind()) {
6909 // Transform attributes with a pragma spelling by calling TransformXXXAttr.
6910 #define ATTR(X)
6911 #define PRAGMA_SPELLING_ATTR(X)                                                \
6912   case attr::X:                                                                \
6913     return getDerived().Transform##X##Attr(cast<X##Attr>(R));
6914 #include "clang/Basic/AttrList.inc"
6915   default:
6916     return R;
6917   }
6918 }
6919 
6920 template <typename Derived>
6921 StmtResult
6922 TreeTransform<Derived>::TransformAttributedStmt(AttributedStmt *S,
6923                                                 StmtDiscardKind SDK) {
6924   bool AttrsChanged = false;
6925   SmallVector<const Attr *, 1> Attrs;
6926 
6927   // Visit attributes and keep track if any are transformed.
6928   for (const auto *I : S->getAttrs()) {
6929     const Attr *R = getDerived().TransformAttr(I);
6930     AttrsChanged |= (I != R);
6931     Attrs.push_back(R);
6932   }
6933 
6934   StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt(), SDK);
6935   if (SubStmt.isInvalid())
6936     return StmtError();
6937 
6938   if (SubStmt.get() == S->getSubStmt() && !AttrsChanged)
6939     return S;
6940 
6941   return getDerived().RebuildAttributedStmt(S->getAttrLoc(), Attrs,
6942                                             SubStmt.get());
6943 }
6944 
6945 template<typename Derived>
6946 StmtResult
6947 TreeTransform<Derived>::TransformIfStmt(IfStmt *S) {
6948   // Transform the initialization statement
6949   StmtResult Init = getDerived().TransformStmt(S->getInit());
6950   if (Init.isInvalid())
6951     return StmtError();
6952 
6953   // Transform the condition
6954   Sema::ConditionResult Cond = getDerived().TransformCondition(
6955       S->getIfLoc(), S->getConditionVariable(), S->getCond(),
6956       S->isConstexpr() ? Sema::ConditionKind::ConstexprIf
6957                        : Sema::ConditionKind::Boolean);
6958   if (Cond.isInvalid())
6959     return StmtError();
6960 
6961   // If this is a constexpr if, determine which arm we should instantiate.
6962   llvm::Optional<bool> ConstexprConditionValue;
6963   if (S->isConstexpr())
6964     ConstexprConditionValue = Cond.getKnownValue();
6965 
6966   // Transform the "then" branch.
6967   StmtResult Then;
6968   if (!ConstexprConditionValue || *ConstexprConditionValue) {
6969     Then = getDerived().TransformStmt(S->getThen());
6970     if (Then.isInvalid())
6971       return StmtError();
6972   } else {
6973     Then = new (getSema().Context) NullStmt(S->getThen()->getBeginLoc());
6974   }
6975 
6976   // Transform the "else" branch.
6977   StmtResult Else;
6978   if (!ConstexprConditionValue || !*ConstexprConditionValue) {
6979     Else = getDerived().TransformStmt(S->getElse());
6980     if (Else.isInvalid())
6981       return StmtError();
6982   }
6983 
6984   if (!getDerived().AlwaysRebuild() &&
6985       Init.get() == S->getInit() &&
6986       Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) &&
6987       Then.get() == S->getThen() &&
6988       Else.get() == S->getElse())
6989     return S;
6990 
6991   return getDerived().RebuildIfStmt(S->getIfLoc(), S->isConstexpr(), Cond,
6992                                     Init.get(), Then.get(), S->getElseLoc(),
6993                                     Else.get());
6994 }
6995 
6996 template<typename Derived>
6997 StmtResult
6998 TreeTransform<Derived>::TransformSwitchStmt(SwitchStmt *S) {
6999   // Transform the initialization statement
7000   StmtResult Init = getDerived().TransformStmt(S->getInit());
7001   if (Init.isInvalid())
7002     return StmtError();
7003 
7004   // Transform the condition.
7005   Sema::ConditionResult Cond = getDerived().TransformCondition(
7006       S->getSwitchLoc(), S->getConditionVariable(), S->getCond(),
7007       Sema::ConditionKind::Switch);
7008   if (Cond.isInvalid())
7009     return StmtError();
7010 
7011   // Rebuild the switch statement.
7012   StmtResult Switch
7013     = getDerived().RebuildSwitchStmtStart(S->getSwitchLoc(), Init.get(), Cond);
7014   if (Switch.isInvalid())
7015     return StmtError();
7016 
7017   // Transform the body of the switch statement.
7018   StmtResult Body = getDerived().TransformStmt(S->getBody());
7019   if (Body.isInvalid())
7020     return StmtError();
7021 
7022   // Complete the switch statement.
7023   return getDerived().RebuildSwitchStmtBody(S->getSwitchLoc(), Switch.get(),
7024                                             Body.get());
7025 }
7026 
7027 template<typename Derived>
7028 StmtResult
7029 TreeTransform<Derived>::TransformWhileStmt(WhileStmt *S) {
7030   // Transform the condition
7031   Sema::ConditionResult Cond = getDerived().TransformCondition(
7032       S->getWhileLoc(), S->getConditionVariable(), S->getCond(),
7033       Sema::ConditionKind::Boolean);
7034   if (Cond.isInvalid())
7035     return StmtError();
7036 
7037   // Transform the body
7038   StmtResult Body = getDerived().TransformStmt(S->getBody());
7039   if (Body.isInvalid())
7040     return StmtError();
7041 
7042   if (!getDerived().AlwaysRebuild() &&
7043       Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) &&
7044       Body.get() == S->getBody())
7045     return Owned(S);
7046 
7047   return getDerived().RebuildWhileStmt(S->getWhileLoc(), Cond, Body.get());
7048 }
7049 
7050 template<typename Derived>
7051 StmtResult
7052 TreeTransform<Derived>::TransformDoStmt(DoStmt *S) {
7053   // Transform the body
7054   StmtResult Body = getDerived().TransformStmt(S->getBody());
7055   if (Body.isInvalid())
7056     return StmtError();
7057 
7058   // Transform the condition
7059   ExprResult Cond = getDerived().TransformExpr(S->getCond());
7060   if (Cond.isInvalid())
7061     return StmtError();
7062 
7063   if (!getDerived().AlwaysRebuild() &&
7064       Cond.get() == S->getCond() &&
7065       Body.get() == S->getBody())
7066     return S;
7067 
7068   return getDerived().RebuildDoStmt(S->getDoLoc(), Body.get(), S->getWhileLoc(),
7069                                     /*FIXME:*/S->getWhileLoc(), Cond.get(),
7070                                     S->getRParenLoc());
7071 }
7072 
7073 template<typename Derived>
7074 StmtResult
7075 TreeTransform<Derived>::TransformForStmt(ForStmt *S) {
7076   if (getSema().getLangOpts().OpenMP)
7077     getSema().startOpenMPLoop();
7078 
7079   // Transform the initialization statement
7080   StmtResult Init = getDerived().TransformStmt(S->getInit());
7081   if (Init.isInvalid())
7082     return StmtError();
7083 
7084   // In OpenMP loop region loop control variable must be captured and be
7085   // private. Perform analysis of first part (if any).
7086   if (getSema().getLangOpts().OpenMP && Init.isUsable())
7087     getSema().ActOnOpenMPLoopInitialization(S->getForLoc(), Init.get());
7088 
7089   // Transform the condition
7090   Sema::ConditionResult Cond = getDerived().TransformCondition(
7091       S->getForLoc(), S->getConditionVariable(), S->getCond(),
7092       Sema::ConditionKind::Boolean);
7093   if (Cond.isInvalid())
7094     return StmtError();
7095 
7096   // Transform the increment
7097   ExprResult Inc = getDerived().TransformExpr(S->getInc());
7098   if (Inc.isInvalid())
7099     return StmtError();
7100 
7101   Sema::FullExprArg FullInc(getSema().MakeFullDiscardedValueExpr(Inc.get()));
7102   if (S->getInc() && !FullInc.get())
7103     return StmtError();
7104 
7105   // Transform the body
7106   StmtResult Body = getDerived().TransformStmt(S->getBody());
7107   if (Body.isInvalid())
7108     return StmtError();
7109 
7110   if (!getDerived().AlwaysRebuild() &&
7111       Init.get() == S->getInit() &&
7112       Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) &&
7113       Inc.get() == S->getInc() &&
7114       Body.get() == S->getBody())
7115     return S;
7116 
7117   return getDerived().RebuildForStmt(S->getForLoc(), S->getLParenLoc(),
7118                                      Init.get(), Cond, FullInc,
7119                                      S->getRParenLoc(), Body.get());
7120 }
7121 
7122 template<typename Derived>
7123 StmtResult
7124 TreeTransform<Derived>::TransformGotoStmt(GotoStmt *S) {
7125   Decl *LD = getDerived().TransformDecl(S->getLabel()->getLocation(),
7126                                         S->getLabel());
7127   if (!LD)
7128     return StmtError();
7129 
7130   // Goto statements must always be rebuilt, to resolve the label.
7131   return getDerived().RebuildGotoStmt(S->getGotoLoc(), S->getLabelLoc(),
7132                                       cast<LabelDecl>(LD));
7133 }
7134 
7135 template<typename Derived>
7136 StmtResult
7137 TreeTransform<Derived>::TransformIndirectGotoStmt(IndirectGotoStmt *S) {
7138   ExprResult Target = getDerived().TransformExpr(S->getTarget());
7139   if (Target.isInvalid())
7140     return StmtError();
7141   Target = SemaRef.MaybeCreateExprWithCleanups(Target.get());
7142 
7143   if (!getDerived().AlwaysRebuild() &&
7144       Target.get() == S->getTarget())
7145     return S;
7146 
7147   return getDerived().RebuildIndirectGotoStmt(S->getGotoLoc(), S->getStarLoc(),
7148                                               Target.get());
7149 }
7150 
7151 template<typename Derived>
7152 StmtResult
7153 TreeTransform<Derived>::TransformContinueStmt(ContinueStmt *S) {
7154   return S;
7155 }
7156 
7157 template<typename Derived>
7158 StmtResult
7159 TreeTransform<Derived>::TransformBreakStmt(BreakStmt *S) {
7160   return S;
7161 }
7162 
7163 template<typename Derived>
7164 StmtResult
7165 TreeTransform<Derived>::TransformReturnStmt(ReturnStmt *S) {
7166   ExprResult Result = getDerived().TransformInitializer(S->getRetValue(),
7167                                                         /*NotCopyInit*/false);
7168   if (Result.isInvalid())
7169     return StmtError();
7170 
7171   // FIXME: We always rebuild the return statement because there is no way
7172   // to tell whether the return type of the function has changed.
7173   return getDerived().RebuildReturnStmt(S->getReturnLoc(), Result.get());
7174 }
7175 
7176 template<typename Derived>
7177 StmtResult
7178 TreeTransform<Derived>::TransformDeclStmt(DeclStmt *S) {
7179   bool DeclChanged = false;
7180   SmallVector<Decl *, 4> Decls;
7181   for (auto *D : S->decls()) {
7182     Decl *Transformed = getDerived().TransformDefinition(D->getLocation(), D);
7183     if (!Transformed)
7184       return StmtError();
7185 
7186     if (Transformed != D)
7187       DeclChanged = true;
7188 
7189     Decls.push_back(Transformed);
7190   }
7191 
7192   if (!getDerived().AlwaysRebuild() && !DeclChanged)
7193     return S;
7194 
7195   return getDerived().RebuildDeclStmt(Decls, S->getBeginLoc(), S->getEndLoc());
7196 }
7197 
7198 template<typename Derived>
7199 StmtResult
7200 TreeTransform<Derived>::TransformGCCAsmStmt(GCCAsmStmt *S) {
7201 
7202   SmallVector<Expr*, 8> Constraints;
7203   SmallVector<Expr*, 8> Exprs;
7204   SmallVector<IdentifierInfo *, 4> Names;
7205 
7206   ExprResult AsmString;
7207   SmallVector<Expr*, 8> Clobbers;
7208 
7209   bool ExprsChanged = false;
7210 
7211   // Go through the outputs.
7212   for (unsigned I = 0, E = S->getNumOutputs(); I != E; ++I) {
7213     Names.push_back(S->getOutputIdentifier(I));
7214 
7215     // No need to transform the constraint literal.
7216     Constraints.push_back(S->getOutputConstraintLiteral(I));
7217 
7218     // Transform the output expr.
7219     Expr *OutputExpr = S->getOutputExpr(I);
7220     ExprResult Result = getDerived().TransformExpr(OutputExpr);
7221     if (Result.isInvalid())
7222       return StmtError();
7223 
7224     ExprsChanged |= Result.get() != OutputExpr;
7225 
7226     Exprs.push_back(Result.get());
7227   }
7228 
7229   // Go through the inputs.
7230   for (unsigned I = 0, E = S->getNumInputs(); I != E; ++I) {
7231     Names.push_back(S->getInputIdentifier(I));
7232 
7233     // No need to transform the constraint literal.
7234     Constraints.push_back(S->getInputConstraintLiteral(I));
7235 
7236     // Transform the input expr.
7237     Expr *InputExpr = S->getInputExpr(I);
7238     ExprResult Result = getDerived().TransformExpr(InputExpr);
7239     if (Result.isInvalid())
7240       return StmtError();
7241 
7242     ExprsChanged |= Result.get() != InputExpr;
7243 
7244     Exprs.push_back(Result.get());
7245   }
7246 
7247   // Go through the Labels.
7248   for (unsigned I = 0, E = S->getNumLabels(); I != E; ++I) {
7249     Names.push_back(S->getLabelIdentifier(I));
7250 
7251     ExprResult Result = getDerived().TransformExpr(S->getLabelExpr(I));
7252     if (Result.isInvalid())
7253       return StmtError();
7254     ExprsChanged |= Result.get() != S->getLabelExpr(I);
7255     Exprs.push_back(Result.get());
7256   }
7257   if (!getDerived().AlwaysRebuild() && !ExprsChanged)
7258     return S;
7259 
7260   // Go through the clobbers.
7261   for (unsigned I = 0, E = S->getNumClobbers(); I != E; ++I)
7262     Clobbers.push_back(S->getClobberStringLiteral(I));
7263 
7264   // No need to transform the asm string literal.
7265   AsmString = S->getAsmString();
7266   return getDerived().RebuildGCCAsmStmt(S->getAsmLoc(), S->isSimple(),
7267                                         S->isVolatile(), S->getNumOutputs(),
7268                                         S->getNumInputs(), Names.data(),
7269                                         Constraints, Exprs, AsmString.get(),
7270                                         Clobbers, S->getNumLabels(),
7271                                         S->getRParenLoc());
7272 }
7273 
7274 template<typename Derived>
7275 StmtResult
7276 TreeTransform<Derived>::TransformMSAsmStmt(MSAsmStmt *S) {
7277   ArrayRef<Token> AsmToks =
7278     llvm::makeArrayRef(S->getAsmToks(), S->getNumAsmToks());
7279 
7280   bool HadError = false, HadChange = false;
7281 
7282   ArrayRef<Expr*> SrcExprs = S->getAllExprs();
7283   SmallVector<Expr*, 8> TransformedExprs;
7284   TransformedExprs.reserve(SrcExprs.size());
7285   for (unsigned i = 0, e = SrcExprs.size(); i != e; ++i) {
7286     ExprResult Result = getDerived().TransformExpr(SrcExprs[i]);
7287     if (!Result.isUsable()) {
7288       HadError = true;
7289     } else {
7290       HadChange |= (Result.get() != SrcExprs[i]);
7291       TransformedExprs.push_back(Result.get());
7292     }
7293   }
7294 
7295   if (HadError) return StmtError();
7296   if (!HadChange && !getDerived().AlwaysRebuild())
7297     return Owned(S);
7298 
7299   return getDerived().RebuildMSAsmStmt(S->getAsmLoc(), S->getLBraceLoc(),
7300                                        AsmToks, S->getAsmString(),
7301                                        S->getNumOutputs(), S->getNumInputs(),
7302                                        S->getAllConstraints(), S->getClobbers(),
7303                                        TransformedExprs, S->getEndLoc());
7304 }
7305 
7306 // C++ Coroutines TS
7307 
7308 template<typename Derived>
7309 StmtResult
7310 TreeTransform<Derived>::TransformCoroutineBodyStmt(CoroutineBodyStmt *S) {
7311   auto *ScopeInfo = SemaRef.getCurFunction();
7312   auto *FD = cast<FunctionDecl>(SemaRef.CurContext);
7313   assert(FD && ScopeInfo && !ScopeInfo->CoroutinePromise &&
7314          ScopeInfo->NeedsCoroutineSuspends &&
7315          ScopeInfo->CoroutineSuspends.first == nullptr &&
7316          ScopeInfo->CoroutineSuspends.second == nullptr &&
7317          "expected clean scope info");
7318 
7319   // Set that we have (possibly-invalid) suspend points before we do anything
7320   // that may fail.
7321   ScopeInfo->setNeedsCoroutineSuspends(false);
7322 
7323   // We re-build the coroutine promise object (and the coroutine parameters its
7324   // type and constructor depend on) based on the types used in our current
7325   // function. We must do so, and set it on the current FunctionScopeInfo,
7326   // before attempting to transform the other parts of the coroutine body
7327   // statement, such as the implicit suspend statements (because those
7328   // statements reference the FunctionScopeInfo::CoroutinePromise).
7329   if (!SemaRef.buildCoroutineParameterMoves(FD->getLocation()))
7330     return StmtError();
7331   auto *Promise = SemaRef.buildCoroutinePromise(FD->getLocation());
7332   if (!Promise)
7333     return StmtError();
7334   getDerived().transformedLocalDecl(S->getPromiseDecl(), {Promise});
7335   ScopeInfo->CoroutinePromise = Promise;
7336 
7337   // Transform the implicit coroutine statements constructed using dependent
7338   // types during the previous parse: initial and final suspensions, the return
7339   // object, and others. We also transform the coroutine function's body.
7340   StmtResult InitSuspend = getDerived().TransformStmt(S->getInitSuspendStmt());
7341   if (InitSuspend.isInvalid())
7342     return StmtError();
7343   StmtResult FinalSuspend =
7344       getDerived().TransformStmt(S->getFinalSuspendStmt());
7345   if (FinalSuspend.isInvalid())
7346     return StmtError();
7347   ScopeInfo->setCoroutineSuspends(InitSuspend.get(), FinalSuspend.get());
7348   assert(isa<Expr>(InitSuspend.get()) && isa<Expr>(FinalSuspend.get()));
7349 
7350   StmtResult BodyRes = getDerived().TransformStmt(S->getBody());
7351   if (BodyRes.isInvalid())
7352     return StmtError();
7353 
7354   CoroutineStmtBuilder Builder(SemaRef, *FD, *ScopeInfo, BodyRes.get());
7355   if (Builder.isInvalid())
7356     return StmtError();
7357 
7358   Expr *ReturnObject = S->getReturnValueInit();
7359   assert(ReturnObject && "the return object is expected to be valid");
7360   ExprResult Res = getDerived().TransformInitializer(ReturnObject,
7361                                                      /*NoCopyInit*/ false);
7362   if (Res.isInvalid())
7363     return StmtError();
7364   Builder.ReturnValue = Res.get();
7365 
7366   // If during the previous parse the coroutine still had a dependent promise
7367   // statement, we may need to build some implicit coroutine statements
7368   // (such as exception and fallthrough handlers) for the first time.
7369   if (S->hasDependentPromiseType()) {
7370     // We can only build these statements, however, if the current promise type
7371     // is not dependent.
7372     if (!Promise->getType()->isDependentType()) {
7373       assert(!S->getFallthroughHandler() && !S->getExceptionHandler() &&
7374              !S->getReturnStmtOnAllocFailure() && !S->getDeallocate() &&
7375              "these nodes should not have been built yet");
7376       if (!Builder.buildDependentStatements())
7377         return StmtError();
7378     }
7379   } else {
7380     if (auto *OnFallthrough = S->getFallthroughHandler()) {
7381       StmtResult Res = getDerived().TransformStmt(OnFallthrough);
7382       if (Res.isInvalid())
7383         return StmtError();
7384       Builder.OnFallthrough = Res.get();
7385     }
7386 
7387     if (auto *OnException = S->getExceptionHandler()) {
7388       StmtResult Res = getDerived().TransformStmt(OnException);
7389       if (Res.isInvalid())
7390         return StmtError();
7391       Builder.OnException = Res.get();
7392     }
7393 
7394     if (auto *OnAllocFailure = S->getReturnStmtOnAllocFailure()) {
7395       StmtResult Res = getDerived().TransformStmt(OnAllocFailure);
7396       if (Res.isInvalid())
7397         return StmtError();
7398       Builder.ReturnStmtOnAllocFailure = Res.get();
7399     }
7400 
7401     // Transform any additional statements we may have already built
7402     assert(S->getAllocate() && S->getDeallocate() &&
7403            "allocation and deallocation calls must already be built");
7404     ExprResult AllocRes = getDerived().TransformExpr(S->getAllocate());
7405     if (AllocRes.isInvalid())
7406       return StmtError();
7407     Builder.Allocate = AllocRes.get();
7408 
7409     ExprResult DeallocRes = getDerived().TransformExpr(S->getDeallocate());
7410     if (DeallocRes.isInvalid())
7411       return StmtError();
7412     Builder.Deallocate = DeallocRes.get();
7413 
7414     assert(S->getResultDecl() && "ResultDecl must already be built");
7415     StmtResult ResultDecl = getDerived().TransformStmt(S->getResultDecl());
7416     if (ResultDecl.isInvalid())
7417       return StmtError();
7418     Builder.ResultDecl = ResultDecl.get();
7419 
7420     if (auto *ReturnStmt = S->getReturnStmt()) {
7421       StmtResult Res = getDerived().TransformStmt(ReturnStmt);
7422       if (Res.isInvalid())
7423         return StmtError();
7424       Builder.ReturnStmt = Res.get();
7425     }
7426   }
7427 
7428   return getDerived().RebuildCoroutineBodyStmt(Builder);
7429 }
7430 
7431 template<typename Derived>
7432 StmtResult
7433 TreeTransform<Derived>::TransformCoreturnStmt(CoreturnStmt *S) {
7434   ExprResult Result = getDerived().TransformInitializer(S->getOperand(),
7435                                                         /*NotCopyInit*/false);
7436   if (Result.isInvalid())
7437     return StmtError();
7438 
7439   // Always rebuild; we don't know if this needs to be injected into a new
7440   // context or if the promise type has changed.
7441   return getDerived().RebuildCoreturnStmt(S->getKeywordLoc(), Result.get(),
7442                                           S->isImplicit());
7443 }
7444 
7445 template<typename Derived>
7446 ExprResult
7447 TreeTransform<Derived>::TransformCoawaitExpr(CoawaitExpr *E) {
7448   ExprResult Result = getDerived().TransformInitializer(E->getOperand(),
7449                                                         /*NotCopyInit*/false);
7450   if (Result.isInvalid())
7451     return ExprError();
7452 
7453   // Always rebuild; we don't know if this needs to be injected into a new
7454   // context or if the promise type has changed.
7455   return getDerived().RebuildCoawaitExpr(E->getKeywordLoc(), Result.get(),
7456                                          E->isImplicit());
7457 }
7458 
7459 template <typename Derived>
7460 ExprResult
7461 TreeTransform<Derived>::TransformDependentCoawaitExpr(DependentCoawaitExpr *E) {
7462   ExprResult OperandResult = getDerived().TransformInitializer(E->getOperand(),
7463                                                         /*NotCopyInit*/ false);
7464   if (OperandResult.isInvalid())
7465     return ExprError();
7466 
7467   ExprResult LookupResult = getDerived().TransformUnresolvedLookupExpr(
7468           E->getOperatorCoawaitLookup());
7469 
7470   if (LookupResult.isInvalid())
7471     return ExprError();
7472 
7473   // Always rebuild; we don't know if this needs to be injected into a new
7474   // context or if the promise type has changed.
7475   return getDerived().RebuildDependentCoawaitExpr(
7476       E->getKeywordLoc(), OperandResult.get(),
7477       cast<UnresolvedLookupExpr>(LookupResult.get()));
7478 }
7479 
7480 template<typename Derived>
7481 ExprResult
7482 TreeTransform<Derived>::TransformCoyieldExpr(CoyieldExpr *E) {
7483   ExprResult Result = getDerived().TransformInitializer(E->getOperand(),
7484                                                         /*NotCopyInit*/false);
7485   if (Result.isInvalid())
7486     return ExprError();
7487 
7488   // Always rebuild; we don't know if this needs to be injected into a new
7489   // context or if the promise type has changed.
7490   return getDerived().RebuildCoyieldExpr(E->getKeywordLoc(), Result.get());
7491 }
7492 
7493 // Objective-C Statements.
7494 
7495 template<typename Derived>
7496 StmtResult
7497 TreeTransform<Derived>::TransformObjCAtTryStmt(ObjCAtTryStmt *S) {
7498   // Transform the body of the @try.
7499   StmtResult TryBody = getDerived().TransformStmt(S->getTryBody());
7500   if (TryBody.isInvalid())
7501     return StmtError();
7502 
7503   // Transform the @catch statements (if present).
7504   bool AnyCatchChanged = false;
7505   SmallVector<Stmt*, 8> CatchStmts;
7506   for (unsigned I = 0, N = S->getNumCatchStmts(); I != N; ++I) {
7507     StmtResult Catch = getDerived().TransformStmt(S->getCatchStmt(I));
7508     if (Catch.isInvalid())
7509       return StmtError();
7510     if (Catch.get() != S->getCatchStmt(I))
7511       AnyCatchChanged = true;
7512     CatchStmts.push_back(Catch.get());
7513   }
7514 
7515   // Transform the @finally statement (if present).
7516   StmtResult Finally;
7517   if (S->getFinallyStmt()) {
7518     Finally = getDerived().TransformStmt(S->getFinallyStmt());
7519     if (Finally.isInvalid())
7520       return StmtError();
7521   }
7522 
7523   // If nothing changed, just retain this statement.
7524   if (!getDerived().AlwaysRebuild() &&
7525       TryBody.get() == S->getTryBody() &&
7526       !AnyCatchChanged &&
7527       Finally.get() == S->getFinallyStmt())
7528     return S;
7529 
7530   // Build a new statement.
7531   return getDerived().RebuildObjCAtTryStmt(S->getAtTryLoc(), TryBody.get(),
7532                                            CatchStmts, Finally.get());
7533 }
7534 
7535 template<typename Derived>
7536 StmtResult
7537 TreeTransform<Derived>::TransformObjCAtCatchStmt(ObjCAtCatchStmt *S) {
7538   // Transform the @catch parameter, if there is one.
7539   VarDecl *Var = nullptr;
7540   if (VarDecl *FromVar = S->getCatchParamDecl()) {
7541     TypeSourceInfo *TSInfo = nullptr;
7542     if (FromVar->getTypeSourceInfo()) {
7543       TSInfo = getDerived().TransformType(FromVar->getTypeSourceInfo());
7544       if (!TSInfo)
7545         return StmtError();
7546     }
7547 
7548     QualType T;
7549     if (TSInfo)
7550       T = TSInfo->getType();
7551     else {
7552       T = getDerived().TransformType(FromVar->getType());
7553       if (T.isNull())
7554         return StmtError();
7555     }
7556 
7557     Var = getDerived().RebuildObjCExceptionDecl(FromVar, TSInfo, T);
7558     if (!Var)
7559       return StmtError();
7560   }
7561 
7562   StmtResult Body = getDerived().TransformStmt(S->getCatchBody());
7563   if (Body.isInvalid())
7564     return StmtError();
7565 
7566   return getDerived().RebuildObjCAtCatchStmt(S->getAtCatchLoc(),
7567                                              S->getRParenLoc(),
7568                                              Var, Body.get());
7569 }
7570 
7571 template<typename Derived>
7572 StmtResult
7573 TreeTransform<Derived>::TransformObjCAtFinallyStmt(ObjCAtFinallyStmt *S) {
7574   // Transform the body.
7575   StmtResult Body = getDerived().TransformStmt(S->getFinallyBody());
7576   if (Body.isInvalid())
7577     return StmtError();
7578 
7579   // If nothing changed, just retain this statement.
7580   if (!getDerived().AlwaysRebuild() &&
7581       Body.get() == S->getFinallyBody())
7582     return S;
7583 
7584   // Build a new statement.
7585   return getDerived().RebuildObjCAtFinallyStmt(S->getAtFinallyLoc(),
7586                                                Body.get());
7587 }
7588 
7589 template<typename Derived>
7590 StmtResult
7591 TreeTransform<Derived>::TransformObjCAtThrowStmt(ObjCAtThrowStmt *S) {
7592   ExprResult Operand;
7593   if (S->getThrowExpr()) {
7594     Operand = getDerived().TransformExpr(S->getThrowExpr());
7595     if (Operand.isInvalid())
7596       return StmtError();
7597   }
7598 
7599   if (!getDerived().AlwaysRebuild() &&
7600       Operand.get() == S->getThrowExpr())
7601     return S;
7602 
7603   return getDerived().RebuildObjCAtThrowStmt(S->getThrowLoc(), Operand.get());
7604 }
7605 
7606 template<typename Derived>
7607 StmtResult
7608 TreeTransform<Derived>::TransformObjCAtSynchronizedStmt(
7609                                                   ObjCAtSynchronizedStmt *S) {
7610   // Transform the object we are locking.
7611   ExprResult Object = getDerived().TransformExpr(S->getSynchExpr());
7612   if (Object.isInvalid())
7613     return StmtError();
7614   Object =
7615     getDerived().RebuildObjCAtSynchronizedOperand(S->getAtSynchronizedLoc(),
7616                                                   Object.get());
7617   if (Object.isInvalid())
7618     return StmtError();
7619 
7620   // Transform the body.
7621   StmtResult Body = getDerived().TransformStmt(S->getSynchBody());
7622   if (Body.isInvalid())
7623     return StmtError();
7624 
7625   // If nothing change, just retain the current statement.
7626   if (!getDerived().AlwaysRebuild() &&
7627       Object.get() == S->getSynchExpr() &&
7628       Body.get() == S->getSynchBody())
7629     return S;
7630 
7631   // Build a new statement.
7632   return getDerived().RebuildObjCAtSynchronizedStmt(S->getAtSynchronizedLoc(),
7633                                                     Object.get(), Body.get());
7634 }
7635 
7636 template<typename Derived>
7637 StmtResult
7638 TreeTransform<Derived>::TransformObjCAutoreleasePoolStmt(
7639                                               ObjCAutoreleasePoolStmt *S) {
7640   // Transform the body.
7641   StmtResult Body = getDerived().TransformStmt(S->getSubStmt());
7642   if (Body.isInvalid())
7643     return StmtError();
7644 
7645   // If nothing changed, just retain this statement.
7646   if (!getDerived().AlwaysRebuild() &&
7647       Body.get() == S->getSubStmt())
7648     return S;
7649 
7650   // Build a new statement.
7651   return getDerived().RebuildObjCAutoreleasePoolStmt(
7652                         S->getAtLoc(), Body.get());
7653 }
7654 
7655 template<typename Derived>
7656 StmtResult
7657 TreeTransform<Derived>::TransformObjCForCollectionStmt(
7658                                                   ObjCForCollectionStmt *S) {
7659   // Transform the element statement.
7660   StmtResult Element =
7661       getDerived().TransformStmt(S->getElement(), SDK_NotDiscarded);
7662   if (Element.isInvalid())
7663     return StmtError();
7664 
7665   // Transform the collection expression.
7666   ExprResult Collection = getDerived().TransformExpr(S->getCollection());
7667   if (Collection.isInvalid())
7668     return StmtError();
7669 
7670   // Transform the body.
7671   StmtResult Body = getDerived().TransformStmt(S->getBody());
7672   if (Body.isInvalid())
7673     return StmtError();
7674 
7675   // If nothing changed, just retain this statement.
7676   if (!getDerived().AlwaysRebuild() &&
7677       Element.get() == S->getElement() &&
7678       Collection.get() == S->getCollection() &&
7679       Body.get() == S->getBody())
7680     return S;
7681 
7682   // Build a new statement.
7683   return getDerived().RebuildObjCForCollectionStmt(S->getForLoc(),
7684                                                    Element.get(),
7685                                                    Collection.get(),
7686                                                    S->getRParenLoc(),
7687                                                    Body.get());
7688 }
7689 
7690 template <typename Derived>
7691 StmtResult TreeTransform<Derived>::TransformCXXCatchStmt(CXXCatchStmt *S) {
7692   // Transform the exception declaration, if any.
7693   VarDecl *Var = nullptr;
7694   if (VarDecl *ExceptionDecl = S->getExceptionDecl()) {
7695     TypeSourceInfo *T =
7696         getDerived().TransformType(ExceptionDecl->getTypeSourceInfo());
7697     if (!T)
7698       return StmtError();
7699 
7700     Var = getDerived().RebuildExceptionDecl(
7701         ExceptionDecl, T, ExceptionDecl->getInnerLocStart(),
7702         ExceptionDecl->getLocation(), ExceptionDecl->getIdentifier());
7703     if (!Var || Var->isInvalidDecl())
7704       return StmtError();
7705   }
7706 
7707   // Transform the actual exception handler.
7708   StmtResult Handler = getDerived().TransformStmt(S->getHandlerBlock());
7709   if (Handler.isInvalid())
7710     return StmtError();
7711 
7712   if (!getDerived().AlwaysRebuild() && !Var &&
7713       Handler.get() == S->getHandlerBlock())
7714     return S;
7715 
7716   return getDerived().RebuildCXXCatchStmt(S->getCatchLoc(), Var, Handler.get());
7717 }
7718 
7719 template <typename Derived>
7720 StmtResult TreeTransform<Derived>::TransformCXXTryStmt(CXXTryStmt *S) {
7721   // Transform the try block itself.
7722   StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock());
7723   if (TryBlock.isInvalid())
7724     return StmtError();
7725 
7726   // Transform the handlers.
7727   bool HandlerChanged = false;
7728   SmallVector<Stmt *, 8> Handlers;
7729   for (unsigned I = 0, N = S->getNumHandlers(); I != N; ++I) {
7730     StmtResult Handler = getDerived().TransformCXXCatchStmt(S->getHandler(I));
7731     if (Handler.isInvalid())
7732       return StmtError();
7733 
7734     HandlerChanged = HandlerChanged || Handler.get() != S->getHandler(I);
7735     Handlers.push_back(Handler.getAs<Stmt>());
7736   }
7737 
7738   if (!getDerived().AlwaysRebuild() && TryBlock.get() == S->getTryBlock() &&
7739       !HandlerChanged)
7740     return S;
7741 
7742   return getDerived().RebuildCXXTryStmt(S->getTryLoc(), TryBlock.get(),
7743                                         Handlers);
7744 }
7745 
7746 template<typename Derived>
7747 StmtResult
7748 TreeTransform<Derived>::TransformCXXForRangeStmt(CXXForRangeStmt *S) {
7749   StmtResult Init =
7750       S->getInit() ? getDerived().TransformStmt(S->getInit()) : StmtResult();
7751   if (Init.isInvalid())
7752     return StmtError();
7753 
7754   StmtResult Range = getDerived().TransformStmt(S->getRangeStmt());
7755   if (Range.isInvalid())
7756     return StmtError();
7757 
7758   StmtResult Begin = getDerived().TransformStmt(S->getBeginStmt());
7759   if (Begin.isInvalid())
7760     return StmtError();
7761   StmtResult End = getDerived().TransformStmt(S->getEndStmt());
7762   if (End.isInvalid())
7763     return StmtError();
7764 
7765   ExprResult Cond = getDerived().TransformExpr(S->getCond());
7766   if (Cond.isInvalid())
7767     return StmtError();
7768   if (Cond.get())
7769     Cond = SemaRef.CheckBooleanCondition(S->getColonLoc(), Cond.get());
7770   if (Cond.isInvalid())
7771     return StmtError();
7772   if (Cond.get())
7773     Cond = SemaRef.MaybeCreateExprWithCleanups(Cond.get());
7774 
7775   ExprResult Inc = getDerived().TransformExpr(S->getInc());
7776   if (Inc.isInvalid())
7777     return StmtError();
7778   if (Inc.get())
7779     Inc = SemaRef.MaybeCreateExprWithCleanups(Inc.get());
7780 
7781   StmtResult LoopVar = getDerived().TransformStmt(S->getLoopVarStmt());
7782   if (LoopVar.isInvalid())
7783     return StmtError();
7784 
7785   StmtResult NewStmt = S;
7786   if (getDerived().AlwaysRebuild() ||
7787       Init.get() != S->getInit() ||
7788       Range.get() != S->getRangeStmt() ||
7789       Begin.get() != S->getBeginStmt() ||
7790       End.get() != S->getEndStmt() ||
7791       Cond.get() != S->getCond() ||
7792       Inc.get() != S->getInc() ||
7793       LoopVar.get() != S->getLoopVarStmt()) {
7794     NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(),
7795                                                   S->getCoawaitLoc(), Init.get(),
7796                                                   S->getColonLoc(), Range.get(),
7797                                                   Begin.get(), End.get(),
7798                                                   Cond.get(),
7799                                                   Inc.get(), LoopVar.get(),
7800                                                   S->getRParenLoc());
7801     if (NewStmt.isInvalid())
7802       return StmtError();
7803   }
7804 
7805   StmtResult Body = getDerived().TransformStmt(S->getBody());
7806   if (Body.isInvalid())
7807     return StmtError();
7808 
7809   // Body has changed but we didn't rebuild the for-range statement. Rebuild
7810   // it now so we have a new statement to attach the body to.
7811   if (Body.get() != S->getBody() && NewStmt.get() == S) {
7812     NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(),
7813                                                   S->getCoawaitLoc(), Init.get(),
7814                                                   S->getColonLoc(), Range.get(),
7815                                                   Begin.get(), End.get(),
7816                                                   Cond.get(),
7817                                                   Inc.get(), LoopVar.get(),
7818                                                   S->getRParenLoc());
7819     if (NewStmt.isInvalid())
7820       return StmtError();
7821   }
7822 
7823   if (NewStmt.get() == S)
7824     return S;
7825 
7826   return FinishCXXForRangeStmt(NewStmt.get(), Body.get());
7827 }
7828 
7829 template<typename Derived>
7830 StmtResult
7831 TreeTransform<Derived>::TransformMSDependentExistsStmt(
7832                                                     MSDependentExistsStmt *S) {
7833   // Transform the nested-name-specifier, if any.
7834   NestedNameSpecifierLoc QualifierLoc;
7835   if (S->getQualifierLoc()) {
7836     QualifierLoc
7837       = getDerived().TransformNestedNameSpecifierLoc(S->getQualifierLoc());
7838     if (!QualifierLoc)
7839       return StmtError();
7840   }
7841 
7842   // Transform the declaration name.
7843   DeclarationNameInfo NameInfo = S->getNameInfo();
7844   if (NameInfo.getName()) {
7845     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
7846     if (!NameInfo.getName())
7847       return StmtError();
7848   }
7849 
7850   // Check whether anything changed.
7851   if (!getDerived().AlwaysRebuild() &&
7852       QualifierLoc == S->getQualifierLoc() &&
7853       NameInfo.getName() == S->getNameInfo().getName())
7854     return S;
7855 
7856   // Determine whether this name exists, if we can.
7857   CXXScopeSpec SS;
7858   SS.Adopt(QualifierLoc);
7859   bool Dependent = false;
7860   switch (getSema().CheckMicrosoftIfExistsSymbol(/*S=*/nullptr, SS, NameInfo)) {
7861   case Sema::IER_Exists:
7862     if (S->isIfExists())
7863       break;
7864 
7865     return new (getSema().Context) NullStmt(S->getKeywordLoc());
7866 
7867   case Sema::IER_DoesNotExist:
7868     if (S->isIfNotExists())
7869       break;
7870 
7871     return new (getSema().Context) NullStmt(S->getKeywordLoc());
7872 
7873   case Sema::IER_Dependent:
7874     Dependent = true;
7875     break;
7876 
7877   case Sema::IER_Error:
7878     return StmtError();
7879   }
7880 
7881   // We need to continue with the instantiation, so do so now.
7882   StmtResult SubStmt = getDerived().TransformCompoundStmt(S->getSubStmt());
7883   if (SubStmt.isInvalid())
7884     return StmtError();
7885 
7886   // If we have resolved the name, just transform to the substatement.
7887   if (!Dependent)
7888     return SubStmt;
7889 
7890   // The name is still dependent, so build a dependent expression again.
7891   return getDerived().RebuildMSDependentExistsStmt(S->getKeywordLoc(),
7892                                                    S->isIfExists(),
7893                                                    QualifierLoc,
7894                                                    NameInfo,
7895                                                    SubStmt.get());
7896 }
7897 
7898 template<typename Derived>
7899 ExprResult
7900 TreeTransform<Derived>::TransformMSPropertyRefExpr(MSPropertyRefExpr *E) {
7901   NestedNameSpecifierLoc QualifierLoc;
7902   if (E->getQualifierLoc()) {
7903     QualifierLoc
7904     = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
7905     if (!QualifierLoc)
7906       return ExprError();
7907   }
7908 
7909   MSPropertyDecl *PD = cast_or_null<MSPropertyDecl>(
7910     getDerived().TransformDecl(E->getMemberLoc(), E->getPropertyDecl()));
7911   if (!PD)
7912     return ExprError();
7913 
7914   ExprResult Base = getDerived().TransformExpr(E->getBaseExpr());
7915   if (Base.isInvalid())
7916     return ExprError();
7917 
7918   return new (SemaRef.getASTContext())
7919       MSPropertyRefExpr(Base.get(), PD, E->isArrow(),
7920                         SemaRef.getASTContext().PseudoObjectTy, VK_LValue,
7921                         QualifierLoc, E->getMemberLoc());
7922 }
7923 
7924 template <typename Derived>
7925 ExprResult TreeTransform<Derived>::TransformMSPropertySubscriptExpr(
7926     MSPropertySubscriptExpr *E) {
7927   auto BaseRes = getDerived().TransformExpr(E->getBase());
7928   if (BaseRes.isInvalid())
7929     return ExprError();
7930   auto IdxRes = getDerived().TransformExpr(E->getIdx());
7931   if (IdxRes.isInvalid())
7932     return ExprError();
7933 
7934   if (!getDerived().AlwaysRebuild() &&
7935       BaseRes.get() == E->getBase() &&
7936       IdxRes.get() == E->getIdx())
7937     return E;
7938 
7939   return getDerived().RebuildArraySubscriptExpr(
7940       BaseRes.get(), SourceLocation(), IdxRes.get(), E->getRBracketLoc());
7941 }
7942 
7943 template <typename Derived>
7944 StmtResult TreeTransform<Derived>::TransformSEHTryStmt(SEHTryStmt *S) {
7945   StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock());
7946   if (TryBlock.isInvalid())
7947     return StmtError();
7948 
7949   StmtResult Handler = getDerived().TransformSEHHandler(S->getHandler());
7950   if (Handler.isInvalid())
7951     return StmtError();
7952 
7953   if (!getDerived().AlwaysRebuild() && TryBlock.get() == S->getTryBlock() &&
7954       Handler.get() == S->getHandler())
7955     return S;
7956 
7957   return getDerived().RebuildSEHTryStmt(S->getIsCXXTry(), S->getTryLoc(),
7958                                         TryBlock.get(), Handler.get());
7959 }
7960 
7961 template <typename Derived>
7962 StmtResult TreeTransform<Derived>::TransformSEHFinallyStmt(SEHFinallyStmt *S) {
7963   StmtResult Block = getDerived().TransformCompoundStmt(S->getBlock());
7964   if (Block.isInvalid())
7965     return StmtError();
7966 
7967   return getDerived().RebuildSEHFinallyStmt(S->getFinallyLoc(), Block.get());
7968 }
7969 
7970 template <typename Derived>
7971 StmtResult TreeTransform<Derived>::TransformSEHExceptStmt(SEHExceptStmt *S) {
7972   ExprResult FilterExpr = getDerived().TransformExpr(S->getFilterExpr());
7973   if (FilterExpr.isInvalid())
7974     return StmtError();
7975 
7976   StmtResult Block = getDerived().TransformCompoundStmt(S->getBlock());
7977   if (Block.isInvalid())
7978     return StmtError();
7979 
7980   return getDerived().RebuildSEHExceptStmt(S->getExceptLoc(), FilterExpr.get(),
7981                                            Block.get());
7982 }
7983 
7984 template <typename Derived>
7985 StmtResult TreeTransform<Derived>::TransformSEHHandler(Stmt *Handler) {
7986   if (isa<SEHFinallyStmt>(Handler))
7987     return getDerived().TransformSEHFinallyStmt(cast<SEHFinallyStmt>(Handler));
7988   else
7989     return getDerived().TransformSEHExceptStmt(cast<SEHExceptStmt>(Handler));
7990 }
7991 
7992 template<typename Derived>
7993 StmtResult
7994 TreeTransform<Derived>::TransformSEHLeaveStmt(SEHLeaveStmt *S) {
7995   return S;
7996 }
7997 
7998 //===----------------------------------------------------------------------===//
7999 // OpenMP directive transformation
8000 //===----------------------------------------------------------------------===//
8001 template <typename Derived>
8002 StmtResult TreeTransform<Derived>::TransformOMPExecutableDirective(
8003     OMPExecutableDirective *D) {
8004 
8005   // Transform the clauses
8006   llvm::SmallVector<OMPClause *, 16> TClauses;
8007   ArrayRef<OMPClause *> Clauses = D->clauses();
8008   TClauses.reserve(Clauses.size());
8009   for (ArrayRef<OMPClause *>::iterator I = Clauses.begin(), E = Clauses.end();
8010        I != E; ++I) {
8011     if (*I) {
8012       getDerived().getSema().StartOpenMPClause((*I)->getClauseKind());
8013       OMPClause *Clause = getDerived().TransformOMPClause(*I);
8014       getDerived().getSema().EndOpenMPClause();
8015       if (Clause)
8016         TClauses.push_back(Clause);
8017     } else {
8018       TClauses.push_back(nullptr);
8019     }
8020   }
8021   StmtResult AssociatedStmt;
8022   if (D->hasAssociatedStmt() && D->getAssociatedStmt()) {
8023     getDerived().getSema().ActOnOpenMPRegionStart(D->getDirectiveKind(),
8024                                                   /*CurScope=*/nullptr);
8025     StmtResult Body;
8026     {
8027       Sema::CompoundScopeRAII CompoundScope(getSema());
8028       Stmt *CS = D->getInnermostCapturedStmt()->getCapturedStmt();
8029       Body = getDerived().TransformStmt(CS);
8030     }
8031     AssociatedStmt =
8032         getDerived().getSema().ActOnOpenMPRegionEnd(Body, TClauses);
8033     if (AssociatedStmt.isInvalid()) {
8034       return StmtError();
8035     }
8036   }
8037   if (TClauses.size() != Clauses.size()) {
8038     return StmtError();
8039   }
8040 
8041   // Transform directive name for 'omp critical' directive.
8042   DeclarationNameInfo DirName;
8043   if (D->getDirectiveKind() == OMPD_critical) {
8044     DirName = cast<OMPCriticalDirective>(D)->getDirectiveName();
8045     DirName = getDerived().TransformDeclarationNameInfo(DirName);
8046   }
8047   OpenMPDirectiveKind CancelRegion = OMPD_unknown;
8048   if (D->getDirectiveKind() == OMPD_cancellation_point) {
8049     CancelRegion = cast<OMPCancellationPointDirective>(D)->getCancelRegion();
8050   } else if (D->getDirectiveKind() == OMPD_cancel) {
8051     CancelRegion = cast<OMPCancelDirective>(D)->getCancelRegion();
8052   }
8053 
8054   return getDerived().RebuildOMPExecutableDirective(
8055       D->getDirectiveKind(), DirName, CancelRegion, TClauses,
8056       AssociatedStmt.get(), D->getBeginLoc(), D->getEndLoc());
8057 }
8058 
8059 template <typename Derived>
8060 StmtResult
8061 TreeTransform<Derived>::TransformOMPParallelDirective(OMPParallelDirective *D) {
8062   DeclarationNameInfo DirName;
8063   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel, DirName, nullptr,
8064                                              D->getBeginLoc());
8065   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8066   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8067   return Res;
8068 }
8069 
8070 template <typename Derived>
8071 StmtResult
8072 TreeTransform<Derived>::TransformOMPSimdDirective(OMPSimdDirective *D) {
8073   DeclarationNameInfo DirName;
8074   getDerived().getSema().StartOpenMPDSABlock(OMPD_simd, DirName, nullptr,
8075                                              D->getBeginLoc());
8076   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8077   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8078   return Res;
8079 }
8080 
8081 template <typename Derived>
8082 StmtResult
8083 TreeTransform<Derived>::TransformOMPForDirective(OMPForDirective *D) {
8084   DeclarationNameInfo DirName;
8085   getDerived().getSema().StartOpenMPDSABlock(OMPD_for, DirName, nullptr,
8086                                              D->getBeginLoc());
8087   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8088   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8089   return Res;
8090 }
8091 
8092 template <typename Derived>
8093 StmtResult
8094 TreeTransform<Derived>::TransformOMPForSimdDirective(OMPForSimdDirective *D) {
8095   DeclarationNameInfo DirName;
8096   getDerived().getSema().StartOpenMPDSABlock(OMPD_for_simd, DirName, nullptr,
8097                                              D->getBeginLoc());
8098   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8099   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8100   return Res;
8101 }
8102 
8103 template <typename Derived>
8104 StmtResult
8105 TreeTransform<Derived>::TransformOMPSectionsDirective(OMPSectionsDirective *D) {
8106   DeclarationNameInfo DirName;
8107   getDerived().getSema().StartOpenMPDSABlock(OMPD_sections, DirName, nullptr,
8108                                              D->getBeginLoc());
8109   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8110   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8111   return Res;
8112 }
8113 
8114 template <typename Derived>
8115 StmtResult
8116 TreeTransform<Derived>::TransformOMPSectionDirective(OMPSectionDirective *D) {
8117   DeclarationNameInfo DirName;
8118   getDerived().getSema().StartOpenMPDSABlock(OMPD_section, DirName, nullptr,
8119                                              D->getBeginLoc());
8120   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8121   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8122   return Res;
8123 }
8124 
8125 template <typename Derived>
8126 StmtResult
8127 TreeTransform<Derived>::TransformOMPSingleDirective(OMPSingleDirective *D) {
8128   DeclarationNameInfo DirName;
8129   getDerived().getSema().StartOpenMPDSABlock(OMPD_single, DirName, nullptr,
8130                                              D->getBeginLoc());
8131   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8132   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8133   return Res;
8134 }
8135 
8136 template <typename Derived>
8137 StmtResult
8138 TreeTransform<Derived>::TransformOMPMasterDirective(OMPMasterDirective *D) {
8139   DeclarationNameInfo DirName;
8140   getDerived().getSema().StartOpenMPDSABlock(OMPD_master, DirName, nullptr,
8141                                              D->getBeginLoc());
8142   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8143   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8144   return Res;
8145 }
8146 
8147 template <typename Derived>
8148 StmtResult
8149 TreeTransform<Derived>::TransformOMPCriticalDirective(OMPCriticalDirective *D) {
8150   getDerived().getSema().StartOpenMPDSABlock(
8151       OMPD_critical, D->getDirectiveName(), nullptr, D->getBeginLoc());
8152   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8153   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8154   return Res;
8155 }
8156 
8157 template <typename Derived>
8158 StmtResult TreeTransform<Derived>::TransformOMPParallelForDirective(
8159     OMPParallelForDirective *D) {
8160   DeclarationNameInfo DirName;
8161   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_for, DirName,
8162                                              nullptr, D->getBeginLoc());
8163   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8164   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8165   return Res;
8166 }
8167 
8168 template <typename Derived>
8169 StmtResult TreeTransform<Derived>::TransformOMPParallelForSimdDirective(
8170     OMPParallelForSimdDirective *D) {
8171   DeclarationNameInfo DirName;
8172   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_for_simd, DirName,
8173                                              nullptr, D->getBeginLoc());
8174   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8175   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8176   return Res;
8177 }
8178 
8179 template <typename Derived>
8180 StmtResult TreeTransform<Derived>::TransformOMPParallelMasterDirective(
8181     OMPParallelMasterDirective *D) {
8182   DeclarationNameInfo DirName;
8183   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_master, DirName,
8184                                              nullptr, D->getBeginLoc());
8185   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8186   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8187   return Res;
8188 }
8189 
8190 template <typename Derived>
8191 StmtResult TreeTransform<Derived>::TransformOMPParallelSectionsDirective(
8192     OMPParallelSectionsDirective *D) {
8193   DeclarationNameInfo DirName;
8194   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_sections, DirName,
8195                                              nullptr, D->getBeginLoc());
8196   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8197   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8198   return Res;
8199 }
8200 
8201 template <typename Derived>
8202 StmtResult
8203 TreeTransform<Derived>::TransformOMPTaskDirective(OMPTaskDirective *D) {
8204   DeclarationNameInfo DirName;
8205   getDerived().getSema().StartOpenMPDSABlock(OMPD_task, DirName, nullptr,
8206                                              D->getBeginLoc());
8207   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8208   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8209   return Res;
8210 }
8211 
8212 template <typename Derived>
8213 StmtResult TreeTransform<Derived>::TransformOMPTaskyieldDirective(
8214     OMPTaskyieldDirective *D) {
8215   DeclarationNameInfo DirName;
8216   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskyield, DirName, nullptr,
8217                                              D->getBeginLoc());
8218   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8219   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8220   return Res;
8221 }
8222 
8223 template <typename Derived>
8224 StmtResult
8225 TreeTransform<Derived>::TransformOMPBarrierDirective(OMPBarrierDirective *D) {
8226   DeclarationNameInfo DirName;
8227   getDerived().getSema().StartOpenMPDSABlock(OMPD_barrier, DirName, nullptr,
8228                                              D->getBeginLoc());
8229   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8230   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8231   return Res;
8232 }
8233 
8234 template <typename Derived>
8235 StmtResult
8236 TreeTransform<Derived>::TransformOMPTaskwaitDirective(OMPTaskwaitDirective *D) {
8237   DeclarationNameInfo DirName;
8238   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskwait, DirName, nullptr,
8239                                              D->getBeginLoc());
8240   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8241   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8242   return Res;
8243 }
8244 
8245 template <typename Derived>
8246 StmtResult TreeTransform<Derived>::TransformOMPTaskgroupDirective(
8247     OMPTaskgroupDirective *D) {
8248   DeclarationNameInfo DirName;
8249   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskgroup, DirName, nullptr,
8250                                              D->getBeginLoc());
8251   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8252   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8253   return Res;
8254 }
8255 
8256 template <typename Derived>
8257 StmtResult
8258 TreeTransform<Derived>::TransformOMPFlushDirective(OMPFlushDirective *D) {
8259   DeclarationNameInfo DirName;
8260   getDerived().getSema().StartOpenMPDSABlock(OMPD_flush, DirName, nullptr,
8261                                              D->getBeginLoc());
8262   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8263   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8264   return Res;
8265 }
8266 
8267 template <typename Derived>
8268 StmtResult
8269 TreeTransform<Derived>::TransformOMPOrderedDirective(OMPOrderedDirective *D) {
8270   DeclarationNameInfo DirName;
8271   getDerived().getSema().StartOpenMPDSABlock(OMPD_ordered, DirName, nullptr,
8272                                              D->getBeginLoc());
8273   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8274   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8275   return Res;
8276 }
8277 
8278 template <typename Derived>
8279 StmtResult
8280 TreeTransform<Derived>::TransformOMPAtomicDirective(OMPAtomicDirective *D) {
8281   DeclarationNameInfo DirName;
8282   getDerived().getSema().StartOpenMPDSABlock(OMPD_atomic, DirName, nullptr,
8283                                              D->getBeginLoc());
8284   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8285   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8286   return Res;
8287 }
8288 
8289 template <typename Derived>
8290 StmtResult
8291 TreeTransform<Derived>::TransformOMPTargetDirective(OMPTargetDirective *D) {
8292   DeclarationNameInfo DirName;
8293   getDerived().getSema().StartOpenMPDSABlock(OMPD_target, DirName, nullptr,
8294                                              D->getBeginLoc());
8295   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8296   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8297   return Res;
8298 }
8299 
8300 template <typename Derived>
8301 StmtResult TreeTransform<Derived>::TransformOMPTargetDataDirective(
8302     OMPTargetDataDirective *D) {
8303   DeclarationNameInfo DirName;
8304   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_data, DirName, nullptr,
8305                                              D->getBeginLoc());
8306   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8307   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8308   return Res;
8309 }
8310 
8311 template <typename Derived>
8312 StmtResult TreeTransform<Derived>::TransformOMPTargetEnterDataDirective(
8313     OMPTargetEnterDataDirective *D) {
8314   DeclarationNameInfo DirName;
8315   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_enter_data, DirName,
8316                                              nullptr, D->getBeginLoc());
8317   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8318   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8319   return Res;
8320 }
8321 
8322 template <typename Derived>
8323 StmtResult TreeTransform<Derived>::TransformOMPTargetExitDataDirective(
8324     OMPTargetExitDataDirective *D) {
8325   DeclarationNameInfo DirName;
8326   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_exit_data, DirName,
8327                                              nullptr, D->getBeginLoc());
8328   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8329   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8330   return Res;
8331 }
8332 
8333 template <typename Derived>
8334 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelDirective(
8335     OMPTargetParallelDirective *D) {
8336   DeclarationNameInfo DirName;
8337   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel, DirName,
8338                                              nullptr, D->getBeginLoc());
8339   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8340   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8341   return Res;
8342 }
8343 
8344 template <typename Derived>
8345 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelForDirective(
8346     OMPTargetParallelForDirective *D) {
8347   DeclarationNameInfo DirName;
8348   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel_for, DirName,
8349                                              nullptr, D->getBeginLoc());
8350   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8351   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8352   return Res;
8353 }
8354 
8355 template <typename Derived>
8356 StmtResult TreeTransform<Derived>::TransformOMPTargetUpdateDirective(
8357     OMPTargetUpdateDirective *D) {
8358   DeclarationNameInfo DirName;
8359   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_update, DirName,
8360                                              nullptr, D->getBeginLoc());
8361   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8362   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8363   return Res;
8364 }
8365 
8366 template <typename Derived>
8367 StmtResult
8368 TreeTransform<Derived>::TransformOMPTeamsDirective(OMPTeamsDirective *D) {
8369   DeclarationNameInfo DirName;
8370   getDerived().getSema().StartOpenMPDSABlock(OMPD_teams, DirName, nullptr,
8371                                              D->getBeginLoc());
8372   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8373   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8374   return Res;
8375 }
8376 
8377 template <typename Derived>
8378 StmtResult TreeTransform<Derived>::TransformOMPCancellationPointDirective(
8379     OMPCancellationPointDirective *D) {
8380   DeclarationNameInfo DirName;
8381   getDerived().getSema().StartOpenMPDSABlock(OMPD_cancellation_point, DirName,
8382                                              nullptr, D->getBeginLoc());
8383   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8384   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8385   return Res;
8386 }
8387 
8388 template <typename Derived>
8389 StmtResult
8390 TreeTransform<Derived>::TransformOMPCancelDirective(OMPCancelDirective *D) {
8391   DeclarationNameInfo DirName;
8392   getDerived().getSema().StartOpenMPDSABlock(OMPD_cancel, DirName, nullptr,
8393                                              D->getBeginLoc());
8394   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8395   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8396   return Res;
8397 }
8398 
8399 template <typename Derived>
8400 StmtResult
8401 TreeTransform<Derived>::TransformOMPTaskLoopDirective(OMPTaskLoopDirective *D) {
8402   DeclarationNameInfo DirName;
8403   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskloop, DirName, nullptr,
8404                                              D->getBeginLoc());
8405   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8406   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8407   return Res;
8408 }
8409 
8410 template <typename Derived>
8411 StmtResult TreeTransform<Derived>::TransformOMPTaskLoopSimdDirective(
8412     OMPTaskLoopSimdDirective *D) {
8413   DeclarationNameInfo DirName;
8414   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskloop_simd, DirName,
8415                                              nullptr, D->getBeginLoc());
8416   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8417   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8418   return Res;
8419 }
8420 
8421 template <typename Derived>
8422 StmtResult TreeTransform<Derived>::TransformOMPMasterTaskLoopDirective(
8423     OMPMasterTaskLoopDirective *D) {
8424   DeclarationNameInfo DirName;
8425   getDerived().getSema().StartOpenMPDSABlock(OMPD_master_taskloop, DirName,
8426                                              nullptr, D->getBeginLoc());
8427   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8428   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8429   return Res;
8430 }
8431 
8432 template <typename Derived>
8433 StmtResult TreeTransform<Derived>::TransformOMPMasterTaskLoopSimdDirective(
8434     OMPMasterTaskLoopSimdDirective *D) {
8435   DeclarationNameInfo DirName;
8436   getDerived().getSema().StartOpenMPDSABlock(OMPD_master_taskloop_simd, DirName,
8437                                              nullptr, D->getBeginLoc());
8438   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8439   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8440   return Res;
8441 }
8442 
8443 template <typename Derived>
8444 StmtResult TreeTransform<Derived>::TransformOMPParallelMasterTaskLoopDirective(
8445     OMPParallelMasterTaskLoopDirective *D) {
8446   DeclarationNameInfo DirName;
8447   getDerived().getSema().StartOpenMPDSABlock(
8448       OMPD_parallel_master_taskloop, DirName, nullptr, D->getBeginLoc());
8449   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8450   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8451   return Res;
8452 }
8453 
8454 template <typename Derived>
8455 StmtResult
8456 TreeTransform<Derived>::TransformOMPParallelMasterTaskLoopSimdDirective(
8457     OMPParallelMasterTaskLoopSimdDirective *D) {
8458   DeclarationNameInfo DirName;
8459   getDerived().getSema().StartOpenMPDSABlock(
8460       OMPD_parallel_master_taskloop_simd, DirName, nullptr, D->getBeginLoc());
8461   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8462   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8463   return Res;
8464 }
8465 
8466 template <typename Derived>
8467 StmtResult TreeTransform<Derived>::TransformOMPDistributeDirective(
8468     OMPDistributeDirective *D) {
8469   DeclarationNameInfo DirName;
8470   getDerived().getSema().StartOpenMPDSABlock(OMPD_distribute, DirName, nullptr,
8471                                              D->getBeginLoc());
8472   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8473   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8474   return Res;
8475 }
8476 
8477 template <typename Derived>
8478 StmtResult TreeTransform<Derived>::TransformOMPDistributeParallelForDirective(
8479     OMPDistributeParallelForDirective *D) {
8480   DeclarationNameInfo DirName;
8481   getDerived().getSema().StartOpenMPDSABlock(
8482       OMPD_distribute_parallel_for, DirName, nullptr, D->getBeginLoc());
8483   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8484   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8485   return Res;
8486 }
8487 
8488 template <typename Derived>
8489 StmtResult
8490 TreeTransform<Derived>::TransformOMPDistributeParallelForSimdDirective(
8491     OMPDistributeParallelForSimdDirective *D) {
8492   DeclarationNameInfo DirName;
8493   getDerived().getSema().StartOpenMPDSABlock(
8494       OMPD_distribute_parallel_for_simd, DirName, nullptr, D->getBeginLoc());
8495   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8496   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8497   return Res;
8498 }
8499 
8500 template <typename Derived>
8501 StmtResult TreeTransform<Derived>::TransformOMPDistributeSimdDirective(
8502     OMPDistributeSimdDirective *D) {
8503   DeclarationNameInfo DirName;
8504   getDerived().getSema().StartOpenMPDSABlock(OMPD_distribute_simd, DirName,
8505                                              nullptr, D->getBeginLoc());
8506   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8507   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8508   return Res;
8509 }
8510 
8511 template <typename Derived>
8512 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelForSimdDirective(
8513     OMPTargetParallelForSimdDirective *D) {
8514   DeclarationNameInfo DirName;
8515   getDerived().getSema().StartOpenMPDSABlock(
8516       OMPD_target_parallel_for_simd, DirName, nullptr, D->getBeginLoc());
8517   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8518   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8519   return Res;
8520 }
8521 
8522 template <typename Derived>
8523 StmtResult TreeTransform<Derived>::TransformOMPTargetSimdDirective(
8524     OMPTargetSimdDirective *D) {
8525   DeclarationNameInfo DirName;
8526   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_simd, DirName, nullptr,
8527                                              D->getBeginLoc());
8528   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8529   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8530   return Res;
8531 }
8532 
8533 template <typename Derived>
8534 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeDirective(
8535     OMPTeamsDistributeDirective *D) {
8536   DeclarationNameInfo DirName;
8537   getDerived().getSema().StartOpenMPDSABlock(OMPD_teams_distribute, DirName,
8538                                              nullptr, D->getBeginLoc());
8539   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8540   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8541   return Res;
8542 }
8543 
8544 template <typename Derived>
8545 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeSimdDirective(
8546     OMPTeamsDistributeSimdDirective *D) {
8547   DeclarationNameInfo DirName;
8548   getDerived().getSema().StartOpenMPDSABlock(
8549       OMPD_teams_distribute_simd, DirName, nullptr, D->getBeginLoc());
8550   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8551   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8552   return Res;
8553 }
8554 
8555 template <typename Derived>
8556 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeParallelForSimdDirective(
8557     OMPTeamsDistributeParallelForSimdDirective *D) {
8558   DeclarationNameInfo DirName;
8559   getDerived().getSema().StartOpenMPDSABlock(
8560       OMPD_teams_distribute_parallel_for_simd, DirName, nullptr,
8561       D->getBeginLoc());
8562   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8563   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8564   return Res;
8565 }
8566 
8567 template <typename Derived>
8568 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeParallelForDirective(
8569     OMPTeamsDistributeParallelForDirective *D) {
8570   DeclarationNameInfo DirName;
8571   getDerived().getSema().StartOpenMPDSABlock(
8572       OMPD_teams_distribute_parallel_for, DirName, nullptr, D->getBeginLoc());
8573   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8574   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8575   return Res;
8576 }
8577 
8578 template <typename Derived>
8579 StmtResult TreeTransform<Derived>::TransformOMPTargetTeamsDirective(
8580     OMPTargetTeamsDirective *D) {
8581   DeclarationNameInfo DirName;
8582   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_teams, DirName,
8583                                              nullptr, D->getBeginLoc());
8584   auto Res = getDerived().TransformOMPExecutableDirective(D);
8585   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8586   return Res;
8587 }
8588 
8589 template <typename Derived>
8590 StmtResult TreeTransform<Derived>::TransformOMPTargetTeamsDistributeDirective(
8591     OMPTargetTeamsDistributeDirective *D) {
8592   DeclarationNameInfo DirName;
8593   getDerived().getSema().StartOpenMPDSABlock(
8594       OMPD_target_teams_distribute, DirName, nullptr, D->getBeginLoc());
8595   auto Res = getDerived().TransformOMPExecutableDirective(D);
8596   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8597   return Res;
8598 }
8599 
8600 template <typename Derived>
8601 StmtResult
8602 TreeTransform<Derived>::TransformOMPTargetTeamsDistributeParallelForDirective(
8603     OMPTargetTeamsDistributeParallelForDirective *D) {
8604   DeclarationNameInfo DirName;
8605   getDerived().getSema().StartOpenMPDSABlock(
8606       OMPD_target_teams_distribute_parallel_for, DirName, nullptr,
8607       D->getBeginLoc());
8608   auto Res = getDerived().TransformOMPExecutableDirective(D);
8609   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8610   return Res;
8611 }
8612 
8613 template <typename Derived>
8614 StmtResult TreeTransform<Derived>::
8615     TransformOMPTargetTeamsDistributeParallelForSimdDirective(
8616         OMPTargetTeamsDistributeParallelForSimdDirective *D) {
8617   DeclarationNameInfo DirName;
8618   getDerived().getSema().StartOpenMPDSABlock(
8619       OMPD_target_teams_distribute_parallel_for_simd, DirName, nullptr,
8620       D->getBeginLoc());
8621   auto Res = getDerived().TransformOMPExecutableDirective(D);
8622   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8623   return Res;
8624 }
8625 
8626 template <typename Derived>
8627 StmtResult
8628 TreeTransform<Derived>::TransformOMPTargetTeamsDistributeSimdDirective(
8629     OMPTargetTeamsDistributeSimdDirective *D) {
8630   DeclarationNameInfo DirName;
8631   getDerived().getSema().StartOpenMPDSABlock(
8632       OMPD_target_teams_distribute_simd, DirName, nullptr, D->getBeginLoc());
8633   auto Res = getDerived().TransformOMPExecutableDirective(D);
8634   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8635   return Res;
8636 }
8637 
8638 
8639 //===----------------------------------------------------------------------===//
8640 // OpenMP clause transformation
8641 //===----------------------------------------------------------------------===//
8642 template <typename Derived>
8643 OMPClause *TreeTransform<Derived>::TransformOMPIfClause(OMPIfClause *C) {
8644   ExprResult Cond = getDerived().TransformExpr(C->getCondition());
8645   if (Cond.isInvalid())
8646     return nullptr;
8647   return getDerived().RebuildOMPIfClause(
8648       C->getNameModifier(), Cond.get(), C->getBeginLoc(), C->getLParenLoc(),
8649       C->getNameModifierLoc(), C->getColonLoc(), C->getEndLoc());
8650 }
8651 
8652 template <typename Derived>
8653 OMPClause *TreeTransform<Derived>::TransformOMPFinalClause(OMPFinalClause *C) {
8654   ExprResult Cond = getDerived().TransformExpr(C->getCondition());
8655   if (Cond.isInvalid())
8656     return nullptr;
8657   return getDerived().RebuildOMPFinalClause(Cond.get(), C->getBeginLoc(),
8658                                             C->getLParenLoc(), C->getEndLoc());
8659 }
8660 
8661 template <typename Derived>
8662 OMPClause *
8663 TreeTransform<Derived>::TransformOMPNumThreadsClause(OMPNumThreadsClause *C) {
8664   ExprResult NumThreads = getDerived().TransformExpr(C->getNumThreads());
8665   if (NumThreads.isInvalid())
8666     return nullptr;
8667   return getDerived().RebuildOMPNumThreadsClause(
8668       NumThreads.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
8669 }
8670 
8671 template <typename Derived>
8672 OMPClause *
8673 TreeTransform<Derived>::TransformOMPSafelenClause(OMPSafelenClause *C) {
8674   ExprResult E = getDerived().TransformExpr(C->getSafelen());
8675   if (E.isInvalid())
8676     return nullptr;
8677   return getDerived().RebuildOMPSafelenClause(
8678       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
8679 }
8680 
8681 template <typename Derived>
8682 OMPClause *
8683 TreeTransform<Derived>::TransformOMPAllocatorClause(OMPAllocatorClause *C) {
8684   ExprResult E = getDerived().TransformExpr(C->getAllocator());
8685   if (E.isInvalid())
8686     return nullptr;
8687   return getDerived().RebuildOMPAllocatorClause(
8688       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
8689 }
8690 
8691 template <typename Derived>
8692 OMPClause *
8693 TreeTransform<Derived>::TransformOMPSimdlenClause(OMPSimdlenClause *C) {
8694   ExprResult E = getDerived().TransformExpr(C->getSimdlen());
8695   if (E.isInvalid())
8696     return nullptr;
8697   return getDerived().RebuildOMPSimdlenClause(
8698       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
8699 }
8700 
8701 template <typename Derived>
8702 OMPClause *
8703 TreeTransform<Derived>::TransformOMPCollapseClause(OMPCollapseClause *C) {
8704   ExprResult E = getDerived().TransformExpr(C->getNumForLoops());
8705   if (E.isInvalid())
8706     return nullptr;
8707   return getDerived().RebuildOMPCollapseClause(
8708       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
8709 }
8710 
8711 template <typename Derived>
8712 OMPClause *
8713 TreeTransform<Derived>::TransformOMPDefaultClause(OMPDefaultClause *C) {
8714   return getDerived().RebuildOMPDefaultClause(
8715       C->getDefaultKind(), C->getDefaultKindKwLoc(), C->getBeginLoc(),
8716       C->getLParenLoc(), C->getEndLoc());
8717 }
8718 
8719 template <typename Derived>
8720 OMPClause *
8721 TreeTransform<Derived>::TransformOMPProcBindClause(OMPProcBindClause *C) {
8722   return getDerived().RebuildOMPProcBindClause(
8723       C->getProcBindKind(), C->getProcBindKindKwLoc(), C->getBeginLoc(),
8724       C->getLParenLoc(), C->getEndLoc());
8725 }
8726 
8727 template <typename Derived>
8728 OMPClause *
8729 TreeTransform<Derived>::TransformOMPScheduleClause(OMPScheduleClause *C) {
8730   ExprResult E = getDerived().TransformExpr(C->getChunkSize());
8731   if (E.isInvalid())
8732     return nullptr;
8733   return getDerived().RebuildOMPScheduleClause(
8734       C->getFirstScheduleModifier(), C->getSecondScheduleModifier(),
8735       C->getScheduleKind(), E.get(), C->getBeginLoc(), C->getLParenLoc(),
8736       C->getFirstScheduleModifierLoc(), C->getSecondScheduleModifierLoc(),
8737       C->getScheduleKindLoc(), C->getCommaLoc(), C->getEndLoc());
8738 }
8739 
8740 template <typename Derived>
8741 OMPClause *
8742 TreeTransform<Derived>::TransformOMPOrderedClause(OMPOrderedClause *C) {
8743   ExprResult E;
8744   if (auto *Num = C->getNumForLoops()) {
8745     E = getDerived().TransformExpr(Num);
8746     if (E.isInvalid())
8747       return nullptr;
8748   }
8749   return getDerived().RebuildOMPOrderedClause(C->getBeginLoc(), C->getEndLoc(),
8750                                               C->getLParenLoc(), E.get());
8751 }
8752 
8753 template <typename Derived>
8754 OMPClause *
8755 TreeTransform<Derived>::TransformOMPNowaitClause(OMPNowaitClause *C) {
8756   // No need to rebuild this clause, no template-dependent parameters.
8757   return C;
8758 }
8759 
8760 template <typename Derived>
8761 OMPClause *
8762 TreeTransform<Derived>::TransformOMPUntiedClause(OMPUntiedClause *C) {
8763   // No need to rebuild this clause, no template-dependent parameters.
8764   return C;
8765 }
8766 
8767 template <typename Derived>
8768 OMPClause *
8769 TreeTransform<Derived>::TransformOMPMergeableClause(OMPMergeableClause *C) {
8770   // No need to rebuild this clause, no template-dependent parameters.
8771   return C;
8772 }
8773 
8774 template <typename Derived>
8775 OMPClause *TreeTransform<Derived>::TransformOMPReadClause(OMPReadClause *C) {
8776   // No need to rebuild this clause, no template-dependent parameters.
8777   return C;
8778 }
8779 
8780 template <typename Derived>
8781 OMPClause *TreeTransform<Derived>::TransformOMPWriteClause(OMPWriteClause *C) {
8782   // No need to rebuild this clause, no template-dependent parameters.
8783   return C;
8784 }
8785 
8786 template <typename Derived>
8787 OMPClause *
8788 TreeTransform<Derived>::TransformOMPUpdateClause(OMPUpdateClause *C) {
8789   // No need to rebuild this clause, no template-dependent parameters.
8790   return C;
8791 }
8792 
8793 template <typename Derived>
8794 OMPClause *
8795 TreeTransform<Derived>::TransformOMPCaptureClause(OMPCaptureClause *C) {
8796   // No need to rebuild this clause, no template-dependent parameters.
8797   return C;
8798 }
8799 
8800 template <typename Derived>
8801 OMPClause *
8802 TreeTransform<Derived>::TransformOMPSeqCstClause(OMPSeqCstClause *C) {
8803   // No need to rebuild this clause, no template-dependent parameters.
8804   return C;
8805 }
8806 
8807 template <typename Derived>
8808 OMPClause *
8809 TreeTransform<Derived>::TransformOMPAcqRelClause(OMPAcqRelClause *C) {
8810   // No need to rebuild this clause, no template-dependent parameters.
8811   return C;
8812 }
8813 
8814 template <typename Derived>
8815 OMPClause *
8816 TreeTransform<Derived>::TransformOMPThreadsClause(OMPThreadsClause *C) {
8817   // No need to rebuild this clause, no template-dependent parameters.
8818   return C;
8819 }
8820 
8821 template <typename Derived>
8822 OMPClause *TreeTransform<Derived>::TransformOMPSIMDClause(OMPSIMDClause *C) {
8823   // No need to rebuild this clause, no template-dependent parameters.
8824   return C;
8825 }
8826 
8827 template <typename Derived>
8828 OMPClause *
8829 TreeTransform<Derived>::TransformOMPNogroupClause(OMPNogroupClause *C) {
8830   // No need to rebuild this clause, no template-dependent parameters.
8831   return C;
8832 }
8833 
8834 template <typename Derived>
8835 OMPClause *TreeTransform<Derived>::TransformOMPUnifiedAddressClause(
8836     OMPUnifiedAddressClause *C) {
8837   llvm_unreachable("unified_address clause cannot appear in dependent context");
8838 }
8839 
8840 template <typename Derived>
8841 OMPClause *TreeTransform<Derived>::TransformOMPUnifiedSharedMemoryClause(
8842     OMPUnifiedSharedMemoryClause *C) {
8843   llvm_unreachable(
8844       "unified_shared_memory clause cannot appear in dependent context");
8845 }
8846 
8847 template <typename Derived>
8848 OMPClause *TreeTransform<Derived>::TransformOMPReverseOffloadClause(
8849     OMPReverseOffloadClause *C) {
8850   llvm_unreachable("reverse_offload clause cannot appear in dependent context");
8851 }
8852 
8853 template <typename Derived>
8854 OMPClause *TreeTransform<Derived>::TransformOMPDynamicAllocatorsClause(
8855     OMPDynamicAllocatorsClause *C) {
8856   llvm_unreachable(
8857       "dynamic_allocators clause cannot appear in dependent context");
8858 }
8859 
8860 template <typename Derived>
8861 OMPClause *TreeTransform<Derived>::TransformOMPAtomicDefaultMemOrderClause(
8862     OMPAtomicDefaultMemOrderClause *C) {
8863   llvm_unreachable(
8864       "atomic_default_mem_order clause cannot appear in dependent context");
8865 }
8866 
8867 template <typename Derived>
8868 OMPClause *
8869 TreeTransform<Derived>::TransformOMPPrivateClause(OMPPrivateClause *C) {
8870   llvm::SmallVector<Expr *, 16> Vars;
8871   Vars.reserve(C->varlist_size());
8872   for (auto *VE : C->varlists()) {
8873     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8874     if (EVar.isInvalid())
8875       return nullptr;
8876     Vars.push_back(EVar.get());
8877   }
8878   return getDerived().RebuildOMPPrivateClause(
8879       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
8880 }
8881 
8882 template <typename Derived>
8883 OMPClause *TreeTransform<Derived>::TransformOMPFirstprivateClause(
8884     OMPFirstprivateClause *C) {
8885   llvm::SmallVector<Expr *, 16> Vars;
8886   Vars.reserve(C->varlist_size());
8887   for (auto *VE : C->varlists()) {
8888     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8889     if (EVar.isInvalid())
8890       return nullptr;
8891     Vars.push_back(EVar.get());
8892   }
8893   return getDerived().RebuildOMPFirstprivateClause(
8894       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
8895 }
8896 
8897 template <typename Derived>
8898 OMPClause *
8899 TreeTransform<Derived>::TransformOMPLastprivateClause(OMPLastprivateClause *C) {
8900   llvm::SmallVector<Expr *, 16> Vars;
8901   Vars.reserve(C->varlist_size());
8902   for (auto *VE : C->varlists()) {
8903     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8904     if (EVar.isInvalid())
8905       return nullptr;
8906     Vars.push_back(EVar.get());
8907   }
8908   return getDerived().RebuildOMPLastprivateClause(
8909       Vars, C->getKind(), C->getKindLoc(), C->getColonLoc(), C->getBeginLoc(),
8910       C->getLParenLoc(), C->getEndLoc());
8911 }
8912 
8913 template <typename Derived>
8914 OMPClause *
8915 TreeTransform<Derived>::TransformOMPSharedClause(OMPSharedClause *C) {
8916   llvm::SmallVector<Expr *, 16> Vars;
8917   Vars.reserve(C->varlist_size());
8918   for (auto *VE : C->varlists()) {
8919     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8920     if (EVar.isInvalid())
8921       return nullptr;
8922     Vars.push_back(EVar.get());
8923   }
8924   return getDerived().RebuildOMPSharedClause(Vars, C->getBeginLoc(),
8925                                              C->getLParenLoc(), C->getEndLoc());
8926 }
8927 
8928 template <typename Derived>
8929 OMPClause *
8930 TreeTransform<Derived>::TransformOMPReductionClause(OMPReductionClause *C) {
8931   llvm::SmallVector<Expr *, 16> Vars;
8932   Vars.reserve(C->varlist_size());
8933   for (auto *VE : C->varlists()) {
8934     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8935     if (EVar.isInvalid())
8936       return nullptr;
8937     Vars.push_back(EVar.get());
8938   }
8939   CXXScopeSpec ReductionIdScopeSpec;
8940   ReductionIdScopeSpec.Adopt(C->getQualifierLoc());
8941 
8942   DeclarationNameInfo NameInfo = C->getNameInfo();
8943   if (NameInfo.getName()) {
8944     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
8945     if (!NameInfo.getName())
8946       return nullptr;
8947   }
8948   // Build a list of all UDR decls with the same names ranged by the Scopes.
8949   // The Scope boundary is a duplication of the previous decl.
8950   llvm::SmallVector<Expr *, 16> UnresolvedReductions;
8951   for (auto *E : C->reduction_ops()) {
8952     // Transform all the decls.
8953     if (E) {
8954       auto *ULE = cast<UnresolvedLookupExpr>(E);
8955       UnresolvedSet<8> Decls;
8956       for (auto *D : ULE->decls()) {
8957         NamedDecl *InstD =
8958             cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D));
8959         Decls.addDecl(InstD, InstD->getAccess());
8960       }
8961       UnresolvedReductions.push_back(
8962        UnresolvedLookupExpr::Create(
8963           SemaRef.Context, /*NamingClass=*/nullptr,
8964           ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context),
8965           NameInfo, /*ADL=*/true, ULE->isOverloaded(),
8966           Decls.begin(), Decls.end()));
8967     } else
8968       UnresolvedReductions.push_back(nullptr);
8969   }
8970   return getDerived().RebuildOMPReductionClause(
8971       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(),
8972       C->getEndLoc(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions);
8973 }
8974 
8975 template <typename Derived>
8976 OMPClause *TreeTransform<Derived>::TransformOMPTaskReductionClause(
8977     OMPTaskReductionClause *C) {
8978   llvm::SmallVector<Expr *, 16> Vars;
8979   Vars.reserve(C->varlist_size());
8980   for (auto *VE : C->varlists()) {
8981     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8982     if (EVar.isInvalid())
8983       return nullptr;
8984     Vars.push_back(EVar.get());
8985   }
8986   CXXScopeSpec ReductionIdScopeSpec;
8987   ReductionIdScopeSpec.Adopt(C->getQualifierLoc());
8988 
8989   DeclarationNameInfo NameInfo = C->getNameInfo();
8990   if (NameInfo.getName()) {
8991     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
8992     if (!NameInfo.getName())
8993       return nullptr;
8994   }
8995   // Build a list of all UDR decls with the same names ranged by the Scopes.
8996   // The Scope boundary is a duplication of the previous decl.
8997   llvm::SmallVector<Expr *, 16> UnresolvedReductions;
8998   for (auto *E : C->reduction_ops()) {
8999     // Transform all the decls.
9000     if (E) {
9001       auto *ULE = cast<UnresolvedLookupExpr>(E);
9002       UnresolvedSet<8> Decls;
9003       for (auto *D : ULE->decls()) {
9004         NamedDecl *InstD =
9005             cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D));
9006         Decls.addDecl(InstD, InstD->getAccess());
9007       }
9008       UnresolvedReductions.push_back(UnresolvedLookupExpr::Create(
9009           SemaRef.Context, /*NamingClass=*/nullptr,
9010           ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), NameInfo,
9011           /*ADL=*/true, ULE->isOverloaded(), Decls.begin(), Decls.end()));
9012     } else
9013       UnresolvedReductions.push_back(nullptr);
9014   }
9015   return getDerived().RebuildOMPTaskReductionClause(
9016       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(),
9017       C->getEndLoc(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions);
9018 }
9019 
9020 template <typename Derived>
9021 OMPClause *
9022 TreeTransform<Derived>::TransformOMPInReductionClause(OMPInReductionClause *C) {
9023   llvm::SmallVector<Expr *, 16> Vars;
9024   Vars.reserve(C->varlist_size());
9025   for (auto *VE : C->varlists()) {
9026     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9027     if (EVar.isInvalid())
9028       return nullptr;
9029     Vars.push_back(EVar.get());
9030   }
9031   CXXScopeSpec ReductionIdScopeSpec;
9032   ReductionIdScopeSpec.Adopt(C->getQualifierLoc());
9033 
9034   DeclarationNameInfo NameInfo = C->getNameInfo();
9035   if (NameInfo.getName()) {
9036     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
9037     if (!NameInfo.getName())
9038       return nullptr;
9039   }
9040   // Build a list of all UDR decls with the same names ranged by the Scopes.
9041   // The Scope boundary is a duplication of the previous decl.
9042   llvm::SmallVector<Expr *, 16> UnresolvedReductions;
9043   for (auto *E : C->reduction_ops()) {
9044     // Transform all the decls.
9045     if (E) {
9046       auto *ULE = cast<UnresolvedLookupExpr>(E);
9047       UnresolvedSet<8> Decls;
9048       for (auto *D : ULE->decls()) {
9049         NamedDecl *InstD =
9050             cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D));
9051         Decls.addDecl(InstD, InstD->getAccess());
9052       }
9053       UnresolvedReductions.push_back(UnresolvedLookupExpr::Create(
9054           SemaRef.Context, /*NamingClass=*/nullptr,
9055           ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), NameInfo,
9056           /*ADL=*/true, ULE->isOverloaded(), Decls.begin(), Decls.end()));
9057     } else
9058       UnresolvedReductions.push_back(nullptr);
9059   }
9060   return getDerived().RebuildOMPInReductionClause(
9061       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(),
9062       C->getEndLoc(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions);
9063 }
9064 
9065 template <typename Derived>
9066 OMPClause *
9067 TreeTransform<Derived>::TransformOMPLinearClause(OMPLinearClause *C) {
9068   llvm::SmallVector<Expr *, 16> Vars;
9069   Vars.reserve(C->varlist_size());
9070   for (auto *VE : C->varlists()) {
9071     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9072     if (EVar.isInvalid())
9073       return nullptr;
9074     Vars.push_back(EVar.get());
9075   }
9076   ExprResult Step = getDerived().TransformExpr(C->getStep());
9077   if (Step.isInvalid())
9078     return nullptr;
9079   return getDerived().RebuildOMPLinearClause(
9080       Vars, Step.get(), C->getBeginLoc(), C->getLParenLoc(), C->getModifier(),
9081       C->getModifierLoc(), C->getColonLoc(), C->getEndLoc());
9082 }
9083 
9084 template <typename Derived>
9085 OMPClause *
9086 TreeTransform<Derived>::TransformOMPAlignedClause(OMPAlignedClause *C) {
9087   llvm::SmallVector<Expr *, 16> Vars;
9088   Vars.reserve(C->varlist_size());
9089   for (auto *VE : C->varlists()) {
9090     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9091     if (EVar.isInvalid())
9092       return nullptr;
9093     Vars.push_back(EVar.get());
9094   }
9095   ExprResult Alignment = getDerived().TransformExpr(C->getAlignment());
9096   if (Alignment.isInvalid())
9097     return nullptr;
9098   return getDerived().RebuildOMPAlignedClause(
9099       Vars, Alignment.get(), C->getBeginLoc(), C->getLParenLoc(),
9100       C->getColonLoc(), C->getEndLoc());
9101 }
9102 
9103 template <typename Derived>
9104 OMPClause *
9105 TreeTransform<Derived>::TransformOMPCopyinClause(OMPCopyinClause *C) {
9106   llvm::SmallVector<Expr *, 16> Vars;
9107   Vars.reserve(C->varlist_size());
9108   for (auto *VE : C->varlists()) {
9109     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9110     if (EVar.isInvalid())
9111       return nullptr;
9112     Vars.push_back(EVar.get());
9113   }
9114   return getDerived().RebuildOMPCopyinClause(Vars, C->getBeginLoc(),
9115                                              C->getLParenLoc(), C->getEndLoc());
9116 }
9117 
9118 template <typename Derived>
9119 OMPClause *
9120 TreeTransform<Derived>::TransformOMPCopyprivateClause(OMPCopyprivateClause *C) {
9121   llvm::SmallVector<Expr *, 16> Vars;
9122   Vars.reserve(C->varlist_size());
9123   for (auto *VE : C->varlists()) {
9124     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9125     if (EVar.isInvalid())
9126       return nullptr;
9127     Vars.push_back(EVar.get());
9128   }
9129   return getDerived().RebuildOMPCopyprivateClause(
9130       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9131 }
9132 
9133 template <typename Derived>
9134 OMPClause *TreeTransform<Derived>::TransformOMPFlushClause(OMPFlushClause *C) {
9135   llvm::SmallVector<Expr *, 16> Vars;
9136   Vars.reserve(C->varlist_size());
9137   for (auto *VE : C->varlists()) {
9138     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9139     if (EVar.isInvalid())
9140       return nullptr;
9141     Vars.push_back(EVar.get());
9142   }
9143   return getDerived().RebuildOMPFlushClause(Vars, C->getBeginLoc(),
9144                                             C->getLParenLoc(), C->getEndLoc());
9145 }
9146 
9147 template <typename Derived>
9148 OMPClause *
9149 TreeTransform<Derived>::TransformOMPDependClause(OMPDependClause *C) {
9150   llvm::SmallVector<Expr *, 16> Vars;
9151   Vars.reserve(C->varlist_size());
9152   for (auto *VE : C->varlists()) {
9153     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9154     if (EVar.isInvalid())
9155       return nullptr;
9156     Vars.push_back(EVar.get());
9157   }
9158   return getDerived().RebuildOMPDependClause(
9159       C->getDependencyKind(), C->getDependencyLoc(), C->getColonLoc(), Vars,
9160       C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9161 }
9162 
9163 template <typename Derived>
9164 OMPClause *
9165 TreeTransform<Derived>::TransformOMPDeviceClause(OMPDeviceClause *C) {
9166   ExprResult E = getDerived().TransformExpr(C->getDevice());
9167   if (E.isInvalid())
9168     return nullptr;
9169   return getDerived().RebuildOMPDeviceClause(E.get(), C->getBeginLoc(),
9170                                              C->getLParenLoc(), C->getEndLoc());
9171 }
9172 
9173 template <typename Derived, class T>
9174 bool transformOMPMappableExprListClause(
9175     TreeTransform<Derived> &TT, OMPMappableExprListClause<T> *C,
9176     llvm::SmallVectorImpl<Expr *> &Vars, CXXScopeSpec &MapperIdScopeSpec,
9177     DeclarationNameInfo &MapperIdInfo,
9178     llvm::SmallVectorImpl<Expr *> &UnresolvedMappers) {
9179   // Transform expressions in the list.
9180   Vars.reserve(C->varlist_size());
9181   for (auto *VE : C->varlists()) {
9182     ExprResult EVar = TT.getDerived().TransformExpr(cast<Expr>(VE));
9183     if (EVar.isInvalid())
9184       return true;
9185     Vars.push_back(EVar.get());
9186   }
9187   // Transform mapper scope specifier and identifier.
9188   NestedNameSpecifierLoc QualifierLoc;
9189   if (C->getMapperQualifierLoc()) {
9190     QualifierLoc = TT.getDerived().TransformNestedNameSpecifierLoc(
9191         C->getMapperQualifierLoc());
9192     if (!QualifierLoc)
9193       return true;
9194   }
9195   MapperIdScopeSpec.Adopt(QualifierLoc);
9196   MapperIdInfo = C->getMapperIdInfo();
9197   if (MapperIdInfo.getName()) {
9198     MapperIdInfo = TT.getDerived().TransformDeclarationNameInfo(MapperIdInfo);
9199     if (!MapperIdInfo.getName())
9200       return true;
9201   }
9202   // Build a list of all candidate OMPDeclareMapperDecls, which is provided by
9203   // the previous user-defined mapper lookup in dependent environment.
9204   for (auto *E : C->mapperlists()) {
9205     // Transform all the decls.
9206     if (E) {
9207       auto *ULE = cast<UnresolvedLookupExpr>(E);
9208       UnresolvedSet<8> Decls;
9209       for (auto *D : ULE->decls()) {
9210         NamedDecl *InstD =
9211             cast<NamedDecl>(TT.getDerived().TransformDecl(E->getExprLoc(), D));
9212         Decls.addDecl(InstD, InstD->getAccess());
9213       }
9214       UnresolvedMappers.push_back(UnresolvedLookupExpr::Create(
9215           TT.getSema().Context, /*NamingClass=*/nullptr,
9216           MapperIdScopeSpec.getWithLocInContext(TT.getSema().Context),
9217           MapperIdInfo, /*ADL=*/true, ULE->isOverloaded(), Decls.begin(),
9218           Decls.end()));
9219     } else {
9220       UnresolvedMappers.push_back(nullptr);
9221     }
9222   }
9223   return false;
9224 }
9225 
9226 template <typename Derived>
9227 OMPClause *TreeTransform<Derived>::TransformOMPMapClause(OMPMapClause *C) {
9228   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9229   llvm::SmallVector<Expr *, 16> Vars;
9230   CXXScopeSpec MapperIdScopeSpec;
9231   DeclarationNameInfo MapperIdInfo;
9232   llvm::SmallVector<Expr *, 16> UnresolvedMappers;
9233   if (transformOMPMappableExprListClause<Derived, OMPMapClause>(
9234           *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers))
9235     return nullptr;
9236   return getDerived().RebuildOMPMapClause(
9237       C->getMapTypeModifiers(), C->getMapTypeModifiersLoc(), MapperIdScopeSpec,
9238       MapperIdInfo, C->getMapType(), C->isImplicitMapType(), C->getMapLoc(),
9239       C->getColonLoc(), Vars, Locs, UnresolvedMappers);
9240 }
9241 
9242 template <typename Derived>
9243 OMPClause *
9244 TreeTransform<Derived>::TransformOMPAllocateClause(OMPAllocateClause *C) {
9245   Expr *Allocator = C->getAllocator();
9246   if (Allocator) {
9247     ExprResult AllocatorRes = getDerived().TransformExpr(Allocator);
9248     if (AllocatorRes.isInvalid())
9249       return nullptr;
9250     Allocator = AllocatorRes.get();
9251   }
9252   llvm::SmallVector<Expr *, 16> Vars;
9253   Vars.reserve(C->varlist_size());
9254   for (auto *VE : C->varlists()) {
9255     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9256     if (EVar.isInvalid())
9257       return nullptr;
9258     Vars.push_back(EVar.get());
9259   }
9260   return getDerived().RebuildOMPAllocateClause(
9261       Allocator, Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(),
9262       C->getEndLoc());
9263 }
9264 
9265 template <typename Derived>
9266 OMPClause *
9267 TreeTransform<Derived>::TransformOMPNumTeamsClause(OMPNumTeamsClause *C) {
9268   ExprResult E = getDerived().TransformExpr(C->getNumTeams());
9269   if (E.isInvalid())
9270     return nullptr;
9271   return getDerived().RebuildOMPNumTeamsClause(
9272       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9273 }
9274 
9275 template <typename Derived>
9276 OMPClause *
9277 TreeTransform<Derived>::TransformOMPThreadLimitClause(OMPThreadLimitClause *C) {
9278   ExprResult E = getDerived().TransformExpr(C->getThreadLimit());
9279   if (E.isInvalid())
9280     return nullptr;
9281   return getDerived().RebuildOMPThreadLimitClause(
9282       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9283 }
9284 
9285 template <typename Derived>
9286 OMPClause *
9287 TreeTransform<Derived>::TransformOMPPriorityClause(OMPPriorityClause *C) {
9288   ExprResult E = getDerived().TransformExpr(C->getPriority());
9289   if (E.isInvalid())
9290     return nullptr;
9291   return getDerived().RebuildOMPPriorityClause(
9292       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9293 }
9294 
9295 template <typename Derived>
9296 OMPClause *
9297 TreeTransform<Derived>::TransformOMPGrainsizeClause(OMPGrainsizeClause *C) {
9298   ExprResult E = getDerived().TransformExpr(C->getGrainsize());
9299   if (E.isInvalid())
9300     return nullptr;
9301   return getDerived().RebuildOMPGrainsizeClause(
9302       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9303 }
9304 
9305 template <typename Derived>
9306 OMPClause *
9307 TreeTransform<Derived>::TransformOMPNumTasksClause(OMPNumTasksClause *C) {
9308   ExprResult E = getDerived().TransformExpr(C->getNumTasks());
9309   if (E.isInvalid())
9310     return nullptr;
9311   return getDerived().RebuildOMPNumTasksClause(
9312       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9313 }
9314 
9315 template <typename Derived>
9316 OMPClause *TreeTransform<Derived>::TransformOMPHintClause(OMPHintClause *C) {
9317   ExprResult E = getDerived().TransformExpr(C->getHint());
9318   if (E.isInvalid())
9319     return nullptr;
9320   return getDerived().RebuildOMPHintClause(E.get(), C->getBeginLoc(),
9321                                            C->getLParenLoc(), C->getEndLoc());
9322 }
9323 
9324 template <typename Derived>
9325 OMPClause *TreeTransform<Derived>::TransformOMPDistScheduleClause(
9326     OMPDistScheduleClause *C) {
9327   ExprResult E = getDerived().TransformExpr(C->getChunkSize());
9328   if (E.isInvalid())
9329     return nullptr;
9330   return getDerived().RebuildOMPDistScheduleClause(
9331       C->getDistScheduleKind(), E.get(), C->getBeginLoc(), C->getLParenLoc(),
9332       C->getDistScheduleKindLoc(), C->getCommaLoc(), C->getEndLoc());
9333 }
9334 
9335 template <typename Derived>
9336 OMPClause *
9337 TreeTransform<Derived>::TransformOMPDefaultmapClause(OMPDefaultmapClause *C) {
9338   // Rebuild Defaultmap Clause since we need to invoke the checking of
9339   // defaultmap(none:variable-category) after template initialization.
9340   return getDerived().RebuildOMPDefaultmapClause(C->getDefaultmapModifier(),
9341                                                  C->getDefaultmapKind(),
9342                                                  C->getBeginLoc(),
9343                                                  C->getLParenLoc(),
9344                                                  C->getDefaultmapModifierLoc(),
9345                                                  C->getDefaultmapKindLoc(),
9346                                                  C->getEndLoc());
9347 }
9348 
9349 template <typename Derived>
9350 OMPClause *TreeTransform<Derived>::TransformOMPToClause(OMPToClause *C) {
9351   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9352   llvm::SmallVector<Expr *, 16> Vars;
9353   CXXScopeSpec MapperIdScopeSpec;
9354   DeclarationNameInfo MapperIdInfo;
9355   llvm::SmallVector<Expr *, 16> UnresolvedMappers;
9356   if (transformOMPMappableExprListClause<Derived, OMPToClause>(
9357           *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers))
9358     return nullptr;
9359   return getDerived().RebuildOMPToClause(Vars, MapperIdScopeSpec, MapperIdInfo,
9360                                          Locs, UnresolvedMappers);
9361 }
9362 
9363 template <typename Derived>
9364 OMPClause *TreeTransform<Derived>::TransformOMPFromClause(OMPFromClause *C) {
9365   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9366   llvm::SmallVector<Expr *, 16> Vars;
9367   CXXScopeSpec MapperIdScopeSpec;
9368   DeclarationNameInfo MapperIdInfo;
9369   llvm::SmallVector<Expr *, 16> UnresolvedMappers;
9370   if (transformOMPMappableExprListClause<Derived, OMPFromClause>(
9371           *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers))
9372     return nullptr;
9373   return getDerived().RebuildOMPFromClause(
9374       Vars, MapperIdScopeSpec, MapperIdInfo, Locs, UnresolvedMappers);
9375 }
9376 
9377 template <typename Derived>
9378 OMPClause *TreeTransform<Derived>::TransformOMPUseDevicePtrClause(
9379     OMPUseDevicePtrClause *C) {
9380   llvm::SmallVector<Expr *, 16> Vars;
9381   Vars.reserve(C->varlist_size());
9382   for (auto *VE : C->varlists()) {
9383     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9384     if (EVar.isInvalid())
9385       return nullptr;
9386     Vars.push_back(EVar.get());
9387   }
9388   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9389   return getDerived().RebuildOMPUseDevicePtrClause(Vars, Locs);
9390 }
9391 
9392 template <typename Derived>
9393 OMPClause *
9394 TreeTransform<Derived>::TransformOMPIsDevicePtrClause(OMPIsDevicePtrClause *C) {
9395   llvm::SmallVector<Expr *, 16> Vars;
9396   Vars.reserve(C->varlist_size());
9397   for (auto *VE : C->varlists()) {
9398     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9399     if (EVar.isInvalid())
9400       return nullptr;
9401     Vars.push_back(EVar.get());
9402   }
9403   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9404   return getDerived().RebuildOMPIsDevicePtrClause(Vars, Locs);
9405 }
9406 
9407 template <typename Derived>
9408 OMPClause *
9409 TreeTransform<Derived>::TransformOMPNontemporalClause(OMPNontemporalClause *C) {
9410   llvm::SmallVector<Expr *, 16> Vars;
9411   Vars.reserve(C->varlist_size());
9412   for (auto *VE : C->varlists()) {
9413     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9414     if (EVar.isInvalid())
9415       return nullptr;
9416     Vars.push_back(EVar.get());
9417   }
9418   return getDerived().RebuildOMPNontemporalClause(
9419       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9420 }
9421 
9422 template <typename Derived>
9423 OMPClause *
9424 TreeTransform<Derived>::TransformOMPOrderClause(OMPOrderClause *C) {
9425   return getDerived().RebuildOMPOrderClause(C->getKind(), C->getKindKwLoc(),
9426                                             C->getBeginLoc(), C->getLParenLoc(),
9427                                             C->getEndLoc());
9428 }
9429 
9430 //===----------------------------------------------------------------------===//
9431 // Expression transformation
9432 //===----------------------------------------------------------------------===//
9433 template<typename Derived>
9434 ExprResult
9435 TreeTransform<Derived>::TransformConstantExpr(ConstantExpr *E) {
9436   return TransformExpr(E->getSubExpr());
9437 }
9438 
9439 template<typename Derived>
9440 ExprResult
9441 TreeTransform<Derived>::TransformPredefinedExpr(PredefinedExpr *E) {
9442   if (!E->isTypeDependent())
9443     return E;
9444 
9445   return getDerived().RebuildPredefinedExpr(E->getLocation(),
9446                                             E->getIdentKind());
9447 }
9448 
9449 template<typename Derived>
9450 ExprResult
9451 TreeTransform<Derived>::TransformDeclRefExpr(DeclRefExpr *E) {
9452   NestedNameSpecifierLoc QualifierLoc;
9453   if (E->getQualifierLoc()) {
9454     QualifierLoc
9455       = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
9456     if (!QualifierLoc)
9457       return ExprError();
9458   }
9459 
9460   ValueDecl *ND
9461     = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getLocation(),
9462                                                          E->getDecl()));
9463   if (!ND)
9464     return ExprError();
9465 
9466   NamedDecl *Found = ND;
9467   if (E->getFoundDecl() != E->getDecl()) {
9468     Found = cast_or_null<NamedDecl>(
9469         getDerived().TransformDecl(E->getLocation(), E->getFoundDecl()));
9470     if (!Found)
9471       return ExprError();
9472   }
9473 
9474   DeclarationNameInfo NameInfo = E->getNameInfo();
9475   if (NameInfo.getName()) {
9476     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
9477     if (!NameInfo.getName())
9478       return ExprError();
9479   }
9480 
9481   if (!getDerived().AlwaysRebuild() &&
9482       QualifierLoc == E->getQualifierLoc() &&
9483       ND == E->getDecl() &&
9484       Found == E->getFoundDecl() &&
9485       NameInfo.getName() == E->getDecl()->getDeclName() &&
9486       !E->hasExplicitTemplateArgs()) {
9487 
9488     // Mark it referenced in the new context regardless.
9489     // FIXME: this is a bit instantiation-specific.
9490     SemaRef.MarkDeclRefReferenced(E);
9491 
9492     return E;
9493   }
9494 
9495   TemplateArgumentListInfo TransArgs, *TemplateArgs = nullptr;
9496   if (E->hasExplicitTemplateArgs()) {
9497     TemplateArgs = &TransArgs;
9498     TransArgs.setLAngleLoc(E->getLAngleLoc());
9499     TransArgs.setRAngleLoc(E->getRAngleLoc());
9500     if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
9501                                                 E->getNumTemplateArgs(),
9502                                                 TransArgs))
9503       return ExprError();
9504   }
9505 
9506   return getDerived().RebuildDeclRefExpr(QualifierLoc, ND, NameInfo,
9507                                          Found, TemplateArgs);
9508 }
9509 
9510 template<typename Derived>
9511 ExprResult
9512 TreeTransform<Derived>::TransformIntegerLiteral(IntegerLiteral *E) {
9513   return E;
9514 }
9515 
9516 template <typename Derived>
9517 ExprResult TreeTransform<Derived>::TransformFixedPointLiteral(
9518     FixedPointLiteral *E) {
9519   return E;
9520 }
9521 
9522 template<typename Derived>
9523 ExprResult
9524 TreeTransform<Derived>::TransformFloatingLiteral(FloatingLiteral *E) {
9525   return E;
9526 }
9527 
9528 template<typename Derived>
9529 ExprResult
9530 TreeTransform<Derived>::TransformImaginaryLiteral(ImaginaryLiteral *E) {
9531   return E;
9532 }
9533 
9534 template<typename Derived>
9535 ExprResult
9536 TreeTransform<Derived>::TransformStringLiteral(StringLiteral *E) {
9537   return E;
9538 }
9539 
9540 template<typename Derived>
9541 ExprResult
9542 TreeTransform<Derived>::TransformCharacterLiteral(CharacterLiteral *E) {
9543   return E;
9544 }
9545 
9546 template<typename Derived>
9547 ExprResult
9548 TreeTransform<Derived>::TransformUserDefinedLiteral(UserDefinedLiteral *E) {
9549   if (FunctionDecl *FD = E->getDirectCallee())
9550     SemaRef.MarkFunctionReferenced(E->getBeginLoc(), FD);
9551   return SemaRef.MaybeBindToTemporary(E);
9552 }
9553 
9554 template<typename Derived>
9555 ExprResult
9556 TreeTransform<Derived>::TransformGenericSelectionExpr(GenericSelectionExpr *E) {
9557   ExprResult ControllingExpr =
9558     getDerived().TransformExpr(E->getControllingExpr());
9559   if (ControllingExpr.isInvalid())
9560     return ExprError();
9561 
9562   SmallVector<Expr *, 4> AssocExprs;
9563   SmallVector<TypeSourceInfo *, 4> AssocTypes;
9564   for (const GenericSelectionExpr::Association Assoc : E->associations()) {
9565     TypeSourceInfo *TSI = Assoc.getTypeSourceInfo();
9566     if (TSI) {
9567       TypeSourceInfo *AssocType = getDerived().TransformType(TSI);
9568       if (!AssocType)
9569         return ExprError();
9570       AssocTypes.push_back(AssocType);
9571     } else {
9572       AssocTypes.push_back(nullptr);
9573     }
9574 
9575     ExprResult AssocExpr =
9576         getDerived().TransformExpr(Assoc.getAssociationExpr());
9577     if (AssocExpr.isInvalid())
9578       return ExprError();
9579     AssocExprs.push_back(AssocExpr.get());
9580   }
9581 
9582   return getDerived().RebuildGenericSelectionExpr(E->getGenericLoc(),
9583                                                   E->getDefaultLoc(),
9584                                                   E->getRParenLoc(),
9585                                                   ControllingExpr.get(),
9586                                                   AssocTypes,
9587                                                   AssocExprs);
9588 }
9589 
9590 template<typename Derived>
9591 ExprResult
9592 TreeTransform<Derived>::TransformParenExpr(ParenExpr *E) {
9593   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
9594   if (SubExpr.isInvalid())
9595     return ExprError();
9596 
9597   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr())
9598     return E;
9599 
9600   return getDerived().RebuildParenExpr(SubExpr.get(), E->getLParen(),
9601                                        E->getRParen());
9602 }
9603 
9604 /// The operand of a unary address-of operator has special rules: it's
9605 /// allowed to refer to a non-static member of a class even if there's no 'this'
9606 /// object available.
9607 template<typename Derived>
9608 ExprResult
9609 TreeTransform<Derived>::TransformAddressOfOperand(Expr *E) {
9610   if (DependentScopeDeclRefExpr *DRE = dyn_cast<DependentScopeDeclRefExpr>(E))
9611     return getDerived().TransformDependentScopeDeclRefExpr(DRE, true, nullptr);
9612   else
9613     return getDerived().TransformExpr(E);
9614 }
9615 
9616 template<typename Derived>
9617 ExprResult
9618 TreeTransform<Derived>::TransformUnaryOperator(UnaryOperator *E) {
9619   ExprResult SubExpr;
9620   if (E->getOpcode() == UO_AddrOf)
9621     SubExpr = TransformAddressOfOperand(E->getSubExpr());
9622   else
9623     SubExpr = TransformExpr(E->getSubExpr());
9624   if (SubExpr.isInvalid())
9625     return ExprError();
9626 
9627   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr())
9628     return E;
9629 
9630   return getDerived().RebuildUnaryOperator(E->getOperatorLoc(),
9631                                            E->getOpcode(),
9632                                            SubExpr.get());
9633 }
9634 
9635 template<typename Derived>
9636 ExprResult
9637 TreeTransform<Derived>::TransformOffsetOfExpr(OffsetOfExpr *E) {
9638   // Transform the type.
9639   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo());
9640   if (!Type)
9641     return ExprError();
9642 
9643   // Transform all of the components into components similar to what the
9644   // parser uses.
9645   // FIXME: It would be slightly more efficient in the non-dependent case to
9646   // just map FieldDecls, rather than requiring the rebuilder to look for
9647   // the fields again. However, __builtin_offsetof is rare enough in
9648   // template code that we don't care.
9649   bool ExprChanged = false;
9650   typedef Sema::OffsetOfComponent Component;
9651   SmallVector<Component, 4> Components;
9652   for (unsigned I = 0, N = E->getNumComponents(); I != N; ++I) {
9653     const OffsetOfNode &ON = E->getComponent(I);
9654     Component Comp;
9655     Comp.isBrackets = true;
9656     Comp.LocStart = ON.getSourceRange().getBegin();
9657     Comp.LocEnd = ON.getSourceRange().getEnd();
9658     switch (ON.getKind()) {
9659     case OffsetOfNode::Array: {
9660       Expr *FromIndex = E->getIndexExpr(ON.getArrayExprIndex());
9661       ExprResult Index = getDerived().TransformExpr(FromIndex);
9662       if (Index.isInvalid())
9663         return ExprError();
9664 
9665       ExprChanged = ExprChanged || Index.get() != FromIndex;
9666       Comp.isBrackets = true;
9667       Comp.U.E = Index.get();
9668       break;
9669     }
9670 
9671     case OffsetOfNode::Field:
9672     case OffsetOfNode::Identifier:
9673       Comp.isBrackets = false;
9674       Comp.U.IdentInfo = ON.getFieldName();
9675       if (!Comp.U.IdentInfo)
9676         continue;
9677 
9678       break;
9679 
9680     case OffsetOfNode::Base:
9681       // Will be recomputed during the rebuild.
9682       continue;
9683     }
9684 
9685     Components.push_back(Comp);
9686   }
9687 
9688   // If nothing changed, retain the existing expression.
9689   if (!getDerived().AlwaysRebuild() &&
9690       Type == E->getTypeSourceInfo() &&
9691       !ExprChanged)
9692     return E;
9693 
9694   // Build a new offsetof expression.
9695   return getDerived().RebuildOffsetOfExpr(E->getOperatorLoc(), Type,
9696                                           Components, E->getRParenLoc());
9697 }
9698 
9699 template<typename Derived>
9700 ExprResult
9701 TreeTransform<Derived>::TransformOpaqueValueExpr(OpaqueValueExpr *E) {
9702   assert((!E->getSourceExpr() || getDerived().AlreadyTransformed(E->getType())) &&
9703          "opaque value expression requires transformation");
9704   return E;
9705 }
9706 
9707 template<typename Derived>
9708 ExprResult
9709 TreeTransform<Derived>::TransformTypoExpr(TypoExpr *E) {
9710   return E;
9711 }
9712 
9713 template<typename Derived>
9714 ExprResult
9715 TreeTransform<Derived>::TransformPseudoObjectExpr(PseudoObjectExpr *E) {
9716   // Rebuild the syntactic form.  The original syntactic form has
9717   // opaque-value expressions in it, so strip those away and rebuild
9718   // the result.  This is a really awful way of doing this, but the
9719   // better solution (rebuilding the semantic expressions and
9720   // rebinding OVEs as necessary) doesn't work; we'd need
9721   // TreeTransform to not strip away implicit conversions.
9722   Expr *newSyntacticForm = SemaRef.recreateSyntacticForm(E);
9723   ExprResult result = getDerived().TransformExpr(newSyntacticForm);
9724   if (result.isInvalid()) return ExprError();
9725 
9726   // If that gives us a pseudo-object result back, the pseudo-object
9727   // expression must have been an lvalue-to-rvalue conversion which we
9728   // should reapply.
9729   if (result.get()->hasPlaceholderType(BuiltinType::PseudoObject))
9730     result = SemaRef.checkPseudoObjectRValue(result.get());
9731 
9732   return result;
9733 }
9734 
9735 template<typename Derived>
9736 ExprResult
9737 TreeTransform<Derived>::TransformUnaryExprOrTypeTraitExpr(
9738                                                 UnaryExprOrTypeTraitExpr *E) {
9739   if (E->isArgumentType()) {
9740     TypeSourceInfo *OldT = E->getArgumentTypeInfo();
9741 
9742     TypeSourceInfo *NewT = getDerived().TransformType(OldT);
9743     if (!NewT)
9744       return ExprError();
9745 
9746     if (!getDerived().AlwaysRebuild() && OldT == NewT)
9747       return E;
9748 
9749     return getDerived().RebuildUnaryExprOrTypeTrait(NewT, E->getOperatorLoc(),
9750                                                     E->getKind(),
9751                                                     E->getSourceRange());
9752   }
9753 
9754   // C++0x [expr.sizeof]p1:
9755   //   The operand is either an expression, which is an unevaluated operand
9756   //   [...]
9757   EnterExpressionEvaluationContext Unevaluated(
9758       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated,
9759       Sema::ReuseLambdaContextDecl);
9760 
9761   // Try to recover if we have something like sizeof(T::X) where X is a type.
9762   // Notably, there must be *exactly* one set of parens if X is a type.
9763   TypeSourceInfo *RecoveryTSI = nullptr;
9764   ExprResult SubExpr;
9765   auto *PE = dyn_cast<ParenExpr>(E->getArgumentExpr());
9766   if (auto *DRE =
9767           PE ? dyn_cast<DependentScopeDeclRefExpr>(PE->getSubExpr()) : nullptr)
9768     SubExpr = getDerived().TransformParenDependentScopeDeclRefExpr(
9769         PE, DRE, false, &RecoveryTSI);
9770   else
9771     SubExpr = getDerived().TransformExpr(E->getArgumentExpr());
9772 
9773   if (RecoveryTSI) {
9774     return getDerived().RebuildUnaryExprOrTypeTrait(
9775         RecoveryTSI, E->getOperatorLoc(), E->getKind(), E->getSourceRange());
9776   } else if (SubExpr.isInvalid())
9777     return ExprError();
9778 
9779   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getArgumentExpr())
9780     return E;
9781 
9782   return getDerived().RebuildUnaryExprOrTypeTrait(SubExpr.get(),
9783                                                   E->getOperatorLoc(),
9784                                                   E->getKind(),
9785                                                   E->getSourceRange());
9786 }
9787 
9788 template<typename Derived>
9789 ExprResult
9790 TreeTransform<Derived>::TransformArraySubscriptExpr(ArraySubscriptExpr *E) {
9791   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
9792   if (LHS.isInvalid())
9793     return ExprError();
9794 
9795   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
9796   if (RHS.isInvalid())
9797     return ExprError();
9798 
9799 
9800   if (!getDerived().AlwaysRebuild() &&
9801       LHS.get() == E->getLHS() &&
9802       RHS.get() == E->getRHS())
9803     return E;
9804 
9805   return getDerived().RebuildArraySubscriptExpr(
9806       LHS.get(),
9807       /*FIXME:*/ E->getLHS()->getBeginLoc(), RHS.get(), E->getRBracketLoc());
9808 }
9809 
9810 template <typename Derived>
9811 ExprResult
9812 TreeTransform<Derived>::TransformOMPArraySectionExpr(OMPArraySectionExpr *E) {
9813   ExprResult Base = getDerived().TransformExpr(E->getBase());
9814   if (Base.isInvalid())
9815     return ExprError();
9816 
9817   ExprResult LowerBound;
9818   if (E->getLowerBound()) {
9819     LowerBound = getDerived().TransformExpr(E->getLowerBound());
9820     if (LowerBound.isInvalid())
9821       return ExprError();
9822   }
9823 
9824   ExprResult Length;
9825   if (E->getLength()) {
9826     Length = getDerived().TransformExpr(E->getLength());
9827     if (Length.isInvalid())
9828       return ExprError();
9829   }
9830 
9831   if (!getDerived().AlwaysRebuild() && Base.get() == E->getBase() &&
9832       LowerBound.get() == E->getLowerBound() && Length.get() == E->getLength())
9833     return E;
9834 
9835   return getDerived().RebuildOMPArraySectionExpr(
9836       Base.get(), E->getBase()->getEndLoc(), LowerBound.get(), E->getColonLoc(),
9837       Length.get(), E->getRBracketLoc());
9838 }
9839 
9840 template<typename Derived>
9841 ExprResult
9842 TreeTransform<Derived>::TransformCallExpr(CallExpr *E) {
9843   // Transform the callee.
9844   ExprResult Callee = getDerived().TransformExpr(E->getCallee());
9845   if (Callee.isInvalid())
9846     return ExprError();
9847 
9848   // Transform arguments.
9849   bool ArgChanged = false;
9850   SmallVector<Expr*, 8> Args;
9851   if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
9852                                   &ArgChanged))
9853     return ExprError();
9854 
9855   if (!getDerived().AlwaysRebuild() &&
9856       Callee.get() == E->getCallee() &&
9857       !ArgChanged)
9858     return SemaRef.MaybeBindToTemporary(E);
9859 
9860   // FIXME: Wrong source location information for the '('.
9861   SourceLocation FakeLParenLoc
9862     = ((Expr *)Callee.get())->getSourceRange().getBegin();
9863   return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc,
9864                                       Args,
9865                                       E->getRParenLoc());
9866 }
9867 
9868 template<typename Derived>
9869 ExprResult
9870 TreeTransform<Derived>::TransformMemberExpr(MemberExpr *E) {
9871   ExprResult Base = getDerived().TransformExpr(E->getBase());
9872   if (Base.isInvalid())
9873     return ExprError();
9874 
9875   NestedNameSpecifierLoc QualifierLoc;
9876   if (E->hasQualifier()) {
9877     QualifierLoc
9878       = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
9879 
9880     if (!QualifierLoc)
9881       return ExprError();
9882   }
9883   SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc();
9884 
9885   ValueDecl *Member
9886     = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getMemberLoc(),
9887                                                          E->getMemberDecl()));
9888   if (!Member)
9889     return ExprError();
9890 
9891   NamedDecl *FoundDecl = E->getFoundDecl();
9892   if (FoundDecl == E->getMemberDecl()) {
9893     FoundDecl = Member;
9894   } else {
9895     FoundDecl = cast_or_null<NamedDecl>(
9896                    getDerived().TransformDecl(E->getMemberLoc(), FoundDecl));
9897     if (!FoundDecl)
9898       return ExprError();
9899   }
9900 
9901   if (!getDerived().AlwaysRebuild() &&
9902       Base.get() == E->getBase() &&
9903       QualifierLoc == E->getQualifierLoc() &&
9904       Member == E->getMemberDecl() &&
9905       FoundDecl == E->getFoundDecl() &&
9906       !E->hasExplicitTemplateArgs()) {
9907 
9908     // Mark it referenced in the new context regardless.
9909     // FIXME: this is a bit instantiation-specific.
9910     SemaRef.MarkMemberReferenced(E);
9911 
9912     return E;
9913   }
9914 
9915   TemplateArgumentListInfo TransArgs;
9916   if (E->hasExplicitTemplateArgs()) {
9917     TransArgs.setLAngleLoc(E->getLAngleLoc());
9918     TransArgs.setRAngleLoc(E->getRAngleLoc());
9919     if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
9920                                                 E->getNumTemplateArgs(),
9921                                                 TransArgs))
9922       return ExprError();
9923   }
9924 
9925   // FIXME: Bogus source location for the operator
9926   SourceLocation FakeOperatorLoc =
9927       SemaRef.getLocForEndOfToken(E->getBase()->getSourceRange().getEnd());
9928 
9929   // FIXME: to do this check properly, we will need to preserve the
9930   // first-qualifier-in-scope here, just in case we had a dependent
9931   // base (and therefore couldn't do the check) and a
9932   // nested-name-qualifier (and therefore could do the lookup).
9933   NamedDecl *FirstQualifierInScope = nullptr;
9934   DeclarationNameInfo MemberNameInfo = E->getMemberNameInfo();
9935   if (MemberNameInfo.getName()) {
9936     MemberNameInfo = getDerived().TransformDeclarationNameInfo(MemberNameInfo);
9937     if (!MemberNameInfo.getName())
9938       return ExprError();
9939   }
9940 
9941   return getDerived().RebuildMemberExpr(Base.get(), FakeOperatorLoc,
9942                                         E->isArrow(),
9943                                         QualifierLoc,
9944                                         TemplateKWLoc,
9945                                         MemberNameInfo,
9946                                         Member,
9947                                         FoundDecl,
9948                                         (E->hasExplicitTemplateArgs()
9949                                            ? &TransArgs : nullptr),
9950                                         FirstQualifierInScope);
9951 }
9952 
9953 template<typename Derived>
9954 ExprResult
9955 TreeTransform<Derived>::TransformBinaryOperator(BinaryOperator *E) {
9956   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
9957   if (LHS.isInvalid())
9958     return ExprError();
9959 
9960   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
9961   if (RHS.isInvalid())
9962     return ExprError();
9963 
9964   if (!getDerived().AlwaysRebuild() &&
9965       LHS.get() == E->getLHS() &&
9966       RHS.get() == E->getRHS())
9967     return E;
9968 
9969   Sema::FPFeaturesStateRAII FPFeaturesState(getSema());
9970   getSema().FPFeatures = E->getFPFeatures();
9971 
9972   return getDerived().RebuildBinaryOperator(E->getOperatorLoc(), E->getOpcode(),
9973                                             LHS.get(), RHS.get());
9974 }
9975 
9976 template <typename Derived>
9977 ExprResult TreeTransform<Derived>::TransformCXXRewrittenBinaryOperator(
9978     CXXRewrittenBinaryOperator *E) {
9979   CXXRewrittenBinaryOperator::DecomposedForm Decomp = E->getDecomposedForm();
9980 
9981   ExprResult LHS = getDerived().TransformExpr(const_cast<Expr*>(Decomp.LHS));
9982   if (LHS.isInvalid())
9983     return ExprError();
9984 
9985   ExprResult RHS = getDerived().TransformExpr(const_cast<Expr*>(Decomp.RHS));
9986   if (RHS.isInvalid())
9987     return ExprError();
9988 
9989   if (!getDerived().AlwaysRebuild() &&
9990       LHS.get() == Decomp.LHS &&
9991       RHS.get() == Decomp.RHS)
9992     return E;
9993 
9994   // Extract the already-resolved callee declarations so that we can restrict
9995   // ourselves to using them as the unqualified lookup results when rebuilding.
9996   UnresolvedSet<2> UnqualLookups;
9997   Expr *PossibleBinOps[] = {E->getSemanticForm(),
9998                             const_cast<Expr *>(Decomp.InnerBinOp)};
9999   for (Expr *PossibleBinOp : PossibleBinOps) {
10000     auto *Op = dyn_cast<CXXOperatorCallExpr>(PossibleBinOp->IgnoreImplicit());
10001     if (!Op)
10002       continue;
10003     auto *Callee = dyn_cast<DeclRefExpr>(Op->getCallee()->IgnoreImplicit());
10004     if (!Callee || isa<CXXMethodDecl>(Callee->getDecl()))
10005       continue;
10006 
10007     // Transform the callee in case we built a call to a local extern
10008     // declaration.
10009     NamedDecl *Found = cast_or_null<NamedDecl>(getDerived().TransformDecl(
10010         E->getOperatorLoc(), Callee->getFoundDecl()));
10011     if (!Found)
10012       return ExprError();
10013     UnqualLookups.addDecl(Found);
10014   }
10015 
10016   return getDerived().RebuildCXXRewrittenBinaryOperator(
10017       E->getOperatorLoc(), Decomp.Opcode, UnqualLookups, LHS.get(), RHS.get());
10018 }
10019 
10020 template<typename Derived>
10021 ExprResult
10022 TreeTransform<Derived>::TransformCompoundAssignOperator(
10023                                                       CompoundAssignOperator *E) {
10024   return getDerived().TransformBinaryOperator(E);
10025 }
10026 
10027 template<typename Derived>
10028 ExprResult TreeTransform<Derived>::
10029 TransformBinaryConditionalOperator(BinaryConditionalOperator *e) {
10030   // Just rebuild the common and RHS expressions and see whether we
10031   // get any changes.
10032 
10033   ExprResult commonExpr = getDerived().TransformExpr(e->getCommon());
10034   if (commonExpr.isInvalid())
10035     return ExprError();
10036 
10037   ExprResult rhs = getDerived().TransformExpr(e->getFalseExpr());
10038   if (rhs.isInvalid())
10039     return ExprError();
10040 
10041   if (!getDerived().AlwaysRebuild() &&
10042       commonExpr.get() == e->getCommon() &&
10043       rhs.get() == e->getFalseExpr())
10044     return e;
10045 
10046   return getDerived().RebuildConditionalOperator(commonExpr.get(),
10047                                                  e->getQuestionLoc(),
10048                                                  nullptr,
10049                                                  e->getColonLoc(),
10050                                                  rhs.get());
10051 }
10052 
10053 template<typename Derived>
10054 ExprResult
10055 TreeTransform<Derived>::TransformConditionalOperator(ConditionalOperator *E) {
10056   ExprResult Cond = getDerived().TransformExpr(E->getCond());
10057   if (Cond.isInvalid())
10058     return ExprError();
10059 
10060   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
10061   if (LHS.isInvalid())
10062     return ExprError();
10063 
10064   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
10065   if (RHS.isInvalid())
10066     return ExprError();
10067 
10068   if (!getDerived().AlwaysRebuild() &&
10069       Cond.get() == E->getCond() &&
10070       LHS.get() == E->getLHS() &&
10071       RHS.get() == E->getRHS())
10072     return E;
10073 
10074   return getDerived().RebuildConditionalOperator(Cond.get(),
10075                                                  E->getQuestionLoc(),
10076                                                  LHS.get(),
10077                                                  E->getColonLoc(),
10078                                                  RHS.get());
10079 }
10080 
10081 template<typename Derived>
10082 ExprResult
10083 TreeTransform<Derived>::TransformImplicitCastExpr(ImplicitCastExpr *E) {
10084   // Implicit casts are eliminated during transformation, since they
10085   // will be recomputed by semantic analysis after transformation.
10086   return getDerived().TransformExpr(E->getSubExprAsWritten());
10087 }
10088 
10089 template<typename Derived>
10090 ExprResult
10091 TreeTransform<Derived>::TransformCStyleCastExpr(CStyleCastExpr *E) {
10092   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten());
10093   if (!Type)
10094     return ExprError();
10095 
10096   ExprResult SubExpr
10097     = getDerived().TransformExpr(E->getSubExprAsWritten());
10098   if (SubExpr.isInvalid())
10099     return ExprError();
10100 
10101   if (!getDerived().AlwaysRebuild() &&
10102       Type == E->getTypeInfoAsWritten() &&
10103       SubExpr.get() == E->getSubExpr())
10104     return E;
10105 
10106   return getDerived().RebuildCStyleCastExpr(E->getLParenLoc(),
10107                                             Type,
10108                                             E->getRParenLoc(),
10109                                             SubExpr.get());
10110 }
10111 
10112 template<typename Derived>
10113 ExprResult
10114 TreeTransform<Derived>::TransformCompoundLiteralExpr(CompoundLiteralExpr *E) {
10115   TypeSourceInfo *OldT = E->getTypeSourceInfo();
10116   TypeSourceInfo *NewT = getDerived().TransformType(OldT);
10117   if (!NewT)
10118     return ExprError();
10119 
10120   ExprResult Init = getDerived().TransformExpr(E->getInitializer());
10121   if (Init.isInvalid())
10122     return ExprError();
10123 
10124   if (!getDerived().AlwaysRebuild() &&
10125       OldT == NewT &&
10126       Init.get() == E->getInitializer())
10127     return SemaRef.MaybeBindToTemporary(E);
10128 
10129   // Note: the expression type doesn't necessarily match the
10130   // type-as-written, but that's okay, because it should always be
10131   // derivable from the initializer.
10132 
10133   return getDerived().RebuildCompoundLiteralExpr(
10134       E->getLParenLoc(), NewT,
10135       /*FIXME:*/ E->getInitializer()->getEndLoc(), Init.get());
10136 }
10137 
10138 template<typename Derived>
10139 ExprResult
10140 TreeTransform<Derived>::TransformExtVectorElementExpr(ExtVectorElementExpr *E) {
10141   ExprResult Base = getDerived().TransformExpr(E->getBase());
10142   if (Base.isInvalid())
10143     return ExprError();
10144 
10145   if (!getDerived().AlwaysRebuild() &&
10146       Base.get() == E->getBase())
10147     return E;
10148 
10149   // FIXME: Bad source location
10150   SourceLocation FakeOperatorLoc =
10151       SemaRef.getLocForEndOfToken(E->getBase()->getEndLoc());
10152   return getDerived().RebuildExtVectorElementExpr(Base.get(), FakeOperatorLoc,
10153                                                   E->getAccessorLoc(),
10154                                                   E->getAccessor());
10155 }
10156 
10157 template<typename Derived>
10158 ExprResult
10159 TreeTransform<Derived>::TransformInitListExpr(InitListExpr *E) {
10160   if (InitListExpr *Syntactic = E->getSyntacticForm())
10161     E = Syntactic;
10162 
10163   bool InitChanged = false;
10164 
10165   EnterExpressionEvaluationContext Context(
10166       getSema(), EnterExpressionEvaluationContext::InitList);
10167 
10168   SmallVector<Expr*, 4> Inits;
10169   if (getDerived().TransformExprs(E->getInits(), E->getNumInits(), false,
10170                                   Inits, &InitChanged))
10171     return ExprError();
10172 
10173   if (!getDerived().AlwaysRebuild() && !InitChanged) {
10174     // FIXME: Attempt to reuse the existing syntactic form of the InitListExpr
10175     // in some cases. We can't reuse it in general, because the syntactic and
10176     // semantic forms are linked, and we can't know that semantic form will
10177     // match even if the syntactic form does.
10178   }
10179 
10180   return getDerived().RebuildInitList(E->getLBraceLoc(), Inits,
10181                                       E->getRBraceLoc());
10182 }
10183 
10184 template<typename Derived>
10185 ExprResult
10186 TreeTransform<Derived>::TransformDesignatedInitExpr(DesignatedInitExpr *E) {
10187   Designation Desig;
10188 
10189   // transform the initializer value
10190   ExprResult Init = getDerived().TransformExpr(E->getInit());
10191   if (Init.isInvalid())
10192     return ExprError();
10193 
10194   // transform the designators.
10195   SmallVector<Expr*, 4> ArrayExprs;
10196   bool ExprChanged = false;
10197   for (const DesignatedInitExpr::Designator &D : E->designators()) {
10198     if (D.isFieldDesignator()) {
10199       Desig.AddDesignator(Designator::getField(D.getFieldName(),
10200                                                D.getDotLoc(),
10201                                                D.getFieldLoc()));
10202       if (D.getField()) {
10203         FieldDecl *Field = cast_or_null<FieldDecl>(
10204             getDerived().TransformDecl(D.getFieldLoc(), D.getField()));
10205         if (Field != D.getField())
10206           // Rebuild the expression when the transformed FieldDecl is
10207           // different to the already assigned FieldDecl.
10208           ExprChanged = true;
10209       } else {
10210         // Ensure that the designator expression is rebuilt when there isn't
10211         // a resolved FieldDecl in the designator as we don't want to assign
10212         // a FieldDecl to a pattern designator that will be instantiated again.
10213         ExprChanged = true;
10214       }
10215       continue;
10216     }
10217 
10218     if (D.isArrayDesignator()) {
10219       ExprResult Index = getDerived().TransformExpr(E->getArrayIndex(D));
10220       if (Index.isInvalid())
10221         return ExprError();
10222 
10223       Desig.AddDesignator(
10224           Designator::getArray(Index.get(), D.getLBracketLoc()));
10225 
10226       ExprChanged = ExprChanged || Init.get() != E->getArrayIndex(D);
10227       ArrayExprs.push_back(Index.get());
10228       continue;
10229     }
10230 
10231     assert(D.isArrayRangeDesignator() && "New kind of designator?");
10232     ExprResult Start
10233       = getDerived().TransformExpr(E->getArrayRangeStart(D));
10234     if (Start.isInvalid())
10235       return ExprError();
10236 
10237     ExprResult End = getDerived().TransformExpr(E->getArrayRangeEnd(D));
10238     if (End.isInvalid())
10239       return ExprError();
10240 
10241     Desig.AddDesignator(Designator::getArrayRange(Start.get(),
10242                                                   End.get(),
10243                                                   D.getLBracketLoc(),
10244                                                   D.getEllipsisLoc()));
10245 
10246     ExprChanged = ExprChanged || Start.get() != E->getArrayRangeStart(D) ||
10247                   End.get() != E->getArrayRangeEnd(D);
10248 
10249     ArrayExprs.push_back(Start.get());
10250     ArrayExprs.push_back(End.get());
10251   }
10252 
10253   if (!getDerived().AlwaysRebuild() &&
10254       Init.get() == E->getInit() &&
10255       !ExprChanged)
10256     return E;
10257 
10258   return getDerived().RebuildDesignatedInitExpr(Desig, ArrayExprs,
10259                                                 E->getEqualOrColonLoc(),
10260                                                 E->usesGNUSyntax(), Init.get());
10261 }
10262 
10263 // Seems that if TransformInitListExpr() only works on the syntactic form of an
10264 // InitListExpr, then a DesignatedInitUpdateExpr is not encountered.
10265 template<typename Derived>
10266 ExprResult
10267 TreeTransform<Derived>::TransformDesignatedInitUpdateExpr(
10268     DesignatedInitUpdateExpr *E) {
10269   llvm_unreachable("Unexpected DesignatedInitUpdateExpr in syntactic form of "
10270                    "initializer");
10271   return ExprError();
10272 }
10273 
10274 template<typename Derived>
10275 ExprResult
10276 TreeTransform<Derived>::TransformNoInitExpr(
10277     NoInitExpr *E) {
10278   llvm_unreachable("Unexpected NoInitExpr in syntactic form of initializer");
10279   return ExprError();
10280 }
10281 
10282 template<typename Derived>
10283 ExprResult
10284 TreeTransform<Derived>::TransformArrayInitLoopExpr(ArrayInitLoopExpr *E) {
10285   llvm_unreachable("Unexpected ArrayInitLoopExpr outside of initializer");
10286   return ExprError();
10287 }
10288 
10289 template<typename Derived>
10290 ExprResult
10291 TreeTransform<Derived>::TransformArrayInitIndexExpr(ArrayInitIndexExpr *E) {
10292   llvm_unreachable("Unexpected ArrayInitIndexExpr outside of initializer");
10293   return ExprError();
10294 }
10295 
10296 template<typename Derived>
10297 ExprResult
10298 TreeTransform<Derived>::TransformImplicitValueInitExpr(
10299                                                      ImplicitValueInitExpr *E) {
10300   TemporaryBase Rebase(*this, E->getBeginLoc(), DeclarationName());
10301 
10302   // FIXME: Will we ever have proper type location here? Will we actually
10303   // need to transform the type?
10304   QualType T = getDerived().TransformType(E->getType());
10305   if (T.isNull())
10306     return ExprError();
10307 
10308   if (!getDerived().AlwaysRebuild() &&
10309       T == E->getType())
10310     return E;
10311 
10312   return getDerived().RebuildImplicitValueInitExpr(T);
10313 }
10314 
10315 template<typename Derived>
10316 ExprResult
10317 TreeTransform<Derived>::TransformVAArgExpr(VAArgExpr *E) {
10318   TypeSourceInfo *TInfo = getDerived().TransformType(E->getWrittenTypeInfo());
10319   if (!TInfo)
10320     return ExprError();
10321 
10322   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
10323   if (SubExpr.isInvalid())
10324     return ExprError();
10325 
10326   if (!getDerived().AlwaysRebuild() &&
10327       TInfo == E->getWrittenTypeInfo() &&
10328       SubExpr.get() == E->getSubExpr())
10329     return E;
10330 
10331   return getDerived().RebuildVAArgExpr(E->getBuiltinLoc(), SubExpr.get(),
10332                                        TInfo, E->getRParenLoc());
10333 }
10334 
10335 template<typename Derived>
10336 ExprResult
10337 TreeTransform<Derived>::TransformParenListExpr(ParenListExpr *E) {
10338   bool ArgumentChanged = false;
10339   SmallVector<Expr*, 4> Inits;
10340   if (TransformExprs(E->getExprs(), E->getNumExprs(), true, Inits,
10341                      &ArgumentChanged))
10342     return ExprError();
10343 
10344   return getDerived().RebuildParenListExpr(E->getLParenLoc(),
10345                                            Inits,
10346                                            E->getRParenLoc());
10347 }
10348 
10349 /// Transform an address-of-label expression.
10350 ///
10351 /// By default, the transformation of an address-of-label expression always
10352 /// rebuilds the expression, so that the label identifier can be resolved to
10353 /// the corresponding label statement by semantic analysis.
10354 template<typename Derived>
10355 ExprResult
10356 TreeTransform<Derived>::TransformAddrLabelExpr(AddrLabelExpr *E) {
10357   Decl *LD = getDerived().TransformDecl(E->getLabel()->getLocation(),
10358                                         E->getLabel());
10359   if (!LD)
10360     return ExprError();
10361 
10362   return getDerived().RebuildAddrLabelExpr(E->getAmpAmpLoc(), E->getLabelLoc(),
10363                                            cast<LabelDecl>(LD));
10364 }
10365 
10366 template<typename Derived>
10367 ExprResult
10368 TreeTransform<Derived>::TransformStmtExpr(StmtExpr *E) {
10369   SemaRef.ActOnStartStmtExpr();
10370   StmtResult SubStmt
10371     = getDerived().TransformCompoundStmt(E->getSubStmt(), true);
10372   if (SubStmt.isInvalid()) {
10373     SemaRef.ActOnStmtExprError();
10374     return ExprError();
10375   }
10376 
10377   if (!getDerived().AlwaysRebuild() &&
10378       SubStmt.get() == E->getSubStmt()) {
10379     // Calling this an 'error' is unintuitive, but it does the right thing.
10380     SemaRef.ActOnStmtExprError();
10381     return SemaRef.MaybeBindToTemporary(E);
10382   }
10383 
10384   return getDerived().RebuildStmtExpr(E->getLParenLoc(),
10385                                       SubStmt.get(),
10386                                       E->getRParenLoc());
10387 }
10388 
10389 template<typename Derived>
10390 ExprResult
10391 TreeTransform<Derived>::TransformChooseExpr(ChooseExpr *E) {
10392   ExprResult Cond = getDerived().TransformExpr(E->getCond());
10393   if (Cond.isInvalid())
10394     return ExprError();
10395 
10396   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
10397   if (LHS.isInvalid())
10398     return ExprError();
10399 
10400   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
10401   if (RHS.isInvalid())
10402     return ExprError();
10403 
10404   if (!getDerived().AlwaysRebuild() &&
10405       Cond.get() == E->getCond() &&
10406       LHS.get() == E->getLHS() &&
10407       RHS.get() == E->getRHS())
10408     return E;
10409 
10410   return getDerived().RebuildChooseExpr(E->getBuiltinLoc(),
10411                                         Cond.get(), LHS.get(), RHS.get(),
10412                                         E->getRParenLoc());
10413 }
10414 
10415 template<typename Derived>
10416 ExprResult
10417 TreeTransform<Derived>::TransformGNUNullExpr(GNUNullExpr *E) {
10418   return E;
10419 }
10420 
10421 template<typename Derived>
10422 ExprResult
10423 TreeTransform<Derived>::TransformCXXOperatorCallExpr(CXXOperatorCallExpr *E) {
10424   switch (E->getOperator()) {
10425   case OO_New:
10426   case OO_Delete:
10427   case OO_Array_New:
10428   case OO_Array_Delete:
10429     llvm_unreachable("new and delete operators cannot use CXXOperatorCallExpr");
10430 
10431   case OO_Call: {
10432     // This is a call to an object's operator().
10433     assert(E->getNumArgs() >= 1 && "Object call is missing arguments");
10434 
10435     // Transform the object itself.
10436     ExprResult Object = getDerived().TransformExpr(E->getArg(0));
10437     if (Object.isInvalid())
10438       return ExprError();
10439 
10440     // FIXME: Poor location information
10441     SourceLocation FakeLParenLoc = SemaRef.getLocForEndOfToken(
10442         static_cast<Expr *>(Object.get())->getEndLoc());
10443 
10444     // Transform the call arguments.
10445     SmallVector<Expr*, 8> Args;
10446     if (getDerived().TransformExprs(E->getArgs() + 1, E->getNumArgs() - 1, true,
10447                                     Args))
10448       return ExprError();
10449 
10450     return getDerived().RebuildCallExpr(Object.get(), FakeLParenLoc, Args,
10451                                         E->getEndLoc());
10452   }
10453 
10454 #define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly) \
10455   case OO_##Name:
10456 #define OVERLOADED_OPERATOR_MULTI(Name,Spelling,Unary,Binary,MemberOnly)
10457 #include "clang/Basic/OperatorKinds.def"
10458   case OO_Subscript:
10459     // Handled below.
10460     break;
10461 
10462   case OO_Conditional:
10463     llvm_unreachable("conditional operator is not actually overloadable");
10464 
10465   case OO_None:
10466   case NUM_OVERLOADED_OPERATORS:
10467     llvm_unreachable("not an overloaded operator?");
10468   }
10469 
10470   ExprResult Callee = getDerived().TransformExpr(E->getCallee());
10471   if (Callee.isInvalid())
10472     return ExprError();
10473 
10474   ExprResult First;
10475   if (E->getOperator() == OO_Amp)
10476     First = getDerived().TransformAddressOfOperand(E->getArg(0));
10477   else
10478     First = getDerived().TransformExpr(E->getArg(0));
10479   if (First.isInvalid())
10480     return ExprError();
10481 
10482   ExprResult Second;
10483   if (E->getNumArgs() == 2) {
10484     Second = getDerived().TransformExpr(E->getArg(1));
10485     if (Second.isInvalid())
10486       return ExprError();
10487   }
10488 
10489   if (!getDerived().AlwaysRebuild() &&
10490       Callee.get() == E->getCallee() &&
10491       First.get() == E->getArg(0) &&
10492       (E->getNumArgs() != 2 || Second.get() == E->getArg(1)))
10493     return SemaRef.MaybeBindToTemporary(E);
10494 
10495   Sema::FPFeaturesStateRAII FPFeaturesState(getSema());
10496   getSema().FPFeatures = E->getFPFeatures();
10497 
10498   return getDerived().RebuildCXXOperatorCallExpr(E->getOperator(),
10499                                                  E->getOperatorLoc(),
10500                                                  Callee.get(),
10501                                                  First.get(),
10502                                                  Second.get());
10503 }
10504 
10505 template<typename Derived>
10506 ExprResult
10507 TreeTransform<Derived>::TransformCXXMemberCallExpr(CXXMemberCallExpr *E) {
10508   return getDerived().TransformCallExpr(E);
10509 }
10510 
10511 template <typename Derived>
10512 ExprResult TreeTransform<Derived>::TransformSourceLocExpr(SourceLocExpr *E) {
10513   bool NeedRebuildFunc = E->getIdentKind() == SourceLocExpr::Function &&
10514                          getSema().CurContext != E->getParentContext();
10515 
10516   if (!getDerived().AlwaysRebuild() && !NeedRebuildFunc)
10517     return E;
10518 
10519   return getDerived().RebuildSourceLocExpr(E->getIdentKind(), E->getBeginLoc(),
10520                                            E->getEndLoc(),
10521                                            getSema().CurContext);
10522 }
10523 
10524 template<typename Derived>
10525 ExprResult
10526 TreeTransform<Derived>::TransformCUDAKernelCallExpr(CUDAKernelCallExpr *E) {
10527   // Transform the callee.
10528   ExprResult Callee = getDerived().TransformExpr(E->getCallee());
10529   if (Callee.isInvalid())
10530     return ExprError();
10531 
10532   // Transform exec config.
10533   ExprResult EC = getDerived().TransformCallExpr(E->getConfig());
10534   if (EC.isInvalid())
10535     return ExprError();
10536 
10537   // Transform arguments.
10538   bool ArgChanged = false;
10539   SmallVector<Expr*, 8> Args;
10540   if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
10541                                   &ArgChanged))
10542     return ExprError();
10543 
10544   if (!getDerived().AlwaysRebuild() &&
10545       Callee.get() == E->getCallee() &&
10546       !ArgChanged)
10547     return SemaRef.MaybeBindToTemporary(E);
10548 
10549   // FIXME: Wrong source location information for the '('.
10550   SourceLocation FakeLParenLoc
10551     = ((Expr *)Callee.get())->getSourceRange().getBegin();
10552   return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc,
10553                                       Args,
10554                                       E->getRParenLoc(), EC.get());
10555 }
10556 
10557 template<typename Derived>
10558 ExprResult
10559 TreeTransform<Derived>::TransformCXXNamedCastExpr(CXXNamedCastExpr *E) {
10560   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten());
10561   if (!Type)
10562     return ExprError();
10563 
10564   ExprResult SubExpr
10565     = getDerived().TransformExpr(E->getSubExprAsWritten());
10566   if (SubExpr.isInvalid())
10567     return ExprError();
10568 
10569   if (!getDerived().AlwaysRebuild() &&
10570       Type == E->getTypeInfoAsWritten() &&
10571       SubExpr.get() == E->getSubExpr())
10572     return E;
10573   return getDerived().RebuildCXXNamedCastExpr(
10574       E->getOperatorLoc(), E->getStmtClass(), E->getAngleBrackets().getBegin(),
10575       Type, E->getAngleBrackets().getEnd(),
10576       // FIXME. this should be '(' location
10577       E->getAngleBrackets().getEnd(), SubExpr.get(), E->getRParenLoc());
10578 }
10579 
10580 template<typename Derived>
10581 ExprResult
10582 TreeTransform<Derived>::TransformBuiltinBitCastExpr(BuiltinBitCastExpr *BCE) {
10583   TypeSourceInfo *TSI =
10584       getDerived().TransformType(BCE->getTypeInfoAsWritten());
10585   if (!TSI)
10586     return ExprError();
10587 
10588   ExprResult Sub = getDerived().TransformExpr(BCE->getSubExpr());
10589   if (Sub.isInvalid())
10590     return ExprError();
10591 
10592   return getDerived().RebuildBuiltinBitCastExpr(BCE->getBeginLoc(), TSI,
10593                                                 Sub.get(), BCE->getEndLoc());
10594 }
10595 
10596 template<typename Derived>
10597 ExprResult
10598 TreeTransform<Derived>::TransformCXXStaticCastExpr(CXXStaticCastExpr *E) {
10599   return getDerived().TransformCXXNamedCastExpr(E);
10600 }
10601 
10602 template<typename Derived>
10603 ExprResult
10604 TreeTransform<Derived>::TransformCXXDynamicCastExpr(CXXDynamicCastExpr *E) {
10605   return getDerived().TransformCXXNamedCastExpr(E);
10606 }
10607 
10608 template<typename Derived>
10609 ExprResult
10610 TreeTransform<Derived>::TransformCXXReinterpretCastExpr(
10611                                                       CXXReinterpretCastExpr *E) {
10612   return getDerived().TransformCXXNamedCastExpr(E);
10613 }
10614 
10615 template<typename Derived>
10616 ExprResult
10617 TreeTransform<Derived>::TransformCXXConstCastExpr(CXXConstCastExpr *E) {
10618   return getDerived().TransformCXXNamedCastExpr(E);
10619 }
10620 
10621 template<typename Derived>
10622 ExprResult
10623 TreeTransform<Derived>::TransformCXXFunctionalCastExpr(
10624                                                      CXXFunctionalCastExpr *E) {
10625   TypeSourceInfo *Type =
10626       getDerived().TransformTypeWithDeducedTST(E->getTypeInfoAsWritten());
10627   if (!Type)
10628     return ExprError();
10629 
10630   ExprResult SubExpr
10631     = getDerived().TransformExpr(E->getSubExprAsWritten());
10632   if (SubExpr.isInvalid())
10633     return ExprError();
10634 
10635   if (!getDerived().AlwaysRebuild() &&
10636       Type == E->getTypeInfoAsWritten() &&
10637       SubExpr.get() == E->getSubExpr())
10638     return E;
10639 
10640   return getDerived().RebuildCXXFunctionalCastExpr(Type,
10641                                                    E->getLParenLoc(),
10642                                                    SubExpr.get(),
10643                                                    E->getRParenLoc(),
10644                                                    E->isListInitialization());
10645 }
10646 
10647 template<typename Derived>
10648 ExprResult
10649 TreeTransform<Derived>::TransformCXXTypeidExpr(CXXTypeidExpr *E) {
10650   if (E->isTypeOperand()) {
10651     TypeSourceInfo *TInfo
10652       = getDerived().TransformType(E->getTypeOperandSourceInfo());
10653     if (!TInfo)
10654       return ExprError();
10655 
10656     if (!getDerived().AlwaysRebuild() &&
10657         TInfo == E->getTypeOperandSourceInfo())
10658       return E;
10659 
10660     return getDerived().RebuildCXXTypeidExpr(E->getType(), E->getBeginLoc(),
10661                                              TInfo, E->getEndLoc());
10662   }
10663 
10664   // We don't know whether the subexpression is potentially evaluated until
10665   // after we perform semantic analysis.  We speculatively assume it is
10666   // unevaluated; it will get fixed later if the subexpression is in fact
10667   // potentially evaluated.
10668   EnterExpressionEvaluationContext Unevaluated(
10669       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated,
10670       Sema::ReuseLambdaContextDecl);
10671 
10672   ExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand());
10673   if (SubExpr.isInvalid())
10674     return ExprError();
10675 
10676   if (!getDerived().AlwaysRebuild() &&
10677       SubExpr.get() == E->getExprOperand())
10678     return E;
10679 
10680   return getDerived().RebuildCXXTypeidExpr(E->getType(), E->getBeginLoc(),
10681                                            SubExpr.get(), E->getEndLoc());
10682 }
10683 
10684 template<typename Derived>
10685 ExprResult
10686 TreeTransform<Derived>::TransformCXXUuidofExpr(CXXUuidofExpr *E) {
10687   if (E->isTypeOperand()) {
10688     TypeSourceInfo *TInfo
10689       = getDerived().TransformType(E->getTypeOperandSourceInfo());
10690     if (!TInfo)
10691       return ExprError();
10692 
10693     if (!getDerived().AlwaysRebuild() &&
10694         TInfo == E->getTypeOperandSourceInfo())
10695       return E;
10696 
10697     return getDerived().RebuildCXXUuidofExpr(E->getType(), E->getBeginLoc(),
10698                                              TInfo, E->getEndLoc());
10699   }
10700 
10701   EnterExpressionEvaluationContext Unevaluated(
10702       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
10703 
10704   ExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand());
10705   if (SubExpr.isInvalid())
10706     return ExprError();
10707 
10708   if (!getDerived().AlwaysRebuild() &&
10709       SubExpr.get() == E->getExprOperand())
10710     return E;
10711 
10712   return getDerived().RebuildCXXUuidofExpr(E->getType(), E->getBeginLoc(),
10713                                            SubExpr.get(), E->getEndLoc());
10714 }
10715 
10716 template<typename Derived>
10717 ExprResult
10718 TreeTransform<Derived>::TransformCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) {
10719   return E;
10720 }
10721 
10722 template<typename Derived>
10723 ExprResult
10724 TreeTransform<Derived>::TransformCXXNullPtrLiteralExpr(
10725                                                      CXXNullPtrLiteralExpr *E) {
10726   return E;
10727 }
10728 
10729 template<typename Derived>
10730 ExprResult
10731 TreeTransform<Derived>::TransformCXXThisExpr(CXXThisExpr *E) {
10732   QualType T = getSema().getCurrentThisType();
10733 
10734   if (!getDerived().AlwaysRebuild() && T == E->getType()) {
10735     // Mark it referenced in the new context regardless.
10736     // FIXME: this is a bit instantiation-specific.
10737     getSema().MarkThisReferenced(E);
10738     return E;
10739   }
10740 
10741   return getDerived().RebuildCXXThisExpr(E->getBeginLoc(), T, E->isImplicit());
10742 }
10743 
10744 template<typename Derived>
10745 ExprResult
10746 TreeTransform<Derived>::TransformCXXThrowExpr(CXXThrowExpr *E) {
10747   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
10748   if (SubExpr.isInvalid())
10749     return ExprError();
10750 
10751   if (!getDerived().AlwaysRebuild() &&
10752       SubExpr.get() == E->getSubExpr())
10753     return E;
10754 
10755   return getDerived().RebuildCXXThrowExpr(E->getThrowLoc(), SubExpr.get(),
10756                                           E->isThrownVariableInScope());
10757 }
10758 
10759 template<typename Derived>
10760 ExprResult
10761 TreeTransform<Derived>::TransformCXXDefaultArgExpr(CXXDefaultArgExpr *E) {
10762   ParmVarDecl *Param = cast_or_null<ParmVarDecl>(
10763       getDerived().TransformDecl(E->getBeginLoc(), E->getParam()));
10764   if (!Param)
10765     return ExprError();
10766 
10767   if (!getDerived().AlwaysRebuild() && Param == E->getParam() &&
10768       E->getUsedContext() == SemaRef.CurContext)
10769     return E;
10770 
10771   return getDerived().RebuildCXXDefaultArgExpr(E->getUsedLocation(), Param);
10772 }
10773 
10774 template<typename Derived>
10775 ExprResult
10776 TreeTransform<Derived>::TransformCXXDefaultInitExpr(CXXDefaultInitExpr *E) {
10777   FieldDecl *Field = cast_or_null<FieldDecl>(
10778       getDerived().TransformDecl(E->getBeginLoc(), E->getField()));
10779   if (!Field)
10780     return ExprError();
10781 
10782   if (!getDerived().AlwaysRebuild() && Field == E->getField() &&
10783       E->getUsedContext() == SemaRef.CurContext)
10784     return E;
10785 
10786   return getDerived().RebuildCXXDefaultInitExpr(E->getExprLoc(), Field);
10787 }
10788 
10789 template<typename Derived>
10790 ExprResult
10791 TreeTransform<Derived>::TransformCXXScalarValueInitExpr(
10792                                                     CXXScalarValueInitExpr *E) {
10793   TypeSourceInfo *T = getDerived().TransformType(E->getTypeSourceInfo());
10794   if (!T)
10795     return ExprError();
10796 
10797   if (!getDerived().AlwaysRebuild() &&
10798       T == E->getTypeSourceInfo())
10799     return E;
10800 
10801   return getDerived().RebuildCXXScalarValueInitExpr(T,
10802                                           /*FIXME:*/T->getTypeLoc().getEndLoc(),
10803                                                     E->getRParenLoc());
10804 }
10805 
10806 template<typename Derived>
10807 ExprResult
10808 TreeTransform<Derived>::TransformCXXNewExpr(CXXNewExpr *E) {
10809   // Transform the type that we're allocating
10810   TypeSourceInfo *AllocTypeInfo =
10811       getDerived().TransformTypeWithDeducedTST(E->getAllocatedTypeSourceInfo());
10812   if (!AllocTypeInfo)
10813     return ExprError();
10814 
10815   // Transform the size of the array we're allocating (if any).
10816   Optional<Expr *> ArraySize;
10817   if (Optional<Expr *> OldArraySize = E->getArraySize()) {
10818     ExprResult NewArraySize;
10819     if (*OldArraySize) {
10820       NewArraySize = getDerived().TransformExpr(*OldArraySize);
10821       if (NewArraySize.isInvalid())
10822         return ExprError();
10823     }
10824     ArraySize = NewArraySize.get();
10825   }
10826 
10827   // Transform the placement arguments (if any).
10828   bool ArgumentChanged = false;
10829   SmallVector<Expr*, 8> PlacementArgs;
10830   if (getDerived().TransformExprs(E->getPlacementArgs(),
10831                                   E->getNumPlacementArgs(), true,
10832                                   PlacementArgs, &ArgumentChanged))
10833     return ExprError();
10834 
10835   // Transform the initializer (if any).
10836   Expr *OldInit = E->getInitializer();
10837   ExprResult NewInit;
10838   if (OldInit)
10839     NewInit = getDerived().TransformInitializer(OldInit, true);
10840   if (NewInit.isInvalid())
10841     return ExprError();
10842 
10843   // Transform new operator and delete operator.
10844   FunctionDecl *OperatorNew = nullptr;
10845   if (E->getOperatorNew()) {
10846     OperatorNew = cast_or_null<FunctionDecl>(
10847         getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorNew()));
10848     if (!OperatorNew)
10849       return ExprError();
10850   }
10851 
10852   FunctionDecl *OperatorDelete = nullptr;
10853   if (E->getOperatorDelete()) {
10854     OperatorDelete = cast_or_null<FunctionDecl>(
10855         getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorDelete()));
10856     if (!OperatorDelete)
10857       return ExprError();
10858   }
10859 
10860   if (!getDerived().AlwaysRebuild() &&
10861       AllocTypeInfo == E->getAllocatedTypeSourceInfo() &&
10862       ArraySize == E->getArraySize() &&
10863       NewInit.get() == OldInit &&
10864       OperatorNew == E->getOperatorNew() &&
10865       OperatorDelete == E->getOperatorDelete() &&
10866       !ArgumentChanged) {
10867     // Mark any declarations we need as referenced.
10868     // FIXME: instantiation-specific.
10869     if (OperatorNew)
10870       SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorNew);
10871     if (OperatorDelete)
10872       SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorDelete);
10873 
10874     if (E->isArray() && !E->getAllocatedType()->isDependentType()) {
10875       QualType ElementType
10876         = SemaRef.Context.getBaseElementType(E->getAllocatedType());
10877       if (const RecordType *RecordT = ElementType->getAs<RecordType>()) {
10878         CXXRecordDecl *Record = cast<CXXRecordDecl>(RecordT->getDecl());
10879         if (CXXDestructorDecl *Destructor = SemaRef.LookupDestructor(Record)) {
10880           SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Destructor);
10881         }
10882       }
10883     }
10884 
10885     return E;
10886   }
10887 
10888   QualType AllocType = AllocTypeInfo->getType();
10889   if (!ArraySize) {
10890     // If no array size was specified, but the new expression was
10891     // instantiated with an array type (e.g., "new T" where T is
10892     // instantiated with "int[4]"), extract the outer bound from the
10893     // array type as our array size. We do this with constant and
10894     // dependently-sized array types.
10895     const ArrayType *ArrayT = SemaRef.Context.getAsArrayType(AllocType);
10896     if (!ArrayT) {
10897       // Do nothing
10898     } else if (const ConstantArrayType *ConsArrayT
10899                                      = dyn_cast<ConstantArrayType>(ArrayT)) {
10900       ArraySize = IntegerLiteral::Create(SemaRef.Context, ConsArrayT->getSize(),
10901                                          SemaRef.Context.getSizeType(),
10902                                          /*FIXME:*/ E->getBeginLoc());
10903       AllocType = ConsArrayT->getElementType();
10904     } else if (const DependentSizedArrayType *DepArrayT
10905                               = dyn_cast<DependentSizedArrayType>(ArrayT)) {
10906       if (DepArrayT->getSizeExpr()) {
10907         ArraySize = DepArrayT->getSizeExpr();
10908         AllocType = DepArrayT->getElementType();
10909       }
10910     }
10911   }
10912 
10913   return getDerived().RebuildCXXNewExpr(
10914       E->getBeginLoc(), E->isGlobalNew(),
10915       /*FIXME:*/ E->getBeginLoc(), PlacementArgs,
10916       /*FIXME:*/ E->getBeginLoc(), E->getTypeIdParens(), AllocType,
10917       AllocTypeInfo, ArraySize, E->getDirectInitRange(), NewInit.get());
10918 }
10919 
10920 template<typename Derived>
10921 ExprResult
10922 TreeTransform<Derived>::TransformCXXDeleteExpr(CXXDeleteExpr *E) {
10923   ExprResult Operand = getDerived().TransformExpr(E->getArgument());
10924   if (Operand.isInvalid())
10925     return ExprError();
10926 
10927   // Transform the delete operator, if known.
10928   FunctionDecl *OperatorDelete = nullptr;
10929   if (E->getOperatorDelete()) {
10930     OperatorDelete = cast_or_null<FunctionDecl>(
10931         getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorDelete()));
10932     if (!OperatorDelete)
10933       return ExprError();
10934   }
10935 
10936   if (!getDerived().AlwaysRebuild() &&
10937       Operand.get() == E->getArgument() &&
10938       OperatorDelete == E->getOperatorDelete()) {
10939     // Mark any declarations we need as referenced.
10940     // FIXME: instantiation-specific.
10941     if (OperatorDelete)
10942       SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorDelete);
10943 
10944     if (!E->getArgument()->isTypeDependent()) {
10945       QualType Destroyed = SemaRef.Context.getBaseElementType(
10946                                                          E->getDestroyedType());
10947       if (const RecordType *DestroyedRec = Destroyed->getAs<RecordType>()) {
10948         CXXRecordDecl *Record = cast<CXXRecordDecl>(DestroyedRec->getDecl());
10949         SemaRef.MarkFunctionReferenced(E->getBeginLoc(),
10950                                        SemaRef.LookupDestructor(Record));
10951       }
10952     }
10953 
10954     return E;
10955   }
10956 
10957   return getDerived().RebuildCXXDeleteExpr(
10958       E->getBeginLoc(), E->isGlobalDelete(), E->isArrayForm(), Operand.get());
10959 }
10960 
10961 template<typename Derived>
10962 ExprResult
10963 TreeTransform<Derived>::TransformCXXPseudoDestructorExpr(
10964                                                      CXXPseudoDestructorExpr *E) {
10965   ExprResult Base = getDerived().TransformExpr(E->getBase());
10966   if (Base.isInvalid())
10967     return ExprError();
10968 
10969   ParsedType ObjectTypePtr;
10970   bool MayBePseudoDestructor = false;
10971   Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(),
10972                                               E->getOperatorLoc(),
10973                                         E->isArrow()? tok::arrow : tok::period,
10974                                               ObjectTypePtr,
10975                                               MayBePseudoDestructor);
10976   if (Base.isInvalid())
10977     return ExprError();
10978 
10979   QualType ObjectType = ObjectTypePtr.get();
10980   NestedNameSpecifierLoc QualifierLoc = E->getQualifierLoc();
10981   if (QualifierLoc) {
10982     QualifierLoc
10983       = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc, ObjectType);
10984     if (!QualifierLoc)
10985       return ExprError();
10986   }
10987   CXXScopeSpec SS;
10988   SS.Adopt(QualifierLoc);
10989 
10990   PseudoDestructorTypeStorage Destroyed;
10991   if (E->getDestroyedTypeInfo()) {
10992     TypeSourceInfo *DestroyedTypeInfo
10993       = getDerived().TransformTypeInObjectScope(E->getDestroyedTypeInfo(),
10994                                                 ObjectType, nullptr, SS);
10995     if (!DestroyedTypeInfo)
10996       return ExprError();
10997     Destroyed = DestroyedTypeInfo;
10998   } else if (!ObjectType.isNull() && ObjectType->isDependentType()) {
10999     // We aren't likely to be able to resolve the identifier down to a type
11000     // now anyway, so just retain the identifier.
11001     Destroyed = PseudoDestructorTypeStorage(E->getDestroyedTypeIdentifier(),
11002                                             E->getDestroyedTypeLoc());
11003   } else {
11004     // Look for a destructor known with the given name.
11005     ParsedType T = SemaRef.getDestructorName(E->getTildeLoc(),
11006                                               *E->getDestroyedTypeIdentifier(),
11007                                                 E->getDestroyedTypeLoc(),
11008                                                 /*Scope=*/nullptr,
11009                                                 SS, ObjectTypePtr,
11010                                                 false);
11011     if (!T)
11012       return ExprError();
11013 
11014     Destroyed
11015       = SemaRef.Context.getTrivialTypeSourceInfo(SemaRef.GetTypeFromParser(T),
11016                                                  E->getDestroyedTypeLoc());
11017   }
11018 
11019   TypeSourceInfo *ScopeTypeInfo = nullptr;
11020   if (E->getScopeTypeInfo()) {
11021     CXXScopeSpec EmptySS;
11022     ScopeTypeInfo = getDerived().TransformTypeInObjectScope(
11023                       E->getScopeTypeInfo(), ObjectType, nullptr, EmptySS);
11024     if (!ScopeTypeInfo)
11025       return ExprError();
11026   }
11027 
11028   return getDerived().RebuildCXXPseudoDestructorExpr(Base.get(),
11029                                                      E->getOperatorLoc(),
11030                                                      E->isArrow(),
11031                                                      SS,
11032                                                      ScopeTypeInfo,
11033                                                      E->getColonColonLoc(),
11034                                                      E->getTildeLoc(),
11035                                                      Destroyed);
11036 }
11037 
11038 template <typename Derived>
11039 bool TreeTransform<Derived>::TransformOverloadExprDecls(OverloadExpr *Old,
11040                                                         bool RequiresADL,
11041                                                         LookupResult &R) {
11042   // Transform all the decls.
11043   bool AllEmptyPacks = true;
11044   for (auto *OldD : Old->decls()) {
11045     Decl *InstD = getDerived().TransformDecl(Old->getNameLoc(), OldD);
11046     if (!InstD) {
11047       // Silently ignore these if a UsingShadowDecl instantiated to nothing.
11048       // This can happen because of dependent hiding.
11049       if (isa<UsingShadowDecl>(OldD))
11050         continue;
11051       else {
11052         R.clear();
11053         return true;
11054       }
11055     }
11056 
11057     // Expand using pack declarations.
11058     NamedDecl *SingleDecl = cast<NamedDecl>(InstD);
11059     ArrayRef<NamedDecl*> Decls = SingleDecl;
11060     if (auto *UPD = dyn_cast<UsingPackDecl>(InstD))
11061       Decls = UPD->expansions();
11062 
11063     // Expand using declarations.
11064     for (auto *D : Decls) {
11065       if (auto *UD = dyn_cast<UsingDecl>(D)) {
11066         for (auto *SD : UD->shadows())
11067           R.addDecl(SD);
11068       } else {
11069         R.addDecl(D);
11070       }
11071     }
11072 
11073     AllEmptyPacks &= Decls.empty();
11074   };
11075 
11076   // C++ [temp.res]/8.4.2:
11077   //   The program is ill-formed, no diagnostic required, if [...] lookup for
11078   //   a name in the template definition found a using-declaration, but the
11079   //   lookup in the corresponding scope in the instantiation odoes not find
11080   //   any declarations because the using-declaration was a pack expansion and
11081   //   the corresponding pack is empty
11082   if (AllEmptyPacks && !RequiresADL) {
11083     getSema().Diag(Old->getNameLoc(), diag::err_using_pack_expansion_empty)
11084         << isa<UnresolvedMemberExpr>(Old) << Old->getName();
11085     return true;
11086   }
11087 
11088   // Resolve a kind, but don't do any further analysis.  If it's
11089   // ambiguous, the callee needs to deal with it.
11090   R.resolveKind();
11091   return false;
11092 }
11093 
11094 template<typename Derived>
11095 ExprResult
11096 TreeTransform<Derived>::TransformUnresolvedLookupExpr(
11097                                                   UnresolvedLookupExpr *Old) {
11098   LookupResult R(SemaRef, Old->getName(), Old->getNameLoc(),
11099                  Sema::LookupOrdinaryName);
11100 
11101   // Transform the declaration set.
11102   if (TransformOverloadExprDecls(Old, Old->requiresADL(), R))
11103     return ExprError();
11104 
11105   // Rebuild the nested-name qualifier, if present.
11106   CXXScopeSpec SS;
11107   if (Old->getQualifierLoc()) {
11108     NestedNameSpecifierLoc QualifierLoc
11109       = getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc());
11110     if (!QualifierLoc)
11111       return ExprError();
11112 
11113     SS.Adopt(QualifierLoc);
11114   }
11115 
11116   if (Old->getNamingClass()) {
11117     CXXRecordDecl *NamingClass
11118       = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl(
11119                                                             Old->getNameLoc(),
11120                                                         Old->getNamingClass()));
11121     if (!NamingClass) {
11122       R.clear();
11123       return ExprError();
11124     }
11125 
11126     R.setNamingClass(NamingClass);
11127   }
11128 
11129   SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc();
11130 
11131   // If we have neither explicit template arguments, nor the template keyword,
11132   // it's a normal declaration name or member reference.
11133   if (!Old->hasExplicitTemplateArgs() && !TemplateKWLoc.isValid()) {
11134     NamedDecl *D = R.getAsSingle<NamedDecl>();
11135     // In a C++11 unevaluated context, an UnresolvedLookupExpr might refer to an
11136     // instance member. In other contexts, BuildPossibleImplicitMemberExpr will
11137     // give a good diagnostic.
11138     if (D && D->isCXXInstanceMember()) {
11139       return SemaRef.BuildPossibleImplicitMemberExpr(SS, TemplateKWLoc, R,
11140                                                      /*TemplateArgs=*/nullptr,
11141                                                      /*Scope=*/nullptr);
11142     }
11143 
11144     return getDerived().RebuildDeclarationNameExpr(SS, R, Old->requiresADL());
11145   }
11146 
11147   // If we have template arguments, rebuild them, then rebuild the
11148   // templateid expression.
11149   TemplateArgumentListInfo TransArgs(Old->getLAngleLoc(), Old->getRAngleLoc());
11150   if (Old->hasExplicitTemplateArgs() &&
11151       getDerived().TransformTemplateArguments(Old->getTemplateArgs(),
11152                                               Old->getNumTemplateArgs(),
11153                                               TransArgs)) {
11154     R.clear();
11155     return ExprError();
11156   }
11157 
11158   return getDerived().RebuildTemplateIdExpr(SS, TemplateKWLoc, R,
11159                                             Old->requiresADL(), &TransArgs);
11160 }
11161 
11162 template<typename Derived>
11163 ExprResult
11164 TreeTransform<Derived>::TransformTypeTraitExpr(TypeTraitExpr *E) {
11165   bool ArgChanged = false;
11166   SmallVector<TypeSourceInfo *, 4> Args;
11167   for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) {
11168     TypeSourceInfo *From = E->getArg(I);
11169     TypeLoc FromTL = From->getTypeLoc();
11170     if (!FromTL.getAs<PackExpansionTypeLoc>()) {
11171       TypeLocBuilder TLB;
11172       TLB.reserve(FromTL.getFullDataSize());
11173       QualType To = getDerived().TransformType(TLB, FromTL);
11174       if (To.isNull())
11175         return ExprError();
11176 
11177       if (To == From->getType())
11178         Args.push_back(From);
11179       else {
11180         Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
11181         ArgChanged = true;
11182       }
11183       continue;
11184     }
11185 
11186     ArgChanged = true;
11187 
11188     // We have a pack expansion. Instantiate it.
11189     PackExpansionTypeLoc ExpansionTL = FromTL.castAs<PackExpansionTypeLoc>();
11190     TypeLoc PatternTL = ExpansionTL.getPatternLoc();
11191     SmallVector<UnexpandedParameterPack, 2> Unexpanded;
11192     SemaRef.collectUnexpandedParameterPacks(PatternTL, Unexpanded);
11193 
11194     // Determine whether the set of unexpanded parameter packs can and should
11195     // be expanded.
11196     bool Expand = true;
11197     bool RetainExpansion = false;
11198     Optional<unsigned> OrigNumExpansions =
11199         ExpansionTL.getTypePtr()->getNumExpansions();
11200     Optional<unsigned> NumExpansions = OrigNumExpansions;
11201     if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(),
11202                                              PatternTL.getSourceRange(),
11203                                              Unexpanded,
11204                                              Expand, RetainExpansion,
11205                                              NumExpansions))
11206       return ExprError();
11207 
11208     if (!Expand) {
11209       // The transform has determined that we should perform a simple
11210       // transformation on the pack expansion, producing another pack
11211       // expansion.
11212       Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
11213 
11214       TypeLocBuilder TLB;
11215       TLB.reserve(From->getTypeLoc().getFullDataSize());
11216 
11217       QualType To = getDerived().TransformType(TLB, PatternTL);
11218       if (To.isNull())
11219         return ExprError();
11220 
11221       To = getDerived().RebuildPackExpansionType(To,
11222                                                  PatternTL.getSourceRange(),
11223                                                  ExpansionTL.getEllipsisLoc(),
11224                                                  NumExpansions);
11225       if (To.isNull())
11226         return ExprError();
11227 
11228       PackExpansionTypeLoc ToExpansionTL
11229         = TLB.push<PackExpansionTypeLoc>(To);
11230       ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc());
11231       Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
11232       continue;
11233     }
11234 
11235     // Expand the pack expansion by substituting for each argument in the
11236     // pack(s).
11237     for (unsigned I = 0; I != *NumExpansions; ++I) {
11238       Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(SemaRef, I);
11239       TypeLocBuilder TLB;
11240       TLB.reserve(PatternTL.getFullDataSize());
11241       QualType To = getDerived().TransformType(TLB, PatternTL);
11242       if (To.isNull())
11243         return ExprError();
11244 
11245       if (To->containsUnexpandedParameterPack()) {
11246         To = getDerived().RebuildPackExpansionType(To,
11247                                                    PatternTL.getSourceRange(),
11248                                                    ExpansionTL.getEllipsisLoc(),
11249                                                    NumExpansions);
11250         if (To.isNull())
11251           return ExprError();
11252 
11253         PackExpansionTypeLoc ToExpansionTL
11254           = TLB.push<PackExpansionTypeLoc>(To);
11255         ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc());
11256       }
11257 
11258       Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
11259     }
11260 
11261     if (!RetainExpansion)
11262       continue;
11263 
11264     // If we're supposed to retain a pack expansion, do so by temporarily
11265     // forgetting the partially-substituted parameter pack.
11266     ForgetPartiallySubstitutedPackRAII Forget(getDerived());
11267 
11268     TypeLocBuilder TLB;
11269     TLB.reserve(From->getTypeLoc().getFullDataSize());
11270 
11271     QualType To = getDerived().TransformType(TLB, PatternTL);
11272     if (To.isNull())
11273       return ExprError();
11274 
11275     To = getDerived().RebuildPackExpansionType(To,
11276                                                PatternTL.getSourceRange(),
11277                                                ExpansionTL.getEllipsisLoc(),
11278                                                NumExpansions);
11279     if (To.isNull())
11280       return ExprError();
11281 
11282     PackExpansionTypeLoc ToExpansionTL
11283       = TLB.push<PackExpansionTypeLoc>(To);
11284     ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc());
11285     Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
11286   }
11287 
11288   if (!getDerived().AlwaysRebuild() && !ArgChanged)
11289     return E;
11290 
11291   return getDerived().RebuildTypeTrait(E->getTrait(), E->getBeginLoc(), Args,
11292                                        E->getEndLoc());
11293 }
11294 
11295 template<typename Derived>
11296 ExprResult
11297 TreeTransform<Derived>::TransformConceptSpecializationExpr(
11298                                                  ConceptSpecializationExpr *E) {
11299   const ASTTemplateArgumentListInfo *Old = E->getTemplateArgsAsWritten();
11300   TemplateArgumentListInfo TransArgs(Old->LAngleLoc, Old->RAngleLoc);
11301   if (getDerived().TransformTemplateArguments(Old->getTemplateArgs(),
11302                                               Old->NumTemplateArgs, TransArgs))
11303     return ExprError();
11304 
11305   return getDerived().RebuildConceptSpecializationExpr(
11306       E->getNestedNameSpecifierLoc(), E->getTemplateKWLoc(),
11307       E->getConceptNameInfo(), E->getFoundDecl(), E->getNamedConcept(),
11308       &TransArgs);
11309 }
11310 
11311 template<typename Derived>
11312 ExprResult
11313 TreeTransform<Derived>::TransformRequiresExpr(RequiresExpr *E) {
11314   SmallVector<ParmVarDecl*, 4> TransParams;
11315   SmallVector<QualType, 4> TransParamTypes;
11316   Sema::ExtParameterInfoBuilder ExtParamInfos;
11317 
11318   // C++2a [expr.prim.req]p2
11319   // Expressions appearing within a requirement-body are unevaluated operands.
11320   EnterExpressionEvaluationContext Ctx(
11321       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
11322 
11323   RequiresExprBodyDecl *Body = RequiresExprBodyDecl::Create(
11324       getSema().Context, E->getBody()->getDeclContext(),
11325       E->getBody()->getBeginLoc());
11326 
11327   Sema::ContextRAII SavedContext(getSema(), Body, /*NewThisContext*/false);
11328 
11329   if (getDerived().TransformFunctionTypeParams(E->getRequiresKWLoc(),
11330                                                E->getLocalParameters(),
11331                                                /*ParamTypes=*/nullptr,
11332                                                /*ParamInfos=*/nullptr,
11333                                                TransParamTypes, &TransParams,
11334                                                ExtParamInfos))
11335     return ExprError();
11336 
11337   for (ParmVarDecl *Param : TransParams)
11338     Param->setDeclContext(Body);
11339 
11340   SmallVector<concepts::Requirement *, 4> TransReqs;
11341   if (getDerived().TransformRequiresExprRequirements(E->getRequirements(),
11342                                                      TransReqs))
11343     return ExprError();
11344 
11345   for (concepts::Requirement *Req : TransReqs) {
11346     if (auto *ER = dyn_cast<concepts::ExprRequirement>(Req)) {
11347       if (ER->getReturnTypeRequirement().isTypeConstraint()) {
11348         ER->getReturnTypeRequirement()
11349                 .getTypeConstraintTemplateParameterList()->getParam(0)
11350                 ->setDeclContext(Body);
11351       }
11352     }
11353   }
11354 
11355   return getDerived().RebuildRequiresExpr(E->getRequiresKWLoc(), Body,
11356                                           TransParams, TransReqs,
11357                                           E->getRBraceLoc());
11358 }
11359 
11360 template<typename Derived>
11361 bool TreeTransform<Derived>::TransformRequiresExprRequirements(
11362     ArrayRef<concepts::Requirement *> Reqs,
11363     SmallVectorImpl<concepts::Requirement *> &Transformed) {
11364   for (concepts::Requirement *Req : Reqs) {
11365     concepts::Requirement *TransReq = nullptr;
11366     if (auto *TypeReq = dyn_cast<concepts::TypeRequirement>(Req))
11367       TransReq = getDerived().TransformTypeRequirement(TypeReq);
11368     else if (auto *ExprReq = dyn_cast<concepts::ExprRequirement>(Req))
11369       TransReq = getDerived().TransformExprRequirement(ExprReq);
11370     else
11371       TransReq = getDerived().TransformNestedRequirement(
11372                      cast<concepts::NestedRequirement>(Req));
11373     if (!TransReq)
11374       return true;
11375     Transformed.push_back(TransReq);
11376   }
11377   return false;
11378 }
11379 
11380 template<typename Derived>
11381 concepts::TypeRequirement *
11382 TreeTransform<Derived>::TransformTypeRequirement(
11383     concepts::TypeRequirement *Req) {
11384   if (Req->isSubstitutionFailure()) {
11385     if (getDerived().AlwaysRebuild())
11386       return getDerived().RebuildTypeRequirement(
11387               Req->getSubstitutionDiagnostic());
11388     return Req;
11389   }
11390   TypeSourceInfo *TransType = getDerived().TransformType(Req->getType());
11391   if (!TransType)
11392     return nullptr;
11393   return getDerived().RebuildTypeRequirement(TransType);
11394 }
11395 
11396 template<typename Derived>
11397 concepts::ExprRequirement *
11398 TreeTransform<Derived>::TransformExprRequirement(concepts::ExprRequirement *Req) {
11399   llvm::PointerUnion<Expr *, concepts::Requirement::SubstitutionDiagnostic *> TransExpr;
11400   if (Req->isExprSubstitutionFailure())
11401     TransExpr = Req->getExprSubstitutionDiagnostic();
11402   else {
11403     ExprResult TransExprRes = getDerived().TransformExpr(Req->getExpr());
11404     if (TransExprRes.isInvalid())
11405       return nullptr;
11406     TransExpr = TransExprRes.get();
11407   }
11408 
11409   llvm::Optional<concepts::ExprRequirement::ReturnTypeRequirement> TransRetReq;
11410   const auto &RetReq = Req->getReturnTypeRequirement();
11411   if (RetReq.isEmpty())
11412     TransRetReq.emplace();
11413   else if (RetReq.isSubstitutionFailure())
11414     TransRetReq.emplace(RetReq.getSubstitutionDiagnostic());
11415   else if (RetReq.isTypeConstraint()) {
11416     TemplateParameterList *OrigTPL =
11417         RetReq.getTypeConstraintTemplateParameterList();
11418     TemplateParameterList *TPL =
11419         getDerived().TransformTemplateParameterList(OrigTPL);
11420     if (!TPL)
11421       return nullptr;
11422     TransRetReq.emplace(TPL);
11423   }
11424   assert(TransRetReq.hasValue() &&
11425          "All code paths leading here must set TransRetReq");
11426   if (Expr *E = TransExpr.dyn_cast<Expr *>())
11427     return getDerived().RebuildExprRequirement(E, Req->isSimple(),
11428                                                Req->getNoexceptLoc(),
11429                                                std::move(*TransRetReq));
11430   return getDerived().RebuildExprRequirement(
11431       TransExpr.get<concepts::Requirement::SubstitutionDiagnostic *>(),
11432       Req->isSimple(), Req->getNoexceptLoc(), std::move(*TransRetReq));
11433 }
11434 
11435 template<typename Derived>
11436 concepts::NestedRequirement *
11437 TreeTransform<Derived>::TransformNestedRequirement(
11438     concepts::NestedRequirement *Req) {
11439   if (Req->isSubstitutionFailure()) {
11440     if (getDerived().AlwaysRebuild())
11441       return getDerived().RebuildNestedRequirement(
11442           Req->getSubstitutionDiagnostic());
11443     return Req;
11444   }
11445   ExprResult TransConstraint =
11446       getDerived().TransformExpr(Req->getConstraintExpr());
11447   if (TransConstraint.isInvalid())
11448     return nullptr;
11449   return getDerived().RebuildNestedRequirement(TransConstraint.get());
11450 }
11451 
11452 template<typename Derived>
11453 ExprResult
11454 TreeTransform<Derived>::TransformArrayTypeTraitExpr(ArrayTypeTraitExpr *E) {
11455   TypeSourceInfo *T = getDerived().TransformType(E->getQueriedTypeSourceInfo());
11456   if (!T)
11457     return ExprError();
11458 
11459   if (!getDerived().AlwaysRebuild() &&
11460       T == E->getQueriedTypeSourceInfo())
11461     return E;
11462 
11463   ExprResult SubExpr;
11464   {
11465     EnterExpressionEvaluationContext Unevaluated(
11466         SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
11467     SubExpr = getDerived().TransformExpr(E->getDimensionExpression());
11468     if (SubExpr.isInvalid())
11469       return ExprError();
11470 
11471     if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getDimensionExpression())
11472       return E;
11473   }
11474 
11475   return getDerived().RebuildArrayTypeTrait(E->getTrait(), E->getBeginLoc(), T,
11476                                             SubExpr.get(), E->getEndLoc());
11477 }
11478 
11479 template<typename Derived>
11480 ExprResult
11481 TreeTransform<Derived>::TransformExpressionTraitExpr(ExpressionTraitExpr *E) {
11482   ExprResult SubExpr;
11483   {
11484     EnterExpressionEvaluationContext Unevaluated(
11485         SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
11486     SubExpr = getDerived().TransformExpr(E->getQueriedExpression());
11487     if (SubExpr.isInvalid())
11488       return ExprError();
11489 
11490     if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getQueriedExpression())
11491       return E;
11492   }
11493 
11494   return getDerived().RebuildExpressionTrait(E->getTrait(), E->getBeginLoc(),
11495                                              SubExpr.get(), E->getEndLoc());
11496 }
11497 
11498 template <typename Derived>
11499 ExprResult TreeTransform<Derived>::TransformParenDependentScopeDeclRefExpr(
11500     ParenExpr *PE, DependentScopeDeclRefExpr *DRE, bool AddrTaken,
11501     TypeSourceInfo **RecoveryTSI) {
11502   ExprResult NewDRE = getDerived().TransformDependentScopeDeclRefExpr(
11503       DRE, AddrTaken, RecoveryTSI);
11504 
11505   // Propagate both errors and recovered types, which return ExprEmpty.
11506   if (!NewDRE.isUsable())
11507     return NewDRE;
11508 
11509   // We got an expr, wrap it up in parens.
11510   if (!getDerived().AlwaysRebuild() && NewDRE.get() == DRE)
11511     return PE;
11512   return getDerived().RebuildParenExpr(NewDRE.get(), PE->getLParen(),
11513                                        PE->getRParen());
11514 }
11515 
11516 template <typename Derived>
11517 ExprResult TreeTransform<Derived>::TransformDependentScopeDeclRefExpr(
11518     DependentScopeDeclRefExpr *E) {
11519   return TransformDependentScopeDeclRefExpr(E, /*IsAddressOfOperand=*/false,
11520                                             nullptr);
11521 }
11522 
11523 template<typename Derived>
11524 ExprResult
11525 TreeTransform<Derived>::TransformDependentScopeDeclRefExpr(
11526                                                DependentScopeDeclRefExpr *E,
11527                                                bool IsAddressOfOperand,
11528                                                TypeSourceInfo **RecoveryTSI) {
11529   assert(E->getQualifierLoc());
11530   NestedNameSpecifierLoc QualifierLoc
11531   = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
11532   if (!QualifierLoc)
11533     return ExprError();
11534   SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc();
11535 
11536   // TODO: If this is a conversion-function-id, verify that the
11537   // destination type name (if present) resolves the same way after
11538   // instantiation as it did in the local scope.
11539 
11540   DeclarationNameInfo NameInfo
11541     = getDerived().TransformDeclarationNameInfo(E->getNameInfo());
11542   if (!NameInfo.getName())
11543     return ExprError();
11544 
11545   if (!E->hasExplicitTemplateArgs()) {
11546     if (!getDerived().AlwaysRebuild() &&
11547         QualifierLoc == E->getQualifierLoc() &&
11548         // Note: it is sufficient to compare the Name component of NameInfo:
11549         // if name has not changed, DNLoc has not changed either.
11550         NameInfo.getName() == E->getDeclName())
11551       return E;
11552 
11553     return getDerived().RebuildDependentScopeDeclRefExpr(
11554         QualifierLoc, TemplateKWLoc, NameInfo, /*TemplateArgs=*/nullptr,
11555         IsAddressOfOperand, RecoveryTSI);
11556   }
11557 
11558   TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc());
11559   if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
11560                                               E->getNumTemplateArgs(),
11561                                               TransArgs))
11562     return ExprError();
11563 
11564   return getDerived().RebuildDependentScopeDeclRefExpr(
11565       QualifierLoc, TemplateKWLoc, NameInfo, &TransArgs, IsAddressOfOperand,
11566       RecoveryTSI);
11567 }
11568 
11569 template<typename Derived>
11570 ExprResult
11571 TreeTransform<Derived>::TransformCXXConstructExpr(CXXConstructExpr *E) {
11572   // CXXConstructExprs other than for list-initialization and
11573   // CXXTemporaryObjectExpr are always implicit, so when we have
11574   // a 1-argument construction we just transform that argument.
11575   if ((E->getNumArgs() == 1 ||
11576        (E->getNumArgs() > 1 && getDerived().DropCallArgument(E->getArg(1)))) &&
11577       (!getDerived().DropCallArgument(E->getArg(0))) &&
11578       !E->isListInitialization())
11579     return getDerived().TransformExpr(E->getArg(0));
11580 
11581   TemporaryBase Rebase(*this, /*FIXME*/ E->getBeginLoc(), DeclarationName());
11582 
11583   QualType T = getDerived().TransformType(E->getType());
11584   if (T.isNull())
11585     return ExprError();
11586 
11587   CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>(
11588       getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor()));
11589   if (!Constructor)
11590     return ExprError();
11591 
11592   bool ArgumentChanged = false;
11593   SmallVector<Expr*, 8> Args;
11594   {
11595     EnterExpressionEvaluationContext Context(
11596         getSema(), EnterExpressionEvaluationContext::InitList,
11597         E->isListInitialization());
11598     if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
11599                                     &ArgumentChanged))
11600       return ExprError();
11601   }
11602 
11603   if (!getDerived().AlwaysRebuild() &&
11604       T == E->getType() &&
11605       Constructor == E->getConstructor() &&
11606       !ArgumentChanged) {
11607     // Mark the constructor as referenced.
11608     // FIXME: Instantiation-specific
11609     SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor);
11610     return E;
11611   }
11612 
11613   return getDerived().RebuildCXXConstructExpr(
11614       T, /*FIXME:*/ E->getBeginLoc(), Constructor, E->isElidable(), Args,
11615       E->hadMultipleCandidates(), E->isListInitialization(),
11616       E->isStdInitListInitialization(), E->requiresZeroInitialization(),
11617       E->getConstructionKind(), E->getParenOrBraceRange());
11618 }
11619 
11620 template<typename Derived>
11621 ExprResult TreeTransform<Derived>::TransformCXXInheritedCtorInitExpr(
11622     CXXInheritedCtorInitExpr *E) {
11623   QualType T = getDerived().TransformType(E->getType());
11624   if (T.isNull())
11625     return ExprError();
11626 
11627   CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>(
11628       getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor()));
11629   if (!Constructor)
11630     return ExprError();
11631 
11632   if (!getDerived().AlwaysRebuild() &&
11633       T == E->getType() &&
11634       Constructor == E->getConstructor()) {
11635     // Mark the constructor as referenced.
11636     // FIXME: Instantiation-specific
11637     SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor);
11638     return E;
11639   }
11640 
11641   return getDerived().RebuildCXXInheritedCtorInitExpr(
11642       T, E->getLocation(), Constructor,
11643       E->constructsVBase(), E->inheritedFromVBase());
11644 }
11645 
11646 /// Transform a C++ temporary-binding expression.
11647 ///
11648 /// Since CXXBindTemporaryExpr nodes are implicitly generated, we just
11649 /// transform the subexpression and return that.
11650 template<typename Derived>
11651 ExprResult
11652 TreeTransform<Derived>::TransformCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) {
11653   return getDerived().TransformExpr(E->getSubExpr());
11654 }
11655 
11656 /// Transform a C++ expression that contains cleanups that should
11657 /// be run after the expression is evaluated.
11658 ///
11659 /// Since ExprWithCleanups nodes are implicitly generated, we
11660 /// just transform the subexpression and return that.
11661 template<typename Derived>
11662 ExprResult
11663 TreeTransform<Derived>::TransformExprWithCleanups(ExprWithCleanups *E) {
11664   return getDerived().TransformExpr(E->getSubExpr());
11665 }
11666 
11667 template<typename Derived>
11668 ExprResult
11669 TreeTransform<Derived>::TransformCXXTemporaryObjectExpr(
11670                                                     CXXTemporaryObjectExpr *E) {
11671   TypeSourceInfo *T =
11672       getDerived().TransformTypeWithDeducedTST(E->getTypeSourceInfo());
11673   if (!T)
11674     return ExprError();
11675 
11676   CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>(
11677       getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor()));
11678   if (!Constructor)
11679     return ExprError();
11680 
11681   bool ArgumentChanged = false;
11682   SmallVector<Expr*, 8> Args;
11683   Args.reserve(E->getNumArgs());
11684   {
11685     EnterExpressionEvaluationContext Context(
11686         getSema(), EnterExpressionEvaluationContext::InitList,
11687         E->isListInitialization());
11688     if (TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
11689                        &ArgumentChanged))
11690       return ExprError();
11691   }
11692 
11693   if (!getDerived().AlwaysRebuild() &&
11694       T == E->getTypeSourceInfo() &&
11695       Constructor == E->getConstructor() &&
11696       !ArgumentChanged) {
11697     // FIXME: Instantiation-specific
11698     SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor);
11699     return SemaRef.MaybeBindToTemporary(E);
11700   }
11701 
11702   // FIXME: We should just pass E->isListInitialization(), but we're not
11703   // prepared to handle list-initialization without a child InitListExpr.
11704   SourceLocation LParenLoc = T->getTypeLoc().getEndLoc();
11705   return getDerived().RebuildCXXTemporaryObjectExpr(
11706       T, LParenLoc, Args, E->getEndLoc(),
11707       /*ListInitialization=*/LParenLoc.isInvalid());
11708 }
11709 
11710 template<typename Derived>
11711 ExprResult
11712 TreeTransform<Derived>::TransformLambdaExpr(LambdaExpr *E) {
11713   // Transform any init-capture expressions before entering the scope of the
11714   // lambda body, because they are not semantically within that scope.
11715   typedef std::pair<ExprResult, QualType> InitCaptureInfoTy;
11716   struct TransformedInitCapture {
11717     // The location of the ... if the result is retaining a pack expansion.
11718     SourceLocation EllipsisLoc;
11719     // Zero or more expansions of the init-capture.
11720     SmallVector<InitCaptureInfoTy, 4> Expansions;
11721   };
11722   SmallVector<TransformedInitCapture, 4> InitCaptures;
11723   InitCaptures.resize(E->explicit_capture_end() - E->explicit_capture_begin());
11724   for (LambdaExpr::capture_iterator C = E->capture_begin(),
11725                                     CEnd = E->capture_end();
11726        C != CEnd; ++C) {
11727     if (!E->isInitCapture(C))
11728       continue;
11729 
11730     TransformedInitCapture &Result = InitCaptures[C - E->capture_begin()];
11731     VarDecl *OldVD = C->getCapturedVar();
11732 
11733     auto SubstInitCapture = [&](SourceLocation EllipsisLoc,
11734                                 Optional<unsigned> NumExpansions) {
11735       ExprResult NewExprInitResult = getDerived().TransformInitializer(
11736           OldVD->getInit(), OldVD->getInitStyle() == VarDecl::CallInit);
11737 
11738       if (NewExprInitResult.isInvalid()) {
11739         Result.Expansions.push_back(InitCaptureInfoTy(ExprError(), QualType()));
11740         return;
11741       }
11742       Expr *NewExprInit = NewExprInitResult.get();
11743 
11744       QualType NewInitCaptureType =
11745           getSema().buildLambdaInitCaptureInitialization(
11746               C->getLocation(), OldVD->getType()->isReferenceType(),
11747               EllipsisLoc, NumExpansions, OldVD->getIdentifier(),
11748               C->getCapturedVar()->getInitStyle() != VarDecl::CInit,
11749               NewExprInit);
11750       Result.Expansions.push_back(
11751           InitCaptureInfoTy(NewExprInit, NewInitCaptureType));
11752     };
11753 
11754     // If this is an init-capture pack, consider expanding the pack now.
11755     if (OldVD->isParameterPack()) {
11756       PackExpansionTypeLoc ExpansionTL = OldVD->getTypeSourceInfo()
11757                                              ->getTypeLoc()
11758                                              .castAs<PackExpansionTypeLoc>();
11759       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
11760       SemaRef.collectUnexpandedParameterPacks(OldVD->getInit(), Unexpanded);
11761 
11762       // Determine whether the set of unexpanded parameter packs can and should
11763       // be expanded.
11764       bool Expand = true;
11765       bool RetainExpansion = false;
11766       Optional<unsigned> OrigNumExpansions =
11767           ExpansionTL.getTypePtr()->getNumExpansions();
11768       Optional<unsigned> NumExpansions = OrigNumExpansions;
11769       if (getDerived().TryExpandParameterPacks(
11770               ExpansionTL.getEllipsisLoc(),
11771               OldVD->getInit()->getSourceRange(), Unexpanded, Expand,
11772               RetainExpansion, NumExpansions))
11773         return ExprError();
11774       if (Expand) {
11775         for (unsigned I = 0; I != *NumExpansions; ++I) {
11776           Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
11777           SubstInitCapture(SourceLocation(), None);
11778         }
11779       }
11780       if (!Expand || RetainExpansion) {
11781         ForgetPartiallySubstitutedPackRAII Forget(getDerived());
11782         SubstInitCapture(ExpansionTL.getEllipsisLoc(), NumExpansions);
11783         Result.EllipsisLoc = ExpansionTL.getEllipsisLoc();
11784       }
11785     } else {
11786       SubstInitCapture(SourceLocation(), None);
11787     }
11788   }
11789 
11790   LambdaScopeInfo *LSI = getSema().PushLambdaScope();
11791   Sema::FunctionScopeRAII FuncScopeCleanup(getSema());
11792 
11793   // Transform the template parameters, and add them to the current
11794   // instantiation scope. The null case is handled correctly.
11795   auto TPL = getDerived().TransformTemplateParameterList(
11796       E->getTemplateParameterList());
11797   LSI->GLTemplateParameterList = TPL;
11798 
11799   // Transform the type of the original lambda's call operator.
11800   // The transformation MUST be done in the CurrentInstantiationScope since
11801   // it introduces a mapping of the original to the newly created
11802   // transformed parameters.
11803   TypeSourceInfo *NewCallOpTSI = nullptr;
11804   {
11805     TypeSourceInfo *OldCallOpTSI = E->getCallOperator()->getTypeSourceInfo();
11806     FunctionProtoTypeLoc OldCallOpFPTL =
11807         OldCallOpTSI->getTypeLoc().getAs<FunctionProtoTypeLoc>();
11808 
11809     TypeLocBuilder NewCallOpTLBuilder;
11810     SmallVector<QualType, 4> ExceptionStorage;
11811     TreeTransform *This = this; // Work around gcc.gnu.org/PR56135.
11812     QualType NewCallOpType = TransformFunctionProtoType(
11813         NewCallOpTLBuilder, OldCallOpFPTL, nullptr, Qualifiers(),
11814         [&](FunctionProtoType::ExceptionSpecInfo &ESI, bool &Changed) {
11815           return This->TransformExceptionSpec(OldCallOpFPTL.getBeginLoc(), ESI,
11816                                               ExceptionStorage, Changed);
11817         });
11818     if (NewCallOpType.isNull())
11819       return ExprError();
11820     NewCallOpTSI = NewCallOpTLBuilder.getTypeSourceInfo(getSema().Context,
11821                                                         NewCallOpType);
11822   }
11823 
11824   // Transform the trailing requires clause
11825   ExprResult NewTrailingRequiresClause;
11826   if (Expr *TRC = E->getCallOperator()->getTrailingRequiresClause())
11827     // FIXME: Concepts: Substitution into requires clause should only happen
11828     //                  when checking satisfaction.
11829     NewTrailingRequiresClause = getDerived().TransformExpr(TRC);
11830 
11831   // Create the local class that will describe the lambda.
11832   CXXRecordDecl *OldClass = E->getLambdaClass();
11833   CXXRecordDecl *Class
11834     = getSema().createLambdaClosureType(E->getIntroducerRange(),
11835                                         NewCallOpTSI,
11836                                         /*KnownDependent=*/false,
11837                                         E->getCaptureDefault());
11838   getDerived().transformedLocalDecl(OldClass, {Class});
11839 
11840   Optional<std::tuple<unsigned, bool, Decl *>> Mangling;
11841   if (getDerived().ReplacingOriginal())
11842     Mangling = std::make_tuple(OldClass->getLambdaManglingNumber(),
11843                                OldClass->hasKnownLambdaInternalLinkage(),
11844                                OldClass->getLambdaContextDecl());
11845 
11846   // Build the call operator.
11847   CXXMethodDecl *NewCallOperator = getSema().startLambdaDefinition(
11848       Class, E->getIntroducerRange(), NewCallOpTSI,
11849       E->getCallOperator()->getEndLoc(),
11850       NewCallOpTSI->getTypeLoc().castAs<FunctionProtoTypeLoc>().getParams(),
11851       E->getCallOperator()->getConstexprKind(),
11852       NewTrailingRequiresClause.get());
11853 
11854   LSI->CallOperator = NewCallOperator;
11855 
11856   for (unsigned I = 0, NumParams = NewCallOperator->getNumParams();
11857        I != NumParams; ++I) {
11858     auto *P = NewCallOperator->getParamDecl(I);
11859     if (P->hasUninstantiatedDefaultArg()) {
11860       EnterExpressionEvaluationContext Eval(
11861           getSema(),
11862           Sema::ExpressionEvaluationContext::PotentiallyEvaluatedIfUsed, P);
11863       ExprResult R = getDerived().TransformExpr(
11864           E->getCallOperator()->getParamDecl(I)->getDefaultArg());
11865       P->setDefaultArg(R.get());
11866     }
11867   }
11868 
11869   getDerived().transformAttrs(E->getCallOperator(), NewCallOperator);
11870   getDerived().transformedLocalDecl(E->getCallOperator(), {NewCallOperator});
11871 
11872   // Number the lambda for linkage purposes if necessary.
11873   getSema().handleLambdaNumbering(Class, NewCallOperator, Mangling);
11874 
11875   // Introduce the context of the call operator.
11876   Sema::ContextRAII SavedContext(getSema(), NewCallOperator,
11877                                  /*NewThisContext*/false);
11878 
11879   // Enter the scope of the lambda.
11880   getSema().buildLambdaScope(LSI, NewCallOperator,
11881                              E->getIntroducerRange(),
11882                              E->getCaptureDefault(),
11883                              E->getCaptureDefaultLoc(),
11884                              E->hasExplicitParameters(),
11885                              E->hasExplicitResultType(),
11886                              E->isMutable());
11887 
11888   bool Invalid = false;
11889 
11890   // Transform captures.
11891   for (LambdaExpr::capture_iterator C = E->capture_begin(),
11892                                  CEnd = E->capture_end();
11893        C != CEnd; ++C) {
11894     // When we hit the first implicit capture, tell Sema that we've finished
11895     // the list of explicit captures.
11896     if (C->isImplicit())
11897       break;
11898 
11899     // Capturing 'this' is trivial.
11900     if (C->capturesThis()) {
11901       getSema().CheckCXXThisCapture(C->getLocation(), C->isExplicit(),
11902                                     /*BuildAndDiagnose*/ true, nullptr,
11903                                     C->getCaptureKind() == LCK_StarThis);
11904       continue;
11905     }
11906     // Captured expression will be recaptured during captured variables
11907     // rebuilding.
11908     if (C->capturesVLAType())
11909       continue;
11910 
11911     // Rebuild init-captures, including the implied field declaration.
11912     if (E->isInitCapture(C)) {
11913       TransformedInitCapture &NewC = InitCaptures[C - E->capture_begin()];
11914 
11915       VarDecl *OldVD = C->getCapturedVar();
11916       llvm::SmallVector<Decl*, 4> NewVDs;
11917 
11918       for (InitCaptureInfoTy &Info : NewC.Expansions) {
11919         ExprResult Init = Info.first;
11920         QualType InitQualType = Info.second;
11921         if (Init.isInvalid() || InitQualType.isNull()) {
11922           Invalid = true;
11923           break;
11924         }
11925         VarDecl *NewVD = getSema().createLambdaInitCaptureVarDecl(
11926             OldVD->getLocation(), InitQualType, NewC.EllipsisLoc,
11927             OldVD->getIdentifier(), OldVD->getInitStyle(), Init.get());
11928         if (!NewVD) {
11929           Invalid = true;
11930           break;
11931         }
11932         NewVDs.push_back(NewVD);
11933         getSema().addInitCapture(LSI, NewVD);
11934       }
11935 
11936       if (Invalid)
11937         break;
11938 
11939       getDerived().transformedLocalDecl(OldVD, NewVDs);
11940       continue;
11941     }
11942 
11943     assert(C->capturesVariable() && "unexpected kind of lambda capture");
11944 
11945     // Determine the capture kind for Sema.
11946     Sema::TryCaptureKind Kind
11947       = C->isImplicit()? Sema::TryCapture_Implicit
11948                        : C->getCaptureKind() == LCK_ByCopy
11949                            ? Sema::TryCapture_ExplicitByVal
11950                            : Sema::TryCapture_ExplicitByRef;
11951     SourceLocation EllipsisLoc;
11952     if (C->isPackExpansion()) {
11953       UnexpandedParameterPack Unexpanded(C->getCapturedVar(), C->getLocation());
11954       bool ShouldExpand = false;
11955       bool RetainExpansion = false;
11956       Optional<unsigned> NumExpansions;
11957       if (getDerived().TryExpandParameterPacks(C->getEllipsisLoc(),
11958                                                C->getLocation(),
11959                                                Unexpanded,
11960                                                ShouldExpand, RetainExpansion,
11961                                                NumExpansions)) {
11962         Invalid = true;
11963         continue;
11964       }
11965 
11966       if (ShouldExpand) {
11967         // The transform has determined that we should perform an expansion;
11968         // transform and capture each of the arguments.
11969         // expansion of the pattern. Do so.
11970         VarDecl *Pack = C->getCapturedVar();
11971         for (unsigned I = 0; I != *NumExpansions; ++I) {
11972           Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
11973           VarDecl *CapturedVar
11974             = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(),
11975                                                                Pack));
11976           if (!CapturedVar) {
11977             Invalid = true;
11978             continue;
11979           }
11980 
11981           // Capture the transformed variable.
11982           getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind);
11983         }
11984 
11985         // FIXME: Retain a pack expansion if RetainExpansion is true.
11986 
11987         continue;
11988       }
11989 
11990       EllipsisLoc = C->getEllipsisLoc();
11991     }
11992 
11993     // Transform the captured variable.
11994     VarDecl *CapturedVar
11995       = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(),
11996                                                          C->getCapturedVar()));
11997     if (!CapturedVar || CapturedVar->isInvalidDecl()) {
11998       Invalid = true;
11999       continue;
12000     }
12001 
12002     // Capture the transformed variable.
12003     getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind,
12004                                  EllipsisLoc);
12005   }
12006   getSema().finishLambdaExplicitCaptures(LSI);
12007 
12008   // FIXME: Sema's lambda-building mechanism expects us to push an expression
12009   // evaluation context even if we're not transforming the function body.
12010   getSema().PushExpressionEvaluationContext(
12011       Sema::ExpressionEvaluationContext::PotentiallyEvaluated);
12012 
12013   // Instantiate the body of the lambda expression.
12014   StmtResult Body =
12015       Invalid ? StmtError() : getDerived().TransformLambdaBody(E, E->getBody());
12016 
12017   // ActOnLambda* will pop the function scope for us.
12018   FuncScopeCleanup.disable();
12019 
12020   if (Body.isInvalid()) {
12021     SavedContext.pop();
12022     getSema().ActOnLambdaError(E->getBeginLoc(), /*CurScope=*/nullptr,
12023                                /*IsInstantiation=*/true);
12024     return ExprError();
12025   }
12026 
12027   // Copy the LSI before ActOnFinishFunctionBody removes it.
12028   // FIXME: This is dumb. Store the lambda information somewhere that outlives
12029   // the call operator.
12030   auto LSICopy = *LSI;
12031   getSema().ActOnFinishFunctionBody(NewCallOperator, Body.get(),
12032                                     /*IsInstantiation*/ true);
12033   SavedContext.pop();
12034 
12035   return getSema().BuildLambdaExpr(E->getBeginLoc(), Body.get()->getEndLoc(),
12036                                    &LSICopy);
12037 }
12038 
12039 template<typename Derived>
12040 StmtResult
12041 TreeTransform<Derived>::TransformLambdaBody(LambdaExpr *E, Stmt *S) {
12042   return TransformStmt(S);
12043 }
12044 
12045 template<typename Derived>
12046 StmtResult
12047 TreeTransform<Derived>::SkipLambdaBody(LambdaExpr *E, Stmt *S) {
12048   // Transform captures.
12049   for (LambdaExpr::capture_iterator C = E->capture_begin(),
12050                                  CEnd = E->capture_end();
12051        C != CEnd; ++C) {
12052     // When we hit the first implicit capture, tell Sema that we've finished
12053     // the list of explicit captures.
12054     if (!C->isImplicit())
12055       continue;
12056 
12057     // Capturing 'this' is trivial.
12058     if (C->capturesThis()) {
12059       getSema().CheckCXXThisCapture(C->getLocation(), C->isExplicit(),
12060                                     /*BuildAndDiagnose*/ true, nullptr,
12061                                     C->getCaptureKind() == LCK_StarThis);
12062       continue;
12063     }
12064     // Captured expression will be recaptured during captured variables
12065     // rebuilding.
12066     if (C->capturesVLAType())
12067       continue;
12068 
12069     assert(C->capturesVariable() && "unexpected kind of lambda capture");
12070     assert(!E->isInitCapture(C) && "implicit init-capture?");
12071 
12072     // Transform the captured variable.
12073     VarDecl *CapturedVar = cast_or_null<VarDecl>(
12074         getDerived().TransformDecl(C->getLocation(), C->getCapturedVar()));
12075     if (!CapturedVar || CapturedVar->isInvalidDecl())
12076       return StmtError();
12077 
12078     // Capture the transformed variable.
12079     getSema().tryCaptureVariable(CapturedVar, C->getLocation());
12080   }
12081 
12082   return S;
12083 }
12084 
12085 template<typename Derived>
12086 ExprResult
12087 TreeTransform<Derived>::TransformCXXUnresolvedConstructExpr(
12088                                                   CXXUnresolvedConstructExpr *E) {
12089   TypeSourceInfo *T =
12090       getDerived().TransformTypeWithDeducedTST(E->getTypeSourceInfo());
12091   if (!T)
12092     return ExprError();
12093 
12094   bool ArgumentChanged = false;
12095   SmallVector<Expr*, 8> Args;
12096   Args.reserve(E->arg_size());
12097   {
12098     EnterExpressionEvaluationContext Context(
12099         getSema(), EnterExpressionEvaluationContext::InitList,
12100         E->isListInitialization());
12101     if (getDerived().TransformExprs(E->arg_begin(), E->arg_size(), true, Args,
12102                                     &ArgumentChanged))
12103       return ExprError();
12104   }
12105 
12106   if (!getDerived().AlwaysRebuild() &&
12107       T == E->getTypeSourceInfo() &&
12108       !ArgumentChanged)
12109     return E;
12110 
12111   // FIXME: we're faking the locations of the commas
12112   return getDerived().RebuildCXXUnresolvedConstructExpr(
12113       T, E->getLParenLoc(), Args, E->getRParenLoc(), E->isListInitialization());
12114 }
12115 
12116 template<typename Derived>
12117 ExprResult
12118 TreeTransform<Derived>::TransformCXXDependentScopeMemberExpr(
12119                                              CXXDependentScopeMemberExpr *E) {
12120   // Transform the base of the expression.
12121   ExprResult Base((Expr*) nullptr);
12122   Expr *OldBase;
12123   QualType BaseType;
12124   QualType ObjectType;
12125   if (!E->isImplicitAccess()) {
12126     OldBase = E->getBase();
12127     Base = getDerived().TransformExpr(OldBase);
12128     if (Base.isInvalid())
12129       return ExprError();
12130 
12131     // Start the member reference and compute the object's type.
12132     ParsedType ObjectTy;
12133     bool MayBePseudoDestructor = false;
12134     Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(),
12135                                                 E->getOperatorLoc(),
12136                                       E->isArrow()? tok::arrow : tok::period,
12137                                                 ObjectTy,
12138                                                 MayBePseudoDestructor);
12139     if (Base.isInvalid())
12140       return ExprError();
12141 
12142     ObjectType = ObjectTy.get();
12143     BaseType = ((Expr*) Base.get())->getType();
12144   } else {
12145     OldBase = nullptr;
12146     BaseType = getDerived().TransformType(E->getBaseType());
12147     ObjectType = BaseType->castAs<PointerType>()->getPointeeType();
12148   }
12149 
12150   // Transform the first part of the nested-name-specifier that qualifies
12151   // the member name.
12152   NamedDecl *FirstQualifierInScope
12153     = getDerived().TransformFirstQualifierInScope(
12154                                             E->getFirstQualifierFoundInScope(),
12155                                             E->getQualifierLoc().getBeginLoc());
12156 
12157   NestedNameSpecifierLoc QualifierLoc;
12158   if (E->getQualifier()) {
12159     QualifierLoc
12160       = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc(),
12161                                                      ObjectType,
12162                                                      FirstQualifierInScope);
12163     if (!QualifierLoc)
12164       return ExprError();
12165   }
12166 
12167   SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc();
12168 
12169   // TODO: If this is a conversion-function-id, verify that the
12170   // destination type name (if present) resolves the same way after
12171   // instantiation as it did in the local scope.
12172 
12173   DeclarationNameInfo NameInfo
12174     = getDerived().TransformDeclarationNameInfo(E->getMemberNameInfo());
12175   if (!NameInfo.getName())
12176     return ExprError();
12177 
12178   if (!E->hasExplicitTemplateArgs()) {
12179     // This is a reference to a member without an explicitly-specified
12180     // template argument list. Optimize for this common case.
12181     if (!getDerived().AlwaysRebuild() &&
12182         Base.get() == OldBase &&
12183         BaseType == E->getBaseType() &&
12184         QualifierLoc == E->getQualifierLoc() &&
12185         NameInfo.getName() == E->getMember() &&
12186         FirstQualifierInScope == E->getFirstQualifierFoundInScope())
12187       return E;
12188 
12189     return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(),
12190                                                        BaseType,
12191                                                        E->isArrow(),
12192                                                        E->getOperatorLoc(),
12193                                                        QualifierLoc,
12194                                                        TemplateKWLoc,
12195                                                        FirstQualifierInScope,
12196                                                        NameInfo,
12197                                                        /*TemplateArgs*/nullptr);
12198   }
12199 
12200   TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc());
12201   if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
12202                                               E->getNumTemplateArgs(),
12203                                               TransArgs))
12204     return ExprError();
12205 
12206   return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(),
12207                                                      BaseType,
12208                                                      E->isArrow(),
12209                                                      E->getOperatorLoc(),
12210                                                      QualifierLoc,
12211                                                      TemplateKWLoc,
12212                                                      FirstQualifierInScope,
12213                                                      NameInfo,
12214                                                      &TransArgs);
12215 }
12216 
12217 template<typename Derived>
12218 ExprResult
12219 TreeTransform<Derived>::TransformUnresolvedMemberExpr(UnresolvedMemberExpr *Old) {
12220   // Transform the base of the expression.
12221   ExprResult Base((Expr*) nullptr);
12222   QualType BaseType;
12223   if (!Old->isImplicitAccess()) {
12224     Base = getDerived().TransformExpr(Old->getBase());
12225     if (Base.isInvalid())
12226       return ExprError();
12227     Base = getSema().PerformMemberExprBaseConversion(Base.get(),
12228                                                      Old->isArrow());
12229     if (Base.isInvalid())
12230       return ExprError();
12231     BaseType = Base.get()->getType();
12232   } else {
12233     BaseType = getDerived().TransformType(Old->getBaseType());
12234   }
12235 
12236   NestedNameSpecifierLoc QualifierLoc;
12237   if (Old->getQualifierLoc()) {
12238     QualifierLoc
12239     = getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc());
12240     if (!QualifierLoc)
12241       return ExprError();
12242   }
12243 
12244   SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc();
12245 
12246   LookupResult R(SemaRef, Old->getMemberNameInfo(),
12247                  Sema::LookupOrdinaryName);
12248 
12249   // Transform the declaration set.
12250   if (TransformOverloadExprDecls(Old, /*RequiresADL*/false, R))
12251     return ExprError();
12252 
12253   // Determine the naming class.
12254   if (Old->getNamingClass()) {
12255     CXXRecordDecl *NamingClass
12256       = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl(
12257                                                           Old->getMemberLoc(),
12258                                                         Old->getNamingClass()));
12259     if (!NamingClass)
12260       return ExprError();
12261 
12262     R.setNamingClass(NamingClass);
12263   }
12264 
12265   TemplateArgumentListInfo TransArgs;
12266   if (Old->hasExplicitTemplateArgs()) {
12267     TransArgs.setLAngleLoc(Old->getLAngleLoc());
12268     TransArgs.setRAngleLoc(Old->getRAngleLoc());
12269     if (getDerived().TransformTemplateArguments(Old->getTemplateArgs(),
12270                                                 Old->getNumTemplateArgs(),
12271                                                 TransArgs))
12272       return ExprError();
12273   }
12274 
12275   // FIXME: to do this check properly, we will need to preserve the
12276   // first-qualifier-in-scope here, just in case we had a dependent
12277   // base (and therefore couldn't do the check) and a
12278   // nested-name-qualifier (and therefore could do the lookup).
12279   NamedDecl *FirstQualifierInScope = nullptr;
12280 
12281   return getDerived().RebuildUnresolvedMemberExpr(Base.get(),
12282                                                   BaseType,
12283                                                   Old->getOperatorLoc(),
12284                                                   Old->isArrow(),
12285                                                   QualifierLoc,
12286                                                   TemplateKWLoc,
12287                                                   FirstQualifierInScope,
12288                                                   R,
12289                                               (Old->hasExplicitTemplateArgs()
12290                                                   ? &TransArgs : nullptr));
12291 }
12292 
12293 template<typename Derived>
12294 ExprResult
12295 TreeTransform<Derived>::TransformCXXNoexceptExpr(CXXNoexceptExpr *E) {
12296   EnterExpressionEvaluationContext Unevaluated(
12297       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
12298   ExprResult SubExpr = getDerived().TransformExpr(E->getOperand());
12299   if (SubExpr.isInvalid())
12300     return ExprError();
12301 
12302   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getOperand())
12303     return E;
12304 
12305   return getDerived().RebuildCXXNoexceptExpr(E->getSourceRange(),SubExpr.get());
12306 }
12307 
12308 template<typename Derived>
12309 ExprResult
12310 TreeTransform<Derived>::TransformPackExpansionExpr(PackExpansionExpr *E) {
12311   ExprResult Pattern = getDerived().TransformExpr(E->getPattern());
12312   if (Pattern.isInvalid())
12313     return ExprError();
12314 
12315   if (!getDerived().AlwaysRebuild() && Pattern.get() == E->getPattern())
12316     return E;
12317 
12318   return getDerived().RebuildPackExpansion(Pattern.get(), E->getEllipsisLoc(),
12319                                            E->getNumExpansions());
12320 }
12321 
12322 template<typename Derived>
12323 ExprResult
12324 TreeTransform<Derived>::TransformSizeOfPackExpr(SizeOfPackExpr *E) {
12325   // If E is not value-dependent, then nothing will change when we transform it.
12326   // Note: This is an instantiation-centric view.
12327   if (!E->isValueDependent())
12328     return E;
12329 
12330   EnterExpressionEvaluationContext Unevaluated(
12331       getSema(), Sema::ExpressionEvaluationContext::Unevaluated);
12332 
12333   ArrayRef<TemplateArgument> PackArgs;
12334   TemplateArgument ArgStorage;
12335 
12336   // Find the argument list to transform.
12337   if (E->isPartiallySubstituted()) {
12338     PackArgs = E->getPartialArguments();
12339   } else if (E->isValueDependent()) {
12340     UnexpandedParameterPack Unexpanded(E->getPack(), E->getPackLoc());
12341     bool ShouldExpand = false;
12342     bool RetainExpansion = false;
12343     Optional<unsigned> NumExpansions;
12344     if (getDerived().TryExpandParameterPacks(E->getOperatorLoc(), E->getPackLoc(),
12345                                              Unexpanded,
12346                                              ShouldExpand, RetainExpansion,
12347                                              NumExpansions))
12348       return ExprError();
12349 
12350     // If we need to expand the pack, build a template argument from it and
12351     // expand that.
12352     if (ShouldExpand) {
12353       auto *Pack = E->getPack();
12354       if (auto *TTPD = dyn_cast<TemplateTypeParmDecl>(Pack)) {
12355         ArgStorage = getSema().Context.getPackExpansionType(
12356             getSema().Context.getTypeDeclType(TTPD), None);
12357       } else if (auto *TTPD = dyn_cast<TemplateTemplateParmDecl>(Pack)) {
12358         ArgStorage = TemplateArgument(TemplateName(TTPD), None);
12359       } else {
12360         auto *VD = cast<ValueDecl>(Pack);
12361         ExprResult DRE = getSema().BuildDeclRefExpr(
12362             VD, VD->getType().getNonLValueExprType(getSema().Context),
12363             VD->getType()->isReferenceType() ? VK_LValue : VK_RValue,
12364             E->getPackLoc());
12365         if (DRE.isInvalid())
12366           return ExprError();
12367         ArgStorage = new (getSema().Context) PackExpansionExpr(
12368             getSema().Context.DependentTy, DRE.get(), E->getPackLoc(), None);
12369       }
12370       PackArgs = ArgStorage;
12371     }
12372   }
12373 
12374   // If we're not expanding the pack, just transform the decl.
12375   if (!PackArgs.size()) {
12376     auto *Pack = cast_or_null<NamedDecl>(
12377         getDerived().TransformDecl(E->getPackLoc(), E->getPack()));
12378     if (!Pack)
12379       return ExprError();
12380     return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), Pack,
12381                                               E->getPackLoc(),
12382                                               E->getRParenLoc(), None, None);
12383   }
12384 
12385   // Try to compute the result without performing a partial substitution.
12386   Optional<unsigned> Result = 0;
12387   for (const TemplateArgument &Arg : PackArgs) {
12388     if (!Arg.isPackExpansion()) {
12389       Result = *Result + 1;
12390       continue;
12391     }
12392 
12393     TemplateArgumentLoc ArgLoc;
12394     InventTemplateArgumentLoc(Arg, ArgLoc);
12395 
12396     // Find the pattern of the pack expansion.
12397     SourceLocation Ellipsis;
12398     Optional<unsigned> OrigNumExpansions;
12399     TemplateArgumentLoc Pattern =
12400         getSema().getTemplateArgumentPackExpansionPattern(ArgLoc, Ellipsis,
12401                                                           OrigNumExpansions);
12402 
12403     // Substitute under the pack expansion. Do not expand the pack (yet).
12404     TemplateArgumentLoc OutPattern;
12405     Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
12406     if (getDerived().TransformTemplateArgument(Pattern, OutPattern,
12407                                                /*Uneval*/ true))
12408       return true;
12409 
12410     // See if we can determine the number of arguments from the result.
12411     Optional<unsigned> NumExpansions =
12412         getSema().getFullyPackExpandedSize(OutPattern.getArgument());
12413     if (!NumExpansions) {
12414       // No: we must be in an alias template expansion, and we're going to need
12415       // to actually expand the packs.
12416       Result = None;
12417       break;
12418     }
12419 
12420     Result = *Result + *NumExpansions;
12421   }
12422 
12423   // Common case: we could determine the number of expansions without
12424   // substituting.
12425   if (Result)
12426     return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(),
12427                                               E->getPackLoc(),
12428                                               E->getRParenLoc(), *Result, None);
12429 
12430   TemplateArgumentListInfo TransformedPackArgs(E->getPackLoc(),
12431                                                E->getPackLoc());
12432   {
12433     TemporaryBase Rebase(*this, E->getPackLoc(), getBaseEntity());
12434     typedef TemplateArgumentLocInventIterator<
12435         Derived, const TemplateArgument*> PackLocIterator;
12436     if (TransformTemplateArguments(PackLocIterator(*this, PackArgs.begin()),
12437                                    PackLocIterator(*this, PackArgs.end()),
12438                                    TransformedPackArgs, /*Uneval*/true))
12439       return ExprError();
12440   }
12441 
12442   // Check whether we managed to fully-expand the pack.
12443   // FIXME: Is it possible for us to do so and not hit the early exit path?
12444   SmallVector<TemplateArgument, 8> Args;
12445   bool PartialSubstitution = false;
12446   for (auto &Loc : TransformedPackArgs.arguments()) {
12447     Args.push_back(Loc.getArgument());
12448     if (Loc.getArgument().isPackExpansion())
12449       PartialSubstitution = true;
12450   }
12451 
12452   if (PartialSubstitution)
12453     return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(),
12454                                               E->getPackLoc(),
12455                                               E->getRParenLoc(), None, Args);
12456 
12457   return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(),
12458                                             E->getPackLoc(), E->getRParenLoc(),
12459                                             Args.size(), None);
12460 }
12461 
12462 template<typename Derived>
12463 ExprResult
12464 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmPackExpr(
12465                                           SubstNonTypeTemplateParmPackExpr *E) {
12466   // Default behavior is to do nothing with this transformation.
12467   return E;
12468 }
12469 
12470 template<typename Derived>
12471 ExprResult
12472 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmExpr(
12473                                           SubstNonTypeTemplateParmExpr *E) {
12474   // Default behavior is to do nothing with this transformation.
12475   return E;
12476 }
12477 
12478 template<typename Derived>
12479 ExprResult
12480 TreeTransform<Derived>::TransformFunctionParmPackExpr(FunctionParmPackExpr *E) {
12481   // Default behavior is to do nothing with this transformation.
12482   return E;
12483 }
12484 
12485 template<typename Derived>
12486 ExprResult
12487 TreeTransform<Derived>::TransformMaterializeTemporaryExpr(
12488                                                   MaterializeTemporaryExpr *E) {
12489   return getDerived().TransformExpr(E->getSubExpr());
12490 }
12491 
12492 template<typename Derived>
12493 ExprResult
12494 TreeTransform<Derived>::TransformCXXFoldExpr(CXXFoldExpr *E) {
12495   Expr *Pattern = E->getPattern();
12496 
12497   SmallVector<UnexpandedParameterPack, 2> Unexpanded;
12498   getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
12499   assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
12500 
12501   // Determine whether the set of unexpanded parameter packs can and should
12502   // be expanded.
12503   bool Expand = true;
12504   bool RetainExpansion = false;
12505   Optional<unsigned> OrigNumExpansions = E->getNumExpansions(),
12506                      NumExpansions = OrigNumExpansions;
12507   if (getDerived().TryExpandParameterPacks(E->getEllipsisLoc(),
12508                                            Pattern->getSourceRange(),
12509                                            Unexpanded,
12510                                            Expand, RetainExpansion,
12511                                            NumExpansions))
12512     return true;
12513 
12514   if (!Expand) {
12515     // Do not expand any packs here, just transform and rebuild a fold
12516     // expression.
12517     Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
12518 
12519     ExprResult LHS =
12520         E->getLHS() ? getDerived().TransformExpr(E->getLHS()) : ExprResult();
12521     if (LHS.isInvalid())
12522       return true;
12523 
12524     ExprResult RHS =
12525         E->getRHS() ? getDerived().TransformExpr(E->getRHS()) : ExprResult();
12526     if (RHS.isInvalid())
12527       return true;
12528 
12529     if (!getDerived().AlwaysRebuild() &&
12530         LHS.get() == E->getLHS() && RHS.get() == E->getRHS())
12531       return E;
12532 
12533     return getDerived().RebuildCXXFoldExpr(
12534         E->getBeginLoc(), LHS.get(), E->getOperator(), E->getEllipsisLoc(),
12535         RHS.get(), E->getEndLoc(), NumExpansions);
12536   }
12537 
12538   // The transform has determined that we should perform an elementwise
12539   // expansion of the pattern. Do so.
12540   ExprResult Result = getDerived().TransformExpr(E->getInit());
12541   if (Result.isInvalid())
12542     return true;
12543   bool LeftFold = E->isLeftFold();
12544 
12545   // If we're retaining an expansion for a right fold, it is the innermost
12546   // component and takes the init (if any).
12547   if (!LeftFold && RetainExpansion) {
12548     ForgetPartiallySubstitutedPackRAII Forget(getDerived());
12549 
12550     ExprResult Out = getDerived().TransformExpr(Pattern);
12551     if (Out.isInvalid())
12552       return true;
12553 
12554     Result = getDerived().RebuildCXXFoldExpr(
12555         E->getBeginLoc(), Out.get(), E->getOperator(), E->getEllipsisLoc(),
12556         Result.get(), E->getEndLoc(), OrigNumExpansions);
12557     if (Result.isInvalid())
12558       return true;
12559   }
12560 
12561   for (unsigned I = 0; I != *NumExpansions; ++I) {
12562     Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(
12563         getSema(), LeftFold ? I : *NumExpansions - I - 1);
12564     ExprResult Out = getDerived().TransformExpr(Pattern);
12565     if (Out.isInvalid())
12566       return true;
12567 
12568     if (Out.get()->containsUnexpandedParameterPack()) {
12569       // We still have a pack; retain a pack expansion for this slice.
12570       Result = getDerived().RebuildCXXFoldExpr(
12571           E->getBeginLoc(), LeftFold ? Result.get() : Out.get(),
12572           E->getOperator(), E->getEllipsisLoc(),
12573           LeftFold ? Out.get() : Result.get(), E->getEndLoc(),
12574           OrigNumExpansions);
12575     } else if (Result.isUsable()) {
12576       // We've got down to a single element; build a binary operator.
12577       Result = getDerived().RebuildBinaryOperator(
12578           E->getEllipsisLoc(), E->getOperator(),
12579           LeftFold ? Result.get() : Out.get(),
12580           LeftFold ? Out.get() : Result.get());
12581     } else
12582       Result = Out;
12583 
12584     if (Result.isInvalid())
12585       return true;
12586   }
12587 
12588   // If we're retaining an expansion for a left fold, it is the outermost
12589   // component and takes the complete expansion so far as its init (if any).
12590   if (LeftFold && RetainExpansion) {
12591     ForgetPartiallySubstitutedPackRAII Forget(getDerived());
12592 
12593     ExprResult Out = getDerived().TransformExpr(Pattern);
12594     if (Out.isInvalid())
12595       return true;
12596 
12597     Result = getDerived().RebuildCXXFoldExpr(
12598         E->getBeginLoc(), Result.get(), E->getOperator(), E->getEllipsisLoc(),
12599         Out.get(), E->getEndLoc(), OrigNumExpansions);
12600     if (Result.isInvalid())
12601       return true;
12602   }
12603 
12604   // If we had no init and an empty pack, and we're not retaining an expansion,
12605   // then produce a fallback value or error.
12606   if (Result.isUnset())
12607     return getDerived().RebuildEmptyCXXFoldExpr(E->getEllipsisLoc(),
12608                                                 E->getOperator());
12609 
12610   return Result;
12611 }
12612 
12613 template<typename Derived>
12614 ExprResult
12615 TreeTransform<Derived>::TransformCXXStdInitializerListExpr(
12616     CXXStdInitializerListExpr *E) {
12617   return getDerived().TransformExpr(E->getSubExpr());
12618 }
12619 
12620 template<typename Derived>
12621 ExprResult
12622 TreeTransform<Derived>::TransformObjCStringLiteral(ObjCStringLiteral *E) {
12623   return SemaRef.MaybeBindToTemporary(E);
12624 }
12625 
12626 template<typename Derived>
12627 ExprResult
12628 TreeTransform<Derived>::TransformObjCBoolLiteralExpr(ObjCBoolLiteralExpr *E) {
12629   return E;
12630 }
12631 
12632 template<typename Derived>
12633 ExprResult
12634 TreeTransform<Derived>::TransformObjCBoxedExpr(ObjCBoxedExpr *E) {
12635   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
12636   if (SubExpr.isInvalid())
12637     return ExprError();
12638 
12639   if (!getDerived().AlwaysRebuild() &&
12640       SubExpr.get() == E->getSubExpr())
12641     return E;
12642 
12643   return getDerived().RebuildObjCBoxedExpr(E->getSourceRange(), SubExpr.get());
12644 }
12645 
12646 template<typename Derived>
12647 ExprResult
12648 TreeTransform<Derived>::TransformObjCArrayLiteral(ObjCArrayLiteral *E) {
12649   // Transform each of the elements.
12650   SmallVector<Expr *, 8> Elements;
12651   bool ArgChanged = false;
12652   if (getDerived().TransformExprs(E->getElements(), E->getNumElements(),
12653                                   /*IsCall=*/false, Elements, &ArgChanged))
12654     return ExprError();
12655 
12656   if (!getDerived().AlwaysRebuild() && !ArgChanged)
12657     return SemaRef.MaybeBindToTemporary(E);
12658 
12659   return getDerived().RebuildObjCArrayLiteral(E->getSourceRange(),
12660                                               Elements.data(),
12661                                               Elements.size());
12662 }
12663 
12664 template<typename Derived>
12665 ExprResult
12666 TreeTransform<Derived>::TransformObjCDictionaryLiteral(
12667                                                     ObjCDictionaryLiteral *E) {
12668   // Transform each of the elements.
12669   SmallVector<ObjCDictionaryElement, 8> Elements;
12670   bool ArgChanged = false;
12671   for (unsigned I = 0, N = E->getNumElements(); I != N; ++I) {
12672     ObjCDictionaryElement OrigElement = E->getKeyValueElement(I);
12673 
12674     if (OrigElement.isPackExpansion()) {
12675       // This key/value element is a pack expansion.
12676       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
12677       getSema().collectUnexpandedParameterPacks(OrigElement.Key, Unexpanded);
12678       getSema().collectUnexpandedParameterPacks(OrigElement.Value, Unexpanded);
12679       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
12680 
12681       // Determine whether the set of unexpanded parameter packs can
12682       // and should be expanded.
12683       bool Expand = true;
12684       bool RetainExpansion = false;
12685       Optional<unsigned> OrigNumExpansions = OrigElement.NumExpansions;
12686       Optional<unsigned> NumExpansions = OrigNumExpansions;
12687       SourceRange PatternRange(OrigElement.Key->getBeginLoc(),
12688                                OrigElement.Value->getEndLoc());
12689       if (getDerived().TryExpandParameterPacks(OrigElement.EllipsisLoc,
12690                                                PatternRange, Unexpanded, Expand,
12691                                                RetainExpansion, NumExpansions))
12692         return ExprError();
12693 
12694       if (!Expand) {
12695         // The transform has determined that we should perform a simple
12696         // transformation on the pack expansion, producing another pack
12697         // expansion.
12698         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
12699         ExprResult Key = getDerived().TransformExpr(OrigElement.Key);
12700         if (Key.isInvalid())
12701           return ExprError();
12702 
12703         if (Key.get() != OrigElement.Key)
12704           ArgChanged = true;
12705 
12706         ExprResult Value = getDerived().TransformExpr(OrigElement.Value);
12707         if (Value.isInvalid())
12708           return ExprError();
12709 
12710         if (Value.get() != OrigElement.Value)
12711           ArgChanged = true;
12712 
12713         ObjCDictionaryElement Expansion = {
12714           Key.get(), Value.get(), OrigElement.EllipsisLoc, NumExpansions
12715         };
12716         Elements.push_back(Expansion);
12717         continue;
12718       }
12719 
12720       // Record right away that the argument was changed.  This needs
12721       // to happen even if the array expands to nothing.
12722       ArgChanged = true;
12723 
12724       // The transform has determined that we should perform an elementwise
12725       // expansion of the pattern. Do so.
12726       for (unsigned I = 0; I != *NumExpansions; ++I) {
12727         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
12728         ExprResult Key = getDerived().TransformExpr(OrigElement.Key);
12729         if (Key.isInvalid())
12730           return ExprError();
12731 
12732         ExprResult Value = getDerived().TransformExpr(OrigElement.Value);
12733         if (Value.isInvalid())
12734           return ExprError();
12735 
12736         ObjCDictionaryElement Element = {
12737           Key.get(), Value.get(), SourceLocation(), NumExpansions
12738         };
12739 
12740         // If any unexpanded parameter packs remain, we still have a
12741         // pack expansion.
12742         // FIXME: Can this really happen?
12743         if (Key.get()->containsUnexpandedParameterPack() ||
12744             Value.get()->containsUnexpandedParameterPack())
12745           Element.EllipsisLoc = OrigElement.EllipsisLoc;
12746 
12747         Elements.push_back(Element);
12748       }
12749 
12750       // FIXME: Retain a pack expansion if RetainExpansion is true.
12751 
12752       // We've finished with this pack expansion.
12753       continue;
12754     }
12755 
12756     // Transform and check key.
12757     ExprResult Key = getDerived().TransformExpr(OrigElement.Key);
12758     if (Key.isInvalid())
12759       return ExprError();
12760 
12761     if (Key.get() != OrigElement.Key)
12762       ArgChanged = true;
12763 
12764     // Transform and check value.
12765     ExprResult Value
12766       = getDerived().TransformExpr(OrigElement.Value);
12767     if (Value.isInvalid())
12768       return ExprError();
12769 
12770     if (Value.get() != OrigElement.Value)
12771       ArgChanged = true;
12772 
12773     ObjCDictionaryElement Element = {
12774       Key.get(), Value.get(), SourceLocation(), None
12775     };
12776     Elements.push_back(Element);
12777   }
12778 
12779   if (!getDerived().AlwaysRebuild() && !ArgChanged)
12780     return SemaRef.MaybeBindToTemporary(E);
12781 
12782   return getDerived().RebuildObjCDictionaryLiteral(E->getSourceRange(),
12783                                                    Elements);
12784 }
12785 
12786 template<typename Derived>
12787 ExprResult
12788 TreeTransform<Derived>::TransformObjCEncodeExpr(ObjCEncodeExpr *E) {
12789   TypeSourceInfo *EncodedTypeInfo
12790     = getDerived().TransformType(E->getEncodedTypeSourceInfo());
12791   if (!EncodedTypeInfo)
12792     return ExprError();
12793 
12794   if (!getDerived().AlwaysRebuild() &&
12795       EncodedTypeInfo == E->getEncodedTypeSourceInfo())
12796     return E;
12797 
12798   return getDerived().RebuildObjCEncodeExpr(E->getAtLoc(),
12799                                             EncodedTypeInfo,
12800                                             E->getRParenLoc());
12801 }
12802 
12803 template<typename Derived>
12804 ExprResult TreeTransform<Derived>::
12805 TransformObjCIndirectCopyRestoreExpr(ObjCIndirectCopyRestoreExpr *E) {
12806   // This is a kind of implicit conversion, and it needs to get dropped
12807   // and recomputed for the same general reasons that ImplicitCastExprs
12808   // do, as well a more specific one: this expression is only valid when
12809   // it appears *immediately* as an argument expression.
12810   return getDerived().TransformExpr(E->getSubExpr());
12811 }
12812 
12813 template<typename Derived>
12814 ExprResult TreeTransform<Derived>::
12815 TransformObjCBridgedCastExpr(ObjCBridgedCastExpr *E) {
12816   TypeSourceInfo *TSInfo
12817     = getDerived().TransformType(E->getTypeInfoAsWritten());
12818   if (!TSInfo)
12819     return ExprError();
12820 
12821   ExprResult Result = getDerived().TransformExpr(E->getSubExpr());
12822   if (Result.isInvalid())
12823     return ExprError();
12824 
12825   if (!getDerived().AlwaysRebuild() &&
12826       TSInfo == E->getTypeInfoAsWritten() &&
12827       Result.get() == E->getSubExpr())
12828     return E;
12829 
12830   return SemaRef.BuildObjCBridgedCast(E->getLParenLoc(), E->getBridgeKind(),
12831                                       E->getBridgeKeywordLoc(), TSInfo,
12832                                       Result.get());
12833 }
12834 
12835 template <typename Derived>
12836 ExprResult TreeTransform<Derived>::TransformObjCAvailabilityCheckExpr(
12837     ObjCAvailabilityCheckExpr *E) {
12838   return E;
12839 }
12840 
12841 template<typename Derived>
12842 ExprResult
12843 TreeTransform<Derived>::TransformObjCMessageExpr(ObjCMessageExpr *E) {
12844   // Transform arguments.
12845   bool ArgChanged = false;
12846   SmallVector<Expr*, 8> Args;
12847   Args.reserve(E->getNumArgs());
12848   if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), false, Args,
12849                                   &ArgChanged))
12850     return ExprError();
12851 
12852   if (E->getReceiverKind() == ObjCMessageExpr::Class) {
12853     // Class message: transform the receiver type.
12854     TypeSourceInfo *ReceiverTypeInfo
12855       = getDerived().TransformType(E->getClassReceiverTypeInfo());
12856     if (!ReceiverTypeInfo)
12857       return ExprError();
12858 
12859     // If nothing changed, just retain the existing message send.
12860     if (!getDerived().AlwaysRebuild() &&
12861         ReceiverTypeInfo == E->getClassReceiverTypeInfo() && !ArgChanged)
12862       return SemaRef.MaybeBindToTemporary(E);
12863 
12864     // Build a new class message send.
12865     SmallVector<SourceLocation, 16> SelLocs;
12866     E->getSelectorLocs(SelLocs);
12867     return getDerived().RebuildObjCMessageExpr(ReceiverTypeInfo,
12868                                                E->getSelector(),
12869                                                SelLocs,
12870                                                E->getMethodDecl(),
12871                                                E->getLeftLoc(),
12872                                                Args,
12873                                                E->getRightLoc());
12874   }
12875   else if (E->getReceiverKind() == ObjCMessageExpr::SuperClass ||
12876            E->getReceiverKind() == ObjCMessageExpr::SuperInstance) {
12877     if (!E->getMethodDecl())
12878       return ExprError();
12879 
12880     // Build a new class message send to 'super'.
12881     SmallVector<SourceLocation, 16> SelLocs;
12882     E->getSelectorLocs(SelLocs);
12883     return getDerived().RebuildObjCMessageExpr(E->getSuperLoc(),
12884                                                E->getSelector(),
12885                                                SelLocs,
12886                                                E->getReceiverType(),
12887                                                E->getMethodDecl(),
12888                                                E->getLeftLoc(),
12889                                                Args,
12890                                                E->getRightLoc());
12891   }
12892 
12893   // Instance message: transform the receiver
12894   assert(E->getReceiverKind() == ObjCMessageExpr::Instance &&
12895          "Only class and instance messages may be instantiated");
12896   ExprResult Receiver
12897     = getDerived().TransformExpr(E->getInstanceReceiver());
12898   if (Receiver.isInvalid())
12899     return ExprError();
12900 
12901   // If nothing changed, just retain the existing message send.
12902   if (!getDerived().AlwaysRebuild() &&
12903       Receiver.get() == E->getInstanceReceiver() && !ArgChanged)
12904     return SemaRef.MaybeBindToTemporary(E);
12905 
12906   // Build a new instance message send.
12907   SmallVector<SourceLocation, 16> SelLocs;
12908   E->getSelectorLocs(SelLocs);
12909   return getDerived().RebuildObjCMessageExpr(Receiver.get(),
12910                                              E->getSelector(),
12911                                              SelLocs,
12912                                              E->getMethodDecl(),
12913                                              E->getLeftLoc(),
12914                                              Args,
12915                                              E->getRightLoc());
12916 }
12917 
12918 template<typename Derived>
12919 ExprResult
12920 TreeTransform<Derived>::TransformObjCSelectorExpr(ObjCSelectorExpr *E) {
12921   return E;
12922 }
12923 
12924 template<typename Derived>
12925 ExprResult
12926 TreeTransform<Derived>::TransformObjCProtocolExpr(ObjCProtocolExpr *E) {
12927   return E;
12928 }
12929 
12930 template<typename Derived>
12931 ExprResult
12932 TreeTransform<Derived>::TransformObjCIvarRefExpr(ObjCIvarRefExpr *E) {
12933   // Transform the base expression.
12934   ExprResult Base = getDerived().TransformExpr(E->getBase());
12935   if (Base.isInvalid())
12936     return ExprError();
12937 
12938   // We don't need to transform the ivar; it will never change.
12939 
12940   // If nothing changed, just retain the existing expression.
12941   if (!getDerived().AlwaysRebuild() &&
12942       Base.get() == E->getBase())
12943     return E;
12944 
12945   return getDerived().RebuildObjCIvarRefExpr(Base.get(), E->getDecl(),
12946                                              E->getLocation(),
12947                                              E->isArrow(), E->isFreeIvar());
12948 }
12949 
12950 template<typename Derived>
12951 ExprResult
12952 TreeTransform<Derived>::TransformObjCPropertyRefExpr(ObjCPropertyRefExpr *E) {
12953   // 'super' and types never change. Property never changes. Just
12954   // retain the existing expression.
12955   if (!E->isObjectReceiver())
12956     return E;
12957 
12958   // Transform the base expression.
12959   ExprResult Base = getDerived().TransformExpr(E->getBase());
12960   if (Base.isInvalid())
12961     return ExprError();
12962 
12963   // We don't need to transform the property; it will never change.
12964 
12965   // If nothing changed, just retain the existing expression.
12966   if (!getDerived().AlwaysRebuild() &&
12967       Base.get() == E->getBase())
12968     return E;
12969 
12970   if (E->isExplicitProperty())
12971     return getDerived().RebuildObjCPropertyRefExpr(Base.get(),
12972                                                    E->getExplicitProperty(),
12973                                                    E->getLocation());
12974 
12975   return getDerived().RebuildObjCPropertyRefExpr(Base.get(),
12976                                                  SemaRef.Context.PseudoObjectTy,
12977                                                  E->getImplicitPropertyGetter(),
12978                                                  E->getImplicitPropertySetter(),
12979                                                  E->getLocation());
12980 }
12981 
12982 template<typename Derived>
12983 ExprResult
12984 TreeTransform<Derived>::TransformObjCSubscriptRefExpr(ObjCSubscriptRefExpr *E) {
12985   // Transform the base expression.
12986   ExprResult Base = getDerived().TransformExpr(E->getBaseExpr());
12987   if (Base.isInvalid())
12988     return ExprError();
12989 
12990   // Transform the key expression.
12991   ExprResult Key = getDerived().TransformExpr(E->getKeyExpr());
12992   if (Key.isInvalid())
12993     return ExprError();
12994 
12995   // If nothing changed, just retain the existing expression.
12996   if (!getDerived().AlwaysRebuild() &&
12997       Key.get() == E->getKeyExpr() && Base.get() == E->getBaseExpr())
12998     return E;
12999 
13000   return getDerived().RebuildObjCSubscriptRefExpr(E->getRBracket(),
13001                                                   Base.get(), Key.get(),
13002                                                   E->getAtIndexMethodDecl(),
13003                                                   E->setAtIndexMethodDecl());
13004 }
13005 
13006 template<typename Derived>
13007 ExprResult
13008 TreeTransform<Derived>::TransformObjCIsaExpr(ObjCIsaExpr *E) {
13009   // Transform the base expression.
13010   ExprResult Base = getDerived().TransformExpr(E->getBase());
13011   if (Base.isInvalid())
13012     return ExprError();
13013 
13014   // If nothing changed, just retain the existing expression.
13015   if (!getDerived().AlwaysRebuild() &&
13016       Base.get() == E->getBase())
13017     return E;
13018 
13019   return getDerived().RebuildObjCIsaExpr(Base.get(), E->getIsaMemberLoc(),
13020                                          E->getOpLoc(),
13021                                          E->isArrow());
13022 }
13023 
13024 template<typename Derived>
13025 ExprResult
13026 TreeTransform<Derived>::TransformShuffleVectorExpr(ShuffleVectorExpr *E) {
13027   bool ArgumentChanged = false;
13028   SmallVector<Expr*, 8> SubExprs;
13029   SubExprs.reserve(E->getNumSubExprs());
13030   if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false,
13031                                   SubExprs, &ArgumentChanged))
13032     return ExprError();
13033 
13034   if (!getDerived().AlwaysRebuild() &&
13035       !ArgumentChanged)
13036     return E;
13037 
13038   return getDerived().RebuildShuffleVectorExpr(E->getBuiltinLoc(),
13039                                                SubExprs,
13040                                                E->getRParenLoc());
13041 }
13042 
13043 template<typename Derived>
13044 ExprResult
13045 TreeTransform<Derived>::TransformConvertVectorExpr(ConvertVectorExpr *E) {
13046   ExprResult SrcExpr = getDerived().TransformExpr(E->getSrcExpr());
13047   if (SrcExpr.isInvalid())
13048     return ExprError();
13049 
13050   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo());
13051   if (!Type)
13052     return ExprError();
13053 
13054   if (!getDerived().AlwaysRebuild() &&
13055       Type == E->getTypeSourceInfo() &&
13056       SrcExpr.get() == E->getSrcExpr())
13057     return E;
13058 
13059   return getDerived().RebuildConvertVectorExpr(E->getBuiltinLoc(),
13060                                                SrcExpr.get(), Type,
13061                                                E->getRParenLoc());
13062 }
13063 
13064 template<typename Derived>
13065 ExprResult
13066 TreeTransform<Derived>::TransformBlockExpr(BlockExpr *E) {
13067   BlockDecl *oldBlock = E->getBlockDecl();
13068 
13069   SemaRef.ActOnBlockStart(E->getCaretLocation(), /*Scope=*/nullptr);
13070   BlockScopeInfo *blockScope = SemaRef.getCurBlock();
13071 
13072   blockScope->TheDecl->setIsVariadic(oldBlock->isVariadic());
13073   blockScope->TheDecl->setBlockMissingReturnType(
13074                          oldBlock->blockMissingReturnType());
13075 
13076   SmallVector<ParmVarDecl*, 4> params;
13077   SmallVector<QualType, 4> paramTypes;
13078 
13079   const FunctionProtoType *exprFunctionType = E->getFunctionType();
13080 
13081   // Parameter substitution.
13082   Sema::ExtParameterInfoBuilder extParamInfos;
13083   if (getDerived().TransformFunctionTypeParams(
13084           E->getCaretLocation(), oldBlock->parameters(), nullptr,
13085           exprFunctionType->getExtParameterInfosOrNull(), paramTypes, &params,
13086           extParamInfos)) {
13087     getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr);
13088     return ExprError();
13089   }
13090 
13091   QualType exprResultType =
13092       getDerived().TransformType(exprFunctionType->getReturnType());
13093 
13094   auto epi = exprFunctionType->getExtProtoInfo();
13095   epi.ExtParameterInfos = extParamInfos.getPointerOrNull(paramTypes.size());
13096 
13097   QualType functionType =
13098     getDerived().RebuildFunctionProtoType(exprResultType, paramTypes, epi);
13099   blockScope->FunctionType = functionType;
13100 
13101   // Set the parameters on the block decl.
13102   if (!params.empty())
13103     blockScope->TheDecl->setParams(params);
13104 
13105   if (!oldBlock->blockMissingReturnType()) {
13106     blockScope->HasImplicitReturnType = false;
13107     blockScope->ReturnType = exprResultType;
13108   }
13109 
13110   // Transform the body
13111   StmtResult body = getDerived().TransformStmt(E->getBody());
13112   if (body.isInvalid()) {
13113     getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr);
13114     return ExprError();
13115   }
13116 
13117 #ifndef NDEBUG
13118   // In builds with assertions, make sure that we captured everything we
13119   // captured before.
13120   if (!SemaRef.getDiagnostics().hasErrorOccurred()) {
13121     for (const auto &I : oldBlock->captures()) {
13122       VarDecl *oldCapture = I.getVariable();
13123 
13124       // Ignore parameter packs.
13125       if (oldCapture->isParameterPack())
13126         continue;
13127 
13128       VarDecl *newCapture =
13129         cast<VarDecl>(getDerived().TransformDecl(E->getCaretLocation(),
13130                                                  oldCapture));
13131       assert(blockScope->CaptureMap.count(newCapture));
13132     }
13133     assert(oldBlock->capturesCXXThis() == blockScope->isCXXThisCaptured());
13134   }
13135 #endif
13136 
13137   return SemaRef.ActOnBlockStmtExpr(E->getCaretLocation(), body.get(),
13138                                     /*Scope=*/nullptr);
13139 }
13140 
13141 template<typename Derived>
13142 ExprResult
13143 TreeTransform<Derived>::TransformAsTypeExpr(AsTypeExpr *E) {
13144   llvm_unreachable("Cannot transform asType expressions yet");
13145 }
13146 
13147 template<typename Derived>
13148 ExprResult
13149 TreeTransform<Derived>::TransformAtomicExpr(AtomicExpr *E) {
13150   bool ArgumentChanged = false;
13151   SmallVector<Expr*, 8> SubExprs;
13152   SubExprs.reserve(E->getNumSubExprs());
13153   if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false,
13154                                   SubExprs, &ArgumentChanged))
13155     return ExprError();
13156 
13157   if (!getDerived().AlwaysRebuild() &&
13158       !ArgumentChanged)
13159     return E;
13160 
13161   return getDerived().RebuildAtomicExpr(E->getBuiltinLoc(), SubExprs,
13162                                         E->getOp(), E->getRParenLoc());
13163 }
13164 
13165 //===----------------------------------------------------------------------===//
13166 // Type reconstruction
13167 //===----------------------------------------------------------------------===//
13168 
13169 template<typename Derived>
13170 QualType TreeTransform<Derived>::RebuildPointerType(QualType PointeeType,
13171                                                     SourceLocation Star) {
13172   return SemaRef.BuildPointerType(PointeeType, Star,
13173                                   getDerived().getBaseEntity());
13174 }
13175 
13176 template<typename Derived>
13177 QualType TreeTransform<Derived>::RebuildBlockPointerType(QualType PointeeType,
13178                                                          SourceLocation Star) {
13179   return SemaRef.BuildBlockPointerType(PointeeType, Star,
13180                                        getDerived().getBaseEntity());
13181 }
13182 
13183 template<typename Derived>
13184 QualType
13185 TreeTransform<Derived>::RebuildReferenceType(QualType ReferentType,
13186                                              bool WrittenAsLValue,
13187                                              SourceLocation Sigil) {
13188   return SemaRef.BuildReferenceType(ReferentType, WrittenAsLValue,
13189                                     Sigil, getDerived().getBaseEntity());
13190 }
13191 
13192 template<typename Derived>
13193 QualType
13194 TreeTransform<Derived>::RebuildMemberPointerType(QualType PointeeType,
13195                                                  QualType ClassType,
13196                                                  SourceLocation Sigil) {
13197   return SemaRef.BuildMemberPointerType(PointeeType, ClassType, Sigil,
13198                                         getDerived().getBaseEntity());
13199 }
13200 
13201 template<typename Derived>
13202 QualType TreeTransform<Derived>::RebuildObjCTypeParamType(
13203            const ObjCTypeParamDecl *Decl,
13204            SourceLocation ProtocolLAngleLoc,
13205            ArrayRef<ObjCProtocolDecl *> Protocols,
13206            ArrayRef<SourceLocation> ProtocolLocs,
13207            SourceLocation ProtocolRAngleLoc) {
13208   return SemaRef.BuildObjCTypeParamType(Decl,
13209                                         ProtocolLAngleLoc, Protocols,
13210                                         ProtocolLocs, ProtocolRAngleLoc,
13211                                         /*FailOnError=*/true);
13212 }
13213 
13214 template<typename Derived>
13215 QualType TreeTransform<Derived>::RebuildObjCObjectType(
13216            QualType BaseType,
13217            SourceLocation Loc,
13218            SourceLocation TypeArgsLAngleLoc,
13219            ArrayRef<TypeSourceInfo *> TypeArgs,
13220            SourceLocation TypeArgsRAngleLoc,
13221            SourceLocation ProtocolLAngleLoc,
13222            ArrayRef<ObjCProtocolDecl *> Protocols,
13223            ArrayRef<SourceLocation> ProtocolLocs,
13224            SourceLocation ProtocolRAngleLoc) {
13225   return SemaRef.BuildObjCObjectType(BaseType, Loc, TypeArgsLAngleLoc,
13226                                      TypeArgs, TypeArgsRAngleLoc,
13227                                      ProtocolLAngleLoc, Protocols, ProtocolLocs,
13228                                      ProtocolRAngleLoc,
13229                                      /*FailOnError=*/true);
13230 }
13231 
13232 template<typename Derived>
13233 QualType TreeTransform<Derived>::RebuildObjCObjectPointerType(
13234            QualType PointeeType,
13235            SourceLocation Star) {
13236   return SemaRef.Context.getObjCObjectPointerType(PointeeType);
13237 }
13238 
13239 template<typename Derived>
13240 QualType
13241 TreeTransform<Derived>::RebuildArrayType(QualType ElementType,
13242                                          ArrayType::ArraySizeModifier SizeMod,
13243                                          const llvm::APInt *Size,
13244                                          Expr *SizeExpr,
13245                                          unsigned IndexTypeQuals,
13246                                          SourceRange BracketsRange) {
13247   if (SizeExpr || !Size)
13248     return SemaRef.BuildArrayType(ElementType, SizeMod, SizeExpr,
13249                                   IndexTypeQuals, BracketsRange,
13250                                   getDerived().getBaseEntity());
13251 
13252   QualType Types[] = {
13253     SemaRef.Context.UnsignedCharTy, SemaRef.Context.UnsignedShortTy,
13254     SemaRef.Context.UnsignedIntTy, SemaRef.Context.UnsignedLongTy,
13255     SemaRef.Context.UnsignedLongLongTy, SemaRef.Context.UnsignedInt128Ty
13256   };
13257   const unsigned NumTypes = llvm::array_lengthof(Types);
13258   QualType SizeType;
13259   for (unsigned I = 0; I != NumTypes; ++I)
13260     if (Size->getBitWidth() == SemaRef.Context.getIntWidth(Types[I])) {
13261       SizeType = Types[I];
13262       break;
13263     }
13264 
13265   // Note that we can return a VariableArrayType here in the case where
13266   // the element type was a dependent VariableArrayType.
13267   IntegerLiteral *ArraySize
13268       = IntegerLiteral::Create(SemaRef.Context, *Size, SizeType,
13269                                /*FIXME*/BracketsRange.getBegin());
13270   return SemaRef.BuildArrayType(ElementType, SizeMod, ArraySize,
13271                                 IndexTypeQuals, BracketsRange,
13272                                 getDerived().getBaseEntity());
13273 }
13274 
13275 template<typename Derived>
13276 QualType
13277 TreeTransform<Derived>::RebuildConstantArrayType(QualType ElementType,
13278                                                  ArrayType::ArraySizeModifier SizeMod,
13279                                                  const llvm::APInt &Size,
13280                                                  Expr *SizeExpr,
13281                                                  unsigned IndexTypeQuals,
13282                                                  SourceRange BracketsRange) {
13283   return getDerived().RebuildArrayType(ElementType, SizeMod, &Size, SizeExpr,
13284                                         IndexTypeQuals, BracketsRange);
13285 }
13286 
13287 template<typename Derived>
13288 QualType
13289 TreeTransform<Derived>::RebuildIncompleteArrayType(QualType ElementType,
13290                                           ArrayType::ArraySizeModifier SizeMod,
13291                                                  unsigned IndexTypeQuals,
13292                                                    SourceRange BracketsRange) {
13293   return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr, nullptr,
13294                                        IndexTypeQuals, BracketsRange);
13295 }
13296 
13297 template<typename Derived>
13298 QualType
13299 TreeTransform<Derived>::RebuildVariableArrayType(QualType ElementType,
13300                                           ArrayType::ArraySizeModifier SizeMod,
13301                                                  Expr *SizeExpr,
13302                                                  unsigned IndexTypeQuals,
13303                                                  SourceRange BracketsRange) {
13304   return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr,
13305                                        SizeExpr,
13306                                        IndexTypeQuals, BracketsRange);
13307 }
13308 
13309 template<typename Derived>
13310 QualType
13311 TreeTransform<Derived>::RebuildDependentSizedArrayType(QualType ElementType,
13312                                           ArrayType::ArraySizeModifier SizeMod,
13313                                                        Expr *SizeExpr,
13314                                                        unsigned IndexTypeQuals,
13315                                                    SourceRange BracketsRange) {
13316   return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr,
13317                                        SizeExpr,
13318                                        IndexTypeQuals, BracketsRange);
13319 }
13320 
13321 template <typename Derived>
13322 QualType TreeTransform<Derived>::RebuildDependentAddressSpaceType(
13323     QualType PointeeType, Expr *AddrSpaceExpr, SourceLocation AttributeLoc) {
13324   return SemaRef.BuildAddressSpaceAttr(PointeeType, AddrSpaceExpr,
13325                                           AttributeLoc);
13326 }
13327 
13328 template <typename Derived>
13329 QualType
13330 TreeTransform<Derived>::RebuildVectorType(QualType ElementType,
13331                                           unsigned NumElements,
13332                                           VectorType::VectorKind VecKind) {
13333   // FIXME: semantic checking!
13334   return SemaRef.Context.getVectorType(ElementType, NumElements, VecKind);
13335 }
13336 
13337 template <typename Derived>
13338 QualType TreeTransform<Derived>::RebuildDependentVectorType(
13339     QualType ElementType, Expr *SizeExpr, SourceLocation AttributeLoc,
13340     VectorType::VectorKind VecKind) {
13341   return SemaRef.BuildVectorType(ElementType, SizeExpr, AttributeLoc);
13342 }
13343 
13344 template<typename Derived>
13345 QualType TreeTransform<Derived>::RebuildExtVectorType(QualType ElementType,
13346                                                       unsigned NumElements,
13347                                                  SourceLocation AttributeLoc) {
13348   llvm::APInt numElements(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy),
13349                           NumElements, true);
13350   IntegerLiteral *VectorSize
13351     = IntegerLiteral::Create(SemaRef.Context, numElements, SemaRef.Context.IntTy,
13352                              AttributeLoc);
13353   return SemaRef.BuildExtVectorType(ElementType, VectorSize, AttributeLoc);
13354 }
13355 
13356 template<typename Derived>
13357 QualType
13358 TreeTransform<Derived>::RebuildDependentSizedExtVectorType(QualType ElementType,
13359                                                            Expr *SizeExpr,
13360                                                   SourceLocation AttributeLoc) {
13361   return SemaRef.BuildExtVectorType(ElementType, SizeExpr, AttributeLoc);
13362 }
13363 
13364 template<typename Derived>
13365 QualType TreeTransform<Derived>::RebuildFunctionProtoType(
13366     QualType T,
13367     MutableArrayRef<QualType> ParamTypes,
13368     const FunctionProtoType::ExtProtoInfo &EPI) {
13369   return SemaRef.BuildFunctionType(T, ParamTypes,
13370                                    getDerived().getBaseLocation(),
13371                                    getDerived().getBaseEntity(),
13372                                    EPI);
13373 }
13374 
13375 template<typename Derived>
13376 QualType TreeTransform<Derived>::RebuildFunctionNoProtoType(QualType T) {
13377   return SemaRef.Context.getFunctionNoProtoType(T);
13378 }
13379 
13380 template<typename Derived>
13381 QualType TreeTransform<Derived>::RebuildUnresolvedUsingType(SourceLocation Loc,
13382                                                             Decl *D) {
13383   assert(D && "no decl found");
13384   if (D->isInvalidDecl()) return QualType();
13385 
13386   // FIXME: Doesn't account for ObjCInterfaceDecl!
13387   TypeDecl *Ty;
13388   if (auto *UPD = dyn_cast<UsingPackDecl>(D)) {
13389     // A valid resolved using typename pack expansion decl can have multiple
13390     // UsingDecls, but they must each have exactly one type, and it must be
13391     // the same type in every case. But we must have at least one expansion!
13392     if (UPD->expansions().empty()) {
13393       getSema().Diag(Loc, diag::err_using_pack_expansion_empty)
13394           << UPD->isCXXClassMember() << UPD;
13395       return QualType();
13396     }
13397 
13398     // We might still have some unresolved types. Try to pick a resolved type
13399     // if we can. The final instantiation will check that the remaining
13400     // unresolved types instantiate to the type we pick.
13401     QualType FallbackT;
13402     QualType T;
13403     for (auto *E : UPD->expansions()) {
13404       QualType ThisT = RebuildUnresolvedUsingType(Loc, E);
13405       if (ThisT.isNull())
13406         continue;
13407       else if (ThisT->getAs<UnresolvedUsingType>())
13408         FallbackT = ThisT;
13409       else if (T.isNull())
13410         T = ThisT;
13411       else
13412         assert(getSema().Context.hasSameType(ThisT, T) &&
13413                "mismatched resolved types in using pack expansion");
13414     }
13415     return T.isNull() ? FallbackT : T;
13416   } else if (auto *Using = dyn_cast<UsingDecl>(D)) {
13417     assert(Using->hasTypename() &&
13418            "UnresolvedUsingTypenameDecl transformed to non-typename using");
13419 
13420     // A valid resolved using typename decl points to exactly one type decl.
13421     assert(++Using->shadow_begin() == Using->shadow_end());
13422     Ty = cast<TypeDecl>((*Using->shadow_begin())->getTargetDecl());
13423   } else {
13424     assert(isa<UnresolvedUsingTypenameDecl>(D) &&
13425            "UnresolvedUsingTypenameDecl transformed to non-using decl");
13426     Ty = cast<UnresolvedUsingTypenameDecl>(D);
13427   }
13428 
13429   return SemaRef.Context.getTypeDeclType(Ty);
13430 }
13431 
13432 template<typename Derived>
13433 QualType TreeTransform<Derived>::RebuildTypeOfExprType(Expr *E,
13434                                                        SourceLocation Loc) {
13435   return SemaRef.BuildTypeofExprType(E, Loc);
13436 }
13437 
13438 template<typename Derived>
13439 QualType TreeTransform<Derived>::RebuildTypeOfType(QualType Underlying) {
13440   return SemaRef.Context.getTypeOfType(Underlying);
13441 }
13442 
13443 template<typename Derived>
13444 QualType TreeTransform<Derived>::RebuildDecltypeType(Expr *E,
13445                                                      SourceLocation Loc) {
13446   return SemaRef.BuildDecltypeType(E, Loc);
13447 }
13448 
13449 template<typename Derived>
13450 QualType TreeTransform<Derived>::RebuildUnaryTransformType(QualType BaseType,
13451                                             UnaryTransformType::UTTKind UKind,
13452                                             SourceLocation Loc) {
13453   return SemaRef.BuildUnaryTransformType(BaseType, UKind, Loc);
13454 }
13455 
13456 template<typename Derived>
13457 QualType TreeTransform<Derived>::RebuildTemplateSpecializationType(
13458                                                       TemplateName Template,
13459                                              SourceLocation TemplateNameLoc,
13460                                      TemplateArgumentListInfo &TemplateArgs) {
13461   return SemaRef.CheckTemplateIdType(Template, TemplateNameLoc, TemplateArgs);
13462 }
13463 
13464 template<typename Derived>
13465 QualType TreeTransform<Derived>::RebuildAtomicType(QualType ValueType,
13466                                                    SourceLocation KWLoc) {
13467   return SemaRef.BuildAtomicType(ValueType, KWLoc);
13468 }
13469 
13470 template<typename Derived>
13471 QualType TreeTransform<Derived>::RebuildPipeType(QualType ValueType,
13472                                                  SourceLocation KWLoc,
13473                                                  bool isReadPipe) {
13474   return isReadPipe ? SemaRef.BuildReadPipeType(ValueType, KWLoc)
13475                     : SemaRef.BuildWritePipeType(ValueType, KWLoc);
13476 }
13477 
13478 template<typename Derived>
13479 TemplateName
13480 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS,
13481                                             bool TemplateKW,
13482                                             TemplateDecl *Template) {
13483   return SemaRef.Context.getQualifiedTemplateName(SS.getScopeRep(), TemplateKW,
13484                                                   Template);
13485 }
13486 
13487 template<typename Derived>
13488 TemplateName
13489 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS,
13490                                             SourceLocation TemplateKWLoc,
13491                                             const IdentifierInfo &Name,
13492                                             SourceLocation NameLoc,
13493                                             QualType ObjectType,
13494                                             NamedDecl *FirstQualifierInScope,
13495                                             bool AllowInjectedClassName) {
13496   UnqualifiedId TemplateName;
13497   TemplateName.setIdentifier(&Name, NameLoc);
13498   Sema::TemplateTy Template;
13499   getSema().ActOnDependentTemplateName(/*Scope=*/nullptr,
13500                                        SS, TemplateKWLoc, TemplateName,
13501                                        ParsedType::make(ObjectType),
13502                                        /*EnteringContext=*/false,
13503                                        Template, AllowInjectedClassName);
13504   return Template.get();
13505 }
13506 
13507 template<typename Derived>
13508 TemplateName
13509 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS,
13510                                             SourceLocation TemplateKWLoc,
13511                                             OverloadedOperatorKind Operator,
13512                                             SourceLocation NameLoc,
13513                                             QualType ObjectType,
13514                                             bool AllowInjectedClassName) {
13515   UnqualifiedId Name;
13516   // FIXME: Bogus location information.
13517   SourceLocation SymbolLocations[3] = { NameLoc, NameLoc, NameLoc };
13518   Name.setOperatorFunctionId(NameLoc, Operator, SymbolLocations);
13519   Sema::TemplateTy Template;
13520   getSema().ActOnDependentTemplateName(/*Scope=*/nullptr,
13521                                        SS, TemplateKWLoc, Name,
13522                                        ParsedType::make(ObjectType),
13523                                        /*EnteringContext=*/false,
13524                                        Template, AllowInjectedClassName);
13525   return Template.get();
13526 }
13527 
13528 template<typename Derived>
13529 ExprResult
13530 TreeTransform<Derived>::RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op,
13531                                                    SourceLocation OpLoc,
13532                                                    Expr *OrigCallee,
13533                                                    Expr *First,
13534                                                    Expr *Second) {
13535   Expr *Callee = OrigCallee->IgnoreParenCasts();
13536   bool isPostIncDec = Second && (Op == OO_PlusPlus || Op == OO_MinusMinus);
13537 
13538   if (First->getObjectKind() == OK_ObjCProperty) {
13539     BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op);
13540     if (BinaryOperator::isAssignmentOp(Opc))
13541       return SemaRef.checkPseudoObjectAssignment(/*Scope=*/nullptr, OpLoc, Opc,
13542                                                  First, Second);
13543     ExprResult Result = SemaRef.CheckPlaceholderExpr(First);
13544     if (Result.isInvalid())
13545       return ExprError();
13546     First = Result.get();
13547   }
13548 
13549   if (Second && Second->getObjectKind() == OK_ObjCProperty) {
13550     ExprResult Result = SemaRef.CheckPlaceholderExpr(Second);
13551     if (Result.isInvalid())
13552       return ExprError();
13553     Second = Result.get();
13554   }
13555 
13556   // Determine whether this should be a builtin operation.
13557   if (Op == OO_Subscript) {
13558     if (!First->getType()->isOverloadableType() &&
13559         !Second->getType()->isOverloadableType())
13560       return getSema().CreateBuiltinArraySubscriptExpr(
13561           First, Callee->getBeginLoc(), Second, OpLoc);
13562   } else if (Op == OO_Arrow) {
13563     // -> is never a builtin operation.
13564     return SemaRef.BuildOverloadedArrowExpr(nullptr, First, OpLoc);
13565   } else if (Second == nullptr || isPostIncDec) {
13566     if (!First->getType()->isOverloadableType() ||
13567         (Op == OO_Amp && getSema().isQualifiedMemberAccess(First))) {
13568       // The argument is not of overloadable type, or this is an expression
13569       // of the form &Class::member, so try to create a built-in unary
13570       // operation.
13571       UnaryOperatorKind Opc
13572         = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec);
13573 
13574       return getSema().CreateBuiltinUnaryOp(OpLoc, Opc, First);
13575     }
13576   } else {
13577     if (!First->getType()->isOverloadableType() &&
13578         !Second->getType()->isOverloadableType()) {
13579       // Neither of the arguments is an overloadable type, so try to
13580       // create a built-in binary operation.
13581       BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op);
13582       ExprResult Result
13583         = SemaRef.CreateBuiltinBinOp(OpLoc, Opc, First, Second);
13584       if (Result.isInvalid())
13585         return ExprError();
13586 
13587       return Result;
13588     }
13589   }
13590 
13591   // Compute the transformed set of functions (and function templates) to be
13592   // used during overload resolution.
13593   UnresolvedSet<16> Functions;
13594   bool RequiresADL;
13595 
13596   if (UnresolvedLookupExpr *ULE = dyn_cast<UnresolvedLookupExpr>(Callee)) {
13597     Functions.append(ULE->decls_begin(), ULE->decls_end());
13598     // If the overload could not be resolved in the template definition
13599     // (because we had a dependent argument), ADL is performed as part of
13600     // template instantiation.
13601     RequiresADL = ULE->requiresADL();
13602   } else {
13603     // If we've resolved this to a particular non-member function, just call
13604     // that function. If we resolved it to a member function,
13605     // CreateOverloaded* will find that function for us.
13606     NamedDecl *ND = cast<DeclRefExpr>(Callee)->getDecl();
13607     if (!isa<CXXMethodDecl>(ND))
13608       Functions.addDecl(ND);
13609     RequiresADL = false;
13610   }
13611 
13612   // Add any functions found via argument-dependent lookup.
13613   Expr *Args[2] = { First, Second };
13614   unsigned NumArgs = 1 + (Second != nullptr);
13615 
13616   // Create the overloaded operator invocation for unary operators.
13617   if (NumArgs == 1 || isPostIncDec) {
13618     UnaryOperatorKind Opc
13619       = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec);
13620     return SemaRef.CreateOverloadedUnaryOp(OpLoc, Opc, Functions, First,
13621                                            RequiresADL);
13622   }
13623 
13624   if (Op == OO_Subscript) {
13625     SourceLocation LBrace;
13626     SourceLocation RBrace;
13627 
13628     if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Callee)) {
13629         DeclarationNameLoc NameLoc = DRE->getNameInfo().getInfo();
13630         LBrace = SourceLocation::getFromRawEncoding(
13631                     NameLoc.CXXOperatorName.BeginOpNameLoc);
13632         RBrace = SourceLocation::getFromRawEncoding(
13633                     NameLoc.CXXOperatorName.EndOpNameLoc);
13634     } else {
13635       LBrace = Callee->getBeginLoc();
13636       RBrace = OpLoc;
13637     }
13638 
13639     return SemaRef.CreateOverloadedArraySubscriptExpr(LBrace, RBrace,
13640                                                       First, Second);
13641   }
13642 
13643   // Create the overloaded operator invocation for binary operators.
13644   BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op);
13645   ExprResult Result = SemaRef.CreateOverloadedBinOp(
13646       OpLoc, Opc, Functions, Args[0], Args[1], RequiresADL);
13647   if (Result.isInvalid())
13648     return ExprError();
13649 
13650   return Result;
13651 }
13652 
13653 template<typename Derived>
13654 ExprResult
13655 TreeTransform<Derived>::RebuildCXXPseudoDestructorExpr(Expr *Base,
13656                                                      SourceLocation OperatorLoc,
13657                                                        bool isArrow,
13658                                                        CXXScopeSpec &SS,
13659                                                      TypeSourceInfo *ScopeType,
13660                                                        SourceLocation CCLoc,
13661                                                        SourceLocation TildeLoc,
13662                                         PseudoDestructorTypeStorage Destroyed) {
13663   QualType BaseType = Base->getType();
13664   if (Base->isTypeDependent() || Destroyed.getIdentifier() ||
13665       (!isArrow && !BaseType->getAs<RecordType>()) ||
13666       (isArrow && BaseType->getAs<PointerType>() &&
13667        !BaseType->castAs<PointerType>()->getPointeeType()
13668                                               ->template getAs<RecordType>())){
13669     // This pseudo-destructor expression is still a pseudo-destructor.
13670     return SemaRef.BuildPseudoDestructorExpr(
13671         Base, OperatorLoc, isArrow ? tok::arrow : tok::period, SS, ScopeType,
13672         CCLoc, TildeLoc, Destroyed);
13673   }
13674 
13675   TypeSourceInfo *DestroyedType = Destroyed.getTypeSourceInfo();
13676   DeclarationName Name(SemaRef.Context.DeclarationNames.getCXXDestructorName(
13677                  SemaRef.Context.getCanonicalType(DestroyedType->getType())));
13678   DeclarationNameInfo NameInfo(Name, Destroyed.getLocation());
13679   NameInfo.setNamedTypeInfo(DestroyedType);
13680 
13681   // The scope type is now known to be a valid nested name specifier
13682   // component. Tack it on to the end of the nested name specifier.
13683   if (ScopeType) {
13684     if (!ScopeType->getType()->getAs<TagType>()) {
13685       getSema().Diag(ScopeType->getTypeLoc().getBeginLoc(),
13686                      diag::err_expected_class_or_namespace)
13687           << ScopeType->getType() << getSema().getLangOpts().CPlusPlus;
13688       return ExprError();
13689     }
13690     SS.Extend(SemaRef.Context, SourceLocation(), ScopeType->getTypeLoc(),
13691               CCLoc);
13692   }
13693 
13694   SourceLocation TemplateKWLoc; // FIXME: retrieve it from caller.
13695   return getSema().BuildMemberReferenceExpr(Base, BaseType,
13696                                             OperatorLoc, isArrow,
13697                                             SS, TemplateKWLoc,
13698                                             /*FIXME: FirstQualifier*/ nullptr,
13699                                             NameInfo,
13700                                             /*TemplateArgs*/ nullptr,
13701                                             /*S*/nullptr);
13702 }
13703 
13704 template<typename Derived>
13705 StmtResult
13706 TreeTransform<Derived>::TransformCapturedStmt(CapturedStmt *S) {
13707   SourceLocation Loc = S->getBeginLoc();
13708   CapturedDecl *CD = S->getCapturedDecl();
13709   unsigned NumParams = CD->getNumParams();
13710   unsigned ContextParamPos = CD->getContextParamPosition();
13711   SmallVector<Sema::CapturedParamNameType, 4> Params;
13712   for (unsigned I = 0; I < NumParams; ++I) {
13713     if (I != ContextParamPos) {
13714       Params.push_back(
13715              std::make_pair(
13716                   CD->getParam(I)->getName(),
13717                   getDerived().TransformType(CD->getParam(I)->getType())));
13718     } else {
13719       Params.push_back(std::make_pair(StringRef(), QualType()));
13720     }
13721   }
13722   getSema().ActOnCapturedRegionStart(Loc, /*CurScope*/nullptr,
13723                                      S->getCapturedRegionKind(), Params);
13724   StmtResult Body;
13725   {
13726     Sema::CompoundScopeRAII CompoundScope(getSema());
13727     Body = getDerived().TransformStmt(S->getCapturedStmt());
13728   }
13729 
13730   if (Body.isInvalid()) {
13731     getSema().ActOnCapturedRegionError();
13732     return StmtError();
13733   }
13734 
13735   return getSema().ActOnCapturedRegionEnd(Body.get());
13736 }
13737 
13738 } // end namespace clang
13739 
13740 #endif // LLVM_CLANG_LIB_SEMA_TREETRANSFORM_H
13741