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/Basic/OpenMPKinds.h"
32 #include "clang/Sema/Designator.h"
33 #include "clang/Sema/Lookup.h"
34 #include "clang/Sema/Ownership.h"
35 #include "clang/Sema/ParsedTemplate.h"
36 #include "clang/Sema/ScopeInfo.h"
37 #include "clang/Sema/SemaDiagnostic.h"
38 #include "clang/Sema/SemaInternal.h"
39 #include "llvm/ADT/ArrayRef.h"
40 #include "llvm/Support/ErrorHandling.h"
41 #include <algorithm>
42 
43 using namespace llvm::omp;
44 
45 namespace clang {
46 using namespace sema;
47 
48 /// A semantic tree transformation that allows one to transform one
49 /// abstract syntax tree into another.
50 ///
51 /// A new tree transformation is defined by creating a new subclass \c X of
52 /// \c TreeTransform<X> and then overriding certain operations to provide
53 /// behavior specific to that transformation. For example, template
54 /// instantiation is implemented as a tree transformation where the
55 /// transformation of TemplateTypeParmType nodes involves substituting the
56 /// template arguments for their corresponding template parameters; a similar
57 /// transformation is performed for non-type template parameters and
58 /// template template parameters.
59 ///
60 /// This tree-transformation template uses static polymorphism to allow
61 /// subclasses to customize any of its operations. Thus, a subclass can
62 /// override any of the transformation or rebuild operators by providing an
63 /// operation with the same signature as the default implementation. The
64 /// overriding function should not be virtual.
65 ///
66 /// Semantic tree transformations are split into two stages, either of which
67 /// can be replaced by a subclass. The "transform" step transforms an AST node
68 /// or the parts of an AST node using the various transformation functions,
69 /// then passes the pieces on to the "rebuild" step, which constructs a new AST
70 /// node of the appropriate kind from the pieces. The default transformation
71 /// routines recursively transform the operands to composite AST nodes (e.g.,
72 /// the pointee type of a PointerType node) and, if any of those operand nodes
73 /// were changed by the transformation, invokes the rebuild operation to create
74 /// a new AST node.
75 ///
76 /// Subclasses can customize the transformation at various levels. The
77 /// most coarse-grained transformations involve replacing TransformType(),
78 /// TransformExpr(), TransformDecl(), TransformNestedNameSpecifierLoc(),
79 /// TransformTemplateName(), or TransformTemplateArgument() with entirely
80 /// new implementations.
81 ///
82 /// For more fine-grained transformations, subclasses can replace any of the
83 /// \c TransformXXX functions (where XXX is the name of an AST node, e.g.,
84 /// PointerType, StmtExpr) to alter the transformation. As mentioned previously,
85 /// replacing TransformTemplateTypeParmType() allows template instantiation
86 /// to substitute template arguments for their corresponding template
87 /// parameters. Additionally, subclasses can override the \c RebuildXXX
88 /// functions to control how AST nodes are rebuilt when their operands change.
89 /// By default, \c TreeTransform will invoke semantic analysis to rebuild
90 /// AST nodes. However, certain other tree transformations (e.g, cloning) may
91 /// be able to use more efficient rebuild steps.
92 ///
93 /// There are a handful of other functions that can be overridden, allowing one
94 /// to avoid traversing nodes that don't need any transformation
95 /// (\c AlreadyTransformed()), force rebuilding AST nodes even when their
96 /// operands have not changed (\c AlwaysRebuild()), and customize the
97 /// default locations and entity names used for type-checking
98 /// (\c getBaseLocation(), \c getBaseEntity()).
99 template<typename Derived>
100 class TreeTransform {
101   /// Private RAII object that helps us forget and then re-remember
102   /// the template argument corresponding to a partially-substituted parameter
103   /// pack.
104   class ForgetPartiallySubstitutedPackRAII {
105     Derived &Self;
106     TemplateArgument Old;
107 
108   public:
109     ForgetPartiallySubstitutedPackRAII(Derived &Self) : Self(Self) {
110       Old = Self.ForgetPartiallySubstitutedPack();
111     }
112 
113     ~ForgetPartiallySubstitutedPackRAII() {
114       Self.RememberPartiallySubstitutedPack(Old);
115     }
116   };
117 
118 protected:
119   Sema &SemaRef;
120 
121   /// The set of local declarations that have been transformed, for
122   /// cases where we are forced to build new declarations within the transformer
123   /// rather than in the subclass (e.g., lambda closure types).
124   llvm::DenseMap<Decl *, Decl *> TransformedLocalDecls;
125 
126 public:
127   /// Initializes a new tree transformer.
128   TreeTransform(Sema &SemaRef) : SemaRef(SemaRef) { }
129 
130   /// Retrieves a reference to the derived class.
131   Derived &getDerived() { return static_cast<Derived&>(*this); }
132 
133   /// Retrieves a reference to the derived class.
134   const Derived &getDerived() const {
135     return static_cast<const Derived&>(*this);
136   }
137 
138   static inline ExprResult Owned(Expr *E) { return E; }
139   static inline StmtResult Owned(Stmt *S) { return S; }
140 
141   /// Retrieves a reference to the semantic analysis object used for
142   /// this tree transform.
143   Sema &getSema() const { return SemaRef; }
144 
145   /// Whether the transformation should always rebuild AST nodes, even
146   /// if none of the children have changed.
147   ///
148   /// Subclasses may override this function to specify when the transformation
149   /// should rebuild all AST nodes.
150   ///
151   /// We must always rebuild all AST nodes when performing variadic template
152   /// pack expansion, in order to avoid violating the AST invariant that each
153   /// statement node appears at most once in its containing declaration.
154   bool AlwaysRebuild() { return SemaRef.ArgumentPackSubstitutionIndex != -1; }
155 
156   /// Whether the transformation is forming an expression or statement that
157   /// replaces the original. In this case, we'll reuse mangling numbers from
158   /// existing lambdas.
159   bool ReplacingOriginal() { return false; }
160 
161   /// Wether CXXConstructExpr can be skipped when they are implicit.
162   /// They will be reconstructed when used if needed.
163   /// This is usefull when the user that cause rebuilding of the
164   /// CXXConstructExpr is outside of the expression at which the TreeTransform
165   /// started.
166   bool AllowSkippingCXXConstructExpr() { return true; }
167 
168   /// Returns the location of the entity being transformed, if that
169   /// information was not available elsewhere in the AST.
170   ///
171   /// By default, returns no source-location information. Subclasses can
172   /// provide an alternative implementation that provides better location
173   /// information.
174   SourceLocation getBaseLocation() { return SourceLocation(); }
175 
176   /// Returns the name of the entity being transformed, if that
177   /// information was not available elsewhere in the AST.
178   ///
179   /// By default, returns an empty name. Subclasses can provide an alternative
180   /// implementation with a more precise name.
181   DeclarationName getBaseEntity() { return DeclarationName(); }
182 
183   /// Sets the "base" location and entity when that
184   /// information is known based on another transformation.
185   ///
186   /// By default, the source location and entity are ignored. Subclasses can
187   /// override this function to provide a customized implementation.
188   void setBase(SourceLocation Loc, DeclarationName Entity) { }
189 
190   /// RAII object that temporarily sets the base location and entity
191   /// used for reporting diagnostics in types.
192   class TemporaryBase {
193     TreeTransform &Self;
194     SourceLocation OldLocation;
195     DeclarationName OldEntity;
196 
197   public:
198     TemporaryBase(TreeTransform &Self, SourceLocation Location,
199                   DeclarationName Entity) : Self(Self) {
200       OldLocation = Self.getDerived().getBaseLocation();
201       OldEntity = Self.getDerived().getBaseEntity();
202 
203       if (Location.isValid())
204         Self.getDerived().setBase(Location, Entity);
205     }
206 
207     ~TemporaryBase() {
208       Self.getDerived().setBase(OldLocation, OldEntity);
209     }
210   };
211 
212   /// Determine whether the given type \p T has already been
213   /// transformed.
214   ///
215   /// Subclasses can provide an alternative implementation of this routine
216   /// to short-circuit evaluation when it is known that a given type will
217   /// not change. For example, template instantiation need not traverse
218   /// non-dependent types.
219   bool AlreadyTransformed(QualType T) {
220     return T.isNull();
221   }
222 
223   /// Transform a template parameter depth level.
224   ///
225   /// During a transformation that transforms template parameters, this maps
226   /// an old template parameter depth to a new depth.
227   unsigned TransformTemplateDepth(unsigned Depth) {
228     return Depth;
229   }
230 
231   /// Determine whether the given call argument should be dropped, e.g.,
232   /// because it is a default argument.
233   ///
234   /// Subclasses can provide an alternative implementation of this routine to
235   /// determine which kinds of call arguments get dropped. By default,
236   /// CXXDefaultArgument nodes are dropped (prior to transformation).
237   bool DropCallArgument(Expr *E) {
238     return E->isDefaultArgument();
239   }
240 
241   /// Determine whether we should expand a pack expansion with the
242   /// given set of parameter packs into separate arguments by repeatedly
243   /// transforming the pattern.
244   ///
245   /// By default, the transformer never tries to expand pack expansions.
246   /// Subclasses can override this routine to provide different behavior.
247   ///
248   /// \param EllipsisLoc The location of the ellipsis that identifies the
249   /// pack expansion.
250   ///
251   /// \param PatternRange The source range that covers the entire pattern of
252   /// the pack expansion.
253   ///
254   /// \param Unexpanded The set of unexpanded parameter packs within the
255   /// pattern.
256   ///
257   /// \param ShouldExpand Will be set to \c true if the transformer should
258   /// expand the corresponding pack expansions into separate arguments. When
259   /// set, \c NumExpansions must also be set.
260   ///
261   /// \param RetainExpansion Whether the caller should add an unexpanded
262   /// pack expansion after all of the expanded arguments. This is used
263   /// when extending explicitly-specified template argument packs per
264   /// C++0x [temp.arg.explicit]p9.
265   ///
266   /// \param NumExpansions The number of separate arguments that will be in
267   /// the expanded form of the corresponding pack expansion. This is both an
268   /// input and an output parameter, which can be set by the caller if the
269   /// number of expansions is known a priori (e.g., due to a prior substitution)
270   /// and will be set by the callee when the number of expansions is known.
271   /// The callee must set this value when \c ShouldExpand is \c true; it may
272   /// set this value in other cases.
273   ///
274   /// \returns true if an error occurred (e.g., because the parameter packs
275   /// are to be instantiated with arguments of different lengths), false
276   /// otherwise. If false, \c ShouldExpand (and possibly \c NumExpansions)
277   /// must be set.
278   bool TryExpandParameterPacks(SourceLocation EllipsisLoc,
279                                SourceRange PatternRange,
280                                ArrayRef<UnexpandedParameterPack> Unexpanded,
281                                bool &ShouldExpand,
282                                bool &RetainExpansion,
283                                Optional<unsigned> &NumExpansions) {
284     ShouldExpand = false;
285     return false;
286   }
287 
288   /// "Forget" about the partially-substituted pack template argument,
289   /// when performing an instantiation that must preserve the parameter pack
290   /// use.
291   ///
292   /// This routine is meant to be overridden by the template instantiator.
293   TemplateArgument ForgetPartiallySubstitutedPack() {
294     return TemplateArgument();
295   }
296 
297   /// "Remember" the partially-substituted pack template argument
298   /// after performing an instantiation that must preserve the parameter pack
299   /// use.
300   ///
301   /// This routine is meant to be overridden by the template instantiator.
302   void RememberPartiallySubstitutedPack(TemplateArgument Arg) { }
303 
304   /// Note to the derived class when a function parameter pack is
305   /// being expanded.
306   void ExpandingFunctionParameterPack(ParmVarDecl *Pack) { }
307 
308   /// Transforms the given type into another type.
309   ///
310   /// By default, this routine transforms a type by creating a
311   /// TypeSourceInfo for it and delegating to the appropriate
312   /// function.  This is expensive, but we don't mind, because
313   /// this method is deprecated anyway;  all users should be
314   /// switched to storing TypeSourceInfos.
315   ///
316   /// \returns the transformed type.
317   QualType TransformType(QualType T);
318 
319   /// Transforms the given type-with-location into a new
320   /// type-with-location.
321   ///
322   /// By default, this routine transforms a type by delegating to the
323   /// appropriate TransformXXXType to build a new type.  Subclasses
324   /// may override this function (to take over all type
325   /// transformations) or some set of the TransformXXXType functions
326   /// to alter the transformation.
327   TypeSourceInfo *TransformType(TypeSourceInfo *DI);
328 
329   /// Transform the given type-with-location into a new
330   /// type, collecting location information in the given builder
331   /// as necessary.
332   ///
333   QualType TransformType(TypeLocBuilder &TLB, TypeLoc TL);
334 
335   /// Transform a type that is permitted to produce a
336   /// DeducedTemplateSpecializationType.
337   ///
338   /// This is used in the (relatively rare) contexts where it is acceptable
339   /// for transformation to produce a class template type with deduced
340   /// template arguments.
341   /// @{
342   QualType TransformTypeWithDeducedTST(QualType T);
343   TypeSourceInfo *TransformTypeWithDeducedTST(TypeSourceInfo *DI);
344   /// @}
345 
346   /// The reason why the value of a statement is not discarded, if any.
347   enum StmtDiscardKind {
348     SDK_Discarded,
349     SDK_NotDiscarded,
350     SDK_StmtExprResult,
351   };
352 
353   /// Transform the given statement.
354   ///
355   /// By default, this routine transforms a statement by delegating to the
356   /// appropriate TransformXXXStmt function to transform a specific kind of
357   /// statement or the TransformExpr() function to transform an expression.
358   /// Subclasses may override this function to transform statements using some
359   /// other mechanism.
360   ///
361   /// \returns the transformed statement.
362   StmtResult TransformStmt(Stmt *S, StmtDiscardKind SDK = SDK_Discarded);
363 
364   /// Transform the given statement.
365   ///
366   /// By default, this routine transforms a statement by delegating to the
367   /// appropriate TransformOMPXXXClause function to transform a specific kind
368   /// of clause. Subclasses may override this function to transform statements
369   /// using some other mechanism.
370   ///
371   /// \returns the transformed OpenMP clause.
372   OMPClause *TransformOMPClause(OMPClause *S);
373 
374   /// Transform the given attribute.
375   ///
376   /// By default, this routine transforms a statement by delegating to the
377   /// appropriate TransformXXXAttr function to transform a specific kind
378   /// of attribute. Subclasses may override this function to transform
379   /// attributed statements using some other mechanism.
380   ///
381   /// \returns the transformed attribute
382   const Attr *TransformAttr(const Attr *S);
383 
384 /// Transform the specified attribute.
385 ///
386 /// Subclasses should override the transformation of attributes with a pragma
387 /// spelling to transform expressions stored within the attribute.
388 ///
389 /// \returns the transformed attribute.
390 #define ATTR(X)
391 #define PRAGMA_SPELLING_ATTR(X)                                                \
392   const X##Attr *Transform##X##Attr(const X##Attr *R) { return R; }
393 #include "clang/Basic/AttrList.inc"
394 
395   /// Transform the given expression.
396   ///
397   /// By default, this routine transforms an expression by delegating to the
398   /// appropriate TransformXXXExpr function to build a new expression.
399   /// Subclasses may override this function to transform expressions using some
400   /// other mechanism.
401   ///
402   /// \returns the transformed expression.
403   ExprResult TransformExpr(Expr *E);
404 
405   /// Transform the given initializer.
406   ///
407   /// By default, this routine transforms an initializer by stripping off the
408   /// semantic nodes added by initialization, then passing the result to
409   /// TransformExpr or TransformExprs.
410   ///
411   /// \returns the transformed initializer.
412   ExprResult TransformInitializer(Expr *Init, bool NotCopyInit);
413 
414   /// Transform the given list of expressions.
415   ///
416   /// This routine transforms a list of expressions by invoking
417   /// \c TransformExpr() for each subexpression. However, it also provides
418   /// support for variadic templates by expanding any pack expansions (if the
419   /// derived class permits such expansion) along the way. When pack expansions
420   /// are present, the number of outputs may not equal the number of inputs.
421   ///
422   /// \param Inputs The set of expressions to be transformed.
423   ///
424   /// \param NumInputs The number of expressions in \c Inputs.
425   ///
426   /// \param IsCall If \c true, then this transform is being performed on
427   /// function-call arguments, and any arguments that should be dropped, will
428   /// be.
429   ///
430   /// \param Outputs The transformed input expressions will be added to this
431   /// vector.
432   ///
433   /// \param ArgChanged If non-NULL, will be set \c true if any argument changed
434   /// due to transformation.
435   ///
436   /// \returns true if an error occurred, false otherwise.
437   bool TransformExprs(Expr *const *Inputs, unsigned NumInputs, bool IsCall,
438                       SmallVectorImpl<Expr *> &Outputs,
439                       bool *ArgChanged = nullptr);
440 
441   /// Transform the given declaration, which is referenced from a type
442   /// or expression.
443   ///
444   /// By default, acts as the identity function on declarations, unless the
445   /// transformer has had to transform the declaration itself. Subclasses
446   /// may override this function to provide alternate behavior.
447   Decl *TransformDecl(SourceLocation Loc, Decl *D) {
448     llvm::DenseMap<Decl *, Decl *>::iterator Known
449       = TransformedLocalDecls.find(D);
450     if (Known != TransformedLocalDecls.end())
451       return Known->second;
452 
453     return D;
454   }
455 
456   /// Transform the specified condition.
457   ///
458   /// By default, this transforms the variable and expression and rebuilds
459   /// the condition.
460   Sema::ConditionResult TransformCondition(SourceLocation Loc, VarDecl *Var,
461                                            Expr *Expr,
462                                            Sema::ConditionKind Kind);
463 
464   /// Transform the attributes associated with the given declaration and
465   /// place them on the new declaration.
466   ///
467   /// By default, this operation does nothing. Subclasses may override this
468   /// behavior to transform attributes.
469   void transformAttrs(Decl *Old, Decl *New) { }
470 
471   /// Note that a local declaration has been transformed by this
472   /// transformer.
473   ///
474   /// Local declarations are typically transformed via a call to
475   /// TransformDefinition. However, in some cases (e.g., lambda expressions),
476   /// the transformer itself has to transform the declarations. This routine
477   /// can be overridden by a subclass that keeps track of such mappings.
478   void transformedLocalDecl(Decl *Old, ArrayRef<Decl *> New) {
479     assert(New.size() == 1 &&
480            "must override transformedLocalDecl if performing pack expansion");
481     TransformedLocalDecls[Old] = New.front();
482   }
483 
484   /// Transform the definition of the given declaration.
485   ///
486   /// By default, invokes TransformDecl() to transform the declaration.
487   /// Subclasses may override this function to provide alternate behavior.
488   Decl *TransformDefinition(SourceLocation Loc, Decl *D) {
489     return getDerived().TransformDecl(Loc, D);
490   }
491 
492   /// Transform the given declaration, which was the first part of a
493   /// nested-name-specifier in a member access expression.
494   ///
495   /// This specific declaration transformation only applies to the first
496   /// identifier in a nested-name-specifier of a member access expression, e.g.,
497   /// the \c T in \c x->T::member
498   ///
499   /// By default, invokes TransformDecl() to transform the declaration.
500   /// Subclasses may override this function to provide alternate behavior.
501   NamedDecl *TransformFirstQualifierInScope(NamedDecl *D, SourceLocation Loc) {
502     return cast_or_null<NamedDecl>(getDerived().TransformDecl(Loc, D));
503   }
504 
505   /// Transform the set of declarations in an OverloadExpr.
506   bool TransformOverloadExprDecls(OverloadExpr *Old, bool RequiresADL,
507                                   LookupResult &R);
508 
509   /// Transform the given nested-name-specifier with source-location
510   /// information.
511   ///
512   /// By default, transforms all of the types and declarations within the
513   /// nested-name-specifier. Subclasses may override this function to provide
514   /// alternate behavior.
515   NestedNameSpecifierLoc
516   TransformNestedNameSpecifierLoc(NestedNameSpecifierLoc NNS,
517                                   QualType ObjectType = QualType(),
518                                   NamedDecl *FirstQualifierInScope = nullptr);
519 
520   /// Transform the given declaration name.
521   ///
522   /// By default, transforms the types of conversion function, constructor,
523   /// and destructor names and then (if needed) rebuilds the declaration name.
524   /// Identifiers and selectors are returned unmodified. Sublcasses may
525   /// override this function to provide alternate behavior.
526   DeclarationNameInfo
527   TransformDeclarationNameInfo(const DeclarationNameInfo &NameInfo);
528 
529   bool TransformRequiresExprRequirements(ArrayRef<concepts::Requirement *> Reqs,
530       llvm::SmallVectorImpl<concepts::Requirement *> &Transformed);
531   concepts::TypeRequirement *
532   TransformTypeRequirement(concepts::TypeRequirement *Req);
533   concepts::ExprRequirement *
534   TransformExprRequirement(concepts::ExprRequirement *Req);
535   concepts::NestedRequirement *
536   TransformNestedRequirement(concepts::NestedRequirement *Req);
537 
538   /// Transform the given template name.
539   ///
540   /// \param SS The nested-name-specifier that qualifies the template
541   /// name. This nested-name-specifier must already have been transformed.
542   ///
543   /// \param Name The template name to transform.
544   ///
545   /// \param NameLoc The source location of the template name.
546   ///
547   /// \param ObjectType If we're translating a template name within a member
548   /// access expression, this is the type of the object whose member template
549   /// is being referenced.
550   ///
551   /// \param FirstQualifierInScope If the first part of a nested-name-specifier
552   /// also refers to a name within the current (lexical) scope, this is the
553   /// declaration it refers to.
554   ///
555   /// By default, transforms the template name by transforming the declarations
556   /// and nested-name-specifiers that occur within the template name.
557   /// Subclasses may override this function to provide alternate behavior.
558   TemplateName
559   TransformTemplateName(CXXScopeSpec &SS, TemplateName Name,
560                         SourceLocation NameLoc,
561                         QualType ObjectType = QualType(),
562                         NamedDecl *FirstQualifierInScope = nullptr,
563                         bool AllowInjectedClassName = false);
564 
565   /// Transform the given template argument.
566   ///
567   /// By default, this operation transforms the type, expression, or
568   /// declaration stored within the template argument and constructs a
569   /// new template argument from the transformed result. Subclasses may
570   /// override this function to provide alternate behavior.
571   ///
572   /// Returns true if there was an error.
573   bool TransformTemplateArgument(const TemplateArgumentLoc &Input,
574                                  TemplateArgumentLoc &Output,
575                                  bool Uneval = false);
576 
577   /// Transform the given set of template arguments.
578   ///
579   /// By default, this operation transforms all of the template arguments
580   /// in the input set using \c TransformTemplateArgument(), and appends
581   /// the transformed arguments to the output list.
582   ///
583   /// Note that this overload of \c TransformTemplateArguments() is merely
584   /// a convenience function. Subclasses that wish to override this behavior
585   /// should override the iterator-based member template version.
586   ///
587   /// \param Inputs The set of template arguments to be transformed.
588   ///
589   /// \param NumInputs The number of template arguments in \p Inputs.
590   ///
591   /// \param Outputs The set of transformed template arguments output by this
592   /// routine.
593   ///
594   /// Returns true if an error occurred.
595   bool TransformTemplateArguments(const TemplateArgumentLoc *Inputs,
596                                   unsigned NumInputs,
597                                   TemplateArgumentListInfo &Outputs,
598                                   bool Uneval = false) {
599     return TransformTemplateArguments(Inputs, Inputs + NumInputs, Outputs,
600                                       Uneval);
601   }
602 
603   /// Transform the given set of template arguments.
604   ///
605   /// By default, this operation transforms all of the template arguments
606   /// in the input set using \c TransformTemplateArgument(), and appends
607   /// the transformed arguments to the output list.
608   ///
609   /// \param First An iterator to the first template argument.
610   ///
611   /// \param Last An iterator one step past the last template argument.
612   ///
613   /// \param Outputs The set of transformed template arguments output by this
614   /// routine.
615   ///
616   /// Returns true if an error occurred.
617   template<typename InputIterator>
618   bool TransformTemplateArguments(InputIterator First,
619                                   InputIterator Last,
620                                   TemplateArgumentListInfo &Outputs,
621                                   bool Uneval = false);
622 
623   /// Fakes up a TemplateArgumentLoc for a given TemplateArgument.
624   void InventTemplateArgumentLoc(const TemplateArgument &Arg,
625                                  TemplateArgumentLoc &ArgLoc);
626 
627   /// Fakes up a TypeSourceInfo for a type.
628   TypeSourceInfo *InventTypeSourceInfo(QualType T) {
629     return SemaRef.Context.getTrivialTypeSourceInfo(T,
630                        getDerived().getBaseLocation());
631   }
632 
633 #define ABSTRACT_TYPELOC(CLASS, PARENT)
634 #define TYPELOC(CLASS, PARENT)                                   \
635   QualType Transform##CLASS##Type(TypeLocBuilder &TLB, CLASS##TypeLoc T);
636 #include "clang/AST/TypeLocNodes.def"
637 
638   template<typename Fn>
639   QualType TransformFunctionProtoType(TypeLocBuilder &TLB,
640                                       FunctionProtoTypeLoc TL,
641                                       CXXRecordDecl *ThisContext,
642                                       Qualifiers ThisTypeQuals,
643                                       Fn TransformExceptionSpec);
644 
645   bool TransformExceptionSpec(SourceLocation Loc,
646                               FunctionProtoType::ExceptionSpecInfo &ESI,
647                               SmallVectorImpl<QualType> &Exceptions,
648                               bool &Changed);
649 
650   StmtResult TransformSEHHandler(Stmt *Handler);
651 
652   QualType
653   TransformTemplateSpecializationType(TypeLocBuilder &TLB,
654                                       TemplateSpecializationTypeLoc TL,
655                                       TemplateName Template);
656 
657   QualType
658   TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB,
659                                       DependentTemplateSpecializationTypeLoc TL,
660                                                TemplateName Template,
661                                                CXXScopeSpec &SS);
662 
663   QualType TransformDependentTemplateSpecializationType(
664       TypeLocBuilder &TLB, DependentTemplateSpecializationTypeLoc TL,
665       NestedNameSpecifierLoc QualifierLoc);
666 
667   /// Transforms the parameters of a function type into the
668   /// given vectors.
669   ///
670   /// The result vectors should be kept in sync; null entries in the
671   /// variables vector are acceptable.
672   ///
673   /// Return true on error.
674   bool TransformFunctionTypeParams(
675       SourceLocation Loc, ArrayRef<ParmVarDecl *> Params,
676       const QualType *ParamTypes,
677       const FunctionProtoType::ExtParameterInfo *ParamInfos,
678       SmallVectorImpl<QualType> &PTypes, SmallVectorImpl<ParmVarDecl *> *PVars,
679       Sema::ExtParameterInfoBuilder &PInfos);
680 
681   /// Transforms a single function-type parameter.  Return null
682   /// on error.
683   ///
684   /// \param indexAdjustment - A number to add to the parameter's
685   ///   scope index;  can be negative
686   ParmVarDecl *TransformFunctionTypeParam(ParmVarDecl *OldParm,
687                                           int indexAdjustment,
688                                           Optional<unsigned> NumExpansions,
689                                           bool ExpectParameterPack);
690 
691   /// Transform the body of a lambda-expression.
692   StmtResult TransformLambdaBody(LambdaExpr *E, Stmt *Body);
693   /// Alternative implementation of TransformLambdaBody that skips transforming
694   /// the body.
695   StmtResult SkipLambdaBody(LambdaExpr *E, Stmt *Body);
696 
697   QualType TransformReferenceType(TypeLocBuilder &TLB, ReferenceTypeLoc TL);
698 
699   StmtResult TransformCompoundStmt(CompoundStmt *S, bool IsStmtExpr);
700   ExprResult TransformCXXNamedCastExpr(CXXNamedCastExpr *E);
701 
702   TemplateParameterList *TransformTemplateParameterList(
703         TemplateParameterList *TPL) {
704     return TPL;
705   }
706 
707   ExprResult TransformAddressOfOperand(Expr *E);
708 
709   ExprResult TransformDependentScopeDeclRefExpr(DependentScopeDeclRefExpr *E,
710                                                 bool IsAddressOfOperand,
711                                                 TypeSourceInfo **RecoveryTSI);
712 
713   ExprResult TransformParenDependentScopeDeclRefExpr(
714       ParenExpr *PE, DependentScopeDeclRefExpr *DRE, bool IsAddressOfOperand,
715       TypeSourceInfo **RecoveryTSI);
716 
717   StmtResult TransformOMPExecutableDirective(OMPExecutableDirective *S);
718 
719 // FIXME: We use LLVM_ATTRIBUTE_NOINLINE because inlining causes a ridiculous
720 // amount of stack usage with clang.
721 #define STMT(Node, Parent)                        \
722   LLVM_ATTRIBUTE_NOINLINE \
723   StmtResult Transform##Node(Node *S);
724 #define VALUESTMT(Node, Parent)                   \
725   LLVM_ATTRIBUTE_NOINLINE \
726   StmtResult Transform##Node(Node *S, StmtDiscardKind SDK);
727 #define EXPR(Node, Parent)                        \
728   LLVM_ATTRIBUTE_NOINLINE \
729   ExprResult Transform##Node(Node *E);
730 #define ABSTRACT_STMT(Stmt)
731 #include "clang/AST/StmtNodes.inc"
732 
733 #define OMP_CLAUSE_CLASS(Enum, Str, Class)                                           \
734   LLVM_ATTRIBUTE_NOINLINE \
735   OMPClause *Transform ## Class(Class *S);
736 #include "llvm/Frontend/OpenMP/OMPKinds.def"
737 
738   /// Build a new qualified type given its unqualified type and type location.
739   ///
740   /// By default, this routine adds type qualifiers only to types that can
741   /// have qualifiers, and silently suppresses those qualifiers that are not
742   /// permitted. Subclasses may override this routine to provide different
743   /// behavior.
744   QualType RebuildQualifiedType(QualType T, QualifiedTypeLoc TL);
745 
746   /// Build a new pointer type given its pointee type.
747   ///
748   /// By default, performs semantic analysis when building the pointer type.
749   /// Subclasses may override this routine to provide different behavior.
750   QualType RebuildPointerType(QualType PointeeType, SourceLocation Sigil);
751 
752   /// Build a new block pointer type given its pointee type.
753   ///
754   /// By default, performs semantic analysis when building the block pointer
755   /// type. Subclasses may override this routine to provide different behavior.
756   QualType RebuildBlockPointerType(QualType PointeeType, SourceLocation Sigil);
757 
758   /// Build a new reference type given the type it references.
759   ///
760   /// By default, performs semantic analysis when building the
761   /// reference type. Subclasses may override this routine to provide
762   /// different behavior.
763   ///
764   /// \param LValue whether the type was written with an lvalue sigil
765   /// or an rvalue sigil.
766   QualType RebuildReferenceType(QualType ReferentType,
767                                 bool LValue,
768                                 SourceLocation Sigil);
769 
770   /// Build a new member pointer type given the pointee type and the
771   /// class type it refers into.
772   ///
773   /// By default, performs semantic analysis when building the member pointer
774   /// type. Subclasses may override this routine to provide different behavior.
775   QualType RebuildMemberPointerType(QualType PointeeType, QualType ClassType,
776                                     SourceLocation Sigil);
777 
778   QualType RebuildObjCTypeParamType(const ObjCTypeParamDecl *Decl,
779                                     SourceLocation ProtocolLAngleLoc,
780                                     ArrayRef<ObjCProtocolDecl *> Protocols,
781                                     ArrayRef<SourceLocation> ProtocolLocs,
782                                     SourceLocation ProtocolRAngleLoc);
783 
784   /// Build an Objective-C object type.
785   ///
786   /// By default, performs semantic analysis when building the object type.
787   /// Subclasses may override this routine to provide different behavior.
788   QualType RebuildObjCObjectType(QualType BaseType,
789                                  SourceLocation Loc,
790                                  SourceLocation TypeArgsLAngleLoc,
791                                  ArrayRef<TypeSourceInfo *> TypeArgs,
792                                  SourceLocation TypeArgsRAngleLoc,
793                                  SourceLocation ProtocolLAngleLoc,
794                                  ArrayRef<ObjCProtocolDecl *> Protocols,
795                                  ArrayRef<SourceLocation> ProtocolLocs,
796                                  SourceLocation ProtocolRAngleLoc);
797 
798   /// Build a new Objective-C object pointer type given the pointee type.
799   ///
800   /// By default, directly builds the pointer type, with no additional semantic
801   /// analysis.
802   QualType RebuildObjCObjectPointerType(QualType PointeeType,
803                                         SourceLocation Star);
804 
805   /// Build a new array type given the element type, size
806   /// modifier, size of the array (if known), size expression, and index type
807   /// qualifiers.
808   ///
809   /// By default, performs semantic analysis when building the array type.
810   /// Subclasses may override this routine to provide different behavior.
811   /// Also by default, all of the other Rebuild*Array
812   QualType RebuildArrayType(QualType ElementType,
813                             ArrayType::ArraySizeModifier SizeMod,
814                             const llvm::APInt *Size,
815                             Expr *SizeExpr,
816                             unsigned IndexTypeQuals,
817                             SourceRange BracketsRange);
818 
819   /// Build a new constant array type given the element type, size
820   /// modifier, (known) size of the array, and index type qualifiers.
821   ///
822   /// By default, performs semantic analysis when building the array type.
823   /// Subclasses may override this routine to provide different behavior.
824   QualType RebuildConstantArrayType(QualType ElementType,
825                                     ArrayType::ArraySizeModifier SizeMod,
826                                     const llvm::APInt &Size,
827                                     Expr *SizeExpr,
828                                     unsigned IndexTypeQuals,
829                                     SourceRange BracketsRange);
830 
831   /// Build a new incomplete array type given the element type, size
832   /// modifier, and index type qualifiers.
833   ///
834   /// By default, performs semantic analysis when building the array type.
835   /// Subclasses may override this routine to provide different behavior.
836   QualType RebuildIncompleteArrayType(QualType ElementType,
837                                       ArrayType::ArraySizeModifier SizeMod,
838                                       unsigned IndexTypeQuals,
839                                       SourceRange BracketsRange);
840 
841   /// Build a new variable-length array type given the element type,
842   /// size modifier, size expression, and index type qualifiers.
843   ///
844   /// By default, performs semantic analysis when building the array type.
845   /// Subclasses may override this routine to provide different behavior.
846   QualType RebuildVariableArrayType(QualType ElementType,
847                                     ArrayType::ArraySizeModifier SizeMod,
848                                     Expr *SizeExpr,
849                                     unsigned IndexTypeQuals,
850                                     SourceRange BracketsRange);
851 
852   /// Build a new dependent-sized array type given the element type,
853   /// size modifier, size expression, and index type qualifiers.
854   ///
855   /// By default, performs semantic analysis when building the array type.
856   /// Subclasses may override this routine to provide different behavior.
857   QualType RebuildDependentSizedArrayType(QualType ElementType,
858                                           ArrayType::ArraySizeModifier SizeMod,
859                                           Expr *SizeExpr,
860                                           unsigned IndexTypeQuals,
861                                           SourceRange BracketsRange);
862 
863   /// Build a new vector type given the element type and
864   /// number of elements.
865   ///
866   /// By default, performs semantic analysis when building the vector type.
867   /// Subclasses may override this routine to provide different behavior.
868   QualType RebuildVectorType(QualType ElementType, unsigned NumElements,
869                              VectorType::VectorKind VecKind);
870 
871   /// Build a new potentially dependently-sized extended vector type
872   /// given the element type and number of elements.
873   ///
874   /// By default, performs semantic analysis when building the vector type.
875   /// Subclasses may override this routine to provide different behavior.
876   QualType RebuildDependentVectorType(QualType ElementType, Expr *SizeExpr,
877                                            SourceLocation AttributeLoc,
878                                            VectorType::VectorKind);
879 
880   /// Build a new extended vector type given the element type and
881   /// number of elements.
882   ///
883   /// By default, performs semantic analysis when building the vector type.
884   /// Subclasses may override this routine to provide different behavior.
885   QualType RebuildExtVectorType(QualType ElementType, unsigned NumElements,
886                                 SourceLocation AttributeLoc);
887 
888   /// Build a new potentially dependently-sized extended vector type
889   /// given the element type and number of elements.
890   ///
891   /// By default, performs semantic analysis when building the vector type.
892   /// Subclasses may override this routine to provide different behavior.
893   QualType RebuildDependentSizedExtVectorType(QualType ElementType,
894                                               Expr *SizeExpr,
895                                               SourceLocation AttributeLoc);
896 
897   /// Build a new DependentAddressSpaceType or return the pointee
898   /// type variable with the correct address space (retrieved from
899   /// AddrSpaceExpr) applied to it. The former will be returned in cases
900   /// where the address space remains dependent.
901   ///
902   /// By default, performs semantic analysis when building the type with address
903   /// space applied. Subclasses may override this routine to provide different
904   /// behavior.
905   QualType RebuildDependentAddressSpaceType(QualType PointeeType,
906                                             Expr *AddrSpaceExpr,
907                                             SourceLocation AttributeLoc);
908 
909   /// Build a new function type.
910   ///
911   /// By default, performs semantic analysis when building the function type.
912   /// Subclasses may override this routine to provide different behavior.
913   QualType RebuildFunctionProtoType(QualType T,
914                                     MutableArrayRef<QualType> ParamTypes,
915                                     const FunctionProtoType::ExtProtoInfo &EPI);
916 
917   /// Build a new unprototyped function type.
918   QualType RebuildFunctionNoProtoType(QualType ResultType);
919 
920   /// Rebuild an unresolved typename type, given the decl that
921   /// the UnresolvedUsingTypenameDecl was transformed to.
922   QualType RebuildUnresolvedUsingType(SourceLocation NameLoc, Decl *D);
923 
924   /// Build a new typedef type.
925   QualType RebuildTypedefType(TypedefNameDecl *Typedef) {
926     return SemaRef.Context.getTypeDeclType(Typedef);
927   }
928 
929   /// Build a new MacroDefined type.
930   QualType RebuildMacroQualifiedType(QualType T,
931                                      const IdentifierInfo *MacroII) {
932     return SemaRef.Context.getMacroQualifiedType(T, MacroII);
933   }
934 
935   /// Build a new class/struct/union type.
936   QualType RebuildRecordType(RecordDecl *Record) {
937     return SemaRef.Context.getTypeDeclType(Record);
938   }
939 
940   /// Build a new Enum type.
941   QualType RebuildEnumType(EnumDecl *Enum) {
942     return SemaRef.Context.getTypeDeclType(Enum);
943   }
944 
945   /// Build a new typeof(expr) type.
946   ///
947   /// By default, performs semantic analysis when building the typeof type.
948   /// Subclasses may override this routine to provide different behavior.
949   QualType RebuildTypeOfExprType(Expr *Underlying, SourceLocation Loc);
950 
951   /// Build a new typeof(type) type.
952   ///
953   /// By default, builds a new TypeOfType with the given underlying type.
954   QualType RebuildTypeOfType(QualType Underlying);
955 
956   /// Build a new unary transform type.
957   QualType RebuildUnaryTransformType(QualType BaseType,
958                                      UnaryTransformType::UTTKind UKind,
959                                      SourceLocation Loc);
960 
961   /// Build a new C++11 decltype type.
962   ///
963   /// By default, performs semantic analysis when building the decltype type.
964   /// Subclasses may override this routine to provide different behavior.
965   QualType RebuildDecltypeType(Expr *Underlying, SourceLocation Loc);
966 
967   /// Build a new C++11 auto type.
968   ///
969   /// By default, builds a new AutoType with the given deduced type.
970   QualType RebuildAutoType(QualType Deduced, AutoTypeKeyword Keyword,
971                            ConceptDecl *TypeConstraintConcept,
972                            ArrayRef<TemplateArgument> TypeConstraintArgs) {
973     // Note, IsDependent is always false here: we implicitly convert an 'auto'
974     // which has been deduced to a dependent type into an undeduced 'auto', so
975     // that we'll retry deduction after the transformation.
976     return SemaRef.Context.getAutoType(Deduced, Keyword,
977                                        /*IsDependent*/ false, /*IsPack=*/false,
978                                        TypeConstraintConcept,
979                                        TypeConstraintArgs);
980   }
981 
982   /// By default, builds a new DeducedTemplateSpecializationType with the given
983   /// deduced type.
984   QualType RebuildDeducedTemplateSpecializationType(TemplateName Template,
985       QualType Deduced) {
986     return SemaRef.Context.getDeducedTemplateSpecializationType(
987         Template, Deduced, /*IsDependent*/ false);
988   }
989 
990   /// Build a new template specialization type.
991   ///
992   /// By default, performs semantic analysis when building the template
993   /// specialization type. Subclasses may override this routine to provide
994   /// different behavior.
995   QualType RebuildTemplateSpecializationType(TemplateName Template,
996                                              SourceLocation TemplateLoc,
997                                              TemplateArgumentListInfo &Args);
998 
999   /// Build a new parenthesized type.
1000   ///
1001   /// By default, builds a new ParenType type from the inner type.
1002   /// Subclasses may override this routine to provide different behavior.
1003   QualType RebuildParenType(QualType InnerType) {
1004     return SemaRef.BuildParenType(InnerType);
1005   }
1006 
1007   /// Build a new qualified name type.
1008   ///
1009   /// By default, builds a new ElaboratedType type from the keyword,
1010   /// the nested-name-specifier and the named type.
1011   /// Subclasses may override this routine to provide different behavior.
1012   QualType RebuildElaboratedType(SourceLocation KeywordLoc,
1013                                  ElaboratedTypeKeyword Keyword,
1014                                  NestedNameSpecifierLoc QualifierLoc,
1015                                  QualType Named) {
1016     return SemaRef.Context.getElaboratedType(Keyword,
1017                                          QualifierLoc.getNestedNameSpecifier(),
1018                                              Named);
1019   }
1020 
1021   /// Build a new typename type that refers to a template-id.
1022   ///
1023   /// By default, builds a new DependentNameType type from the
1024   /// nested-name-specifier and the given type. Subclasses may override
1025   /// this routine to provide different behavior.
1026   QualType RebuildDependentTemplateSpecializationType(
1027                                           ElaboratedTypeKeyword Keyword,
1028                                           NestedNameSpecifierLoc QualifierLoc,
1029                                           SourceLocation TemplateKWLoc,
1030                                           const IdentifierInfo *Name,
1031                                           SourceLocation NameLoc,
1032                                           TemplateArgumentListInfo &Args,
1033                                           bool AllowInjectedClassName) {
1034     // Rebuild the template name.
1035     // TODO: avoid TemplateName abstraction
1036     CXXScopeSpec SS;
1037     SS.Adopt(QualifierLoc);
1038     TemplateName InstName = getDerived().RebuildTemplateName(
1039         SS, TemplateKWLoc, *Name, NameLoc, QualType(), nullptr,
1040         AllowInjectedClassName);
1041 
1042     if (InstName.isNull())
1043       return QualType();
1044 
1045     // If it's still dependent, make a dependent specialization.
1046     if (InstName.getAsDependentTemplateName())
1047       return SemaRef.Context.getDependentTemplateSpecializationType(Keyword,
1048                                           QualifierLoc.getNestedNameSpecifier(),
1049                                                                     Name,
1050                                                                     Args);
1051 
1052     // Otherwise, make an elaborated type wrapping a non-dependent
1053     // specialization.
1054     QualType T =
1055     getDerived().RebuildTemplateSpecializationType(InstName, NameLoc, Args);
1056     if (T.isNull()) return QualType();
1057 
1058     if (Keyword == ETK_None && QualifierLoc.getNestedNameSpecifier() == nullptr)
1059       return T;
1060 
1061     return SemaRef.Context.getElaboratedType(Keyword,
1062                                        QualifierLoc.getNestedNameSpecifier(),
1063                                              T);
1064   }
1065 
1066   /// Build a new typename type that refers to an identifier.
1067   ///
1068   /// By default, performs semantic analysis when building the typename type
1069   /// (or elaborated type). Subclasses may override this routine to provide
1070   /// different behavior.
1071   QualType RebuildDependentNameType(ElaboratedTypeKeyword Keyword,
1072                                     SourceLocation KeywordLoc,
1073                                     NestedNameSpecifierLoc QualifierLoc,
1074                                     const IdentifierInfo *Id,
1075                                     SourceLocation IdLoc,
1076                                     bool DeducedTSTContext) {
1077     CXXScopeSpec SS;
1078     SS.Adopt(QualifierLoc);
1079 
1080     if (QualifierLoc.getNestedNameSpecifier()->isDependent()) {
1081       // If the name is still dependent, just build a new dependent name type.
1082       if (!SemaRef.computeDeclContext(SS))
1083         return SemaRef.Context.getDependentNameType(Keyword,
1084                                           QualifierLoc.getNestedNameSpecifier(),
1085                                                     Id);
1086     }
1087 
1088     if (Keyword == ETK_None || Keyword == ETK_Typename) {
1089       return SemaRef.CheckTypenameType(Keyword, KeywordLoc, QualifierLoc,
1090                                        *Id, IdLoc, DeducedTSTContext);
1091     }
1092 
1093     TagTypeKind Kind = TypeWithKeyword::getTagTypeKindForKeyword(Keyword);
1094 
1095     // We had a dependent elaborated-type-specifier that has been transformed
1096     // into a non-dependent elaborated-type-specifier. Find the tag we're
1097     // referring to.
1098     LookupResult Result(SemaRef, Id, IdLoc, Sema::LookupTagName);
1099     DeclContext *DC = SemaRef.computeDeclContext(SS, false);
1100     if (!DC)
1101       return QualType();
1102 
1103     if (SemaRef.RequireCompleteDeclContext(SS, DC))
1104       return QualType();
1105 
1106     TagDecl *Tag = nullptr;
1107     SemaRef.LookupQualifiedName(Result, DC);
1108     switch (Result.getResultKind()) {
1109       case LookupResult::NotFound:
1110       case LookupResult::NotFoundInCurrentInstantiation:
1111         break;
1112 
1113       case LookupResult::Found:
1114         Tag = Result.getAsSingle<TagDecl>();
1115         break;
1116 
1117       case LookupResult::FoundOverloaded:
1118       case LookupResult::FoundUnresolvedValue:
1119         llvm_unreachable("Tag lookup cannot find non-tags");
1120 
1121       case LookupResult::Ambiguous:
1122         // Let the LookupResult structure handle ambiguities.
1123         return QualType();
1124     }
1125 
1126     if (!Tag) {
1127       // Check where the name exists but isn't a tag type and use that to emit
1128       // better diagnostics.
1129       LookupResult Result(SemaRef, Id, IdLoc, Sema::LookupTagName);
1130       SemaRef.LookupQualifiedName(Result, DC);
1131       switch (Result.getResultKind()) {
1132         case LookupResult::Found:
1133         case LookupResult::FoundOverloaded:
1134         case LookupResult::FoundUnresolvedValue: {
1135           NamedDecl *SomeDecl = Result.getRepresentativeDecl();
1136           Sema::NonTagKind NTK = SemaRef.getNonTagTypeDeclKind(SomeDecl, Kind);
1137           SemaRef.Diag(IdLoc, diag::err_tag_reference_non_tag) << SomeDecl
1138                                                                << NTK << Kind;
1139           SemaRef.Diag(SomeDecl->getLocation(), diag::note_declared_at);
1140           break;
1141         }
1142         default:
1143           SemaRef.Diag(IdLoc, diag::err_not_tag_in_scope)
1144               << Kind << Id << DC << QualifierLoc.getSourceRange();
1145           break;
1146       }
1147       return QualType();
1148     }
1149 
1150     if (!SemaRef.isAcceptableTagRedeclaration(Tag, Kind, /*isDefinition*/false,
1151                                               IdLoc, Id)) {
1152       SemaRef.Diag(KeywordLoc, diag::err_use_with_wrong_tag) << Id;
1153       SemaRef.Diag(Tag->getLocation(), diag::note_previous_use);
1154       return QualType();
1155     }
1156 
1157     // Build the elaborated-type-specifier type.
1158     QualType T = SemaRef.Context.getTypeDeclType(Tag);
1159     return SemaRef.Context.getElaboratedType(Keyword,
1160                                          QualifierLoc.getNestedNameSpecifier(),
1161                                              T);
1162   }
1163 
1164   /// Build a new pack expansion type.
1165   ///
1166   /// By default, builds a new PackExpansionType type from the given pattern.
1167   /// Subclasses may override this routine to provide different behavior.
1168   QualType RebuildPackExpansionType(QualType Pattern,
1169                                     SourceRange PatternRange,
1170                                     SourceLocation EllipsisLoc,
1171                                     Optional<unsigned> NumExpansions) {
1172     return getSema().CheckPackExpansion(Pattern, PatternRange, EllipsisLoc,
1173                                         NumExpansions);
1174   }
1175 
1176   /// Build a new atomic type given its value type.
1177   ///
1178   /// By default, performs semantic analysis when building the atomic type.
1179   /// Subclasses may override this routine to provide different behavior.
1180   QualType RebuildAtomicType(QualType ValueType, SourceLocation KWLoc);
1181 
1182   /// Build a new pipe type given its value type.
1183   QualType RebuildPipeType(QualType ValueType, SourceLocation KWLoc,
1184                            bool isReadPipe);
1185 
1186   /// Build a new template name given a nested name specifier, a flag
1187   /// indicating whether the "template" keyword was provided, and the template
1188   /// that the template name refers to.
1189   ///
1190   /// By default, builds the new template name directly. Subclasses may override
1191   /// this routine to provide different behavior.
1192   TemplateName RebuildTemplateName(CXXScopeSpec &SS,
1193                                    bool TemplateKW,
1194                                    TemplateDecl *Template);
1195 
1196   /// Build a new template name given a nested name specifier and the
1197   /// name that is referred to as a template.
1198   ///
1199   /// By default, performs semantic analysis to determine whether the name can
1200   /// be resolved to a specific template, then builds the appropriate kind of
1201   /// template name. Subclasses may override this routine to provide different
1202   /// behavior.
1203   TemplateName RebuildTemplateName(CXXScopeSpec &SS,
1204                                    SourceLocation TemplateKWLoc,
1205                                    const IdentifierInfo &Name,
1206                                    SourceLocation NameLoc, QualType ObjectType,
1207                                    NamedDecl *FirstQualifierInScope,
1208                                    bool AllowInjectedClassName);
1209 
1210   /// Build a new template name given a nested name specifier and the
1211   /// overloaded operator name that is referred to as a template.
1212   ///
1213   /// By default, performs semantic analysis to determine whether the name can
1214   /// be resolved to a specific template, then builds the appropriate kind of
1215   /// template name. Subclasses may override this routine to provide different
1216   /// behavior.
1217   TemplateName RebuildTemplateName(CXXScopeSpec &SS,
1218                                    SourceLocation TemplateKWLoc,
1219                                    OverloadedOperatorKind Operator,
1220                                    SourceLocation NameLoc, QualType ObjectType,
1221                                    bool AllowInjectedClassName);
1222 
1223   /// Build a new template name given a template template parameter pack
1224   /// and the
1225   ///
1226   /// By default, performs semantic analysis to determine whether the name can
1227   /// be resolved to a specific template, then builds the appropriate kind of
1228   /// template name. Subclasses may override this routine to provide different
1229   /// behavior.
1230   TemplateName RebuildTemplateName(TemplateTemplateParmDecl *Param,
1231                                    const TemplateArgument &ArgPack) {
1232     return getSema().Context.getSubstTemplateTemplateParmPack(Param, ArgPack);
1233   }
1234 
1235   /// Build a new compound statement.
1236   ///
1237   /// By default, performs semantic analysis to build the new statement.
1238   /// Subclasses may override this routine to provide different behavior.
1239   StmtResult RebuildCompoundStmt(SourceLocation LBraceLoc,
1240                                        MultiStmtArg Statements,
1241                                        SourceLocation RBraceLoc,
1242                                        bool IsStmtExpr) {
1243     return getSema().ActOnCompoundStmt(LBraceLoc, RBraceLoc, Statements,
1244                                        IsStmtExpr);
1245   }
1246 
1247   /// Build a new case statement.
1248   ///
1249   /// By default, performs semantic analysis to build the new statement.
1250   /// Subclasses may override this routine to provide different behavior.
1251   StmtResult RebuildCaseStmt(SourceLocation CaseLoc,
1252                                    Expr *LHS,
1253                                    SourceLocation EllipsisLoc,
1254                                    Expr *RHS,
1255                                    SourceLocation ColonLoc) {
1256     return getSema().ActOnCaseStmt(CaseLoc, LHS, EllipsisLoc, RHS,
1257                                    ColonLoc);
1258   }
1259 
1260   /// Attach the body to a new case statement.
1261   ///
1262   /// By default, performs semantic analysis to build the new statement.
1263   /// Subclasses may override this routine to provide different behavior.
1264   StmtResult RebuildCaseStmtBody(Stmt *S, Stmt *Body) {
1265     getSema().ActOnCaseStmtBody(S, Body);
1266     return S;
1267   }
1268 
1269   /// Build a new default statement.
1270   ///
1271   /// By default, performs semantic analysis to build the new statement.
1272   /// Subclasses may override this routine to provide different behavior.
1273   StmtResult RebuildDefaultStmt(SourceLocation DefaultLoc,
1274                                       SourceLocation ColonLoc,
1275                                       Stmt *SubStmt) {
1276     return getSema().ActOnDefaultStmt(DefaultLoc, ColonLoc, SubStmt,
1277                                       /*CurScope=*/nullptr);
1278   }
1279 
1280   /// Build a new label statement.
1281   ///
1282   /// By default, performs semantic analysis to build the new statement.
1283   /// Subclasses may override this routine to provide different behavior.
1284   StmtResult RebuildLabelStmt(SourceLocation IdentLoc, LabelDecl *L,
1285                               SourceLocation ColonLoc, Stmt *SubStmt) {
1286     return SemaRef.ActOnLabelStmt(IdentLoc, L, ColonLoc, SubStmt);
1287   }
1288 
1289   /// Build a new label statement.
1290   ///
1291   /// By default, performs semantic analysis to build the new statement.
1292   /// Subclasses may override this routine to provide different behavior.
1293   StmtResult RebuildAttributedStmt(SourceLocation AttrLoc,
1294                                    ArrayRef<const Attr*> Attrs,
1295                                    Stmt *SubStmt) {
1296     return SemaRef.ActOnAttributedStmt(AttrLoc, Attrs, SubStmt);
1297   }
1298 
1299   /// Build a new "if" statement.
1300   ///
1301   /// By default, performs semantic analysis to build the new statement.
1302   /// Subclasses may override this routine to provide different behavior.
1303   StmtResult RebuildIfStmt(SourceLocation IfLoc, bool IsConstexpr,
1304                            Sema::ConditionResult Cond, Stmt *Init, Stmt *Then,
1305                            SourceLocation ElseLoc, Stmt *Else) {
1306     return getSema().ActOnIfStmt(IfLoc, IsConstexpr, Init, Cond, Then,
1307                                  ElseLoc, Else);
1308   }
1309 
1310   /// Start building a new switch statement.
1311   ///
1312   /// By default, performs semantic analysis to build the new statement.
1313   /// Subclasses may override this routine to provide different behavior.
1314   StmtResult RebuildSwitchStmtStart(SourceLocation SwitchLoc, Stmt *Init,
1315                                     Sema::ConditionResult Cond) {
1316     return getSema().ActOnStartOfSwitchStmt(SwitchLoc, Init, Cond);
1317   }
1318 
1319   /// Attach the body to the switch statement.
1320   ///
1321   /// By default, performs semantic analysis to build the new statement.
1322   /// Subclasses may override this routine to provide different behavior.
1323   StmtResult RebuildSwitchStmtBody(SourceLocation SwitchLoc,
1324                                    Stmt *Switch, Stmt *Body) {
1325     return getSema().ActOnFinishSwitchStmt(SwitchLoc, Switch, Body);
1326   }
1327 
1328   /// Build a new while statement.
1329   ///
1330   /// By default, performs semantic analysis to build the new statement.
1331   /// Subclasses may override this routine to provide different behavior.
1332   StmtResult RebuildWhileStmt(SourceLocation WhileLoc,
1333                               Sema::ConditionResult Cond, Stmt *Body) {
1334     return getSema().ActOnWhileStmt(WhileLoc, Cond, Body);
1335   }
1336 
1337   /// Build a new do-while statement.
1338   ///
1339   /// By default, performs semantic analysis to build the new statement.
1340   /// Subclasses may override this routine to provide different behavior.
1341   StmtResult RebuildDoStmt(SourceLocation DoLoc, Stmt *Body,
1342                            SourceLocation WhileLoc, SourceLocation LParenLoc,
1343                            Expr *Cond, SourceLocation RParenLoc) {
1344     return getSema().ActOnDoStmt(DoLoc, Body, WhileLoc, LParenLoc,
1345                                  Cond, RParenLoc);
1346   }
1347 
1348   /// Build a new for statement.
1349   ///
1350   /// By default, performs semantic analysis to build the new statement.
1351   /// Subclasses may override this routine to provide different behavior.
1352   StmtResult RebuildForStmt(SourceLocation ForLoc, SourceLocation LParenLoc,
1353                             Stmt *Init, Sema::ConditionResult Cond,
1354                             Sema::FullExprArg Inc, SourceLocation RParenLoc,
1355                             Stmt *Body) {
1356     return getSema().ActOnForStmt(ForLoc, LParenLoc, Init, Cond,
1357                                   Inc, RParenLoc, Body);
1358   }
1359 
1360   /// Build a new goto statement.
1361   ///
1362   /// By default, performs semantic analysis to build the new statement.
1363   /// Subclasses may override this routine to provide different behavior.
1364   StmtResult RebuildGotoStmt(SourceLocation GotoLoc, SourceLocation LabelLoc,
1365                              LabelDecl *Label) {
1366     return getSema().ActOnGotoStmt(GotoLoc, LabelLoc, Label);
1367   }
1368 
1369   /// Build a new indirect goto statement.
1370   ///
1371   /// By default, performs semantic analysis to build the new statement.
1372   /// Subclasses may override this routine to provide different behavior.
1373   StmtResult RebuildIndirectGotoStmt(SourceLocation GotoLoc,
1374                                      SourceLocation StarLoc,
1375                                      Expr *Target) {
1376     return getSema().ActOnIndirectGotoStmt(GotoLoc, StarLoc, Target);
1377   }
1378 
1379   /// Build a new return statement.
1380   ///
1381   /// By default, performs semantic analysis to build the new statement.
1382   /// Subclasses may override this routine to provide different behavior.
1383   StmtResult RebuildReturnStmt(SourceLocation ReturnLoc, Expr *Result) {
1384     return getSema().BuildReturnStmt(ReturnLoc, Result);
1385   }
1386 
1387   /// Build a new declaration statement.
1388   ///
1389   /// By default, performs semantic analysis to build the new statement.
1390   /// Subclasses may override this routine to provide different behavior.
1391   StmtResult RebuildDeclStmt(MutableArrayRef<Decl *> Decls,
1392                              SourceLocation StartLoc, SourceLocation EndLoc) {
1393     Sema::DeclGroupPtrTy DG = getSema().BuildDeclaratorGroup(Decls);
1394     return getSema().ActOnDeclStmt(DG, StartLoc, EndLoc);
1395   }
1396 
1397   /// Build a new 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 RebuildGCCAsmStmt(SourceLocation AsmLoc, bool IsSimple,
1402                                bool IsVolatile, unsigned NumOutputs,
1403                                unsigned NumInputs, IdentifierInfo **Names,
1404                                MultiExprArg Constraints, MultiExprArg Exprs,
1405                                Expr *AsmString, MultiExprArg Clobbers,
1406                                unsigned NumLabels,
1407                                SourceLocation RParenLoc) {
1408     return getSema().ActOnGCCAsmStmt(AsmLoc, IsSimple, IsVolatile, NumOutputs,
1409                                      NumInputs, Names, Constraints, Exprs,
1410                                      AsmString, Clobbers, NumLabels, RParenLoc);
1411   }
1412 
1413   /// Build a new MS style inline asm statement.
1414   ///
1415   /// By default, performs semantic analysis to build the new statement.
1416   /// Subclasses may override this routine to provide different behavior.
1417   StmtResult RebuildMSAsmStmt(SourceLocation AsmLoc, SourceLocation LBraceLoc,
1418                               ArrayRef<Token> AsmToks,
1419                               StringRef AsmString,
1420                               unsigned NumOutputs, unsigned NumInputs,
1421                               ArrayRef<StringRef> Constraints,
1422                               ArrayRef<StringRef> Clobbers,
1423                               ArrayRef<Expr*> Exprs,
1424                               SourceLocation EndLoc) {
1425     return getSema().ActOnMSAsmStmt(AsmLoc, LBraceLoc, AsmToks, AsmString,
1426                                     NumOutputs, NumInputs,
1427                                     Constraints, Clobbers, Exprs, EndLoc);
1428   }
1429 
1430   /// Build a new co_return statement.
1431   ///
1432   /// By default, performs semantic analysis to build the new statement.
1433   /// Subclasses may override this routine to provide different behavior.
1434   StmtResult RebuildCoreturnStmt(SourceLocation CoreturnLoc, Expr *Result,
1435                                  bool IsImplicit) {
1436     return getSema().BuildCoreturnStmt(CoreturnLoc, Result, IsImplicit);
1437   }
1438 
1439   /// Build a new co_await expression.
1440   ///
1441   /// By default, performs semantic analysis to build the new expression.
1442   /// Subclasses may override this routine to provide different behavior.
1443   ExprResult RebuildCoawaitExpr(SourceLocation CoawaitLoc, Expr *Result,
1444                                 bool IsImplicit) {
1445     return getSema().BuildResolvedCoawaitExpr(CoawaitLoc, Result, IsImplicit);
1446   }
1447 
1448   /// Build a new co_await expression.
1449   ///
1450   /// By default, performs semantic analysis to build the new expression.
1451   /// Subclasses may override this routine to provide different behavior.
1452   ExprResult RebuildDependentCoawaitExpr(SourceLocation CoawaitLoc,
1453                                          Expr *Result,
1454                                          UnresolvedLookupExpr *Lookup) {
1455     return getSema().BuildUnresolvedCoawaitExpr(CoawaitLoc, Result, Lookup);
1456   }
1457 
1458   /// Build a new co_yield expression.
1459   ///
1460   /// By default, performs semantic analysis to build the new expression.
1461   /// Subclasses may override this routine to provide different behavior.
1462   ExprResult RebuildCoyieldExpr(SourceLocation CoyieldLoc, Expr *Result) {
1463     return getSema().BuildCoyieldExpr(CoyieldLoc, Result);
1464   }
1465 
1466   StmtResult RebuildCoroutineBodyStmt(CoroutineBodyStmt::CtorArgs Args) {
1467     return getSema().BuildCoroutineBodyStmt(Args);
1468   }
1469 
1470   /// Build a new Objective-C \@try statement.
1471   ///
1472   /// By default, performs semantic analysis to build the new statement.
1473   /// Subclasses may override this routine to provide different behavior.
1474   StmtResult RebuildObjCAtTryStmt(SourceLocation AtLoc,
1475                                         Stmt *TryBody,
1476                                         MultiStmtArg CatchStmts,
1477                                         Stmt *Finally) {
1478     return getSema().ActOnObjCAtTryStmt(AtLoc, TryBody, CatchStmts,
1479                                         Finally);
1480   }
1481 
1482   /// Rebuild an Objective-C exception declaration.
1483   ///
1484   /// By default, performs semantic analysis to build the new declaration.
1485   /// Subclasses may override this routine to provide different behavior.
1486   VarDecl *RebuildObjCExceptionDecl(VarDecl *ExceptionDecl,
1487                                     TypeSourceInfo *TInfo, QualType T) {
1488     return getSema().BuildObjCExceptionDecl(TInfo, T,
1489                                             ExceptionDecl->getInnerLocStart(),
1490                                             ExceptionDecl->getLocation(),
1491                                             ExceptionDecl->getIdentifier());
1492   }
1493 
1494   /// Build a new Objective-C \@catch statement.
1495   ///
1496   /// By default, performs semantic analysis to build the new statement.
1497   /// Subclasses may override this routine to provide different behavior.
1498   StmtResult RebuildObjCAtCatchStmt(SourceLocation AtLoc,
1499                                           SourceLocation RParenLoc,
1500                                           VarDecl *Var,
1501                                           Stmt *Body) {
1502     return getSema().ActOnObjCAtCatchStmt(AtLoc, RParenLoc,
1503                                           Var, Body);
1504   }
1505 
1506   /// Build a new Objective-C \@finally statement.
1507   ///
1508   /// By default, performs semantic analysis to build the new statement.
1509   /// Subclasses may override this routine to provide different behavior.
1510   StmtResult RebuildObjCAtFinallyStmt(SourceLocation AtLoc,
1511                                             Stmt *Body) {
1512     return getSema().ActOnObjCAtFinallyStmt(AtLoc, Body);
1513   }
1514 
1515   /// Build a new Objective-C \@throw statement.
1516   ///
1517   /// By default, performs semantic analysis to build the new statement.
1518   /// Subclasses may override this routine to provide different behavior.
1519   StmtResult RebuildObjCAtThrowStmt(SourceLocation AtLoc,
1520                                           Expr *Operand) {
1521     return getSema().BuildObjCAtThrowStmt(AtLoc, Operand);
1522   }
1523 
1524   /// Build a new OpenMP executable directive.
1525   ///
1526   /// By default, performs semantic analysis to build the new statement.
1527   /// Subclasses may override this routine to provide different behavior.
1528   StmtResult RebuildOMPExecutableDirective(OpenMPDirectiveKind Kind,
1529                                            DeclarationNameInfo DirName,
1530                                            OpenMPDirectiveKind CancelRegion,
1531                                            ArrayRef<OMPClause *> Clauses,
1532                                            Stmt *AStmt, SourceLocation StartLoc,
1533                                            SourceLocation EndLoc) {
1534     return getSema().ActOnOpenMPExecutableDirective(
1535         Kind, DirName, CancelRegion, Clauses, AStmt, StartLoc, EndLoc);
1536   }
1537 
1538   /// Build a new OpenMP 'if' clause.
1539   ///
1540   /// By default, performs semantic analysis to build the new OpenMP clause.
1541   /// Subclasses may override this routine to provide different behavior.
1542   OMPClause *RebuildOMPIfClause(OpenMPDirectiveKind NameModifier,
1543                                 Expr *Condition, SourceLocation StartLoc,
1544                                 SourceLocation LParenLoc,
1545                                 SourceLocation NameModifierLoc,
1546                                 SourceLocation ColonLoc,
1547                                 SourceLocation EndLoc) {
1548     return getSema().ActOnOpenMPIfClause(NameModifier, Condition, StartLoc,
1549                                          LParenLoc, NameModifierLoc, ColonLoc,
1550                                          EndLoc);
1551   }
1552 
1553   /// Build a new OpenMP 'final' clause.
1554   ///
1555   /// By default, performs semantic analysis to build the new OpenMP clause.
1556   /// Subclasses may override this routine to provide different behavior.
1557   OMPClause *RebuildOMPFinalClause(Expr *Condition, SourceLocation StartLoc,
1558                                    SourceLocation LParenLoc,
1559                                    SourceLocation EndLoc) {
1560     return getSema().ActOnOpenMPFinalClause(Condition, StartLoc, LParenLoc,
1561                                             EndLoc);
1562   }
1563 
1564   /// Build a new OpenMP 'num_threads' clause.
1565   ///
1566   /// By default, performs semantic analysis to build the new OpenMP clause.
1567   /// Subclasses may override this routine to provide different behavior.
1568   OMPClause *RebuildOMPNumThreadsClause(Expr *NumThreads,
1569                                         SourceLocation StartLoc,
1570                                         SourceLocation LParenLoc,
1571                                         SourceLocation EndLoc) {
1572     return getSema().ActOnOpenMPNumThreadsClause(NumThreads, StartLoc,
1573                                                  LParenLoc, EndLoc);
1574   }
1575 
1576   /// Build a new OpenMP 'safelen' clause.
1577   ///
1578   /// By default, performs semantic analysis to build the new OpenMP clause.
1579   /// Subclasses may override this routine to provide different behavior.
1580   OMPClause *RebuildOMPSafelenClause(Expr *Len, SourceLocation StartLoc,
1581                                      SourceLocation LParenLoc,
1582                                      SourceLocation EndLoc) {
1583     return getSema().ActOnOpenMPSafelenClause(Len, StartLoc, LParenLoc, EndLoc);
1584   }
1585 
1586   /// Build a new OpenMP 'simdlen' clause.
1587   ///
1588   /// By default, performs semantic analysis to build the new OpenMP clause.
1589   /// Subclasses may override this routine to provide different behavior.
1590   OMPClause *RebuildOMPSimdlenClause(Expr *Len, SourceLocation StartLoc,
1591                                      SourceLocation LParenLoc,
1592                                      SourceLocation EndLoc) {
1593     return getSema().ActOnOpenMPSimdlenClause(Len, StartLoc, LParenLoc, EndLoc);
1594   }
1595 
1596   /// Build a new OpenMP 'allocator' clause.
1597   ///
1598   /// By default, performs semantic analysis to build the new OpenMP clause.
1599   /// Subclasses may override this routine to provide different behavior.
1600   OMPClause *RebuildOMPAllocatorClause(Expr *A, SourceLocation StartLoc,
1601                                        SourceLocation LParenLoc,
1602                                        SourceLocation EndLoc) {
1603     return getSema().ActOnOpenMPAllocatorClause(A, StartLoc, LParenLoc, EndLoc);
1604   }
1605 
1606   /// Build a new OpenMP 'collapse' clause.
1607   ///
1608   /// By default, performs semantic analysis to build the new OpenMP clause.
1609   /// Subclasses may override this routine to provide different behavior.
1610   OMPClause *RebuildOMPCollapseClause(Expr *Num, SourceLocation StartLoc,
1611                                       SourceLocation LParenLoc,
1612                                       SourceLocation EndLoc) {
1613     return getSema().ActOnOpenMPCollapseClause(Num, StartLoc, LParenLoc,
1614                                                EndLoc);
1615   }
1616 
1617   /// Build a new OpenMP 'default' clause.
1618   ///
1619   /// By default, performs semantic analysis to build the new OpenMP clause.
1620   /// Subclasses may override this routine to provide different behavior.
1621   OMPClause *RebuildOMPDefaultClause(DefaultKind Kind, SourceLocation KindKwLoc,
1622                                      SourceLocation StartLoc,
1623                                      SourceLocation LParenLoc,
1624                                      SourceLocation EndLoc) {
1625     return getSema().ActOnOpenMPDefaultClause(Kind, KindKwLoc,
1626                                               StartLoc, LParenLoc, EndLoc);
1627   }
1628 
1629   /// Build a new OpenMP 'proc_bind' clause.
1630   ///
1631   /// By default, performs semantic analysis to build the new OpenMP clause.
1632   /// Subclasses may override this routine to provide different behavior.
1633   OMPClause *RebuildOMPProcBindClause(ProcBindKind Kind,
1634                                       SourceLocation KindKwLoc,
1635                                       SourceLocation StartLoc,
1636                                       SourceLocation LParenLoc,
1637                                       SourceLocation EndLoc) {
1638     return getSema().ActOnOpenMPProcBindClause(Kind, KindKwLoc,
1639                                                StartLoc, LParenLoc, EndLoc);
1640   }
1641 
1642   /// Build a new OpenMP 'schedule' clause.
1643   ///
1644   /// By default, performs semantic analysis to build the new OpenMP clause.
1645   /// Subclasses may override this routine to provide different behavior.
1646   OMPClause *RebuildOMPScheduleClause(
1647       OpenMPScheduleClauseModifier M1, OpenMPScheduleClauseModifier M2,
1648       OpenMPScheduleClauseKind Kind, Expr *ChunkSize, SourceLocation StartLoc,
1649       SourceLocation LParenLoc, SourceLocation M1Loc, SourceLocation M2Loc,
1650       SourceLocation KindLoc, SourceLocation CommaLoc, SourceLocation EndLoc) {
1651     return getSema().ActOnOpenMPScheduleClause(
1652         M1, M2, Kind, ChunkSize, StartLoc, LParenLoc, M1Loc, M2Loc, KindLoc,
1653         CommaLoc, EndLoc);
1654   }
1655 
1656   /// Build a new OpenMP 'ordered' clause.
1657   ///
1658   /// By default, performs semantic analysis to build the new OpenMP clause.
1659   /// Subclasses may override this routine to provide different behavior.
1660   OMPClause *RebuildOMPOrderedClause(SourceLocation StartLoc,
1661                                      SourceLocation EndLoc,
1662                                      SourceLocation LParenLoc, Expr *Num) {
1663     return getSema().ActOnOpenMPOrderedClause(StartLoc, EndLoc, LParenLoc, Num);
1664   }
1665 
1666   /// Build a new OpenMP 'private' clause.
1667   ///
1668   /// By default, performs semantic analysis to build the new OpenMP clause.
1669   /// Subclasses may override this routine to provide different behavior.
1670   OMPClause *RebuildOMPPrivateClause(ArrayRef<Expr *> VarList,
1671                                      SourceLocation StartLoc,
1672                                      SourceLocation LParenLoc,
1673                                      SourceLocation EndLoc) {
1674     return getSema().ActOnOpenMPPrivateClause(VarList, StartLoc, LParenLoc,
1675                                               EndLoc);
1676   }
1677 
1678   /// Build a new OpenMP 'firstprivate' clause.
1679   ///
1680   /// By default, performs semantic analysis to build the new OpenMP clause.
1681   /// Subclasses may override this routine to provide different behavior.
1682   OMPClause *RebuildOMPFirstprivateClause(ArrayRef<Expr *> VarList,
1683                                           SourceLocation StartLoc,
1684                                           SourceLocation LParenLoc,
1685                                           SourceLocation EndLoc) {
1686     return getSema().ActOnOpenMPFirstprivateClause(VarList, StartLoc, LParenLoc,
1687                                                    EndLoc);
1688   }
1689 
1690   /// Build a new OpenMP 'lastprivate' 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 *RebuildOMPLastprivateClause(ArrayRef<Expr *> VarList,
1695                                          OpenMPLastprivateModifier LPKind,
1696                                          SourceLocation LPKindLoc,
1697                                          SourceLocation ColonLoc,
1698                                          SourceLocation StartLoc,
1699                                          SourceLocation LParenLoc,
1700                                          SourceLocation EndLoc) {
1701     return getSema().ActOnOpenMPLastprivateClause(
1702         VarList, LPKind, LPKindLoc, ColonLoc, StartLoc, LParenLoc, EndLoc);
1703   }
1704 
1705   /// Build a new OpenMP 'shared' clause.
1706   ///
1707   /// By default, performs semantic analysis to build the new OpenMP clause.
1708   /// Subclasses may override this routine to provide different behavior.
1709   OMPClause *RebuildOMPSharedClause(ArrayRef<Expr *> VarList,
1710                                     SourceLocation StartLoc,
1711                                     SourceLocation LParenLoc,
1712                                     SourceLocation EndLoc) {
1713     return getSema().ActOnOpenMPSharedClause(VarList, StartLoc, LParenLoc,
1714                                              EndLoc);
1715   }
1716 
1717   /// Build a new OpenMP 'reduction' clause.
1718   ///
1719   /// By default, performs semantic analysis to build the new statement.
1720   /// Subclasses may override this routine to provide different behavior.
1721   OMPClause *RebuildOMPReductionClause(
1722       ArrayRef<Expr *> VarList, OpenMPReductionClauseModifier Modifier,
1723       SourceLocation StartLoc, SourceLocation LParenLoc,
1724       SourceLocation ModifierLoc, SourceLocation ColonLoc,
1725       SourceLocation EndLoc, CXXScopeSpec &ReductionIdScopeSpec,
1726       const DeclarationNameInfo &ReductionId,
1727       ArrayRef<Expr *> UnresolvedReductions) {
1728     return getSema().ActOnOpenMPReductionClause(
1729         VarList, Modifier, StartLoc, LParenLoc, ModifierLoc, ColonLoc, EndLoc,
1730         ReductionIdScopeSpec, ReductionId, UnresolvedReductions);
1731   }
1732 
1733   /// Build a new OpenMP 'task_reduction' clause.
1734   ///
1735   /// By default, performs semantic analysis to build the new statement.
1736   /// Subclasses may override this routine to provide different behavior.
1737   OMPClause *RebuildOMPTaskReductionClause(
1738       ArrayRef<Expr *> VarList, SourceLocation StartLoc,
1739       SourceLocation LParenLoc, SourceLocation ColonLoc, SourceLocation EndLoc,
1740       CXXScopeSpec &ReductionIdScopeSpec,
1741       const DeclarationNameInfo &ReductionId,
1742       ArrayRef<Expr *> UnresolvedReductions) {
1743     return getSema().ActOnOpenMPTaskReductionClause(
1744         VarList, StartLoc, LParenLoc, ColonLoc, EndLoc, ReductionIdScopeSpec,
1745         ReductionId, UnresolvedReductions);
1746   }
1747 
1748   /// Build a new OpenMP 'in_reduction' clause.
1749   ///
1750   /// By default, performs semantic analysis to build the new statement.
1751   /// Subclasses may override this routine to provide different behavior.
1752   OMPClause *
1753   RebuildOMPInReductionClause(ArrayRef<Expr *> VarList, SourceLocation StartLoc,
1754                               SourceLocation LParenLoc, SourceLocation ColonLoc,
1755                               SourceLocation EndLoc,
1756                               CXXScopeSpec &ReductionIdScopeSpec,
1757                               const DeclarationNameInfo &ReductionId,
1758                               ArrayRef<Expr *> UnresolvedReductions) {
1759     return getSema().ActOnOpenMPInReductionClause(
1760         VarList, StartLoc, LParenLoc, ColonLoc, EndLoc, ReductionIdScopeSpec,
1761         ReductionId, UnresolvedReductions);
1762   }
1763 
1764   /// Build a new OpenMP 'linear' clause.
1765   ///
1766   /// By default, performs semantic analysis to build the new OpenMP clause.
1767   /// Subclasses may override this routine to provide different behavior.
1768   OMPClause *RebuildOMPLinearClause(ArrayRef<Expr *> VarList, Expr *Step,
1769                                     SourceLocation StartLoc,
1770                                     SourceLocation LParenLoc,
1771                                     OpenMPLinearClauseKind Modifier,
1772                                     SourceLocation ModifierLoc,
1773                                     SourceLocation ColonLoc,
1774                                     SourceLocation EndLoc) {
1775     return getSema().ActOnOpenMPLinearClause(VarList, Step, StartLoc, LParenLoc,
1776                                              Modifier, ModifierLoc, ColonLoc,
1777                                              EndLoc);
1778   }
1779 
1780   /// Build a new OpenMP 'aligned' clause.
1781   ///
1782   /// By default, performs semantic analysis to build the new OpenMP clause.
1783   /// Subclasses may override this routine to provide different behavior.
1784   OMPClause *RebuildOMPAlignedClause(ArrayRef<Expr *> VarList, Expr *Alignment,
1785                                      SourceLocation StartLoc,
1786                                      SourceLocation LParenLoc,
1787                                      SourceLocation ColonLoc,
1788                                      SourceLocation EndLoc) {
1789     return getSema().ActOnOpenMPAlignedClause(VarList, Alignment, StartLoc,
1790                                               LParenLoc, ColonLoc, EndLoc);
1791   }
1792 
1793   /// Build a new OpenMP 'copyin' clause.
1794   ///
1795   /// By default, performs semantic analysis to build the new OpenMP clause.
1796   /// Subclasses may override this routine to provide different behavior.
1797   OMPClause *RebuildOMPCopyinClause(ArrayRef<Expr *> VarList,
1798                                     SourceLocation StartLoc,
1799                                     SourceLocation LParenLoc,
1800                                     SourceLocation EndLoc) {
1801     return getSema().ActOnOpenMPCopyinClause(VarList, StartLoc, LParenLoc,
1802                                              EndLoc);
1803   }
1804 
1805   /// Build a new OpenMP 'copyprivate' clause.
1806   ///
1807   /// By default, performs semantic analysis to build the new OpenMP clause.
1808   /// Subclasses may override this routine to provide different behavior.
1809   OMPClause *RebuildOMPCopyprivateClause(ArrayRef<Expr *> VarList,
1810                                          SourceLocation StartLoc,
1811                                          SourceLocation LParenLoc,
1812                                          SourceLocation EndLoc) {
1813     return getSema().ActOnOpenMPCopyprivateClause(VarList, StartLoc, LParenLoc,
1814                                                   EndLoc);
1815   }
1816 
1817   /// Build a new OpenMP 'flush' pseudo clause.
1818   ///
1819   /// By default, performs semantic analysis to build the new OpenMP clause.
1820   /// Subclasses may override this routine to provide different behavior.
1821   OMPClause *RebuildOMPFlushClause(ArrayRef<Expr *> VarList,
1822                                    SourceLocation StartLoc,
1823                                    SourceLocation LParenLoc,
1824                                    SourceLocation EndLoc) {
1825     return getSema().ActOnOpenMPFlushClause(VarList, StartLoc, LParenLoc,
1826                                             EndLoc);
1827   }
1828 
1829   /// Build a new OpenMP 'depobj' pseudo clause.
1830   ///
1831   /// By default, performs semantic analysis to build the new OpenMP clause.
1832   /// Subclasses may override this routine to provide different behavior.
1833   OMPClause *RebuildOMPDepobjClause(Expr *Depobj, SourceLocation StartLoc,
1834                                     SourceLocation LParenLoc,
1835                                     SourceLocation EndLoc) {
1836     return getSema().ActOnOpenMPDepobjClause(Depobj, StartLoc, LParenLoc,
1837                                              EndLoc);
1838   }
1839 
1840   /// Build a new OpenMP 'depend' pseudo clause.
1841   ///
1842   /// By default, performs semantic analysis to build the new OpenMP clause.
1843   /// Subclasses may override this routine to provide different behavior.
1844   OMPClause *
1845   RebuildOMPDependClause(Expr *DepModifier, OpenMPDependClauseKind DepKind,
1846                          SourceLocation DepLoc, SourceLocation ColonLoc,
1847                          ArrayRef<Expr *> VarList, SourceLocation StartLoc,
1848                          SourceLocation LParenLoc, SourceLocation EndLoc) {
1849     return getSema().ActOnOpenMPDependClause(DepModifier, DepKind, DepLoc,
1850                                              ColonLoc, VarList, StartLoc,
1851                                              LParenLoc, EndLoc);
1852   }
1853 
1854   /// Build a new OpenMP 'device' clause.
1855   ///
1856   /// By default, performs semantic analysis to build the new statement.
1857   /// Subclasses may override this routine to provide different behavior.
1858   OMPClause *RebuildOMPDeviceClause(OpenMPDeviceClauseModifier Modifier,
1859                                     Expr *Device, SourceLocation StartLoc,
1860                                     SourceLocation LParenLoc,
1861                                     SourceLocation ModifierLoc,
1862                                     SourceLocation EndLoc) {
1863     return getSema().ActOnOpenMPDeviceClause(Modifier, Device, StartLoc,
1864                                              LParenLoc, ModifierLoc, EndLoc);
1865   }
1866 
1867   /// Build a new OpenMP 'map' clause.
1868   ///
1869   /// By default, performs semantic analysis to build the new OpenMP clause.
1870   /// Subclasses may override this routine to provide different behavior.
1871   OMPClause *RebuildOMPMapClause(
1872       ArrayRef<OpenMPMapModifierKind> MapTypeModifiers,
1873       ArrayRef<SourceLocation> MapTypeModifiersLoc,
1874       CXXScopeSpec MapperIdScopeSpec, DeclarationNameInfo MapperId,
1875       OpenMPMapClauseKind MapType, bool IsMapTypeImplicit,
1876       SourceLocation MapLoc, SourceLocation ColonLoc, ArrayRef<Expr *> VarList,
1877       const OMPVarListLocTy &Locs, ArrayRef<Expr *> UnresolvedMappers) {
1878     return getSema().ActOnOpenMPMapClause(MapTypeModifiers, MapTypeModifiersLoc,
1879                                           MapperIdScopeSpec, MapperId, MapType,
1880                                           IsMapTypeImplicit, MapLoc, ColonLoc,
1881                                           VarList, Locs, UnresolvedMappers);
1882   }
1883 
1884   /// Build a new OpenMP 'allocate' clause.
1885   ///
1886   /// By default, performs semantic analysis to build the new OpenMP clause.
1887   /// Subclasses may override this routine to provide different behavior.
1888   OMPClause *RebuildOMPAllocateClause(Expr *Allocate, ArrayRef<Expr *> VarList,
1889                                       SourceLocation StartLoc,
1890                                       SourceLocation LParenLoc,
1891                                       SourceLocation ColonLoc,
1892                                       SourceLocation EndLoc) {
1893     return getSema().ActOnOpenMPAllocateClause(Allocate, VarList, StartLoc,
1894                                                LParenLoc, ColonLoc, EndLoc);
1895   }
1896 
1897   /// Build a new OpenMP 'num_teams' clause.
1898   ///
1899   /// By default, performs semantic analysis to build the new statement.
1900   /// Subclasses may override this routine to provide different behavior.
1901   OMPClause *RebuildOMPNumTeamsClause(Expr *NumTeams, SourceLocation StartLoc,
1902                                       SourceLocation LParenLoc,
1903                                       SourceLocation EndLoc) {
1904     return getSema().ActOnOpenMPNumTeamsClause(NumTeams, StartLoc, LParenLoc,
1905                                                EndLoc);
1906   }
1907 
1908   /// Build a new OpenMP 'thread_limit' clause.
1909   ///
1910   /// By default, performs semantic analysis to build the new statement.
1911   /// Subclasses may override this routine to provide different behavior.
1912   OMPClause *RebuildOMPThreadLimitClause(Expr *ThreadLimit,
1913                                          SourceLocation StartLoc,
1914                                          SourceLocation LParenLoc,
1915                                          SourceLocation EndLoc) {
1916     return getSema().ActOnOpenMPThreadLimitClause(ThreadLimit, StartLoc,
1917                                                   LParenLoc, EndLoc);
1918   }
1919 
1920   /// Build a new OpenMP 'priority' clause.
1921   ///
1922   /// By default, performs semantic analysis to build the new statement.
1923   /// Subclasses may override this routine to provide different behavior.
1924   OMPClause *RebuildOMPPriorityClause(Expr *Priority, SourceLocation StartLoc,
1925                                       SourceLocation LParenLoc,
1926                                       SourceLocation EndLoc) {
1927     return getSema().ActOnOpenMPPriorityClause(Priority, StartLoc, LParenLoc,
1928                                                EndLoc);
1929   }
1930 
1931   /// Build a new OpenMP 'grainsize' clause.
1932   ///
1933   /// By default, performs semantic analysis to build the new statement.
1934   /// Subclasses may override this routine to provide different behavior.
1935   OMPClause *RebuildOMPGrainsizeClause(Expr *Grainsize, SourceLocation StartLoc,
1936                                        SourceLocation LParenLoc,
1937                                        SourceLocation EndLoc) {
1938     return getSema().ActOnOpenMPGrainsizeClause(Grainsize, StartLoc, LParenLoc,
1939                                                 EndLoc);
1940   }
1941 
1942   /// Build a new OpenMP 'num_tasks' clause.
1943   ///
1944   /// By default, performs semantic analysis to build the new statement.
1945   /// Subclasses may override this routine to provide different behavior.
1946   OMPClause *RebuildOMPNumTasksClause(Expr *NumTasks, SourceLocation StartLoc,
1947                                       SourceLocation LParenLoc,
1948                                       SourceLocation EndLoc) {
1949     return getSema().ActOnOpenMPNumTasksClause(NumTasks, StartLoc, LParenLoc,
1950                                                EndLoc);
1951   }
1952 
1953   /// Build a new OpenMP 'hint' clause.
1954   ///
1955   /// By default, performs semantic analysis to build the new statement.
1956   /// Subclasses may override this routine to provide different behavior.
1957   OMPClause *RebuildOMPHintClause(Expr *Hint, SourceLocation StartLoc,
1958                                   SourceLocation LParenLoc,
1959                                   SourceLocation EndLoc) {
1960     return getSema().ActOnOpenMPHintClause(Hint, StartLoc, LParenLoc, EndLoc);
1961   }
1962 
1963   /// Build a new OpenMP 'detach' clause.
1964   ///
1965   /// By default, performs semantic analysis to build the new statement.
1966   /// Subclasses may override this routine to provide different behavior.
1967   OMPClause *RebuildOMPDetachClause(Expr *Evt, SourceLocation StartLoc,
1968                                     SourceLocation LParenLoc,
1969                                     SourceLocation EndLoc) {
1970     return getSema().ActOnOpenMPDetachClause(Evt, StartLoc, LParenLoc, EndLoc);
1971   }
1972 
1973   /// Build a new OpenMP 'dist_schedule' clause.
1974   ///
1975   /// By default, performs semantic analysis to build the new OpenMP clause.
1976   /// Subclasses may override this routine to provide different behavior.
1977   OMPClause *
1978   RebuildOMPDistScheduleClause(OpenMPDistScheduleClauseKind Kind,
1979                                Expr *ChunkSize, SourceLocation StartLoc,
1980                                SourceLocation LParenLoc, SourceLocation KindLoc,
1981                                SourceLocation CommaLoc, SourceLocation EndLoc) {
1982     return getSema().ActOnOpenMPDistScheduleClause(
1983         Kind, ChunkSize, StartLoc, LParenLoc, KindLoc, CommaLoc, EndLoc);
1984   }
1985 
1986   /// Build a new OpenMP 'to' clause.
1987   ///
1988   /// By default, performs semantic analysis to build the new statement.
1989   /// Subclasses may override this routine to provide different behavior.
1990   OMPClause *RebuildOMPToClause(ArrayRef<Expr *> VarList,
1991                                 CXXScopeSpec &MapperIdScopeSpec,
1992                                 DeclarationNameInfo &MapperId,
1993                                 const OMPVarListLocTy &Locs,
1994                                 ArrayRef<Expr *> UnresolvedMappers) {
1995     return getSema().ActOnOpenMPToClause(VarList, MapperIdScopeSpec, MapperId,
1996                                          Locs, UnresolvedMappers);
1997   }
1998 
1999   /// Build a new OpenMP 'from' clause.
2000   ///
2001   /// By default, performs semantic analysis to build the new statement.
2002   /// Subclasses may override this routine to provide different behavior.
2003   OMPClause *RebuildOMPFromClause(ArrayRef<Expr *> VarList,
2004                                   CXXScopeSpec &MapperIdScopeSpec,
2005                                   DeclarationNameInfo &MapperId,
2006                                   const OMPVarListLocTy &Locs,
2007                                   ArrayRef<Expr *> UnresolvedMappers) {
2008     return getSema().ActOnOpenMPFromClause(VarList, MapperIdScopeSpec, MapperId,
2009                                            Locs, UnresolvedMappers);
2010   }
2011 
2012   /// Build a new OpenMP 'use_device_ptr' clause.
2013   ///
2014   /// By default, performs semantic analysis to build the new OpenMP clause.
2015   /// Subclasses may override this routine to provide different behavior.
2016   OMPClause *RebuildOMPUseDevicePtrClause(ArrayRef<Expr *> VarList,
2017                                           const OMPVarListLocTy &Locs) {
2018     return getSema().ActOnOpenMPUseDevicePtrClause(VarList, Locs);
2019   }
2020 
2021   /// Build a new OpenMP 'is_device_ptr' clause.
2022   ///
2023   /// By default, performs semantic analysis to build the new OpenMP clause.
2024   /// Subclasses may override this routine to provide different behavior.
2025   OMPClause *RebuildOMPIsDevicePtrClause(ArrayRef<Expr *> VarList,
2026                                          const OMPVarListLocTy &Locs) {
2027     return getSema().ActOnOpenMPIsDevicePtrClause(VarList, Locs);
2028   }
2029 
2030   /// Build a new OpenMP 'defaultmap' clause.
2031   ///
2032   /// By default, performs semantic analysis to build the new OpenMP clause.
2033   /// Subclasses may override this routine to provide different behavior.
2034   OMPClause *RebuildOMPDefaultmapClause(OpenMPDefaultmapClauseModifier M,
2035                                         OpenMPDefaultmapClauseKind Kind,
2036                                         SourceLocation StartLoc,
2037                                         SourceLocation LParenLoc,
2038                                         SourceLocation MLoc,
2039                                         SourceLocation KindLoc,
2040                                         SourceLocation EndLoc) {
2041     return getSema().ActOnOpenMPDefaultmapClause(M, Kind, StartLoc, LParenLoc,
2042                                                  MLoc, KindLoc, EndLoc);
2043   }
2044 
2045   /// Build a new OpenMP 'nontemporal' clause.
2046   ///
2047   /// By default, performs semantic analysis to build the new OpenMP clause.
2048   /// Subclasses may override this routine to provide different behavior.
2049   OMPClause *RebuildOMPNontemporalClause(ArrayRef<Expr *> VarList,
2050                                          SourceLocation StartLoc,
2051                                          SourceLocation LParenLoc,
2052                                          SourceLocation EndLoc) {
2053     return getSema().ActOnOpenMPNontemporalClause(VarList, StartLoc, LParenLoc,
2054                                                   EndLoc);
2055   }
2056 
2057   /// Build a new OpenMP 'inclusive' clause.
2058   ///
2059   /// By default, performs semantic analysis to build the new OpenMP clause.
2060   /// Subclasses may override this routine to provide different behavior.
2061   OMPClause *RebuildOMPInclusiveClause(ArrayRef<Expr *> VarList,
2062                                        SourceLocation StartLoc,
2063                                        SourceLocation LParenLoc,
2064                                        SourceLocation EndLoc) {
2065     return getSema().ActOnOpenMPInclusiveClause(VarList, StartLoc, LParenLoc,
2066                                                 EndLoc);
2067   }
2068 
2069   /// Build a new OpenMP 'exclusive' clause.
2070   ///
2071   /// By default, performs semantic analysis to build the new OpenMP clause.
2072   /// Subclasses may override this routine to provide different behavior.
2073   OMPClause *RebuildOMPExclusiveClause(ArrayRef<Expr *> VarList,
2074                                        SourceLocation StartLoc,
2075                                        SourceLocation LParenLoc,
2076                                        SourceLocation EndLoc) {
2077     return getSema().ActOnOpenMPExclusiveClause(VarList, StartLoc, LParenLoc,
2078                                                 EndLoc);
2079   }
2080 
2081   /// Build a new OpenMP 'order' clause.
2082   ///
2083   /// By default, performs semantic analysis to build the new OpenMP clause.
2084   /// Subclasses may override this routine to provide different behavior.
2085   OMPClause *RebuildOMPOrderClause(OpenMPOrderClauseKind Kind,
2086                                    SourceLocation KindKwLoc,
2087                                    SourceLocation StartLoc,
2088                                    SourceLocation LParenLoc,
2089                                    SourceLocation EndLoc) {
2090     return getSema().ActOnOpenMPOrderClause(Kind, KindKwLoc, StartLoc,
2091                                             LParenLoc, EndLoc);
2092   }
2093 
2094   /// Rebuild the operand to an Objective-C \@synchronized statement.
2095   ///
2096   /// By default, performs semantic analysis to build the new statement.
2097   /// Subclasses may override this routine to provide different behavior.
2098   ExprResult RebuildObjCAtSynchronizedOperand(SourceLocation atLoc,
2099                                               Expr *object) {
2100     return getSema().ActOnObjCAtSynchronizedOperand(atLoc, object);
2101   }
2102 
2103   /// Build a new Objective-C \@synchronized statement.
2104   ///
2105   /// By default, performs semantic analysis to build the new statement.
2106   /// Subclasses may override this routine to provide different behavior.
2107   StmtResult RebuildObjCAtSynchronizedStmt(SourceLocation AtLoc,
2108                                            Expr *Object, Stmt *Body) {
2109     return getSema().ActOnObjCAtSynchronizedStmt(AtLoc, Object, Body);
2110   }
2111 
2112   /// Build a new Objective-C \@autoreleasepool statement.
2113   ///
2114   /// By default, performs semantic analysis to build the new statement.
2115   /// Subclasses may override this routine to provide different behavior.
2116   StmtResult RebuildObjCAutoreleasePoolStmt(SourceLocation AtLoc,
2117                                             Stmt *Body) {
2118     return getSema().ActOnObjCAutoreleasePoolStmt(AtLoc, Body);
2119   }
2120 
2121   /// Build a new Objective-C fast enumeration statement.
2122   ///
2123   /// By default, performs semantic analysis to build the new statement.
2124   /// Subclasses may override this routine to provide different behavior.
2125   StmtResult RebuildObjCForCollectionStmt(SourceLocation ForLoc,
2126                                           Stmt *Element,
2127                                           Expr *Collection,
2128                                           SourceLocation RParenLoc,
2129                                           Stmt *Body) {
2130     StmtResult ForEachStmt = getSema().ActOnObjCForCollectionStmt(ForLoc,
2131                                                 Element,
2132                                                 Collection,
2133                                                 RParenLoc);
2134     if (ForEachStmt.isInvalid())
2135       return StmtError();
2136 
2137     return getSema().FinishObjCForCollectionStmt(ForEachStmt.get(), Body);
2138   }
2139 
2140   /// Build a new C++ exception declaration.
2141   ///
2142   /// By default, performs semantic analysis to build the new decaration.
2143   /// Subclasses may override this routine to provide different behavior.
2144   VarDecl *RebuildExceptionDecl(VarDecl *ExceptionDecl,
2145                                 TypeSourceInfo *Declarator,
2146                                 SourceLocation StartLoc,
2147                                 SourceLocation IdLoc,
2148                                 IdentifierInfo *Id) {
2149     VarDecl *Var = getSema().BuildExceptionDeclaration(nullptr, Declarator,
2150                                                        StartLoc, IdLoc, Id);
2151     if (Var)
2152       getSema().CurContext->addDecl(Var);
2153     return Var;
2154   }
2155 
2156   /// Build a new C++ catch statement.
2157   ///
2158   /// By default, performs semantic analysis to build the new statement.
2159   /// Subclasses may override this routine to provide different behavior.
2160   StmtResult RebuildCXXCatchStmt(SourceLocation CatchLoc,
2161                                  VarDecl *ExceptionDecl,
2162                                  Stmt *Handler) {
2163     return Owned(new (getSema().Context) CXXCatchStmt(CatchLoc, ExceptionDecl,
2164                                                       Handler));
2165   }
2166 
2167   /// Build a new C++ try statement.
2168   ///
2169   /// By default, performs semantic analysis to build the new statement.
2170   /// Subclasses may override this routine to provide different behavior.
2171   StmtResult RebuildCXXTryStmt(SourceLocation TryLoc, Stmt *TryBlock,
2172                                ArrayRef<Stmt *> Handlers) {
2173     return getSema().ActOnCXXTryBlock(TryLoc, TryBlock, Handlers);
2174   }
2175 
2176   /// Build a new C++0x range-based for statement.
2177   ///
2178   /// By default, performs semantic analysis to build the new statement.
2179   /// Subclasses may override this routine to provide different behavior.
2180   StmtResult RebuildCXXForRangeStmt(SourceLocation ForLoc,
2181                                     SourceLocation CoawaitLoc, Stmt *Init,
2182                                     SourceLocation ColonLoc, Stmt *Range,
2183                                     Stmt *Begin, Stmt *End, Expr *Cond,
2184                                     Expr *Inc, Stmt *LoopVar,
2185                                     SourceLocation RParenLoc) {
2186     // If we've just learned that the range is actually an Objective-C
2187     // collection, treat this as an Objective-C fast enumeration loop.
2188     if (DeclStmt *RangeStmt = dyn_cast<DeclStmt>(Range)) {
2189       if (RangeStmt->isSingleDecl()) {
2190         if (VarDecl *RangeVar = dyn_cast<VarDecl>(RangeStmt->getSingleDecl())) {
2191           if (RangeVar->isInvalidDecl())
2192             return StmtError();
2193 
2194           Expr *RangeExpr = RangeVar->getInit();
2195           if (!RangeExpr->isTypeDependent() &&
2196               RangeExpr->getType()->isObjCObjectPointerType()) {
2197             // FIXME: Support init-statements in Objective-C++20 ranged for
2198             // statement.
2199             if (Init) {
2200               return SemaRef.Diag(Init->getBeginLoc(),
2201                                   diag::err_objc_for_range_init_stmt)
2202                          << Init->getSourceRange();
2203             }
2204             return getSema().ActOnObjCForCollectionStmt(ForLoc, LoopVar,
2205                                                         RangeExpr, RParenLoc);
2206           }
2207         }
2208       }
2209     }
2210 
2211     return getSema().BuildCXXForRangeStmt(ForLoc, CoawaitLoc, Init, ColonLoc,
2212                                           Range, Begin, End, Cond, Inc, LoopVar,
2213                                           RParenLoc, Sema::BFRK_Rebuild);
2214   }
2215 
2216   /// Build a new C++0x range-based for statement.
2217   ///
2218   /// By default, performs semantic analysis to build the new statement.
2219   /// Subclasses may override this routine to provide different behavior.
2220   StmtResult RebuildMSDependentExistsStmt(SourceLocation KeywordLoc,
2221                                           bool IsIfExists,
2222                                           NestedNameSpecifierLoc QualifierLoc,
2223                                           DeclarationNameInfo NameInfo,
2224                                           Stmt *Nested) {
2225     return getSema().BuildMSDependentExistsStmt(KeywordLoc, IsIfExists,
2226                                                 QualifierLoc, NameInfo, Nested);
2227   }
2228 
2229   /// Attach body to a C++0x range-based for statement.
2230   ///
2231   /// By default, performs semantic analysis to finish the new statement.
2232   /// Subclasses may override this routine to provide different behavior.
2233   StmtResult FinishCXXForRangeStmt(Stmt *ForRange, Stmt *Body) {
2234     return getSema().FinishCXXForRangeStmt(ForRange, Body);
2235   }
2236 
2237   StmtResult RebuildSEHTryStmt(bool IsCXXTry, SourceLocation TryLoc,
2238                                Stmt *TryBlock, Stmt *Handler) {
2239     return getSema().ActOnSEHTryBlock(IsCXXTry, TryLoc, TryBlock, Handler);
2240   }
2241 
2242   StmtResult RebuildSEHExceptStmt(SourceLocation Loc, Expr *FilterExpr,
2243                                   Stmt *Block) {
2244     return getSema().ActOnSEHExceptBlock(Loc, FilterExpr, Block);
2245   }
2246 
2247   StmtResult RebuildSEHFinallyStmt(SourceLocation Loc, Stmt *Block) {
2248     return SEHFinallyStmt::Create(getSema().getASTContext(), Loc, Block);
2249   }
2250 
2251   /// Build a new predefined expression.
2252   ///
2253   /// By default, performs semantic analysis to build the new expression.
2254   /// Subclasses may override this routine to provide different behavior.
2255   ExprResult RebuildPredefinedExpr(SourceLocation Loc,
2256                                    PredefinedExpr::IdentKind IK) {
2257     return getSema().BuildPredefinedExpr(Loc, IK);
2258   }
2259 
2260   /// Build a new expression that references a declaration.
2261   ///
2262   /// By default, performs semantic analysis to build the new expression.
2263   /// Subclasses may override this routine to provide different behavior.
2264   ExprResult RebuildDeclarationNameExpr(const CXXScopeSpec &SS,
2265                                         LookupResult &R,
2266                                         bool RequiresADL) {
2267     return getSema().BuildDeclarationNameExpr(SS, R, RequiresADL);
2268   }
2269 
2270 
2271   /// Build a new expression that references a declaration.
2272   ///
2273   /// By default, performs semantic analysis to build the new expression.
2274   /// Subclasses may override this routine to provide different behavior.
2275   ExprResult RebuildDeclRefExpr(NestedNameSpecifierLoc QualifierLoc,
2276                                 ValueDecl *VD,
2277                                 const DeclarationNameInfo &NameInfo,
2278                                 NamedDecl *Found,
2279                                 TemplateArgumentListInfo *TemplateArgs) {
2280     CXXScopeSpec SS;
2281     SS.Adopt(QualifierLoc);
2282     return getSema().BuildDeclarationNameExpr(SS, NameInfo, VD, Found,
2283                                               TemplateArgs);
2284   }
2285 
2286   /// Build a new expression in parentheses.
2287   ///
2288   /// By default, performs semantic analysis to build the new expression.
2289   /// Subclasses may override this routine to provide different behavior.
2290   ExprResult RebuildParenExpr(Expr *SubExpr, SourceLocation LParen,
2291                                     SourceLocation RParen) {
2292     return getSema().ActOnParenExpr(LParen, RParen, SubExpr);
2293   }
2294 
2295   /// Build a new pseudo-destructor expression.
2296   ///
2297   /// By default, performs semantic analysis to build the new expression.
2298   /// Subclasses may override this routine to provide different behavior.
2299   ExprResult RebuildCXXPseudoDestructorExpr(Expr *Base,
2300                                             SourceLocation OperatorLoc,
2301                                             bool isArrow,
2302                                             CXXScopeSpec &SS,
2303                                             TypeSourceInfo *ScopeType,
2304                                             SourceLocation CCLoc,
2305                                             SourceLocation TildeLoc,
2306                                         PseudoDestructorTypeStorage Destroyed);
2307 
2308   /// Build a new unary operator expression.
2309   ///
2310   /// By default, performs semantic analysis to build the new expression.
2311   /// Subclasses may override this routine to provide different behavior.
2312   ExprResult RebuildUnaryOperator(SourceLocation OpLoc,
2313                                         UnaryOperatorKind Opc,
2314                                         Expr *SubExpr) {
2315     return getSema().BuildUnaryOp(/*Scope=*/nullptr, OpLoc, Opc, SubExpr);
2316   }
2317 
2318   /// Build a new builtin offsetof expression.
2319   ///
2320   /// By default, performs semantic analysis to build the new expression.
2321   /// Subclasses may override this routine to provide different behavior.
2322   ExprResult RebuildOffsetOfExpr(SourceLocation OperatorLoc,
2323                                  TypeSourceInfo *Type,
2324                                  ArrayRef<Sema::OffsetOfComponent> Components,
2325                                  SourceLocation RParenLoc) {
2326     return getSema().BuildBuiltinOffsetOf(OperatorLoc, Type, Components,
2327                                           RParenLoc);
2328   }
2329 
2330   /// Build a new sizeof, alignof or vec_step expression with a
2331   /// type argument.
2332   ///
2333   /// By default, performs semantic analysis to build the new expression.
2334   /// Subclasses may override this routine to provide different behavior.
2335   ExprResult RebuildUnaryExprOrTypeTrait(TypeSourceInfo *TInfo,
2336                                          SourceLocation OpLoc,
2337                                          UnaryExprOrTypeTrait ExprKind,
2338                                          SourceRange R) {
2339     return getSema().CreateUnaryExprOrTypeTraitExpr(TInfo, OpLoc, ExprKind, R);
2340   }
2341 
2342   /// Build a new sizeof, alignof or vec step expression with an
2343   /// expression argument.
2344   ///
2345   /// By default, performs semantic analysis to build the new expression.
2346   /// Subclasses may override this routine to provide different behavior.
2347   ExprResult RebuildUnaryExprOrTypeTrait(Expr *SubExpr, SourceLocation OpLoc,
2348                                          UnaryExprOrTypeTrait ExprKind,
2349                                          SourceRange R) {
2350     ExprResult Result
2351       = getSema().CreateUnaryExprOrTypeTraitExpr(SubExpr, OpLoc, ExprKind);
2352     if (Result.isInvalid())
2353       return ExprError();
2354 
2355     return Result;
2356   }
2357 
2358   /// Build a new array subscript expression.
2359   ///
2360   /// By default, performs semantic analysis to build the new expression.
2361   /// Subclasses may override this routine to provide different behavior.
2362   ExprResult RebuildArraySubscriptExpr(Expr *LHS,
2363                                              SourceLocation LBracketLoc,
2364                                              Expr *RHS,
2365                                              SourceLocation RBracketLoc) {
2366     return getSema().ActOnArraySubscriptExpr(/*Scope=*/nullptr, LHS,
2367                                              LBracketLoc, RHS,
2368                                              RBracketLoc);
2369   }
2370 
2371   /// Build a new array section expression.
2372   ///
2373   /// By default, performs semantic analysis to build the new expression.
2374   /// Subclasses may override this routine to provide different behavior.
2375   ExprResult RebuildOMPArraySectionExpr(Expr *Base, SourceLocation LBracketLoc,
2376                                         Expr *LowerBound,
2377                                         SourceLocation ColonLoc, Expr *Length,
2378                                         SourceLocation RBracketLoc) {
2379     return getSema().ActOnOMPArraySectionExpr(Base, LBracketLoc, LowerBound,
2380                                               ColonLoc, Length, RBracketLoc);
2381   }
2382 
2383   /// Build a new array shaping expression.
2384   ///
2385   /// By default, performs semantic analysis to build the new expression.
2386   /// Subclasses may override this routine to provide different behavior.
2387   ExprResult RebuildOMPArrayShapingExpr(Expr *Base, SourceLocation LParenLoc,
2388                                         SourceLocation RParenLoc,
2389                                         ArrayRef<Expr *> Dims,
2390                                         ArrayRef<SourceRange> BracketsRanges) {
2391     return getSema().ActOnOMPArrayShapingExpr(Base, LParenLoc, RParenLoc, Dims,
2392                                               BracketsRanges);
2393   }
2394 
2395   /// Build a new iterator expression.
2396   ///
2397   /// By default, performs semantic analysis to build the new expression.
2398   /// Subclasses may override this routine to provide different behavior.
2399   ExprResult RebuildOMPIteratorExpr(
2400       SourceLocation IteratorKwLoc, SourceLocation LLoc, SourceLocation RLoc,
2401       ArrayRef<Sema::OMPIteratorData> Data) {
2402     return getSema().ActOnOMPIteratorExpr(/*Scope=*/nullptr, IteratorKwLoc,
2403                                           LLoc, RLoc, Data);
2404   }
2405 
2406   /// Build a new call expression.
2407   ///
2408   /// By default, performs semantic analysis to build the new expression.
2409   /// Subclasses may override this routine to provide different behavior.
2410   ExprResult RebuildCallExpr(Expr *Callee, SourceLocation LParenLoc,
2411                                    MultiExprArg Args,
2412                                    SourceLocation RParenLoc,
2413                                    Expr *ExecConfig = nullptr) {
2414     return getSema().BuildCallExpr(/*Scope=*/nullptr, Callee, LParenLoc, Args,
2415                                    RParenLoc, ExecConfig);
2416   }
2417 
2418   /// Build a new member access expression.
2419   ///
2420   /// By default, performs semantic analysis to build the new expression.
2421   /// Subclasses may override this routine to provide different behavior.
2422   ExprResult RebuildMemberExpr(Expr *Base, SourceLocation OpLoc,
2423                                bool isArrow,
2424                                NestedNameSpecifierLoc QualifierLoc,
2425                                SourceLocation TemplateKWLoc,
2426                                const DeclarationNameInfo &MemberNameInfo,
2427                                ValueDecl *Member,
2428                                NamedDecl *FoundDecl,
2429                         const TemplateArgumentListInfo *ExplicitTemplateArgs,
2430                                NamedDecl *FirstQualifierInScope) {
2431     ExprResult BaseResult = getSema().PerformMemberExprBaseConversion(Base,
2432                                                                       isArrow);
2433     if (!Member->getDeclName()) {
2434       // We have a reference to an unnamed field.  This is always the
2435       // base of an anonymous struct/union member access, i.e. the
2436       // field is always of record type.
2437       assert(Member->getType()->isRecordType() &&
2438              "unnamed member not of record type?");
2439 
2440       BaseResult =
2441         getSema().PerformObjectMemberConversion(BaseResult.get(),
2442                                                 QualifierLoc.getNestedNameSpecifier(),
2443                                                 FoundDecl, Member);
2444       if (BaseResult.isInvalid())
2445         return ExprError();
2446       Base = BaseResult.get();
2447 
2448       CXXScopeSpec EmptySS;
2449       return getSema().BuildFieldReferenceExpr(
2450           Base, isArrow, OpLoc, EmptySS, cast<FieldDecl>(Member),
2451           DeclAccessPair::make(FoundDecl, FoundDecl->getAccess()), MemberNameInfo);
2452     }
2453 
2454     CXXScopeSpec SS;
2455     SS.Adopt(QualifierLoc);
2456 
2457     Base = BaseResult.get();
2458     QualType BaseType = Base->getType();
2459 
2460     if (isArrow && !BaseType->isPointerType())
2461       return ExprError();
2462 
2463     // FIXME: this involves duplicating earlier analysis in a lot of
2464     // cases; we should avoid this when possible.
2465     LookupResult R(getSema(), MemberNameInfo, Sema::LookupMemberName);
2466     R.addDecl(FoundDecl);
2467     R.resolveKind();
2468 
2469     return getSema().BuildMemberReferenceExpr(Base, BaseType, OpLoc, isArrow,
2470                                               SS, TemplateKWLoc,
2471                                               FirstQualifierInScope,
2472                                               R, ExplicitTemplateArgs,
2473                                               /*S*/nullptr);
2474   }
2475 
2476   /// Build a new binary operator expression.
2477   ///
2478   /// By default, performs semantic analysis to build the new expression.
2479   /// Subclasses may override this routine to provide different behavior.
2480   ExprResult RebuildBinaryOperator(SourceLocation OpLoc,
2481                                          BinaryOperatorKind Opc,
2482                                          Expr *LHS, Expr *RHS) {
2483     return getSema().BuildBinOp(/*Scope=*/nullptr, OpLoc, Opc, LHS, RHS);
2484   }
2485 
2486   /// Build a new rewritten operator expression.
2487   ///
2488   /// By default, performs semantic analysis to build the new expression.
2489   /// Subclasses may override this routine to provide different behavior.
2490   ExprResult RebuildCXXRewrittenBinaryOperator(
2491       SourceLocation OpLoc, BinaryOperatorKind Opcode,
2492       const UnresolvedSetImpl &UnqualLookups, Expr *LHS, Expr *RHS) {
2493     return getSema().CreateOverloadedBinOp(OpLoc, Opcode, UnqualLookups, LHS,
2494                                            RHS, /*RequiresADL*/false);
2495   }
2496 
2497   /// Build a new conditional operator expression.
2498   ///
2499   /// By default, performs semantic analysis to build the new expression.
2500   /// Subclasses may override this routine to provide different behavior.
2501   ExprResult RebuildConditionalOperator(Expr *Cond,
2502                                         SourceLocation QuestionLoc,
2503                                         Expr *LHS,
2504                                         SourceLocation ColonLoc,
2505                                         Expr *RHS) {
2506     return getSema().ActOnConditionalOp(QuestionLoc, ColonLoc, Cond,
2507                                         LHS, RHS);
2508   }
2509 
2510   /// Build a new C-style cast expression.
2511   ///
2512   /// By default, performs semantic analysis to build the new expression.
2513   /// Subclasses may override this routine to provide different behavior.
2514   ExprResult RebuildCStyleCastExpr(SourceLocation LParenLoc,
2515                                          TypeSourceInfo *TInfo,
2516                                          SourceLocation RParenLoc,
2517                                          Expr *SubExpr) {
2518     return getSema().BuildCStyleCastExpr(LParenLoc, TInfo, RParenLoc,
2519                                          SubExpr);
2520   }
2521 
2522   /// Build a new compound literal expression.
2523   ///
2524   /// By default, performs semantic analysis to build the new expression.
2525   /// Subclasses may override this routine to provide different behavior.
2526   ExprResult RebuildCompoundLiteralExpr(SourceLocation LParenLoc,
2527                                               TypeSourceInfo *TInfo,
2528                                               SourceLocation RParenLoc,
2529                                               Expr *Init) {
2530     return getSema().BuildCompoundLiteralExpr(LParenLoc, TInfo, RParenLoc,
2531                                               Init);
2532   }
2533 
2534   /// Build a new extended vector element access expression.
2535   ///
2536   /// By default, performs semantic analysis to build the new expression.
2537   /// Subclasses may override this routine to provide different behavior.
2538   ExprResult RebuildExtVectorElementExpr(Expr *Base,
2539                                                SourceLocation OpLoc,
2540                                                SourceLocation AccessorLoc,
2541                                                IdentifierInfo &Accessor) {
2542 
2543     CXXScopeSpec SS;
2544     DeclarationNameInfo NameInfo(&Accessor, AccessorLoc);
2545     return getSema().BuildMemberReferenceExpr(Base, Base->getType(),
2546                                               OpLoc, /*IsArrow*/ false,
2547                                               SS, SourceLocation(),
2548                                               /*FirstQualifierInScope*/ nullptr,
2549                                               NameInfo,
2550                                               /* TemplateArgs */ nullptr,
2551                                               /*S*/ nullptr);
2552   }
2553 
2554   /// Build a new initializer list expression.
2555   ///
2556   /// By default, performs semantic analysis to build the new expression.
2557   /// Subclasses may override this routine to provide different behavior.
2558   ExprResult RebuildInitList(SourceLocation LBraceLoc,
2559                              MultiExprArg Inits,
2560                              SourceLocation RBraceLoc) {
2561     return SemaRef.BuildInitList(LBraceLoc, Inits, RBraceLoc);
2562   }
2563 
2564   /// Build a new designated initializer expression.
2565   ///
2566   /// By default, performs semantic analysis to build the new expression.
2567   /// Subclasses may override this routine to provide different behavior.
2568   ExprResult RebuildDesignatedInitExpr(Designation &Desig,
2569                                              MultiExprArg ArrayExprs,
2570                                              SourceLocation EqualOrColonLoc,
2571                                              bool GNUSyntax,
2572                                              Expr *Init) {
2573     ExprResult Result
2574       = SemaRef.ActOnDesignatedInitializer(Desig, EqualOrColonLoc, GNUSyntax,
2575                                            Init);
2576     if (Result.isInvalid())
2577       return ExprError();
2578 
2579     return Result;
2580   }
2581 
2582   /// Build a new value-initialized expression.
2583   ///
2584   /// By default, builds the implicit value initialization without performing
2585   /// any semantic analysis. Subclasses may override this routine to provide
2586   /// different behavior.
2587   ExprResult RebuildImplicitValueInitExpr(QualType T) {
2588     return new (SemaRef.Context) ImplicitValueInitExpr(T);
2589   }
2590 
2591   /// Build a new \c va_arg expression.
2592   ///
2593   /// By default, performs semantic analysis to build the new expression.
2594   /// Subclasses may override this routine to provide different behavior.
2595   ExprResult RebuildVAArgExpr(SourceLocation BuiltinLoc,
2596                                     Expr *SubExpr, TypeSourceInfo *TInfo,
2597                                     SourceLocation RParenLoc) {
2598     return getSema().BuildVAArgExpr(BuiltinLoc,
2599                                     SubExpr, TInfo,
2600                                     RParenLoc);
2601   }
2602 
2603   /// Build a new expression list in parentheses.
2604   ///
2605   /// By default, performs semantic analysis to build the new expression.
2606   /// Subclasses may override this routine to provide different behavior.
2607   ExprResult RebuildParenListExpr(SourceLocation LParenLoc,
2608                                   MultiExprArg SubExprs,
2609                                   SourceLocation RParenLoc) {
2610     return getSema().ActOnParenListExpr(LParenLoc, RParenLoc, SubExprs);
2611   }
2612 
2613   /// Build a new address-of-label expression.
2614   ///
2615   /// By default, performs semantic analysis, using the name of the label
2616   /// rather than attempting to map the label statement itself.
2617   /// Subclasses may override this routine to provide different behavior.
2618   ExprResult RebuildAddrLabelExpr(SourceLocation AmpAmpLoc,
2619                                   SourceLocation LabelLoc, LabelDecl *Label) {
2620     return getSema().ActOnAddrLabel(AmpAmpLoc, LabelLoc, Label);
2621   }
2622 
2623   /// Build a new GNU statement expression.
2624   ///
2625   /// By default, performs semantic analysis to build the new expression.
2626   /// Subclasses may override this routine to provide different behavior.
2627   ExprResult RebuildStmtExpr(SourceLocation LParenLoc, Stmt *SubStmt,
2628                              SourceLocation RParenLoc, unsigned TemplateDepth) {
2629     return getSema().BuildStmtExpr(LParenLoc, SubStmt, RParenLoc,
2630                                    TemplateDepth);
2631   }
2632 
2633   /// Build a new __builtin_choose_expr expression.
2634   ///
2635   /// By default, performs semantic analysis to build the new expression.
2636   /// Subclasses may override this routine to provide different behavior.
2637   ExprResult RebuildChooseExpr(SourceLocation BuiltinLoc,
2638                                      Expr *Cond, Expr *LHS, Expr *RHS,
2639                                      SourceLocation RParenLoc) {
2640     return SemaRef.ActOnChooseExpr(BuiltinLoc,
2641                                    Cond, LHS, RHS,
2642                                    RParenLoc);
2643   }
2644 
2645   /// Build a new generic selection expression.
2646   ///
2647   /// By default, performs semantic analysis to build the new expression.
2648   /// Subclasses may override this routine to provide different behavior.
2649   ExprResult RebuildGenericSelectionExpr(SourceLocation KeyLoc,
2650                                          SourceLocation DefaultLoc,
2651                                          SourceLocation RParenLoc,
2652                                          Expr *ControllingExpr,
2653                                          ArrayRef<TypeSourceInfo *> Types,
2654                                          ArrayRef<Expr *> Exprs) {
2655     return getSema().CreateGenericSelectionExpr(KeyLoc, DefaultLoc, RParenLoc,
2656                                                 ControllingExpr, Types, Exprs);
2657   }
2658 
2659   /// Build a new overloaded operator call expression.
2660   ///
2661   /// By default, performs semantic analysis to build the new expression.
2662   /// The semantic analysis provides the behavior of template instantiation,
2663   /// copying with transformations that turn what looks like an overloaded
2664   /// operator call into a use of a builtin operator, performing
2665   /// argument-dependent lookup, etc. Subclasses may override this routine to
2666   /// provide different behavior.
2667   ExprResult RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op,
2668                                               SourceLocation OpLoc,
2669                                               Expr *Callee,
2670                                               Expr *First,
2671                                               Expr *Second);
2672 
2673   /// Build a new C++ "named" cast expression, such as static_cast or
2674   /// reinterpret_cast.
2675   ///
2676   /// By default, this routine dispatches to one of the more-specific routines
2677   /// for a particular named case, e.g., RebuildCXXStaticCastExpr().
2678   /// Subclasses may override this routine to provide different behavior.
2679   ExprResult RebuildCXXNamedCastExpr(SourceLocation OpLoc,
2680                                            Stmt::StmtClass Class,
2681                                            SourceLocation LAngleLoc,
2682                                            TypeSourceInfo *TInfo,
2683                                            SourceLocation RAngleLoc,
2684                                            SourceLocation LParenLoc,
2685                                            Expr *SubExpr,
2686                                            SourceLocation RParenLoc) {
2687     switch (Class) {
2688     case Stmt::CXXStaticCastExprClass:
2689       return getDerived().RebuildCXXStaticCastExpr(OpLoc, LAngleLoc, TInfo,
2690                                                    RAngleLoc, LParenLoc,
2691                                                    SubExpr, RParenLoc);
2692 
2693     case Stmt::CXXDynamicCastExprClass:
2694       return getDerived().RebuildCXXDynamicCastExpr(OpLoc, LAngleLoc, TInfo,
2695                                                     RAngleLoc, LParenLoc,
2696                                                     SubExpr, RParenLoc);
2697 
2698     case Stmt::CXXReinterpretCastExprClass:
2699       return getDerived().RebuildCXXReinterpretCastExpr(OpLoc, LAngleLoc, TInfo,
2700                                                         RAngleLoc, LParenLoc,
2701                                                         SubExpr,
2702                                                         RParenLoc);
2703 
2704     case Stmt::CXXConstCastExprClass:
2705       return getDerived().RebuildCXXConstCastExpr(OpLoc, LAngleLoc, TInfo,
2706                                                    RAngleLoc, LParenLoc,
2707                                                    SubExpr, RParenLoc);
2708 
2709     default:
2710       llvm_unreachable("Invalid C++ named cast");
2711     }
2712   }
2713 
2714   /// Build a new C++ static_cast expression.
2715   ///
2716   /// By default, performs semantic analysis to build the new expression.
2717   /// Subclasses may override this routine to provide different behavior.
2718   ExprResult RebuildCXXStaticCastExpr(SourceLocation OpLoc,
2719                                             SourceLocation LAngleLoc,
2720                                             TypeSourceInfo *TInfo,
2721                                             SourceLocation RAngleLoc,
2722                                             SourceLocation LParenLoc,
2723                                             Expr *SubExpr,
2724                                             SourceLocation RParenLoc) {
2725     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_static_cast,
2726                                        TInfo, SubExpr,
2727                                        SourceRange(LAngleLoc, RAngleLoc),
2728                                        SourceRange(LParenLoc, RParenLoc));
2729   }
2730 
2731   /// Build a new C++ dynamic_cast expression.
2732   ///
2733   /// By default, performs semantic analysis to build the new expression.
2734   /// Subclasses may override this routine to provide different behavior.
2735   ExprResult RebuildCXXDynamicCastExpr(SourceLocation OpLoc,
2736                                              SourceLocation LAngleLoc,
2737                                              TypeSourceInfo *TInfo,
2738                                              SourceLocation RAngleLoc,
2739                                              SourceLocation LParenLoc,
2740                                              Expr *SubExpr,
2741                                              SourceLocation RParenLoc) {
2742     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_dynamic_cast,
2743                                        TInfo, SubExpr,
2744                                        SourceRange(LAngleLoc, RAngleLoc),
2745                                        SourceRange(LParenLoc, RParenLoc));
2746   }
2747 
2748   /// Build a new C++ reinterpret_cast expression.
2749   ///
2750   /// By default, performs semantic analysis to build the new expression.
2751   /// Subclasses may override this routine to provide different behavior.
2752   ExprResult RebuildCXXReinterpretCastExpr(SourceLocation OpLoc,
2753                                                  SourceLocation LAngleLoc,
2754                                                  TypeSourceInfo *TInfo,
2755                                                  SourceLocation RAngleLoc,
2756                                                  SourceLocation LParenLoc,
2757                                                  Expr *SubExpr,
2758                                                  SourceLocation RParenLoc) {
2759     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_reinterpret_cast,
2760                                        TInfo, SubExpr,
2761                                        SourceRange(LAngleLoc, RAngleLoc),
2762                                        SourceRange(LParenLoc, RParenLoc));
2763   }
2764 
2765   /// Build a new C++ const_cast expression.
2766   ///
2767   /// By default, performs semantic analysis to build the new expression.
2768   /// Subclasses may override this routine to provide different behavior.
2769   ExprResult RebuildCXXConstCastExpr(SourceLocation OpLoc,
2770                                            SourceLocation LAngleLoc,
2771                                            TypeSourceInfo *TInfo,
2772                                            SourceLocation RAngleLoc,
2773                                            SourceLocation LParenLoc,
2774                                            Expr *SubExpr,
2775                                            SourceLocation RParenLoc) {
2776     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_const_cast,
2777                                        TInfo, SubExpr,
2778                                        SourceRange(LAngleLoc, RAngleLoc),
2779                                        SourceRange(LParenLoc, RParenLoc));
2780   }
2781 
2782   /// Build a new C++ functional-style cast expression.
2783   ///
2784   /// By default, performs semantic analysis to build the new expression.
2785   /// Subclasses may override this routine to provide different behavior.
2786   ExprResult RebuildCXXFunctionalCastExpr(TypeSourceInfo *TInfo,
2787                                           SourceLocation LParenLoc,
2788                                           Expr *Sub,
2789                                           SourceLocation RParenLoc,
2790                                           bool ListInitialization) {
2791     return getSema().BuildCXXTypeConstructExpr(TInfo, LParenLoc,
2792                                                MultiExprArg(&Sub, 1), RParenLoc,
2793                                                ListInitialization);
2794   }
2795 
2796   /// Build a new C++ __builtin_bit_cast expression.
2797   ///
2798   /// By default, performs semantic analysis to build the new expression.
2799   /// Subclasses may override this routine to provide different behavior.
2800   ExprResult RebuildBuiltinBitCastExpr(SourceLocation KWLoc,
2801                                        TypeSourceInfo *TSI, Expr *Sub,
2802                                        SourceLocation RParenLoc) {
2803     return getSema().BuildBuiltinBitCastExpr(KWLoc, TSI, Sub, RParenLoc);
2804   }
2805 
2806   /// Build a new C++ typeid(type) expression.
2807   ///
2808   /// By default, performs semantic analysis to build the new expression.
2809   /// Subclasses may override this routine to provide different behavior.
2810   ExprResult RebuildCXXTypeidExpr(QualType TypeInfoType,
2811                                         SourceLocation TypeidLoc,
2812                                         TypeSourceInfo *Operand,
2813                                         SourceLocation RParenLoc) {
2814     return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand,
2815                                     RParenLoc);
2816   }
2817 
2818 
2819   /// Build a new C++ typeid(expr) expression.
2820   ///
2821   /// By default, performs semantic analysis to build the new expression.
2822   /// Subclasses may override this routine to provide different behavior.
2823   ExprResult RebuildCXXTypeidExpr(QualType TypeInfoType,
2824                                         SourceLocation TypeidLoc,
2825                                         Expr *Operand,
2826                                         SourceLocation RParenLoc) {
2827     return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand,
2828                                     RParenLoc);
2829   }
2830 
2831   /// Build a new C++ __uuidof(type) expression.
2832   ///
2833   /// By default, performs semantic analysis to build the new expression.
2834   /// Subclasses may override this routine to provide different behavior.
2835   ExprResult RebuildCXXUuidofExpr(QualType TypeInfoType,
2836                                         SourceLocation TypeidLoc,
2837                                         TypeSourceInfo *Operand,
2838                                         SourceLocation RParenLoc) {
2839     return getSema().BuildCXXUuidof(TypeInfoType, TypeidLoc, Operand,
2840                                     RParenLoc);
2841   }
2842 
2843   /// Build a new C++ __uuidof(expr) expression.
2844   ///
2845   /// By default, performs semantic analysis to build the new expression.
2846   /// Subclasses may override this routine to provide different behavior.
2847   ExprResult RebuildCXXUuidofExpr(QualType TypeInfoType,
2848                                         SourceLocation TypeidLoc,
2849                                         Expr *Operand,
2850                                         SourceLocation RParenLoc) {
2851     return getSema().BuildCXXUuidof(TypeInfoType, TypeidLoc, Operand,
2852                                     RParenLoc);
2853   }
2854 
2855   /// Build a new C++ "this" expression.
2856   ///
2857   /// By default, builds a new "this" expression without performing any
2858   /// semantic analysis. Subclasses may override this routine to provide
2859   /// different behavior.
2860   ExprResult RebuildCXXThisExpr(SourceLocation ThisLoc,
2861                                 QualType ThisType,
2862                                 bool isImplicit) {
2863     return getSema().BuildCXXThisExpr(ThisLoc, ThisType, isImplicit);
2864   }
2865 
2866   /// Build a new C++ throw expression.
2867   ///
2868   /// By default, performs semantic analysis to build the new expression.
2869   /// Subclasses may override this routine to provide different behavior.
2870   ExprResult RebuildCXXThrowExpr(SourceLocation ThrowLoc, Expr *Sub,
2871                                  bool IsThrownVariableInScope) {
2872     return getSema().BuildCXXThrow(ThrowLoc, Sub, IsThrownVariableInScope);
2873   }
2874 
2875   /// Build a new C++ default-argument expression.
2876   ///
2877   /// By default, builds a new default-argument expression, which does not
2878   /// require any semantic analysis. Subclasses may override this routine to
2879   /// provide different behavior.
2880   ExprResult RebuildCXXDefaultArgExpr(SourceLocation Loc, ParmVarDecl *Param) {
2881     return CXXDefaultArgExpr::Create(getSema().Context, Loc, Param,
2882                                      getSema().CurContext);
2883   }
2884 
2885   /// Build a new C++11 default-initialization expression.
2886   ///
2887   /// By default, builds a new default field initialization expression, which
2888   /// does not require any semantic analysis. Subclasses may override this
2889   /// routine to provide different behavior.
2890   ExprResult RebuildCXXDefaultInitExpr(SourceLocation Loc,
2891                                        FieldDecl *Field) {
2892     return CXXDefaultInitExpr::Create(getSema().Context, Loc, Field,
2893                                       getSema().CurContext);
2894   }
2895 
2896   /// Build a new C++ zero-initialization 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 RebuildCXXScalarValueInitExpr(TypeSourceInfo *TSInfo,
2901                                            SourceLocation LParenLoc,
2902                                            SourceLocation RParenLoc) {
2903     return getSema().BuildCXXTypeConstructExpr(
2904         TSInfo, LParenLoc, None, RParenLoc, /*ListInitialization=*/false);
2905   }
2906 
2907   /// Build a new C++ "new" expression.
2908   ///
2909   /// By default, performs semantic analysis to build the new expression.
2910   /// Subclasses may override this routine to provide different behavior.
2911   ExprResult RebuildCXXNewExpr(SourceLocation StartLoc,
2912                                bool UseGlobal,
2913                                SourceLocation PlacementLParen,
2914                                MultiExprArg PlacementArgs,
2915                                SourceLocation PlacementRParen,
2916                                SourceRange TypeIdParens,
2917                                QualType AllocatedType,
2918                                TypeSourceInfo *AllocatedTypeInfo,
2919                                Optional<Expr *> ArraySize,
2920                                SourceRange DirectInitRange,
2921                                Expr *Initializer) {
2922     return getSema().BuildCXXNew(StartLoc, UseGlobal,
2923                                  PlacementLParen,
2924                                  PlacementArgs,
2925                                  PlacementRParen,
2926                                  TypeIdParens,
2927                                  AllocatedType,
2928                                  AllocatedTypeInfo,
2929                                  ArraySize,
2930                                  DirectInitRange,
2931                                  Initializer);
2932   }
2933 
2934   /// Build a new C++ "delete" expression.
2935   ///
2936   /// By default, performs semantic analysis to build the new expression.
2937   /// Subclasses may override this routine to provide different behavior.
2938   ExprResult RebuildCXXDeleteExpr(SourceLocation StartLoc,
2939                                         bool IsGlobalDelete,
2940                                         bool IsArrayForm,
2941                                         Expr *Operand) {
2942     return getSema().ActOnCXXDelete(StartLoc, IsGlobalDelete, IsArrayForm,
2943                                     Operand);
2944   }
2945 
2946   /// Build a new type trait expression.
2947   ///
2948   /// By default, performs semantic analysis to build the new expression.
2949   /// Subclasses may override this routine to provide different behavior.
2950   ExprResult RebuildTypeTrait(TypeTrait Trait,
2951                               SourceLocation StartLoc,
2952                               ArrayRef<TypeSourceInfo *> Args,
2953                               SourceLocation RParenLoc) {
2954     return getSema().BuildTypeTrait(Trait, StartLoc, Args, RParenLoc);
2955   }
2956 
2957   /// Build a new array type trait expression.
2958   ///
2959   /// By default, performs semantic analysis to build the new expression.
2960   /// Subclasses may override this routine to provide different behavior.
2961   ExprResult RebuildArrayTypeTrait(ArrayTypeTrait Trait,
2962                                    SourceLocation StartLoc,
2963                                    TypeSourceInfo *TSInfo,
2964                                    Expr *DimExpr,
2965                                    SourceLocation RParenLoc) {
2966     return getSema().BuildArrayTypeTrait(Trait, StartLoc, TSInfo, DimExpr, RParenLoc);
2967   }
2968 
2969   /// Build a new expression trait expression.
2970   ///
2971   /// By default, performs semantic analysis to build the new expression.
2972   /// Subclasses may override this routine to provide different behavior.
2973   ExprResult RebuildExpressionTrait(ExpressionTrait Trait,
2974                                    SourceLocation StartLoc,
2975                                    Expr *Queried,
2976                                    SourceLocation RParenLoc) {
2977     return getSema().BuildExpressionTrait(Trait, StartLoc, Queried, RParenLoc);
2978   }
2979 
2980   /// Build a new (previously unresolved) declaration reference
2981   /// expression.
2982   ///
2983   /// By default, performs semantic analysis to build the new expression.
2984   /// Subclasses may override this routine to provide different behavior.
2985   ExprResult RebuildDependentScopeDeclRefExpr(
2986                                           NestedNameSpecifierLoc QualifierLoc,
2987                                           SourceLocation TemplateKWLoc,
2988                                        const DeclarationNameInfo &NameInfo,
2989                               const TemplateArgumentListInfo *TemplateArgs,
2990                                           bool IsAddressOfOperand,
2991                                           TypeSourceInfo **RecoveryTSI) {
2992     CXXScopeSpec SS;
2993     SS.Adopt(QualifierLoc);
2994 
2995     if (TemplateArgs || TemplateKWLoc.isValid())
2996       return getSema().BuildQualifiedTemplateIdExpr(SS, TemplateKWLoc, NameInfo,
2997                                                     TemplateArgs);
2998 
2999     return getSema().BuildQualifiedDeclarationNameExpr(
3000         SS, NameInfo, IsAddressOfOperand, /*S*/nullptr, RecoveryTSI);
3001   }
3002 
3003   /// Build a new template-id expression.
3004   ///
3005   /// By default, performs semantic analysis to build the new expression.
3006   /// Subclasses may override this routine to provide different behavior.
3007   ExprResult RebuildTemplateIdExpr(const CXXScopeSpec &SS,
3008                                    SourceLocation TemplateKWLoc,
3009                                    LookupResult &R,
3010                                    bool RequiresADL,
3011                               const TemplateArgumentListInfo *TemplateArgs) {
3012     return getSema().BuildTemplateIdExpr(SS, TemplateKWLoc, R, RequiresADL,
3013                                          TemplateArgs);
3014   }
3015 
3016   /// Build a new object-construction expression.
3017   ///
3018   /// By default, performs semantic analysis to build the new expression.
3019   /// Subclasses may override this routine to provide different behavior.
3020   ExprResult RebuildCXXConstructExpr(QualType T,
3021                                      SourceLocation Loc,
3022                                      CXXConstructorDecl *Constructor,
3023                                      bool IsElidable,
3024                                      MultiExprArg Args,
3025                                      bool HadMultipleCandidates,
3026                                      bool ListInitialization,
3027                                      bool StdInitListInitialization,
3028                                      bool RequiresZeroInit,
3029                              CXXConstructExpr::ConstructionKind ConstructKind,
3030                                      SourceRange ParenRange) {
3031     SmallVector<Expr*, 8> ConvertedArgs;
3032     if (getSema().CompleteConstructorCall(Constructor, Args, Loc,
3033                                           ConvertedArgs))
3034       return ExprError();
3035 
3036     return getSema().BuildCXXConstructExpr(Loc, T, Constructor,
3037                                            IsElidable,
3038                                            ConvertedArgs,
3039                                            HadMultipleCandidates,
3040                                            ListInitialization,
3041                                            StdInitListInitialization,
3042                                            RequiresZeroInit, ConstructKind,
3043                                            ParenRange);
3044   }
3045 
3046   /// Build a new implicit construction via inherited constructor
3047   /// expression.
3048   ExprResult RebuildCXXInheritedCtorInitExpr(QualType T, SourceLocation Loc,
3049                                              CXXConstructorDecl *Constructor,
3050                                              bool ConstructsVBase,
3051                                              bool InheritedFromVBase) {
3052     return new (getSema().Context) CXXInheritedCtorInitExpr(
3053         Loc, T, Constructor, ConstructsVBase, InheritedFromVBase);
3054   }
3055 
3056   /// Build a new object-construction expression.
3057   ///
3058   /// By default, performs semantic analysis to build the new expression.
3059   /// Subclasses may override this routine to provide different behavior.
3060   ExprResult RebuildCXXTemporaryObjectExpr(TypeSourceInfo *TSInfo,
3061                                            SourceLocation LParenOrBraceLoc,
3062                                            MultiExprArg Args,
3063                                            SourceLocation RParenOrBraceLoc,
3064                                            bool ListInitialization) {
3065     return getSema().BuildCXXTypeConstructExpr(
3066         TSInfo, LParenOrBraceLoc, Args, RParenOrBraceLoc, ListInitialization);
3067   }
3068 
3069   /// Build a new object-construction expression.
3070   ///
3071   /// By default, performs semantic analysis to build the new expression.
3072   /// Subclasses may override this routine to provide different behavior.
3073   ExprResult RebuildCXXUnresolvedConstructExpr(TypeSourceInfo *TSInfo,
3074                                                SourceLocation LParenLoc,
3075                                                MultiExprArg Args,
3076                                                SourceLocation RParenLoc,
3077                                                bool ListInitialization) {
3078     return getSema().BuildCXXTypeConstructExpr(TSInfo, LParenLoc, Args,
3079                                                RParenLoc, ListInitialization);
3080   }
3081 
3082   /// Build a new member reference expression.
3083   ///
3084   /// By default, performs semantic analysis to build the new expression.
3085   /// Subclasses may override this routine to provide different behavior.
3086   ExprResult RebuildCXXDependentScopeMemberExpr(Expr *BaseE,
3087                                                 QualType BaseType,
3088                                                 bool IsArrow,
3089                                                 SourceLocation OperatorLoc,
3090                                           NestedNameSpecifierLoc QualifierLoc,
3091                                                 SourceLocation TemplateKWLoc,
3092                                             NamedDecl *FirstQualifierInScope,
3093                                    const DeclarationNameInfo &MemberNameInfo,
3094                               const TemplateArgumentListInfo *TemplateArgs) {
3095     CXXScopeSpec SS;
3096     SS.Adopt(QualifierLoc);
3097 
3098     return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType,
3099                                             OperatorLoc, IsArrow,
3100                                             SS, TemplateKWLoc,
3101                                             FirstQualifierInScope,
3102                                             MemberNameInfo,
3103                                             TemplateArgs, /*S*/nullptr);
3104   }
3105 
3106   /// Build a new member reference expression.
3107   ///
3108   /// By default, performs semantic analysis to build the new expression.
3109   /// Subclasses may override this routine to provide different behavior.
3110   ExprResult RebuildUnresolvedMemberExpr(Expr *BaseE, QualType BaseType,
3111                                          SourceLocation OperatorLoc,
3112                                          bool IsArrow,
3113                                          NestedNameSpecifierLoc QualifierLoc,
3114                                          SourceLocation TemplateKWLoc,
3115                                          NamedDecl *FirstQualifierInScope,
3116                                          LookupResult &R,
3117                                 const TemplateArgumentListInfo *TemplateArgs) {
3118     CXXScopeSpec SS;
3119     SS.Adopt(QualifierLoc);
3120 
3121     return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType,
3122                                             OperatorLoc, IsArrow,
3123                                             SS, TemplateKWLoc,
3124                                             FirstQualifierInScope,
3125                                             R, TemplateArgs, /*S*/nullptr);
3126   }
3127 
3128   /// Build a new noexcept expression.
3129   ///
3130   /// By default, performs semantic analysis to build the new expression.
3131   /// Subclasses may override this routine to provide different behavior.
3132   ExprResult RebuildCXXNoexceptExpr(SourceRange Range, Expr *Arg) {
3133     return SemaRef.BuildCXXNoexceptExpr(Range.getBegin(), Arg, Range.getEnd());
3134   }
3135 
3136   /// Build a new expression to compute the length of a parameter pack.
3137   ExprResult RebuildSizeOfPackExpr(SourceLocation OperatorLoc,
3138                                    NamedDecl *Pack,
3139                                    SourceLocation PackLoc,
3140                                    SourceLocation RParenLoc,
3141                                    Optional<unsigned> Length,
3142                                    ArrayRef<TemplateArgument> PartialArgs) {
3143     return SizeOfPackExpr::Create(SemaRef.Context, OperatorLoc, Pack, PackLoc,
3144                                   RParenLoc, Length, PartialArgs);
3145   }
3146 
3147   /// Build a new expression representing a call to a source location
3148   ///  builtin.
3149   ///
3150   /// By default, performs semantic analysis to build the new expression.
3151   /// Subclasses may override this routine to provide different behavior.
3152   ExprResult RebuildSourceLocExpr(SourceLocExpr::IdentKind Kind,
3153                                   SourceLocation BuiltinLoc,
3154                                   SourceLocation RPLoc,
3155                                   DeclContext *ParentContext) {
3156     return getSema().BuildSourceLocExpr(Kind, BuiltinLoc, RPLoc, ParentContext);
3157   }
3158 
3159   /// Build a new Objective-C boxed expression.
3160   ///
3161   /// By default, performs semantic analysis to build the new expression.
3162   /// Subclasses may override this routine to provide different behavior.
3163   ExprResult RebuildConceptSpecializationExpr(NestedNameSpecifierLoc NNS,
3164       SourceLocation TemplateKWLoc, DeclarationNameInfo ConceptNameInfo,
3165       NamedDecl *FoundDecl, ConceptDecl *NamedConcept,
3166       TemplateArgumentListInfo *TALI) {
3167     CXXScopeSpec SS;
3168     SS.Adopt(NNS);
3169     ExprResult Result = getSema().CheckConceptTemplateId(SS, TemplateKWLoc,
3170                                                          ConceptNameInfo,
3171                                                          FoundDecl,
3172                                                          NamedConcept, TALI);
3173     if (Result.isInvalid())
3174       return ExprError();
3175     return Result;
3176   }
3177 
3178   /// \brief Build a new requires expression.
3179   ///
3180   /// By default, performs semantic analysis to build the new expression.
3181   /// Subclasses may override this routine to provide different behavior.
3182   ExprResult RebuildRequiresExpr(SourceLocation RequiresKWLoc,
3183                                  RequiresExprBodyDecl *Body,
3184                                  ArrayRef<ParmVarDecl *> LocalParameters,
3185                                  ArrayRef<concepts::Requirement *> Requirements,
3186                                  SourceLocation ClosingBraceLoc) {
3187     return RequiresExpr::Create(SemaRef.Context, RequiresKWLoc, Body,
3188                                 LocalParameters, Requirements, ClosingBraceLoc);
3189   }
3190 
3191   concepts::TypeRequirement *
3192   RebuildTypeRequirement(
3193       concepts::Requirement::SubstitutionDiagnostic *SubstDiag) {
3194     return SemaRef.BuildTypeRequirement(SubstDiag);
3195   }
3196 
3197   concepts::TypeRequirement *RebuildTypeRequirement(TypeSourceInfo *T) {
3198     return SemaRef.BuildTypeRequirement(T);
3199   }
3200 
3201   concepts::ExprRequirement *
3202   RebuildExprRequirement(
3203       concepts::Requirement::SubstitutionDiagnostic *SubstDiag, bool IsSimple,
3204       SourceLocation NoexceptLoc,
3205       concepts::ExprRequirement::ReturnTypeRequirement Ret) {
3206     return SemaRef.BuildExprRequirement(SubstDiag, IsSimple, NoexceptLoc,
3207                                         std::move(Ret));
3208   }
3209 
3210   concepts::ExprRequirement *
3211   RebuildExprRequirement(Expr *E, bool IsSimple, SourceLocation NoexceptLoc,
3212                          concepts::ExprRequirement::ReturnTypeRequirement Ret) {
3213     return SemaRef.BuildExprRequirement(E, IsSimple, NoexceptLoc,
3214                                         std::move(Ret));
3215   }
3216 
3217   concepts::NestedRequirement *
3218   RebuildNestedRequirement(
3219       concepts::Requirement::SubstitutionDiagnostic *SubstDiag) {
3220     return SemaRef.BuildNestedRequirement(SubstDiag);
3221   }
3222 
3223   concepts::NestedRequirement *RebuildNestedRequirement(Expr *Constraint) {
3224     return SemaRef.BuildNestedRequirement(Constraint);
3225   }
3226 
3227   /// \brief Build a new Objective-C boxed expression.
3228   ///
3229   /// By default, performs semantic analysis to build the new expression.
3230   /// Subclasses may override this routine to provide different behavior.
3231   ExprResult RebuildObjCBoxedExpr(SourceRange SR, Expr *ValueExpr) {
3232     return getSema().BuildObjCBoxedExpr(SR, ValueExpr);
3233   }
3234 
3235   /// Build a new Objective-C array literal.
3236   ///
3237   /// By default, performs semantic analysis to build the new expression.
3238   /// Subclasses may override this routine to provide different behavior.
3239   ExprResult RebuildObjCArrayLiteral(SourceRange Range,
3240                                      Expr **Elements, unsigned NumElements) {
3241     return getSema().BuildObjCArrayLiteral(Range,
3242                                            MultiExprArg(Elements, NumElements));
3243   }
3244 
3245   ExprResult RebuildObjCSubscriptRefExpr(SourceLocation RB,
3246                                          Expr *Base, Expr *Key,
3247                                          ObjCMethodDecl *getterMethod,
3248                                          ObjCMethodDecl *setterMethod) {
3249     return  getSema().BuildObjCSubscriptExpression(RB, Base, Key,
3250                                                    getterMethod, setterMethod);
3251   }
3252 
3253   /// Build a new Objective-C dictionary literal.
3254   ///
3255   /// By default, performs semantic analysis to build the new expression.
3256   /// Subclasses may override this routine to provide different behavior.
3257   ExprResult RebuildObjCDictionaryLiteral(SourceRange Range,
3258                               MutableArrayRef<ObjCDictionaryElement> Elements) {
3259     return getSema().BuildObjCDictionaryLiteral(Range, Elements);
3260   }
3261 
3262   /// Build a new Objective-C \@encode expression.
3263   ///
3264   /// By default, performs semantic analysis to build the new expression.
3265   /// Subclasses may override this routine to provide different behavior.
3266   ExprResult RebuildObjCEncodeExpr(SourceLocation AtLoc,
3267                                          TypeSourceInfo *EncodeTypeInfo,
3268                                          SourceLocation RParenLoc) {
3269     return SemaRef.BuildObjCEncodeExpression(AtLoc, EncodeTypeInfo, RParenLoc);
3270   }
3271 
3272   /// Build a new Objective-C class message.
3273   ExprResult RebuildObjCMessageExpr(TypeSourceInfo *ReceiverTypeInfo,
3274                                           Selector Sel,
3275                                           ArrayRef<SourceLocation> SelectorLocs,
3276                                           ObjCMethodDecl *Method,
3277                                           SourceLocation LBracLoc,
3278                                           MultiExprArg Args,
3279                                           SourceLocation RBracLoc) {
3280     return SemaRef.BuildClassMessage(ReceiverTypeInfo,
3281                                      ReceiverTypeInfo->getType(),
3282                                      /*SuperLoc=*/SourceLocation(),
3283                                      Sel, Method, LBracLoc, SelectorLocs,
3284                                      RBracLoc, Args);
3285   }
3286 
3287   /// Build a new Objective-C instance message.
3288   ExprResult RebuildObjCMessageExpr(Expr *Receiver,
3289                                           Selector Sel,
3290                                           ArrayRef<SourceLocation> SelectorLocs,
3291                                           ObjCMethodDecl *Method,
3292                                           SourceLocation LBracLoc,
3293                                           MultiExprArg Args,
3294                                           SourceLocation RBracLoc) {
3295     return SemaRef.BuildInstanceMessage(Receiver,
3296                                         Receiver->getType(),
3297                                         /*SuperLoc=*/SourceLocation(),
3298                                         Sel, Method, LBracLoc, SelectorLocs,
3299                                         RBracLoc, Args);
3300   }
3301 
3302   /// Build a new Objective-C instance/class message to 'super'.
3303   ExprResult RebuildObjCMessageExpr(SourceLocation SuperLoc,
3304                                     Selector Sel,
3305                                     ArrayRef<SourceLocation> SelectorLocs,
3306                                     QualType SuperType,
3307                                     ObjCMethodDecl *Method,
3308                                     SourceLocation LBracLoc,
3309                                     MultiExprArg Args,
3310                                     SourceLocation RBracLoc) {
3311     return Method->isInstanceMethod() ? SemaRef.BuildInstanceMessage(nullptr,
3312                                           SuperType,
3313                                           SuperLoc,
3314                                           Sel, Method, LBracLoc, SelectorLocs,
3315                                           RBracLoc, Args)
3316                                       : SemaRef.BuildClassMessage(nullptr,
3317                                           SuperType,
3318                                           SuperLoc,
3319                                           Sel, Method, LBracLoc, SelectorLocs,
3320                                           RBracLoc, Args);
3321 
3322 
3323   }
3324 
3325   /// Build a new Objective-C ivar reference expression.
3326   ///
3327   /// By default, performs semantic analysis to build the new expression.
3328   /// Subclasses may override this routine to provide different behavior.
3329   ExprResult RebuildObjCIvarRefExpr(Expr *BaseArg, ObjCIvarDecl *Ivar,
3330                                           SourceLocation IvarLoc,
3331                                           bool IsArrow, bool IsFreeIvar) {
3332     CXXScopeSpec SS;
3333     DeclarationNameInfo NameInfo(Ivar->getDeclName(), IvarLoc);
3334     ExprResult Result = getSema().BuildMemberReferenceExpr(
3335         BaseArg, BaseArg->getType(),
3336         /*FIXME:*/ IvarLoc, IsArrow, SS, SourceLocation(),
3337         /*FirstQualifierInScope=*/nullptr, NameInfo,
3338         /*TemplateArgs=*/nullptr,
3339         /*S=*/nullptr);
3340     if (IsFreeIvar && Result.isUsable())
3341       cast<ObjCIvarRefExpr>(Result.get())->setIsFreeIvar(IsFreeIvar);
3342     return Result;
3343   }
3344 
3345   /// Build a new Objective-C property reference expression.
3346   ///
3347   /// By default, performs semantic analysis to build the new expression.
3348   /// Subclasses may override this routine to provide different behavior.
3349   ExprResult RebuildObjCPropertyRefExpr(Expr *BaseArg,
3350                                         ObjCPropertyDecl *Property,
3351                                         SourceLocation PropertyLoc) {
3352     CXXScopeSpec SS;
3353     DeclarationNameInfo NameInfo(Property->getDeclName(), PropertyLoc);
3354     return getSema().BuildMemberReferenceExpr(BaseArg, BaseArg->getType(),
3355                                               /*FIXME:*/PropertyLoc,
3356                                               /*IsArrow=*/false,
3357                                               SS, SourceLocation(),
3358                                               /*FirstQualifierInScope=*/nullptr,
3359                                               NameInfo,
3360                                               /*TemplateArgs=*/nullptr,
3361                                               /*S=*/nullptr);
3362   }
3363 
3364   /// Build a new Objective-C property reference expression.
3365   ///
3366   /// By default, performs semantic analysis to build the new expression.
3367   /// Subclasses may override this routine to provide different behavior.
3368   ExprResult RebuildObjCPropertyRefExpr(Expr *Base, QualType T,
3369                                         ObjCMethodDecl *Getter,
3370                                         ObjCMethodDecl *Setter,
3371                                         SourceLocation PropertyLoc) {
3372     // Since these expressions can only be value-dependent, we do not
3373     // need to perform semantic analysis again.
3374     return Owned(
3375       new (getSema().Context) ObjCPropertyRefExpr(Getter, Setter, T,
3376                                                   VK_LValue, OK_ObjCProperty,
3377                                                   PropertyLoc, Base));
3378   }
3379 
3380   /// Build a new Objective-C "isa" expression.
3381   ///
3382   /// By default, performs semantic analysis to build the new expression.
3383   /// Subclasses may override this routine to provide different behavior.
3384   ExprResult RebuildObjCIsaExpr(Expr *BaseArg, SourceLocation IsaLoc,
3385                                 SourceLocation OpLoc, bool IsArrow) {
3386     CXXScopeSpec SS;
3387     DeclarationNameInfo NameInfo(&getSema().Context.Idents.get("isa"), IsaLoc);
3388     return getSema().BuildMemberReferenceExpr(BaseArg, BaseArg->getType(),
3389                                               OpLoc, IsArrow,
3390                                               SS, SourceLocation(),
3391                                               /*FirstQualifierInScope=*/nullptr,
3392                                               NameInfo,
3393                                               /*TemplateArgs=*/nullptr,
3394                                               /*S=*/nullptr);
3395   }
3396 
3397   /// Build a new shuffle vector expression.
3398   ///
3399   /// By default, performs semantic analysis to build the new expression.
3400   /// Subclasses may override this routine to provide different behavior.
3401   ExprResult RebuildShuffleVectorExpr(SourceLocation BuiltinLoc,
3402                                       MultiExprArg SubExprs,
3403                                       SourceLocation RParenLoc) {
3404     // Find the declaration for __builtin_shufflevector
3405     const IdentifierInfo &Name
3406       = SemaRef.Context.Idents.get("__builtin_shufflevector");
3407     TranslationUnitDecl *TUDecl = SemaRef.Context.getTranslationUnitDecl();
3408     DeclContext::lookup_result Lookup = TUDecl->lookup(DeclarationName(&Name));
3409     assert(!Lookup.empty() && "No __builtin_shufflevector?");
3410 
3411     // Build a reference to the __builtin_shufflevector builtin
3412     FunctionDecl *Builtin = cast<FunctionDecl>(Lookup.front());
3413     Expr *Callee = new (SemaRef.Context)
3414         DeclRefExpr(SemaRef.Context, Builtin, false,
3415                     SemaRef.Context.BuiltinFnTy, VK_RValue, BuiltinLoc);
3416     QualType CalleePtrTy = SemaRef.Context.getPointerType(Builtin->getType());
3417     Callee = SemaRef.ImpCastExprToType(Callee, CalleePtrTy,
3418                                        CK_BuiltinFnToFnPtr).get();
3419 
3420     // Build the CallExpr
3421     ExprResult TheCall = CallExpr::Create(
3422         SemaRef.Context, Callee, SubExprs, Builtin->getCallResultType(),
3423         Expr::getValueKindForType(Builtin->getReturnType()), RParenLoc);
3424 
3425     // Type-check the __builtin_shufflevector expression.
3426     return SemaRef.SemaBuiltinShuffleVector(cast<CallExpr>(TheCall.get()));
3427   }
3428 
3429   /// Build a new convert vector expression.
3430   ExprResult RebuildConvertVectorExpr(SourceLocation BuiltinLoc,
3431                                       Expr *SrcExpr, TypeSourceInfo *DstTInfo,
3432                                       SourceLocation RParenLoc) {
3433     return SemaRef.SemaConvertVectorExpr(SrcExpr, DstTInfo,
3434                                          BuiltinLoc, RParenLoc);
3435   }
3436 
3437   /// Build a new template argument pack expansion.
3438   ///
3439   /// By default, performs semantic analysis to build a new pack expansion
3440   /// for a template argument. Subclasses may override this routine to provide
3441   /// different behavior.
3442   TemplateArgumentLoc RebuildPackExpansion(TemplateArgumentLoc Pattern,
3443                                            SourceLocation EllipsisLoc,
3444                                            Optional<unsigned> NumExpansions) {
3445     switch (Pattern.getArgument().getKind()) {
3446     case TemplateArgument::Expression: {
3447       ExprResult Result
3448         = getSema().CheckPackExpansion(Pattern.getSourceExpression(),
3449                                        EllipsisLoc, NumExpansions);
3450       if (Result.isInvalid())
3451         return TemplateArgumentLoc();
3452 
3453       return TemplateArgumentLoc(Result.get(), Result.get());
3454     }
3455 
3456     case TemplateArgument::Template:
3457       return TemplateArgumentLoc(TemplateArgument(
3458                                           Pattern.getArgument().getAsTemplate(),
3459                                                   NumExpansions),
3460                                  Pattern.getTemplateQualifierLoc(),
3461                                  Pattern.getTemplateNameLoc(),
3462                                  EllipsisLoc);
3463 
3464     case TemplateArgument::Null:
3465     case TemplateArgument::Integral:
3466     case TemplateArgument::Declaration:
3467     case TemplateArgument::Pack:
3468     case TemplateArgument::TemplateExpansion:
3469     case TemplateArgument::NullPtr:
3470       llvm_unreachable("Pack expansion pattern has no parameter packs");
3471 
3472     case TemplateArgument::Type:
3473       if (TypeSourceInfo *Expansion
3474             = getSema().CheckPackExpansion(Pattern.getTypeSourceInfo(),
3475                                            EllipsisLoc,
3476                                            NumExpansions))
3477         return TemplateArgumentLoc(TemplateArgument(Expansion->getType()),
3478                                    Expansion);
3479       break;
3480     }
3481 
3482     return TemplateArgumentLoc();
3483   }
3484 
3485   /// Build a new expression pack expansion.
3486   ///
3487   /// By default, performs semantic analysis to build a new pack expansion
3488   /// for an expression. Subclasses may override this routine to provide
3489   /// different behavior.
3490   ExprResult RebuildPackExpansion(Expr *Pattern, SourceLocation EllipsisLoc,
3491                                   Optional<unsigned> NumExpansions) {
3492     return getSema().CheckPackExpansion(Pattern, EllipsisLoc, NumExpansions);
3493   }
3494 
3495   /// Build a new C++1z fold-expression.
3496   ///
3497   /// By default, performs semantic analysis in order to build a new fold
3498   /// expression.
3499   ExprResult RebuildCXXFoldExpr(SourceLocation LParenLoc, Expr *LHS,
3500                                 BinaryOperatorKind Operator,
3501                                 SourceLocation EllipsisLoc, Expr *RHS,
3502                                 SourceLocation RParenLoc,
3503                                 Optional<unsigned> NumExpansions) {
3504     return getSema().BuildCXXFoldExpr(LParenLoc, LHS, Operator, EllipsisLoc,
3505                                       RHS, RParenLoc, NumExpansions);
3506   }
3507 
3508   /// Build an empty C++1z fold-expression with the given operator.
3509   ///
3510   /// By default, produces the fallback value for the fold-expression, or
3511   /// produce an error if there is no fallback value.
3512   ExprResult RebuildEmptyCXXFoldExpr(SourceLocation EllipsisLoc,
3513                                      BinaryOperatorKind Operator) {
3514     return getSema().BuildEmptyCXXFoldExpr(EllipsisLoc, Operator);
3515   }
3516 
3517   /// Build a new atomic operation expression.
3518   ///
3519   /// By default, performs semantic analysis to build the new expression.
3520   /// Subclasses may override this routine to provide different behavior.
3521   ExprResult RebuildAtomicExpr(SourceLocation BuiltinLoc, MultiExprArg SubExprs,
3522                                AtomicExpr::AtomicOp Op,
3523                                SourceLocation RParenLoc) {
3524     // Use this for all of the locations, since we don't know the difference
3525     // between the call and the expr at this point.
3526     SourceRange Range{BuiltinLoc, RParenLoc};
3527     return getSema().BuildAtomicExpr(Range, Range, RParenLoc, SubExprs, Op,
3528                                      Sema::AtomicArgumentOrder::AST);
3529   }
3530 
3531   ExprResult RebuildRecoveryExpr(SourceLocation BeginLoc, SourceLocation EndLoc,
3532                                  ArrayRef<Expr *> SubExprs) {
3533     return getSema().CreateRecoveryExpr(BeginLoc, EndLoc, SubExprs);
3534   }
3535 
3536 private:
3537   TypeLoc TransformTypeInObjectScope(TypeLoc TL,
3538                                      QualType ObjectType,
3539                                      NamedDecl *FirstQualifierInScope,
3540                                      CXXScopeSpec &SS);
3541 
3542   TypeSourceInfo *TransformTypeInObjectScope(TypeSourceInfo *TSInfo,
3543                                              QualType ObjectType,
3544                                              NamedDecl *FirstQualifierInScope,
3545                                              CXXScopeSpec &SS);
3546 
3547   TypeSourceInfo *TransformTSIInObjectScope(TypeLoc TL, QualType ObjectType,
3548                                             NamedDecl *FirstQualifierInScope,
3549                                             CXXScopeSpec &SS);
3550 
3551   QualType TransformDependentNameType(TypeLocBuilder &TLB,
3552                                       DependentNameTypeLoc TL,
3553                                       bool DeducibleTSTContext);
3554 };
3555 
3556 template <typename Derived>
3557 StmtResult TreeTransform<Derived>::TransformStmt(Stmt *S, StmtDiscardKind SDK) {
3558   if (!S)
3559     return S;
3560 
3561   switch (S->getStmtClass()) {
3562   case Stmt::NoStmtClass: break;
3563 
3564   // Transform individual statement nodes
3565   // Pass SDK into statements that can produce a value
3566 #define STMT(Node, Parent)                                              \
3567   case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(S));
3568 #define VALUESTMT(Node, Parent)                                         \
3569   case Stmt::Node##Class:                                               \
3570     return getDerived().Transform##Node(cast<Node>(S), SDK);
3571 #define ABSTRACT_STMT(Node)
3572 #define EXPR(Node, Parent)
3573 #include "clang/AST/StmtNodes.inc"
3574 
3575   // Transform expressions by calling TransformExpr.
3576 #define STMT(Node, Parent)
3577 #define ABSTRACT_STMT(Stmt)
3578 #define EXPR(Node, Parent) case Stmt::Node##Class:
3579 #include "clang/AST/StmtNodes.inc"
3580     {
3581       ExprResult E = getDerived().TransformExpr(cast<Expr>(S));
3582 
3583       if (SDK == SDK_StmtExprResult)
3584         E = getSema().ActOnStmtExprResult(E);
3585       return getSema().ActOnExprStmt(E, SDK == SDK_Discarded);
3586     }
3587   }
3588 
3589   return S;
3590 }
3591 
3592 template<typename Derived>
3593 OMPClause *TreeTransform<Derived>::TransformOMPClause(OMPClause *S) {
3594   if (!S)
3595     return S;
3596 
3597   switch (S->getClauseKind()) {
3598   default: break;
3599   // Transform individual clause nodes
3600 #define OMP_CLAUSE_CLASS(Enum, Str, Class) \
3601   case Enum:                                                                   \
3602     return getDerived().Transform ## Class(cast<Class>(S));
3603 #include "llvm/Frontend/OpenMP/OMPKinds.def"
3604   }
3605 
3606   return S;
3607 }
3608 
3609 
3610 template<typename Derived>
3611 ExprResult TreeTransform<Derived>::TransformExpr(Expr *E) {
3612   if (!E)
3613     return E;
3614 
3615   switch (E->getStmtClass()) {
3616     case Stmt::NoStmtClass: break;
3617 #define STMT(Node, Parent) case Stmt::Node##Class: break;
3618 #define ABSTRACT_STMT(Stmt)
3619 #define EXPR(Node, Parent)                                              \
3620     case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(E));
3621 #include "clang/AST/StmtNodes.inc"
3622   }
3623 
3624   return E;
3625 }
3626 
3627 template<typename Derived>
3628 ExprResult TreeTransform<Derived>::TransformInitializer(Expr *Init,
3629                                                         bool NotCopyInit) {
3630   // Initializers are instantiated like expressions, except that various outer
3631   // layers are stripped.
3632   if (!Init)
3633     return Init;
3634 
3635   if (auto *FE = dyn_cast<FullExpr>(Init))
3636     Init = FE->getSubExpr();
3637 
3638   if (auto *AIL = dyn_cast<ArrayInitLoopExpr>(Init))
3639     Init = AIL->getCommonExpr();
3640 
3641   if (MaterializeTemporaryExpr *MTE = dyn_cast<MaterializeTemporaryExpr>(Init))
3642     Init = MTE->getSubExpr();
3643 
3644   while (CXXBindTemporaryExpr *Binder = dyn_cast<CXXBindTemporaryExpr>(Init))
3645     Init = Binder->getSubExpr();
3646 
3647   if (ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(Init))
3648     Init = ICE->getSubExprAsWritten();
3649 
3650   if (CXXStdInitializerListExpr *ILE =
3651           dyn_cast<CXXStdInitializerListExpr>(Init))
3652     return TransformInitializer(ILE->getSubExpr(), NotCopyInit);
3653 
3654   // If this is copy-initialization, we only need to reconstruct
3655   // InitListExprs. Other forms of copy-initialization will be a no-op if
3656   // the initializer is already the right type.
3657   CXXConstructExpr *Construct = dyn_cast<CXXConstructExpr>(Init);
3658   if (!NotCopyInit && !(Construct && Construct->isListInitialization()))
3659     return getDerived().TransformExpr(Init);
3660 
3661   // Revert value-initialization back to empty parens.
3662   if (CXXScalarValueInitExpr *VIE = dyn_cast<CXXScalarValueInitExpr>(Init)) {
3663     SourceRange Parens = VIE->getSourceRange();
3664     return getDerived().RebuildParenListExpr(Parens.getBegin(), None,
3665                                              Parens.getEnd());
3666   }
3667 
3668   // FIXME: We shouldn't build ImplicitValueInitExprs for direct-initialization.
3669   if (isa<ImplicitValueInitExpr>(Init))
3670     return getDerived().RebuildParenListExpr(SourceLocation(), None,
3671                                              SourceLocation());
3672 
3673   // Revert initialization by constructor back to a parenthesized or braced list
3674   // of expressions. Any other form of initializer can just be reused directly.
3675   if (!Construct || isa<CXXTemporaryObjectExpr>(Construct))
3676     return getDerived().TransformExpr(Init);
3677 
3678   // If the initialization implicitly converted an initializer list to a
3679   // std::initializer_list object, unwrap the std::initializer_list too.
3680   if (Construct && Construct->isStdInitListInitialization())
3681     return TransformInitializer(Construct->getArg(0), NotCopyInit);
3682 
3683   // Enter a list-init context if this was list initialization.
3684   EnterExpressionEvaluationContext Context(
3685       getSema(), EnterExpressionEvaluationContext::InitList,
3686       Construct->isListInitialization());
3687 
3688   SmallVector<Expr*, 8> NewArgs;
3689   bool ArgChanged = false;
3690   if (getDerived().TransformExprs(Construct->getArgs(), Construct->getNumArgs(),
3691                                   /*IsCall*/true, NewArgs, &ArgChanged))
3692     return ExprError();
3693 
3694   // If this was list initialization, revert to syntactic list form.
3695   if (Construct->isListInitialization())
3696     return getDerived().RebuildInitList(Construct->getBeginLoc(), NewArgs,
3697                                         Construct->getEndLoc());
3698 
3699   // Build a ParenListExpr to represent anything else.
3700   SourceRange Parens = Construct->getParenOrBraceRange();
3701   if (Parens.isInvalid()) {
3702     // This was a variable declaration's initialization for which no initializer
3703     // was specified.
3704     assert(NewArgs.empty() &&
3705            "no parens or braces but have direct init with arguments?");
3706     return ExprEmpty();
3707   }
3708   return getDerived().RebuildParenListExpr(Parens.getBegin(), NewArgs,
3709                                            Parens.getEnd());
3710 }
3711 
3712 template<typename Derived>
3713 bool TreeTransform<Derived>::TransformExprs(Expr *const *Inputs,
3714                                             unsigned NumInputs,
3715                                             bool IsCall,
3716                                       SmallVectorImpl<Expr *> &Outputs,
3717                                             bool *ArgChanged) {
3718   for (unsigned I = 0; I != NumInputs; ++I) {
3719     // If requested, drop call arguments that need to be dropped.
3720     if (IsCall && getDerived().DropCallArgument(Inputs[I])) {
3721       if (ArgChanged)
3722         *ArgChanged = true;
3723 
3724       break;
3725     }
3726 
3727     if (PackExpansionExpr *Expansion = dyn_cast<PackExpansionExpr>(Inputs[I])) {
3728       Expr *Pattern = Expansion->getPattern();
3729 
3730       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
3731       getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
3732       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
3733 
3734       // Determine whether the set of unexpanded parameter packs can and should
3735       // be expanded.
3736       bool Expand = true;
3737       bool RetainExpansion = false;
3738       Optional<unsigned> OrigNumExpansions = Expansion->getNumExpansions();
3739       Optional<unsigned> NumExpansions = OrigNumExpansions;
3740       if (getDerived().TryExpandParameterPacks(Expansion->getEllipsisLoc(),
3741                                                Pattern->getSourceRange(),
3742                                                Unexpanded,
3743                                                Expand, RetainExpansion,
3744                                                NumExpansions))
3745         return true;
3746 
3747       if (!Expand) {
3748         // The transform has determined that we should perform a simple
3749         // transformation on the pack expansion, producing another pack
3750         // expansion.
3751         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
3752         ExprResult OutPattern = getDerived().TransformExpr(Pattern);
3753         if (OutPattern.isInvalid())
3754           return true;
3755 
3756         ExprResult Out = getDerived().RebuildPackExpansion(OutPattern.get(),
3757                                                 Expansion->getEllipsisLoc(),
3758                                                            NumExpansions);
3759         if (Out.isInvalid())
3760           return true;
3761 
3762         if (ArgChanged)
3763           *ArgChanged = true;
3764         Outputs.push_back(Out.get());
3765         continue;
3766       }
3767 
3768       // Record right away that the argument was changed.  This needs
3769       // to happen even if the array expands to nothing.
3770       if (ArgChanged) *ArgChanged = true;
3771 
3772       // The transform has determined that we should perform an elementwise
3773       // expansion of the pattern. Do so.
3774       for (unsigned I = 0; I != *NumExpansions; ++I) {
3775         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
3776         ExprResult Out = getDerived().TransformExpr(Pattern);
3777         if (Out.isInvalid())
3778           return true;
3779 
3780         if (Out.get()->containsUnexpandedParameterPack()) {
3781           Out = getDerived().RebuildPackExpansion(
3782               Out.get(), Expansion->getEllipsisLoc(), OrigNumExpansions);
3783           if (Out.isInvalid())
3784             return true;
3785         }
3786 
3787         Outputs.push_back(Out.get());
3788       }
3789 
3790       // If we're supposed to retain a pack expansion, do so by temporarily
3791       // forgetting the partially-substituted parameter pack.
3792       if (RetainExpansion) {
3793         ForgetPartiallySubstitutedPackRAII Forget(getDerived());
3794 
3795         ExprResult Out = getDerived().TransformExpr(Pattern);
3796         if (Out.isInvalid())
3797           return true;
3798 
3799         Out = getDerived().RebuildPackExpansion(
3800             Out.get(), Expansion->getEllipsisLoc(), OrigNumExpansions);
3801         if (Out.isInvalid())
3802           return true;
3803 
3804         Outputs.push_back(Out.get());
3805       }
3806 
3807       continue;
3808     }
3809 
3810     ExprResult Result =
3811       IsCall ? getDerived().TransformInitializer(Inputs[I], /*DirectInit*/false)
3812              : getDerived().TransformExpr(Inputs[I]);
3813     if (Result.isInvalid())
3814       return true;
3815 
3816     if (Result.get() != Inputs[I] && ArgChanged)
3817       *ArgChanged = true;
3818 
3819     Outputs.push_back(Result.get());
3820   }
3821 
3822   return false;
3823 }
3824 
3825 template <typename Derived>
3826 Sema::ConditionResult TreeTransform<Derived>::TransformCondition(
3827     SourceLocation Loc, VarDecl *Var, Expr *Expr, Sema::ConditionKind Kind) {
3828   if (Var) {
3829     VarDecl *ConditionVar = cast_or_null<VarDecl>(
3830         getDerived().TransformDefinition(Var->getLocation(), Var));
3831 
3832     if (!ConditionVar)
3833       return Sema::ConditionError();
3834 
3835     return getSema().ActOnConditionVariable(ConditionVar, Loc, Kind);
3836   }
3837 
3838   if (Expr) {
3839     ExprResult CondExpr = getDerived().TransformExpr(Expr);
3840 
3841     if (CondExpr.isInvalid())
3842       return Sema::ConditionError();
3843 
3844     return getSema().ActOnCondition(nullptr, Loc, CondExpr.get(), Kind);
3845   }
3846 
3847   return Sema::ConditionResult();
3848 }
3849 
3850 template<typename Derived>
3851 NestedNameSpecifierLoc
3852 TreeTransform<Derived>::TransformNestedNameSpecifierLoc(
3853                                                     NestedNameSpecifierLoc NNS,
3854                                                      QualType ObjectType,
3855                                              NamedDecl *FirstQualifierInScope) {
3856   SmallVector<NestedNameSpecifierLoc, 4> Qualifiers;
3857   for (NestedNameSpecifierLoc Qualifier = NNS; Qualifier;
3858        Qualifier = Qualifier.getPrefix())
3859     Qualifiers.push_back(Qualifier);
3860 
3861   CXXScopeSpec SS;
3862   while (!Qualifiers.empty()) {
3863     NestedNameSpecifierLoc Q = Qualifiers.pop_back_val();
3864     NestedNameSpecifier *QNNS = Q.getNestedNameSpecifier();
3865 
3866     switch (QNNS->getKind()) {
3867     case NestedNameSpecifier::Identifier: {
3868       Sema::NestedNameSpecInfo IdInfo(QNNS->getAsIdentifier(),
3869                           Q.getLocalBeginLoc(), Q.getLocalEndLoc(), ObjectType);
3870       if (SemaRef.BuildCXXNestedNameSpecifier(/*Scope=*/nullptr, IdInfo, false,
3871                                               SS, FirstQualifierInScope, false))
3872         return NestedNameSpecifierLoc();
3873     }
3874       break;
3875 
3876     case NestedNameSpecifier::Namespace: {
3877       NamespaceDecl *NS
3878         = cast_or_null<NamespaceDecl>(
3879                                     getDerived().TransformDecl(
3880                                                           Q.getLocalBeginLoc(),
3881                                                        QNNS->getAsNamespace()));
3882       SS.Extend(SemaRef.Context, NS, Q.getLocalBeginLoc(), Q.getLocalEndLoc());
3883       break;
3884     }
3885 
3886     case NestedNameSpecifier::NamespaceAlias: {
3887       NamespaceAliasDecl *Alias
3888         = cast_or_null<NamespaceAliasDecl>(
3889                       getDerived().TransformDecl(Q.getLocalBeginLoc(),
3890                                                  QNNS->getAsNamespaceAlias()));
3891       SS.Extend(SemaRef.Context, Alias, Q.getLocalBeginLoc(),
3892                 Q.getLocalEndLoc());
3893       break;
3894     }
3895 
3896     case NestedNameSpecifier::Global:
3897       // There is no meaningful transformation that one could perform on the
3898       // global scope.
3899       SS.MakeGlobal(SemaRef.Context, Q.getBeginLoc());
3900       break;
3901 
3902     case NestedNameSpecifier::Super: {
3903       CXXRecordDecl *RD =
3904           cast_or_null<CXXRecordDecl>(getDerived().TransformDecl(
3905               SourceLocation(), QNNS->getAsRecordDecl()));
3906       SS.MakeSuper(SemaRef.Context, RD, Q.getBeginLoc(), Q.getEndLoc());
3907       break;
3908     }
3909 
3910     case NestedNameSpecifier::TypeSpecWithTemplate:
3911     case NestedNameSpecifier::TypeSpec: {
3912       TypeLoc TL = TransformTypeInObjectScope(Q.getTypeLoc(), ObjectType,
3913                                               FirstQualifierInScope, SS);
3914 
3915       if (!TL)
3916         return NestedNameSpecifierLoc();
3917 
3918       if (TL.getType()->isDependentType() || TL.getType()->isRecordType() ||
3919           (SemaRef.getLangOpts().CPlusPlus11 &&
3920            TL.getType()->isEnumeralType())) {
3921         assert(!TL.getType().hasLocalQualifiers() &&
3922                "Can't get cv-qualifiers here");
3923         if (TL.getType()->isEnumeralType())
3924           SemaRef.Diag(TL.getBeginLoc(),
3925                        diag::warn_cxx98_compat_enum_nested_name_spec);
3926         SS.Extend(SemaRef.Context, /*FIXME:*/SourceLocation(), TL,
3927                   Q.getLocalEndLoc());
3928         break;
3929       }
3930       // If the nested-name-specifier is an invalid type def, don't emit an
3931       // error because a previous error should have already been emitted.
3932       TypedefTypeLoc TTL = TL.getAs<TypedefTypeLoc>();
3933       if (!TTL || !TTL.getTypedefNameDecl()->isInvalidDecl()) {
3934         SemaRef.Diag(TL.getBeginLoc(), diag::err_nested_name_spec_non_tag)
3935           << TL.getType() << SS.getRange();
3936       }
3937       return NestedNameSpecifierLoc();
3938     }
3939     }
3940 
3941     // The qualifier-in-scope and object type only apply to the leftmost entity.
3942     FirstQualifierInScope = nullptr;
3943     ObjectType = QualType();
3944   }
3945 
3946   // Don't rebuild the nested-name-specifier if we don't have to.
3947   if (SS.getScopeRep() == NNS.getNestedNameSpecifier() &&
3948       !getDerived().AlwaysRebuild())
3949     return NNS;
3950 
3951   // If we can re-use the source-location data from the original
3952   // nested-name-specifier, do so.
3953   if (SS.location_size() == NNS.getDataLength() &&
3954       memcmp(SS.location_data(), NNS.getOpaqueData(), SS.location_size()) == 0)
3955     return NestedNameSpecifierLoc(SS.getScopeRep(), NNS.getOpaqueData());
3956 
3957   // Allocate new nested-name-specifier location information.
3958   return SS.getWithLocInContext(SemaRef.Context);
3959 }
3960 
3961 template<typename Derived>
3962 DeclarationNameInfo
3963 TreeTransform<Derived>
3964 ::TransformDeclarationNameInfo(const DeclarationNameInfo &NameInfo) {
3965   DeclarationName Name = NameInfo.getName();
3966   if (!Name)
3967     return DeclarationNameInfo();
3968 
3969   switch (Name.getNameKind()) {
3970   case DeclarationName::Identifier:
3971   case DeclarationName::ObjCZeroArgSelector:
3972   case DeclarationName::ObjCOneArgSelector:
3973   case DeclarationName::ObjCMultiArgSelector:
3974   case DeclarationName::CXXOperatorName:
3975   case DeclarationName::CXXLiteralOperatorName:
3976   case DeclarationName::CXXUsingDirective:
3977     return NameInfo;
3978 
3979   case DeclarationName::CXXDeductionGuideName: {
3980     TemplateDecl *OldTemplate = Name.getCXXDeductionGuideTemplate();
3981     TemplateDecl *NewTemplate = cast_or_null<TemplateDecl>(
3982         getDerived().TransformDecl(NameInfo.getLoc(), OldTemplate));
3983     if (!NewTemplate)
3984       return DeclarationNameInfo();
3985 
3986     DeclarationNameInfo NewNameInfo(NameInfo);
3987     NewNameInfo.setName(
3988         SemaRef.Context.DeclarationNames.getCXXDeductionGuideName(NewTemplate));
3989     return NewNameInfo;
3990   }
3991 
3992   case DeclarationName::CXXConstructorName:
3993   case DeclarationName::CXXDestructorName:
3994   case DeclarationName::CXXConversionFunctionName: {
3995     TypeSourceInfo *NewTInfo;
3996     CanQualType NewCanTy;
3997     if (TypeSourceInfo *OldTInfo = NameInfo.getNamedTypeInfo()) {
3998       NewTInfo = getDerived().TransformType(OldTInfo);
3999       if (!NewTInfo)
4000         return DeclarationNameInfo();
4001       NewCanTy = SemaRef.Context.getCanonicalType(NewTInfo->getType());
4002     }
4003     else {
4004       NewTInfo = nullptr;
4005       TemporaryBase Rebase(*this, NameInfo.getLoc(), Name);
4006       QualType NewT = getDerived().TransformType(Name.getCXXNameType());
4007       if (NewT.isNull())
4008         return DeclarationNameInfo();
4009       NewCanTy = SemaRef.Context.getCanonicalType(NewT);
4010     }
4011 
4012     DeclarationName NewName
4013       = SemaRef.Context.DeclarationNames.getCXXSpecialName(Name.getNameKind(),
4014                                                            NewCanTy);
4015     DeclarationNameInfo NewNameInfo(NameInfo);
4016     NewNameInfo.setName(NewName);
4017     NewNameInfo.setNamedTypeInfo(NewTInfo);
4018     return NewNameInfo;
4019   }
4020   }
4021 
4022   llvm_unreachable("Unknown name kind.");
4023 }
4024 
4025 template<typename Derived>
4026 TemplateName
4027 TreeTransform<Derived>::TransformTemplateName(CXXScopeSpec &SS,
4028                                               TemplateName Name,
4029                                               SourceLocation NameLoc,
4030                                               QualType ObjectType,
4031                                               NamedDecl *FirstQualifierInScope,
4032                                               bool AllowInjectedClassName) {
4033   if (QualifiedTemplateName *QTN = Name.getAsQualifiedTemplateName()) {
4034     TemplateDecl *Template = QTN->getTemplateDecl();
4035     assert(Template && "qualified template name must refer to a template");
4036 
4037     TemplateDecl *TransTemplate
4038       = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc,
4039                                                               Template));
4040     if (!TransTemplate)
4041       return TemplateName();
4042 
4043     if (!getDerived().AlwaysRebuild() &&
4044         SS.getScopeRep() == QTN->getQualifier() &&
4045         TransTemplate == Template)
4046       return Name;
4047 
4048     return getDerived().RebuildTemplateName(SS, QTN->hasTemplateKeyword(),
4049                                             TransTemplate);
4050   }
4051 
4052   if (DependentTemplateName *DTN = Name.getAsDependentTemplateName()) {
4053     if (SS.getScopeRep()) {
4054       // These apply to the scope specifier, not the template.
4055       ObjectType = QualType();
4056       FirstQualifierInScope = nullptr;
4057     }
4058 
4059     if (!getDerived().AlwaysRebuild() &&
4060         SS.getScopeRep() == DTN->getQualifier() &&
4061         ObjectType.isNull())
4062       return Name;
4063 
4064     // FIXME: Preserve the location of the "template" keyword.
4065     SourceLocation TemplateKWLoc = NameLoc;
4066 
4067     if (DTN->isIdentifier()) {
4068       return getDerived().RebuildTemplateName(SS,
4069                                               TemplateKWLoc,
4070                                               *DTN->getIdentifier(),
4071                                               NameLoc,
4072                                               ObjectType,
4073                                               FirstQualifierInScope,
4074                                               AllowInjectedClassName);
4075     }
4076 
4077     return getDerived().RebuildTemplateName(SS, TemplateKWLoc,
4078                                             DTN->getOperator(), NameLoc,
4079                                             ObjectType, AllowInjectedClassName);
4080   }
4081 
4082   if (TemplateDecl *Template = Name.getAsTemplateDecl()) {
4083     TemplateDecl *TransTemplate
4084       = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc,
4085                                                               Template));
4086     if (!TransTemplate)
4087       return TemplateName();
4088 
4089     if (!getDerived().AlwaysRebuild() &&
4090         TransTemplate == Template)
4091       return Name;
4092 
4093     return TemplateName(TransTemplate);
4094   }
4095 
4096   if (SubstTemplateTemplateParmPackStorage *SubstPack
4097       = Name.getAsSubstTemplateTemplateParmPack()) {
4098     TemplateTemplateParmDecl *TransParam
4099     = cast_or_null<TemplateTemplateParmDecl>(
4100             getDerived().TransformDecl(NameLoc, SubstPack->getParameterPack()));
4101     if (!TransParam)
4102       return TemplateName();
4103 
4104     if (!getDerived().AlwaysRebuild() &&
4105         TransParam == SubstPack->getParameterPack())
4106       return Name;
4107 
4108     return getDerived().RebuildTemplateName(TransParam,
4109                                             SubstPack->getArgumentPack());
4110   }
4111 
4112   // These should be getting filtered out before they reach the AST.
4113   llvm_unreachable("overloaded function decl survived to here");
4114 }
4115 
4116 template<typename Derived>
4117 void TreeTransform<Derived>::InventTemplateArgumentLoc(
4118                                          const TemplateArgument &Arg,
4119                                          TemplateArgumentLoc &Output) {
4120   Output = getSema().getTrivialTemplateArgumentLoc(
4121       Arg, QualType(), getDerived().getBaseLocation());
4122 }
4123 
4124 template<typename Derived>
4125 bool TreeTransform<Derived>::TransformTemplateArgument(
4126                                          const TemplateArgumentLoc &Input,
4127                                          TemplateArgumentLoc &Output, bool Uneval) {
4128   const TemplateArgument &Arg = Input.getArgument();
4129   switch (Arg.getKind()) {
4130   case TemplateArgument::Null:
4131   case TemplateArgument::Pack:
4132     llvm_unreachable("Unexpected TemplateArgument");
4133 
4134   case TemplateArgument::Integral:
4135   case TemplateArgument::NullPtr:
4136   case TemplateArgument::Declaration: {
4137     // Transform a resolved template argument straight to a resolved template
4138     // argument. We get here when substituting into an already-substituted
4139     // template type argument during concept satisfaction checking.
4140     QualType T = Arg.getNonTypeTemplateArgumentType();
4141     QualType NewT = getDerived().TransformType(T);
4142     if (NewT.isNull())
4143       return true;
4144 
4145     ValueDecl *D = Arg.getKind() == TemplateArgument::Declaration
4146                        ? Arg.getAsDecl()
4147                        : nullptr;
4148     ValueDecl *NewD = D ? cast_or_null<ValueDecl>(getDerived().TransformDecl(
4149                               getDerived().getBaseLocation(), D))
4150                         : nullptr;
4151     if (D && !NewD)
4152       return true;
4153 
4154     if (NewT == T && D == NewD)
4155       Output = Input;
4156     else if (Arg.getKind() == TemplateArgument::Integral)
4157       Output = TemplateArgumentLoc(
4158           TemplateArgument(getSema().Context, Arg.getAsIntegral(), NewT),
4159           TemplateArgumentLocInfo());
4160     else if (Arg.getKind() == TemplateArgument::NullPtr)
4161       Output = TemplateArgumentLoc(TemplateArgument(NewT, /*IsNullPtr=*/true),
4162                                    TemplateArgumentLocInfo());
4163     else
4164       Output = TemplateArgumentLoc(TemplateArgument(NewD, NewT),
4165                                    TemplateArgumentLocInfo());
4166 
4167     return false;
4168   }
4169 
4170   case TemplateArgument::Type: {
4171     TypeSourceInfo *DI = Input.getTypeSourceInfo();
4172     if (!DI)
4173       DI = InventTypeSourceInfo(Input.getArgument().getAsType());
4174 
4175     DI = getDerived().TransformType(DI);
4176     if (!DI) return true;
4177 
4178     Output = TemplateArgumentLoc(TemplateArgument(DI->getType()), DI);
4179     return false;
4180   }
4181 
4182   case TemplateArgument::Template: {
4183     NestedNameSpecifierLoc QualifierLoc = Input.getTemplateQualifierLoc();
4184     if (QualifierLoc) {
4185       QualifierLoc = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc);
4186       if (!QualifierLoc)
4187         return true;
4188     }
4189 
4190     CXXScopeSpec SS;
4191     SS.Adopt(QualifierLoc);
4192     TemplateName Template
4193       = getDerived().TransformTemplateName(SS, Arg.getAsTemplate(),
4194                                            Input.getTemplateNameLoc());
4195     if (Template.isNull())
4196       return true;
4197 
4198     Output = TemplateArgumentLoc(TemplateArgument(Template), QualifierLoc,
4199                                  Input.getTemplateNameLoc());
4200     return false;
4201   }
4202 
4203   case TemplateArgument::TemplateExpansion:
4204     llvm_unreachable("Caller should expand pack expansions");
4205 
4206   case TemplateArgument::Expression: {
4207     // Template argument expressions are constant expressions.
4208     EnterExpressionEvaluationContext Unevaluated(
4209         getSema(),
4210         Uneval ? Sema::ExpressionEvaluationContext::Unevaluated
4211                : Sema::ExpressionEvaluationContext::ConstantEvaluated,
4212         /*LambdaContextDecl=*/nullptr, /*ExprContext=*/
4213         Sema::ExpressionEvaluationContextRecord::EK_TemplateArgument);
4214 
4215     Expr *InputExpr = Input.getSourceExpression();
4216     if (!InputExpr) InputExpr = Input.getArgument().getAsExpr();
4217 
4218     ExprResult E = getDerived().TransformExpr(InputExpr);
4219     E = SemaRef.ActOnConstantExpression(E);
4220     if (E.isInvalid()) return true;
4221     Output = TemplateArgumentLoc(TemplateArgument(E.get()), E.get());
4222     return false;
4223   }
4224   }
4225 
4226   // Work around bogus GCC warning
4227   return true;
4228 }
4229 
4230 /// Iterator adaptor that invents template argument location information
4231 /// for each of the template arguments in its underlying iterator.
4232 template<typename Derived, typename InputIterator>
4233 class TemplateArgumentLocInventIterator {
4234   TreeTransform<Derived> &Self;
4235   InputIterator Iter;
4236 
4237 public:
4238   typedef TemplateArgumentLoc value_type;
4239   typedef TemplateArgumentLoc reference;
4240   typedef typename std::iterator_traits<InputIterator>::difference_type
4241     difference_type;
4242   typedef std::input_iterator_tag iterator_category;
4243 
4244   class pointer {
4245     TemplateArgumentLoc Arg;
4246 
4247   public:
4248     explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { }
4249 
4250     const TemplateArgumentLoc *operator->() const { return &Arg; }
4251   };
4252 
4253   TemplateArgumentLocInventIterator() { }
4254 
4255   explicit TemplateArgumentLocInventIterator(TreeTransform<Derived> &Self,
4256                                              InputIterator Iter)
4257     : Self(Self), Iter(Iter) { }
4258 
4259   TemplateArgumentLocInventIterator &operator++() {
4260     ++Iter;
4261     return *this;
4262   }
4263 
4264   TemplateArgumentLocInventIterator operator++(int) {
4265     TemplateArgumentLocInventIterator Old(*this);
4266     ++(*this);
4267     return Old;
4268   }
4269 
4270   reference operator*() const {
4271     TemplateArgumentLoc Result;
4272     Self.InventTemplateArgumentLoc(*Iter, Result);
4273     return Result;
4274   }
4275 
4276   pointer operator->() const { return pointer(**this); }
4277 
4278   friend bool operator==(const TemplateArgumentLocInventIterator &X,
4279                          const TemplateArgumentLocInventIterator &Y) {
4280     return X.Iter == Y.Iter;
4281   }
4282 
4283   friend bool operator!=(const TemplateArgumentLocInventIterator &X,
4284                          const TemplateArgumentLocInventIterator &Y) {
4285     return X.Iter != Y.Iter;
4286   }
4287 };
4288 
4289 template<typename Derived>
4290 template<typename InputIterator>
4291 bool TreeTransform<Derived>::TransformTemplateArguments(
4292     InputIterator First, InputIterator Last, TemplateArgumentListInfo &Outputs,
4293     bool Uneval) {
4294   for (; First != Last; ++First) {
4295     TemplateArgumentLoc Out;
4296     TemplateArgumentLoc In = *First;
4297 
4298     if (In.getArgument().getKind() == TemplateArgument::Pack) {
4299       // Unpack argument packs, which we translate them into separate
4300       // arguments.
4301       // FIXME: We could do much better if we could guarantee that the
4302       // TemplateArgumentLocInfo for the pack expansion would be usable for
4303       // all of the template arguments in the argument pack.
4304       typedef TemplateArgumentLocInventIterator<Derived,
4305                                                 TemplateArgument::pack_iterator>
4306         PackLocIterator;
4307       if (TransformTemplateArguments(PackLocIterator(*this,
4308                                                  In.getArgument().pack_begin()),
4309                                      PackLocIterator(*this,
4310                                                    In.getArgument().pack_end()),
4311                                      Outputs, Uneval))
4312         return true;
4313 
4314       continue;
4315     }
4316 
4317     if (In.getArgument().isPackExpansion()) {
4318       // We have a pack expansion, for which we will be substituting into
4319       // the pattern.
4320       SourceLocation Ellipsis;
4321       Optional<unsigned> OrigNumExpansions;
4322       TemplateArgumentLoc Pattern
4323         = getSema().getTemplateArgumentPackExpansionPattern(
4324               In, Ellipsis, OrigNumExpansions);
4325 
4326       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
4327       getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
4328       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
4329 
4330       // Determine whether the set of unexpanded parameter packs can and should
4331       // be expanded.
4332       bool Expand = true;
4333       bool RetainExpansion = false;
4334       Optional<unsigned> NumExpansions = OrigNumExpansions;
4335       if (getDerived().TryExpandParameterPacks(Ellipsis,
4336                                                Pattern.getSourceRange(),
4337                                                Unexpanded,
4338                                                Expand,
4339                                                RetainExpansion,
4340                                                NumExpansions))
4341         return true;
4342 
4343       if (!Expand) {
4344         // The transform has determined that we should perform a simple
4345         // transformation on the pack expansion, producing another pack
4346         // expansion.
4347         TemplateArgumentLoc OutPattern;
4348         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
4349         if (getDerived().TransformTemplateArgument(Pattern, OutPattern, Uneval))
4350           return true;
4351 
4352         Out = getDerived().RebuildPackExpansion(OutPattern, Ellipsis,
4353                                                 NumExpansions);
4354         if (Out.getArgument().isNull())
4355           return true;
4356 
4357         Outputs.addArgument(Out);
4358         continue;
4359       }
4360 
4361       // The transform has determined that we should perform an elementwise
4362       // expansion of the pattern. Do so.
4363       for (unsigned I = 0; I != *NumExpansions; ++I) {
4364         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
4365 
4366         if (getDerived().TransformTemplateArgument(Pattern, Out, Uneval))
4367           return true;
4368 
4369         if (Out.getArgument().containsUnexpandedParameterPack()) {
4370           Out = getDerived().RebuildPackExpansion(Out, Ellipsis,
4371                                                   OrigNumExpansions);
4372           if (Out.getArgument().isNull())
4373             return true;
4374         }
4375 
4376         Outputs.addArgument(Out);
4377       }
4378 
4379       // If we're supposed to retain a pack expansion, do so by temporarily
4380       // forgetting the partially-substituted parameter pack.
4381       if (RetainExpansion) {
4382         ForgetPartiallySubstitutedPackRAII Forget(getDerived());
4383 
4384         if (getDerived().TransformTemplateArgument(Pattern, Out, Uneval))
4385           return true;
4386 
4387         Out = getDerived().RebuildPackExpansion(Out, Ellipsis,
4388                                                 OrigNumExpansions);
4389         if (Out.getArgument().isNull())
4390           return true;
4391 
4392         Outputs.addArgument(Out);
4393       }
4394 
4395       continue;
4396     }
4397 
4398     // The simple case:
4399     if (getDerived().TransformTemplateArgument(In, Out, Uneval))
4400       return true;
4401 
4402     Outputs.addArgument(Out);
4403   }
4404 
4405   return false;
4406 
4407 }
4408 
4409 //===----------------------------------------------------------------------===//
4410 // Type transformation
4411 //===----------------------------------------------------------------------===//
4412 
4413 template<typename Derived>
4414 QualType TreeTransform<Derived>::TransformType(QualType T) {
4415   if (getDerived().AlreadyTransformed(T))
4416     return T;
4417 
4418   // Temporary workaround.  All of these transformations should
4419   // eventually turn into transformations on TypeLocs.
4420   TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(T,
4421                                                 getDerived().getBaseLocation());
4422 
4423   TypeSourceInfo *NewDI = getDerived().TransformType(DI);
4424 
4425   if (!NewDI)
4426     return QualType();
4427 
4428   return NewDI->getType();
4429 }
4430 
4431 template<typename Derived>
4432 TypeSourceInfo *TreeTransform<Derived>::TransformType(TypeSourceInfo *DI) {
4433   // Refine the base location to the type's location.
4434   TemporaryBase Rebase(*this, DI->getTypeLoc().getBeginLoc(),
4435                        getDerived().getBaseEntity());
4436   if (getDerived().AlreadyTransformed(DI->getType()))
4437     return DI;
4438 
4439   TypeLocBuilder TLB;
4440 
4441   TypeLoc TL = DI->getTypeLoc();
4442   TLB.reserve(TL.getFullDataSize());
4443 
4444   QualType Result = getDerived().TransformType(TLB, TL);
4445   if (Result.isNull())
4446     return nullptr;
4447 
4448   return TLB.getTypeSourceInfo(SemaRef.Context, Result);
4449 }
4450 
4451 template<typename Derived>
4452 QualType
4453 TreeTransform<Derived>::TransformType(TypeLocBuilder &TLB, TypeLoc T) {
4454   switch (T.getTypeLocClass()) {
4455 #define ABSTRACT_TYPELOC(CLASS, PARENT)
4456 #define TYPELOC(CLASS, PARENT)                                                 \
4457   case TypeLoc::CLASS:                                                         \
4458     return getDerived().Transform##CLASS##Type(TLB,                            \
4459                                                T.castAs<CLASS##TypeLoc>());
4460 #include "clang/AST/TypeLocNodes.def"
4461   }
4462 
4463   llvm_unreachable("unhandled type loc!");
4464 }
4465 
4466 template<typename Derived>
4467 QualType TreeTransform<Derived>::TransformTypeWithDeducedTST(QualType T) {
4468   if (!isa<DependentNameType>(T))
4469     return TransformType(T);
4470 
4471   if (getDerived().AlreadyTransformed(T))
4472     return T;
4473   TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(T,
4474                                                 getDerived().getBaseLocation());
4475   TypeSourceInfo *NewDI = getDerived().TransformTypeWithDeducedTST(DI);
4476   return NewDI ? NewDI->getType() : QualType();
4477 }
4478 
4479 template<typename Derived>
4480 TypeSourceInfo *
4481 TreeTransform<Derived>::TransformTypeWithDeducedTST(TypeSourceInfo *DI) {
4482   if (!isa<DependentNameType>(DI->getType()))
4483     return TransformType(DI);
4484 
4485   // Refine the base location to the type's location.
4486   TemporaryBase Rebase(*this, DI->getTypeLoc().getBeginLoc(),
4487                        getDerived().getBaseEntity());
4488   if (getDerived().AlreadyTransformed(DI->getType()))
4489     return DI;
4490 
4491   TypeLocBuilder TLB;
4492 
4493   TypeLoc TL = DI->getTypeLoc();
4494   TLB.reserve(TL.getFullDataSize());
4495 
4496   auto QTL = TL.getAs<QualifiedTypeLoc>();
4497   if (QTL)
4498     TL = QTL.getUnqualifiedLoc();
4499 
4500   auto DNTL = TL.castAs<DependentNameTypeLoc>();
4501 
4502   QualType Result = getDerived().TransformDependentNameType(
4503       TLB, DNTL, /*DeducedTSTContext*/true);
4504   if (Result.isNull())
4505     return nullptr;
4506 
4507   if (QTL) {
4508     Result = getDerived().RebuildQualifiedType(Result, QTL);
4509     if (Result.isNull())
4510       return nullptr;
4511     TLB.TypeWasModifiedSafely(Result);
4512   }
4513 
4514   return TLB.getTypeSourceInfo(SemaRef.Context, Result);
4515 }
4516 
4517 template<typename Derived>
4518 QualType
4519 TreeTransform<Derived>::TransformQualifiedType(TypeLocBuilder &TLB,
4520                                                QualifiedTypeLoc T) {
4521   QualType Result = getDerived().TransformType(TLB, T.getUnqualifiedLoc());
4522   if (Result.isNull())
4523     return QualType();
4524 
4525   Result = getDerived().RebuildQualifiedType(Result, T);
4526 
4527   if (Result.isNull())
4528     return QualType();
4529 
4530   // RebuildQualifiedType might have updated the type, but not in a way
4531   // that invalidates the TypeLoc. (There's no location information for
4532   // qualifiers.)
4533   TLB.TypeWasModifiedSafely(Result);
4534 
4535   return Result;
4536 }
4537 
4538 template <typename Derived>
4539 QualType TreeTransform<Derived>::RebuildQualifiedType(QualType T,
4540                                                       QualifiedTypeLoc TL) {
4541 
4542   SourceLocation Loc = TL.getBeginLoc();
4543   Qualifiers Quals = TL.getType().getLocalQualifiers();
4544 
4545   if (((T.getAddressSpace() != LangAS::Default &&
4546         Quals.getAddressSpace() != LangAS::Default)) &&
4547       T.getAddressSpace() != Quals.getAddressSpace()) {
4548     SemaRef.Diag(Loc, diag::err_address_space_mismatch_templ_inst)
4549         << TL.getType() << T;
4550     return QualType();
4551   }
4552 
4553   // C++ [dcl.fct]p7:
4554   //   [When] adding cv-qualifications on top of the function type [...] the
4555   //   cv-qualifiers are ignored.
4556   if (T->isFunctionType()) {
4557     T = SemaRef.getASTContext().getAddrSpaceQualType(T,
4558                                                      Quals.getAddressSpace());
4559     return T;
4560   }
4561 
4562   // C++ [dcl.ref]p1:
4563   //   when the cv-qualifiers are introduced through the use of a typedef-name
4564   //   or decltype-specifier [...] the cv-qualifiers are ignored.
4565   // Note that [dcl.ref]p1 lists all cases in which cv-qualifiers can be
4566   // applied to a reference type.
4567   if (T->isReferenceType()) {
4568     // The only qualifier that applies to a reference type is restrict.
4569     if (!Quals.hasRestrict())
4570       return T;
4571     Quals = Qualifiers::fromCVRMask(Qualifiers::Restrict);
4572   }
4573 
4574   // Suppress Objective-C lifetime qualifiers if they don't make sense for the
4575   // resulting type.
4576   if (Quals.hasObjCLifetime()) {
4577     if (!T->isObjCLifetimeType() && !T->isDependentType())
4578       Quals.removeObjCLifetime();
4579     else if (T.getObjCLifetime()) {
4580       // Objective-C ARC:
4581       //   A lifetime qualifier applied to a substituted template parameter
4582       //   overrides the lifetime qualifier from the template argument.
4583       const AutoType *AutoTy;
4584       if (const SubstTemplateTypeParmType *SubstTypeParam
4585                                 = dyn_cast<SubstTemplateTypeParmType>(T)) {
4586         QualType Replacement = SubstTypeParam->getReplacementType();
4587         Qualifiers Qs = Replacement.getQualifiers();
4588         Qs.removeObjCLifetime();
4589         Replacement = SemaRef.Context.getQualifiedType(
4590             Replacement.getUnqualifiedType(), Qs);
4591         T = SemaRef.Context.getSubstTemplateTypeParmType(
4592             SubstTypeParam->getReplacedParameter(), Replacement);
4593       } else if ((AutoTy = dyn_cast<AutoType>(T)) && AutoTy->isDeduced()) {
4594         // 'auto' types behave the same way as template parameters.
4595         QualType Deduced = AutoTy->getDeducedType();
4596         Qualifiers Qs = Deduced.getQualifiers();
4597         Qs.removeObjCLifetime();
4598         Deduced =
4599             SemaRef.Context.getQualifiedType(Deduced.getUnqualifiedType(), Qs);
4600         T = SemaRef.Context.getAutoType(Deduced, AutoTy->getKeyword(),
4601                                         AutoTy->isDependentType(),
4602                                         /*isPack=*/false,
4603                                         AutoTy->getTypeConstraintConcept(),
4604                                         AutoTy->getTypeConstraintArguments());
4605       } else {
4606         // Otherwise, complain about the addition of a qualifier to an
4607         // already-qualified type.
4608         // FIXME: Why is this check not in Sema::BuildQualifiedType?
4609         SemaRef.Diag(Loc, diag::err_attr_objc_ownership_redundant) << T;
4610         Quals.removeObjCLifetime();
4611       }
4612     }
4613   }
4614 
4615   return SemaRef.BuildQualifiedType(T, Loc, Quals);
4616 }
4617 
4618 template<typename Derived>
4619 TypeLoc
4620 TreeTransform<Derived>::TransformTypeInObjectScope(TypeLoc TL,
4621                                                    QualType ObjectType,
4622                                                    NamedDecl *UnqualLookup,
4623                                                    CXXScopeSpec &SS) {
4624   if (getDerived().AlreadyTransformed(TL.getType()))
4625     return TL;
4626 
4627   TypeSourceInfo *TSI =
4628       TransformTSIInObjectScope(TL, ObjectType, UnqualLookup, SS);
4629   if (TSI)
4630     return TSI->getTypeLoc();
4631   return TypeLoc();
4632 }
4633 
4634 template<typename Derived>
4635 TypeSourceInfo *
4636 TreeTransform<Derived>::TransformTypeInObjectScope(TypeSourceInfo *TSInfo,
4637                                                    QualType ObjectType,
4638                                                    NamedDecl *UnqualLookup,
4639                                                    CXXScopeSpec &SS) {
4640   if (getDerived().AlreadyTransformed(TSInfo->getType()))
4641     return TSInfo;
4642 
4643   return TransformTSIInObjectScope(TSInfo->getTypeLoc(), ObjectType,
4644                                    UnqualLookup, SS);
4645 }
4646 
4647 template <typename Derived>
4648 TypeSourceInfo *TreeTransform<Derived>::TransformTSIInObjectScope(
4649     TypeLoc TL, QualType ObjectType, NamedDecl *UnqualLookup,
4650     CXXScopeSpec &SS) {
4651   QualType T = TL.getType();
4652   assert(!getDerived().AlreadyTransformed(T));
4653 
4654   TypeLocBuilder TLB;
4655   QualType Result;
4656 
4657   if (isa<TemplateSpecializationType>(T)) {
4658     TemplateSpecializationTypeLoc SpecTL =
4659         TL.castAs<TemplateSpecializationTypeLoc>();
4660 
4661     TemplateName Template = getDerived().TransformTemplateName(
4662         SS, SpecTL.getTypePtr()->getTemplateName(), SpecTL.getTemplateNameLoc(),
4663         ObjectType, UnqualLookup, /*AllowInjectedClassName*/true);
4664     if (Template.isNull())
4665       return nullptr;
4666 
4667     Result = getDerived().TransformTemplateSpecializationType(TLB, SpecTL,
4668                                                               Template);
4669   } else if (isa<DependentTemplateSpecializationType>(T)) {
4670     DependentTemplateSpecializationTypeLoc SpecTL =
4671         TL.castAs<DependentTemplateSpecializationTypeLoc>();
4672 
4673     TemplateName Template
4674       = getDerived().RebuildTemplateName(SS,
4675                                          SpecTL.getTemplateKeywordLoc(),
4676                                          *SpecTL.getTypePtr()->getIdentifier(),
4677                                          SpecTL.getTemplateNameLoc(),
4678                                          ObjectType, UnqualLookup,
4679                                          /*AllowInjectedClassName*/true);
4680     if (Template.isNull())
4681       return nullptr;
4682 
4683     Result = getDerived().TransformDependentTemplateSpecializationType(TLB,
4684                                                                        SpecTL,
4685                                                                        Template,
4686                                                                        SS);
4687   } else {
4688     // Nothing special needs to be done for these.
4689     Result = getDerived().TransformType(TLB, TL);
4690   }
4691 
4692   if (Result.isNull())
4693     return nullptr;
4694 
4695   return TLB.getTypeSourceInfo(SemaRef.Context, Result);
4696 }
4697 
4698 template <class TyLoc> static inline
4699 QualType TransformTypeSpecType(TypeLocBuilder &TLB, TyLoc T) {
4700   TyLoc NewT = TLB.push<TyLoc>(T.getType());
4701   NewT.setNameLoc(T.getNameLoc());
4702   return T.getType();
4703 }
4704 
4705 template<typename Derived>
4706 QualType TreeTransform<Derived>::TransformBuiltinType(TypeLocBuilder &TLB,
4707                                                       BuiltinTypeLoc T) {
4708   BuiltinTypeLoc NewT = TLB.push<BuiltinTypeLoc>(T.getType());
4709   NewT.setBuiltinLoc(T.getBuiltinLoc());
4710   if (T.needsExtraLocalData())
4711     NewT.getWrittenBuiltinSpecs() = T.getWrittenBuiltinSpecs();
4712   return T.getType();
4713 }
4714 
4715 template<typename Derived>
4716 QualType TreeTransform<Derived>::TransformComplexType(TypeLocBuilder &TLB,
4717                                                       ComplexTypeLoc T) {
4718   // FIXME: recurse?
4719   return TransformTypeSpecType(TLB, T);
4720 }
4721 
4722 template <typename Derived>
4723 QualType TreeTransform<Derived>::TransformAdjustedType(TypeLocBuilder &TLB,
4724                                                        AdjustedTypeLoc TL) {
4725   // Adjustments applied during transformation are handled elsewhere.
4726   return getDerived().TransformType(TLB, TL.getOriginalLoc());
4727 }
4728 
4729 template<typename Derived>
4730 QualType TreeTransform<Derived>::TransformDecayedType(TypeLocBuilder &TLB,
4731                                                       DecayedTypeLoc TL) {
4732   QualType OriginalType = getDerived().TransformType(TLB, TL.getOriginalLoc());
4733   if (OriginalType.isNull())
4734     return QualType();
4735 
4736   QualType Result = TL.getType();
4737   if (getDerived().AlwaysRebuild() ||
4738       OriginalType != TL.getOriginalLoc().getType())
4739     Result = SemaRef.Context.getDecayedType(OriginalType);
4740   TLB.push<DecayedTypeLoc>(Result);
4741   // Nothing to set for DecayedTypeLoc.
4742   return Result;
4743 }
4744 
4745 template<typename Derived>
4746 QualType TreeTransform<Derived>::TransformPointerType(TypeLocBuilder &TLB,
4747                                                       PointerTypeLoc TL) {
4748   QualType PointeeType
4749     = getDerived().TransformType(TLB, TL.getPointeeLoc());
4750   if (PointeeType.isNull())
4751     return QualType();
4752 
4753   QualType Result = TL.getType();
4754   if (PointeeType->getAs<ObjCObjectType>()) {
4755     // A dependent pointer type 'T *' has is being transformed such
4756     // that an Objective-C class type is being replaced for 'T'. The
4757     // resulting pointer type is an ObjCObjectPointerType, not a
4758     // PointerType.
4759     Result = SemaRef.Context.getObjCObjectPointerType(PointeeType);
4760 
4761     ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result);
4762     NewT.setStarLoc(TL.getStarLoc());
4763     return Result;
4764   }
4765 
4766   if (getDerived().AlwaysRebuild() ||
4767       PointeeType != TL.getPointeeLoc().getType()) {
4768     Result = getDerived().RebuildPointerType(PointeeType, TL.getSigilLoc());
4769     if (Result.isNull())
4770       return QualType();
4771   }
4772 
4773   // Objective-C ARC can add lifetime qualifiers to the type that we're
4774   // pointing to.
4775   TLB.TypeWasModifiedSafely(Result->getPointeeType());
4776 
4777   PointerTypeLoc NewT = TLB.push<PointerTypeLoc>(Result);
4778   NewT.setSigilLoc(TL.getSigilLoc());
4779   return Result;
4780 }
4781 
4782 template<typename Derived>
4783 QualType
4784 TreeTransform<Derived>::TransformBlockPointerType(TypeLocBuilder &TLB,
4785                                                   BlockPointerTypeLoc TL) {
4786   QualType PointeeType
4787     = getDerived().TransformType(TLB, TL.getPointeeLoc());
4788   if (PointeeType.isNull())
4789     return QualType();
4790 
4791   QualType Result = TL.getType();
4792   if (getDerived().AlwaysRebuild() ||
4793       PointeeType != TL.getPointeeLoc().getType()) {
4794     Result = getDerived().RebuildBlockPointerType(PointeeType,
4795                                                   TL.getSigilLoc());
4796     if (Result.isNull())
4797       return QualType();
4798   }
4799 
4800   BlockPointerTypeLoc NewT = TLB.push<BlockPointerTypeLoc>(Result);
4801   NewT.setSigilLoc(TL.getSigilLoc());
4802   return Result;
4803 }
4804 
4805 /// Transforms a reference type.  Note that somewhat paradoxically we
4806 /// don't care whether the type itself is an l-value type or an r-value
4807 /// type;  we only care if the type was *written* as an l-value type
4808 /// or an r-value type.
4809 template<typename Derived>
4810 QualType
4811 TreeTransform<Derived>::TransformReferenceType(TypeLocBuilder &TLB,
4812                                                ReferenceTypeLoc TL) {
4813   const ReferenceType *T = TL.getTypePtr();
4814 
4815   // Note that this works with the pointee-as-written.
4816   QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
4817   if (PointeeType.isNull())
4818     return QualType();
4819 
4820   QualType Result = TL.getType();
4821   if (getDerived().AlwaysRebuild() ||
4822       PointeeType != T->getPointeeTypeAsWritten()) {
4823     Result = getDerived().RebuildReferenceType(PointeeType,
4824                                                T->isSpelledAsLValue(),
4825                                                TL.getSigilLoc());
4826     if (Result.isNull())
4827       return QualType();
4828   }
4829 
4830   // Objective-C ARC can add lifetime qualifiers to the type that we're
4831   // referring to.
4832   TLB.TypeWasModifiedSafely(
4833       Result->castAs<ReferenceType>()->getPointeeTypeAsWritten());
4834 
4835   // r-value references can be rebuilt as l-value references.
4836   ReferenceTypeLoc NewTL;
4837   if (isa<LValueReferenceType>(Result))
4838     NewTL = TLB.push<LValueReferenceTypeLoc>(Result);
4839   else
4840     NewTL = TLB.push<RValueReferenceTypeLoc>(Result);
4841   NewTL.setSigilLoc(TL.getSigilLoc());
4842 
4843   return Result;
4844 }
4845 
4846 template<typename Derived>
4847 QualType
4848 TreeTransform<Derived>::TransformLValueReferenceType(TypeLocBuilder &TLB,
4849                                                  LValueReferenceTypeLoc TL) {
4850   return TransformReferenceType(TLB, TL);
4851 }
4852 
4853 template<typename Derived>
4854 QualType
4855 TreeTransform<Derived>::TransformRValueReferenceType(TypeLocBuilder &TLB,
4856                                                  RValueReferenceTypeLoc TL) {
4857   return TransformReferenceType(TLB, TL);
4858 }
4859 
4860 template<typename Derived>
4861 QualType
4862 TreeTransform<Derived>::TransformMemberPointerType(TypeLocBuilder &TLB,
4863                                                    MemberPointerTypeLoc TL) {
4864   QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
4865   if (PointeeType.isNull())
4866     return QualType();
4867 
4868   TypeSourceInfo* OldClsTInfo = TL.getClassTInfo();
4869   TypeSourceInfo *NewClsTInfo = nullptr;
4870   if (OldClsTInfo) {
4871     NewClsTInfo = getDerived().TransformType(OldClsTInfo);
4872     if (!NewClsTInfo)
4873       return QualType();
4874   }
4875 
4876   const MemberPointerType *T = TL.getTypePtr();
4877   QualType OldClsType = QualType(T->getClass(), 0);
4878   QualType NewClsType;
4879   if (NewClsTInfo)
4880     NewClsType = NewClsTInfo->getType();
4881   else {
4882     NewClsType = getDerived().TransformType(OldClsType);
4883     if (NewClsType.isNull())
4884       return QualType();
4885   }
4886 
4887   QualType Result = TL.getType();
4888   if (getDerived().AlwaysRebuild() ||
4889       PointeeType != T->getPointeeType() ||
4890       NewClsType != OldClsType) {
4891     Result = getDerived().RebuildMemberPointerType(PointeeType, NewClsType,
4892                                                    TL.getStarLoc());
4893     if (Result.isNull())
4894       return QualType();
4895   }
4896 
4897   // If we had to adjust the pointee type when building a member pointer, make
4898   // sure to push TypeLoc info for it.
4899   const MemberPointerType *MPT = Result->getAs<MemberPointerType>();
4900   if (MPT && PointeeType != MPT->getPointeeType()) {
4901     assert(isa<AdjustedType>(MPT->getPointeeType()));
4902     TLB.push<AdjustedTypeLoc>(MPT->getPointeeType());
4903   }
4904 
4905   MemberPointerTypeLoc NewTL = TLB.push<MemberPointerTypeLoc>(Result);
4906   NewTL.setSigilLoc(TL.getSigilLoc());
4907   NewTL.setClassTInfo(NewClsTInfo);
4908 
4909   return Result;
4910 }
4911 
4912 template<typename Derived>
4913 QualType
4914 TreeTransform<Derived>::TransformConstantArrayType(TypeLocBuilder &TLB,
4915                                                    ConstantArrayTypeLoc TL) {
4916   const ConstantArrayType *T = TL.getTypePtr();
4917   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
4918   if (ElementType.isNull())
4919     return QualType();
4920 
4921   // Prefer the expression from the TypeLoc;  the other may have been uniqued.
4922   Expr *OldSize = TL.getSizeExpr();
4923   if (!OldSize)
4924     OldSize = const_cast<Expr*>(T->getSizeExpr());
4925   Expr *NewSize = nullptr;
4926   if (OldSize) {
4927     EnterExpressionEvaluationContext Unevaluated(
4928         SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
4929     NewSize = getDerived().TransformExpr(OldSize).template getAs<Expr>();
4930     NewSize = SemaRef.ActOnConstantExpression(NewSize).get();
4931   }
4932 
4933   QualType Result = TL.getType();
4934   if (getDerived().AlwaysRebuild() ||
4935       ElementType != T->getElementType() ||
4936       (T->getSizeExpr() && NewSize != OldSize)) {
4937     Result = getDerived().RebuildConstantArrayType(ElementType,
4938                                                    T->getSizeModifier(),
4939                                                    T->getSize(), NewSize,
4940                                              T->getIndexTypeCVRQualifiers(),
4941                                                    TL.getBracketsRange());
4942     if (Result.isNull())
4943       return QualType();
4944   }
4945 
4946   // We might have either a ConstantArrayType or a VariableArrayType now:
4947   // a ConstantArrayType is allowed to have an element type which is a
4948   // VariableArrayType if the type is dependent.  Fortunately, all array
4949   // types have the same location layout.
4950   ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result);
4951   NewTL.setLBracketLoc(TL.getLBracketLoc());
4952   NewTL.setRBracketLoc(TL.getRBracketLoc());
4953   NewTL.setSizeExpr(NewSize);
4954 
4955   return Result;
4956 }
4957 
4958 template<typename Derived>
4959 QualType TreeTransform<Derived>::TransformIncompleteArrayType(
4960                                               TypeLocBuilder &TLB,
4961                                               IncompleteArrayTypeLoc TL) {
4962   const IncompleteArrayType *T = TL.getTypePtr();
4963   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
4964   if (ElementType.isNull())
4965     return QualType();
4966 
4967   QualType Result = TL.getType();
4968   if (getDerived().AlwaysRebuild() ||
4969       ElementType != T->getElementType()) {
4970     Result = getDerived().RebuildIncompleteArrayType(ElementType,
4971                                                      T->getSizeModifier(),
4972                                            T->getIndexTypeCVRQualifiers(),
4973                                                      TL.getBracketsRange());
4974     if (Result.isNull())
4975       return QualType();
4976   }
4977 
4978   IncompleteArrayTypeLoc NewTL = TLB.push<IncompleteArrayTypeLoc>(Result);
4979   NewTL.setLBracketLoc(TL.getLBracketLoc());
4980   NewTL.setRBracketLoc(TL.getRBracketLoc());
4981   NewTL.setSizeExpr(nullptr);
4982 
4983   return Result;
4984 }
4985 
4986 template<typename Derived>
4987 QualType
4988 TreeTransform<Derived>::TransformVariableArrayType(TypeLocBuilder &TLB,
4989                                                    VariableArrayTypeLoc TL) {
4990   const VariableArrayType *T = TL.getTypePtr();
4991   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
4992   if (ElementType.isNull())
4993     return QualType();
4994 
4995   ExprResult SizeResult;
4996   {
4997     EnterExpressionEvaluationContext Context(
4998         SemaRef, Sema::ExpressionEvaluationContext::PotentiallyEvaluated);
4999     SizeResult = getDerived().TransformExpr(T->getSizeExpr());
5000   }
5001   if (SizeResult.isInvalid())
5002     return QualType();
5003   SizeResult =
5004       SemaRef.ActOnFinishFullExpr(SizeResult.get(), /*DiscardedValue*/ false);
5005   if (SizeResult.isInvalid())
5006     return QualType();
5007 
5008   Expr *Size = SizeResult.get();
5009 
5010   QualType Result = TL.getType();
5011   if (getDerived().AlwaysRebuild() ||
5012       ElementType != T->getElementType() ||
5013       Size != T->getSizeExpr()) {
5014     Result = getDerived().RebuildVariableArrayType(ElementType,
5015                                                    T->getSizeModifier(),
5016                                                    Size,
5017                                              T->getIndexTypeCVRQualifiers(),
5018                                                    TL.getBracketsRange());
5019     if (Result.isNull())
5020       return QualType();
5021   }
5022 
5023   // We might have constant size array now, but fortunately it has the same
5024   // location layout.
5025   ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result);
5026   NewTL.setLBracketLoc(TL.getLBracketLoc());
5027   NewTL.setRBracketLoc(TL.getRBracketLoc());
5028   NewTL.setSizeExpr(Size);
5029 
5030   return Result;
5031 }
5032 
5033 template<typename Derived>
5034 QualType
5035 TreeTransform<Derived>::TransformDependentSizedArrayType(TypeLocBuilder &TLB,
5036                                              DependentSizedArrayTypeLoc TL) {
5037   const DependentSizedArrayType *T = TL.getTypePtr();
5038   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5039   if (ElementType.isNull())
5040     return QualType();
5041 
5042   // Array bounds are constant expressions.
5043   EnterExpressionEvaluationContext Unevaluated(
5044       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
5045 
5046   // Prefer the expression from the TypeLoc;  the other may have been uniqued.
5047   Expr *origSize = TL.getSizeExpr();
5048   if (!origSize) origSize = T->getSizeExpr();
5049 
5050   ExprResult sizeResult
5051     = getDerived().TransformExpr(origSize);
5052   sizeResult = SemaRef.ActOnConstantExpression(sizeResult);
5053   if (sizeResult.isInvalid())
5054     return QualType();
5055 
5056   Expr *size = sizeResult.get();
5057 
5058   QualType Result = TL.getType();
5059   if (getDerived().AlwaysRebuild() ||
5060       ElementType != T->getElementType() ||
5061       size != origSize) {
5062     Result = getDerived().RebuildDependentSizedArrayType(ElementType,
5063                                                          T->getSizeModifier(),
5064                                                          size,
5065                                                 T->getIndexTypeCVRQualifiers(),
5066                                                         TL.getBracketsRange());
5067     if (Result.isNull())
5068       return QualType();
5069   }
5070 
5071   // We might have any sort of array type now, but fortunately they
5072   // all have the same location layout.
5073   ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result);
5074   NewTL.setLBracketLoc(TL.getLBracketLoc());
5075   NewTL.setRBracketLoc(TL.getRBracketLoc());
5076   NewTL.setSizeExpr(size);
5077 
5078   return Result;
5079 }
5080 
5081 template <typename Derived>
5082 QualType TreeTransform<Derived>::TransformDependentVectorType(
5083     TypeLocBuilder &TLB, DependentVectorTypeLoc TL) {
5084   const DependentVectorType *T = TL.getTypePtr();
5085   QualType ElementType = getDerived().TransformType(T->getElementType());
5086   if (ElementType.isNull())
5087     return QualType();
5088 
5089   EnterExpressionEvaluationContext Unevaluated(
5090       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
5091 
5092   ExprResult Size = getDerived().TransformExpr(T->getSizeExpr());
5093   Size = SemaRef.ActOnConstantExpression(Size);
5094   if (Size.isInvalid())
5095     return QualType();
5096 
5097   QualType Result = TL.getType();
5098   if (getDerived().AlwaysRebuild() || ElementType != T->getElementType() ||
5099       Size.get() != T->getSizeExpr()) {
5100     Result = getDerived().RebuildDependentVectorType(
5101         ElementType, Size.get(), T->getAttributeLoc(), T->getVectorKind());
5102     if (Result.isNull())
5103       return QualType();
5104   }
5105 
5106   // Result might be dependent or not.
5107   if (isa<DependentVectorType>(Result)) {
5108     DependentVectorTypeLoc NewTL =
5109         TLB.push<DependentVectorTypeLoc>(Result);
5110     NewTL.setNameLoc(TL.getNameLoc());
5111   } else {
5112     VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result);
5113     NewTL.setNameLoc(TL.getNameLoc());
5114   }
5115 
5116   return Result;
5117 }
5118 
5119 template<typename Derived>
5120 QualType TreeTransform<Derived>::TransformDependentSizedExtVectorType(
5121                                       TypeLocBuilder &TLB,
5122                                       DependentSizedExtVectorTypeLoc TL) {
5123   const DependentSizedExtVectorType *T = TL.getTypePtr();
5124 
5125   // FIXME: ext vector locs should be nested
5126   QualType ElementType = getDerived().TransformType(T->getElementType());
5127   if (ElementType.isNull())
5128     return QualType();
5129 
5130   // Vector sizes are constant expressions.
5131   EnterExpressionEvaluationContext Unevaluated(
5132       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
5133 
5134   ExprResult Size = getDerived().TransformExpr(T->getSizeExpr());
5135   Size = SemaRef.ActOnConstantExpression(Size);
5136   if (Size.isInvalid())
5137     return QualType();
5138 
5139   QualType Result = TL.getType();
5140   if (getDerived().AlwaysRebuild() ||
5141       ElementType != T->getElementType() ||
5142       Size.get() != T->getSizeExpr()) {
5143     Result = getDerived().RebuildDependentSizedExtVectorType(ElementType,
5144                                                              Size.get(),
5145                                                          T->getAttributeLoc());
5146     if (Result.isNull())
5147       return QualType();
5148   }
5149 
5150   // Result might be dependent or not.
5151   if (isa<DependentSizedExtVectorType>(Result)) {
5152     DependentSizedExtVectorTypeLoc NewTL
5153       = TLB.push<DependentSizedExtVectorTypeLoc>(Result);
5154     NewTL.setNameLoc(TL.getNameLoc());
5155   } else {
5156     ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result);
5157     NewTL.setNameLoc(TL.getNameLoc());
5158   }
5159 
5160   return Result;
5161 }
5162 
5163 template <typename Derived>
5164 QualType TreeTransform<Derived>::TransformDependentAddressSpaceType(
5165     TypeLocBuilder &TLB, DependentAddressSpaceTypeLoc TL) {
5166   const DependentAddressSpaceType *T = TL.getTypePtr();
5167 
5168   QualType pointeeType = getDerived().TransformType(T->getPointeeType());
5169 
5170   if (pointeeType.isNull())
5171     return QualType();
5172 
5173   // Address spaces are constant expressions.
5174   EnterExpressionEvaluationContext Unevaluated(
5175       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
5176 
5177   ExprResult AddrSpace = getDerived().TransformExpr(T->getAddrSpaceExpr());
5178   AddrSpace = SemaRef.ActOnConstantExpression(AddrSpace);
5179   if (AddrSpace.isInvalid())
5180     return QualType();
5181 
5182   QualType Result = TL.getType();
5183   if (getDerived().AlwaysRebuild() || pointeeType != T->getPointeeType() ||
5184       AddrSpace.get() != T->getAddrSpaceExpr()) {
5185     Result = getDerived().RebuildDependentAddressSpaceType(
5186         pointeeType, AddrSpace.get(), T->getAttributeLoc());
5187     if (Result.isNull())
5188       return QualType();
5189   }
5190 
5191   // Result might be dependent or not.
5192   if (isa<DependentAddressSpaceType>(Result)) {
5193     DependentAddressSpaceTypeLoc NewTL =
5194         TLB.push<DependentAddressSpaceTypeLoc>(Result);
5195 
5196     NewTL.setAttrOperandParensRange(TL.getAttrOperandParensRange());
5197     NewTL.setAttrExprOperand(TL.getAttrExprOperand());
5198     NewTL.setAttrNameLoc(TL.getAttrNameLoc());
5199 
5200   } else {
5201     TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(
5202         Result, getDerived().getBaseLocation());
5203     TransformType(TLB, DI->getTypeLoc());
5204   }
5205 
5206   return Result;
5207 }
5208 
5209 template <typename Derived>
5210 QualType TreeTransform<Derived>::TransformVectorType(TypeLocBuilder &TLB,
5211                                                      VectorTypeLoc TL) {
5212   const VectorType *T = TL.getTypePtr();
5213   QualType ElementType = getDerived().TransformType(T->getElementType());
5214   if (ElementType.isNull())
5215     return QualType();
5216 
5217   QualType Result = TL.getType();
5218   if (getDerived().AlwaysRebuild() ||
5219       ElementType != T->getElementType()) {
5220     Result = getDerived().RebuildVectorType(ElementType, T->getNumElements(),
5221                                             T->getVectorKind());
5222     if (Result.isNull())
5223       return QualType();
5224   }
5225 
5226   VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result);
5227   NewTL.setNameLoc(TL.getNameLoc());
5228 
5229   return Result;
5230 }
5231 
5232 template<typename Derived>
5233 QualType TreeTransform<Derived>::TransformExtVectorType(TypeLocBuilder &TLB,
5234                                                         ExtVectorTypeLoc TL) {
5235   const VectorType *T = TL.getTypePtr();
5236   QualType ElementType = getDerived().TransformType(T->getElementType());
5237   if (ElementType.isNull())
5238     return QualType();
5239 
5240   QualType Result = TL.getType();
5241   if (getDerived().AlwaysRebuild() ||
5242       ElementType != T->getElementType()) {
5243     Result = getDerived().RebuildExtVectorType(ElementType,
5244                                                T->getNumElements(),
5245                                                /*FIXME*/ SourceLocation());
5246     if (Result.isNull())
5247       return QualType();
5248   }
5249 
5250   ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result);
5251   NewTL.setNameLoc(TL.getNameLoc());
5252 
5253   return Result;
5254 }
5255 
5256 template <typename Derived>
5257 ParmVarDecl *TreeTransform<Derived>::TransformFunctionTypeParam(
5258     ParmVarDecl *OldParm, int indexAdjustment, Optional<unsigned> NumExpansions,
5259     bool ExpectParameterPack) {
5260   TypeSourceInfo *OldDI = OldParm->getTypeSourceInfo();
5261   TypeSourceInfo *NewDI = nullptr;
5262 
5263   if (NumExpansions && isa<PackExpansionType>(OldDI->getType())) {
5264     // If we're substituting into a pack expansion type and we know the
5265     // length we want to expand to, just substitute for the pattern.
5266     TypeLoc OldTL = OldDI->getTypeLoc();
5267     PackExpansionTypeLoc OldExpansionTL = OldTL.castAs<PackExpansionTypeLoc>();
5268 
5269     TypeLocBuilder TLB;
5270     TypeLoc NewTL = OldDI->getTypeLoc();
5271     TLB.reserve(NewTL.getFullDataSize());
5272 
5273     QualType Result = getDerived().TransformType(TLB,
5274                                                OldExpansionTL.getPatternLoc());
5275     if (Result.isNull())
5276       return nullptr;
5277 
5278     Result = RebuildPackExpansionType(Result,
5279                                 OldExpansionTL.getPatternLoc().getSourceRange(),
5280                                       OldExpansionTL.getEllipsisLoc(),
5281                                       NumExpansions);
5282     if (Result.isNull())
5283       return nullptr;
5284 
5285     PackExpansionTypeLoc NewExpansionTL
5286       = TLB.push<PackExpansionTypeLoc>(Result);
5287     NewExpansionTL.setEllipsisLoc(OldExpansionTL.getEllipsisLoc());
5288     NewDI = TLB.getTypeSourceInfo(SemaRef.Context, Result);
5289   } else
5290     NewDI = getDerived().TransformType(OldDI);
5291   if (!NewDI)
5292     return nullptr;
5293 
5294   if (NewDI == OldDI && indexAdjustment == 0)
5295     return OldParm;
5296 
5297   ParmVarDecl *newParm = ParmVarDecl::Create(SemaRef.Context,
5298                                              OldParm->getDeclContext(),
5299                                              OldParm->getInnerLocStart(),
5300                                              OldParm->getLocation(),
5301                                              OldParm->getIdentifier(),
5302                                              NewDI->getType(),
5303                                              NewDI,
5304                                              OldParm->getStorageClass(),
5305                                              /* DefArg */ nullptr);
5306   newParm->setScopeInfo(OldParm->getFunctionScopeDepth(),
5307                         OldParm->getFunctionScopeIndex() + indexAdjustment);
5308   return newParm;
5309 }
5310 
5311 template <typename Derived>
5312 bool TreeTransform<Derived>::TransformFunctionTypeParams(
5313     SourceLocation Loc, ArrayRef<ParmVarDecl *> Params,
5314     const QualType *ParamTypes,
5315     const FunctionProtoType::ExtParameterInfo *ParamInfos,
5316     SmallVectorImpl<QualType> &OutParamTypes,
5317     SmallVectorImpl<ParmVarDecl *> *PVars,
5318     Sema::ExtParameterInfoBuilder &PInfos) {
5319   int indexAdjustment = 0;
5320 
5321   unsigned NumParams = Params.size();
5322   for (unsigned i = 0; i != NumParams; ++i) {
5323     if (ParmVarDecl *OldParm = Params[i]) {
5324       assert(OldParm->getFunctionScopeIndex() == i);
5325 
5326       Optional<unsigned> NumExpansions;
5327       ParmVarDecl *NewParm = nullptr;
5328       if (OldParm->isParameterPack()) {
5329         // We have a function parameter pack that may need to be expanded.
5330         SmallVector<UnexpandedParameterPack, 2> Unexpanded;
5331 
5332         // Find the parameter packs that could be expanded.
5333         TypeLoc TL = OldParm->getTypeSourceInfo()->getTypeLoc();
5334         PackExpansionTypeLoc ExpansionTL = TL.castAs<PackExpansionTypeLoc>();
5335         TypeLoc Pattern = ExpansionTL.getPatternLoc();
5336         SemaRef.collectUnexpandedParameterPacks(Pattern, Unexpanded);
5337 
5338         // Determine whether we should expand the parameter packs.
5339         bool ShouldExpand = false;
5340         bool RetainExpansion = false;
5341         Optional<unsigned> OrigNumExpansions;
5342         if (Unexpanded.size() > 0) {
5343           OrigNumExpansions = ExpansionTL.getTypePtr()->getNumExpansions();
5344           NumExpansions = OrigNumExpansions;
5345           if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(),
5346                                                    Pattern.getSourceRange(),
5347                                                    Unexpanded,
5348                                                    ShouldExpand,
5349                                                    RetainExpansion,
5350                                                    NumExpansions)) {
5351             return true;
5352           }
5353         } else {
5354 #ifndef NDEBUG
5355           const AutoType *AT =
5356               Pattern.getType().getTypePtr()->getContainedAutoType();
5357           assert((AT && (!AT->isDeduced() || AT->getDeducedType().isNull())) &&
5358                  "Could not find parameter packs or undeduced auto type!");
5359 #endif
5360         }
5361 
5362         if (ShouldExpand) {
5363           // Expand the function parameter pack into multiple, separate
5364           // parameters.
5365           getDerived().ExpandingFunctionParameterPack(OldParm);
5366           for (unsigned I = 0; I != *NumExpansions; ++I) {
5367             Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
5368             ParmVarDecl *NewParm
5369               = getDerived().TransformFunctionTypeParam(OldParm,
5370                                                         indexAdjustment++,
5371                                                         OrigNumExpansions,
5372                                                 /*ExpectParameterPack=*/false);
5373             if (!NewParm)
5374               return true;
5375 
5376             if (ParamInfos)
5377               PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5378             OutParamTypes.push_back(NewParm->getType());
5379             if (PVars)
5380               PVars->push_back(NewParm);
5381           }
5382 
5383           // If we're supposed to retain a pack expansion, do so by temporarily
5384           // forgetting the partially-substituted parameter pack.
5385           if (RetainExpansion) {
5386             ForgetPartiallySubstitutedPackRAII Forget(getDerived());
5387             ParmVarDecl *NewParm
5388               = getDerived().TransformFunctionTypeParam(OldParm,
5389                                                         indexAdjustment++,
5390                                                         OrigNumExpansions,
5391                                                 /*ExpectParameterPack=*/false);
5392             if (!NewParm)
5393               return true;
5394 
5395             if (ParamInfos)
5396               PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5397             OutParamTypes.push_back(NewParm->getType());
5398             if (PVars)
5399               PVars->push_back(NewParm);
5400           }
5401 
5402           // The next parameter should have the same adjustment as the
5403           // last thing we pushed, but we post-incremented indexAdjustment
5404           // on every push.  Also, if we push nothing, the adjustment should
5405           // go down by one.
5406           indexAdjustment--;
5407 
5408           // We're done with the pack expansion.
5409           continue;
5410         }
5411 
5412         // We'll substitute the parameter now without expanding the pack
5413         // expansion.
5414         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
5415         NewParm = getDerived().TransformFunctionTypeParam(OldParm,
5416                                                           indexAdjustment,
5417                                                           NumExpansions,
5418                                                   /*ExpectParameterPack=*/true);
5419         assert(NewParm->isParameterPack() &&
5420                "Parameter pack no longer a parameter pack after "
5421                "transformation.");
5422       } else {
5423         NewParm = getDerived().TransformFunctionTypeParam(
5424             OldParm, indexAdjustment, None, /*ExpectParameterPack=*/ false);
5425       }
5426 
5427       if (!NewParm)
5428         return true;
5429 
5430       if (ParamInfos)
5431         PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5432       OutParamTypes.push_back(NewParm->getType());
5433       if (PVars)
5434         PVars->push_back(NewParm);
5435       continue;
5436     }
5437 
5438     // Deal with the possibility that we don't have a parameter
5439     // declaration for this parameter.
5440     QualType OldType = ParamTypes[i];
5441     bool IsPackExpansion = false;
5442     Optional<unsigned> NumExpansions;
5443     QualType NewType;
5444     if (const PackExpansionType *Expansion
5445                                        = dyn_cast<PackExpansionType>(OldType)) {
5446       // We have a function parameter pack that may need to be expanded.
5447       QualType Pattern = Expansion->getPattern();
5448       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
5449       getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
5450 
5451       // Determine whether we should expand the parameter packs.
5452       bool ShouldExpand = false;
5453       bool RetainExpansion = false;
5454       if (getDerived().TryExpandParameterPacks(Loc, SourceRange(),
5455                                                Unexpanded,
5456                                                ShouldExpand,
5457                                                RetainExpansion,
5458                                                NumExpansions)) {
5459         return true;
5460       }
5461 
5462       if (ShouldExpand) {
5463         // Expand the function parameter pack into multiple, separate
5464         // parameters.
5465         for (unsigned I = 0; I != *NumExpansions; ++I) {
5466           Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
5467           QualType NewType = getDerived().TransformType(Pattern);
5468           if (NewType.isNull())
5469             return true;
5470 
5471           if (NewType->containsUnexpandedParameterPack()) {
5472             NewType =
5473                 getSema().getASTContext().getPackExpansionType(NewType, None);
5474 
5475             if (NewType.isNull())
5476               return true;
5477           }
5478 
5479           if (ParamInfos)
5480             PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5481           OutParamTypes.push_back(NewType);
5482           if (PVars)
5483             PVars->push_back(nullptr);
5484         }
5485 
5486         // We're done with the pack expansion.
5487         continue;
5488       }
5489 
5490       // If we're supposed to retain a pack expansion, do so by temporarily
5491       // forgetting the partially-substituted parameter pack.
5492       if (RetainExpansion) {
5493         ForgetPartiallySubstitutedPackRAII Forget(getDerived());
5494         QualType NewType = getDerived().TransformType(Pattern);
5495         if (NewType.isNull())
5496           return true;
5497 
5498         if (ParamInfos)
5499           PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5500         OutParamTypes.push_back(NewType);
5501         if (PVars)
5502           PVars->push_back(nullptr);
5503       }
5504 
5505       // We'll substitute the parameter now without expanding the pack
5506       // expansion.
5507       OldType = Expansion->getPattern();
5508       IsPackExpansion = true;
5509       Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
5510       NewType = getDerived().TransformType(OldType);
5511     } else {
5512       NewType = getDerived().TransformType(OldType);
5513     }
5514 
5515     if (NewType.isNull())
5516       return true;
5517 
5518     if (IsPackExpansion)
5519       NewType = getSema().Context.getPackExpansionType(NewType,
5520                                                        NumExpansions);
5521 
5522     if (ParamInfos)
5523       PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5524     OutParamTypes.push_back(NewType);
5525     if (PVars)
5526       PVars->push_back(nullptr);
5527   }
5528 
5529 #ifndef NDEBUG
5530   if (PVars) {
5531     for (unsigned i = 0, e = PVars->size(); i != e; ++i)
5532       if (ParmVarDecl *parm = (*PVars)[i])
5533         assert(parm->getFunctionScopeIndex() == i);
5534   }
5535 #endif
5536 
5537   return false;
5538 }
5539 
5540 template<typename Derived>
5541 QualType
5542 TreeTransform<Derived>::TransformFunctionProtoType(TypeLocBuilder &TLB,
5543                                                    FunctionProtoTypeLoc TL) {
5544   SmallVector<QualType, 4> ExceptionStorage;
5545   TreeTransform *This = this; // Work around gcc.gnu.org/PR56135.
5546   return getDerived().TransformFunctionProtoType(
5547       TLB, TL, nullptr, Qualifiers(),
5548       [&](FunctionProtoType::ExceptionSpecInfo &ESI, bool &Changed) {
5549         return This->TransformExceptionSpec(TL.getBeginLoc(), ESI,
5550                                             ExceptionStorage, Changed);
5551       });
5552 }
5553 
5554 template<typename Derived> template<typename Fn>
5555 QualType TreeTransform<Derived>::TransformFunctionProtoType(
5556     TypeLocBuilder &TLB, FunctionProtoTypeLoc TL, CXXRecordDecl *ThisContext,
5557     Qualifiers ThisTypeQuals, Fn TransformExceptionSpec) {
5558 
5559   // Transform the parameters and return type.
5560   //
5561   // We are required to instantiate the params and return type in source order.
5562   // When the function has a trailing return type, we instantiate the
5563   // parameters before the return type,  since the return type can then refer
5564   // to the parameters themselves (via decltype, sizeof, etc.).
5565   //
5566   SmallVector<QualType, 4> ParamTypes;
5567   SmallVector<ParmVarDecl*, 4> ParamDecls;
5568   Sema::ExtParameterInfoBuilder ExtParamInfos;
5569   const FunctionProtoType *T = TL.getTypePtr();
5570 
5571   QualType ResultType;
5572 
5573   if (T->hasTrailingReturn()) {
5574     if (getDerived().TransformFunctionTypeParams(
5575             TL.getBeginLoc(), TL.getParams(),
5576             TL.getTypePtr()->param_type_begin(),
5577             T->getExtParameterInfosOrNull(),
5578             ParamTypes, &ParamDecls, ExtParamInfos))
5579       return QualType();
5580 
5581     {
5582       // C++11 [expr.prim.general]p3:
5583       //   If a declaration declares a member function or member function
5584       //   template of a class X, the expression this is a prvalue of type
5585       //   "pointer to cv-qualifier-seq X" between the optional cv-qualifer-seq
5586       //   and the end of the function-definition, member-declarator, or
5587       //   declarator.
5588       Sema::CXXThisScopeRAII ThisScope(SemaRef, ThisContext, ThisTypeQuals);
5589 
5590       ResultType = getDerived().TransformType(TLB, TL.getReturnLoc());
5591       if (ResultType.isNull())
5592         return QualType();
5593     }
5594   }
5595   else {
5596     ResultType = getDerived().TransformType(TLB, TL.getReturnLoc());
5597     if (ResultType.isNull())
5598       return QualType();
5599 
5600     if (getDerived().TransformFunctionTypeParams(
5601             TL.getBeginLoc(), TL.getParams(),
5602             TL.getTypePtr()->param_type_begin(),
5603             T->getExtParameterInfosOrNull(),
5604             ParamTypes, &ParamDecls, ExtParamInfos))
5605       return QualType();
5606   }
5607 
5608   FunctionProtoType::ExtProtoInfo EPI = T->getExtProtoInfo();
5609 
5610   bool EPIChanged = false;
5611   if (TransformExceptionSpec(EPI.ExceptionSpec, EPIChanged))
5612     return QualType();
5613 
5614   // Handle extended parameter information.
5615   if (auto NewExtParamInfos =
5616         ExtParamInfos.getPointerOrNull(ParamTypes.size())) {
5617     if (!EPI.ExtParameterInfos ||
5618         llvm::makeArrayRef(EPI.ExtParameterInfos, TL.getNumParams())
5619           != llvm::makeArrayRef(NewExtParamInfos, ParamTypes.size())) {
5620       EPIChanged = true;
5621     }
5622     EPI.ExtParameterInfos = NewExtParamInfos;
5623   } else if (EPI.ExtParameterInfos) {
5624     EPIChanged = true;
5625     EPI.ExtParameterInfos = nullptr;
5626   }
5627 
5628   QualType Result = TL.getType();
5629   if (getDerived().AlwaysRebuild() || ResultType != T->getReturnType() ||
5630       T->getParamTypes() != llvm::makeArrayRef(ParamTypes) || EPIChanged) {
5631     Result = getDerived().RebuildFunctionProtoType(ResultType, ParamTypes, EPI);
5632     if (Result.isNull())
5633       return QualType();
5634   }
5635 
5636   FunctionProtoTypeLoc NewTL = TLB.push<FunctionProtoTypeLoc>(Result);
5637   NewTL.setLocalRangeBegin(TL.getLocalRangeBegin());
5638   NewTL.setLParenLoc(TL.getLParenLoc());
5639   NewTL.setRParenLoc(TL.getRParenLoc());
5640   NewTL.setExceptionSpecRange(TL.getExceptionSpecRange());
5641   NewTL.setLocalRangeEnd(TL.getLocalRangeEnd());
5642   for (unsigned i = 0, e = NewTL.getNumParams(); i != e; ++i)
5643     NewTL.setParam(i, ParamDecls[i]);
5644 
5645   return Result;
5646 }
5647 
5648 template<typename Derived>
5649 bool TreeTransform<Derived>::TransformExceptionSpec(
5650     SourceLocation Loc, FunctionProtoType::ExceptionSpecInfo &ESI,
5651     SmallVectorImpl<QualType> &Exceptions, bool &Changed) {
5652   assert(ESI.Type != EST_Uninstantiated && ESI.Type != EST_Unevaluated);
5653 
5654   // Instantiate a dynamic noexcept expression, if any.
5655   if (isComputedNoexcept(ESI.Type)) {
5656     EnterExpressionEvaluationContext Unevaluated(
5657         getSema(), Sema::ExpressionEvaluationContext::ConstantEvaluated);
5658     ExprResult NoexceptExpr = getDerived().TransformExpr(ESI.NoexceptExpr);
5659     if (NoexceptExpr.isInvalid())
5660       return true;
5661 
5662     ExceptionSpecificationType EST = ESI.Type;
5663     NoexceptExpr =
5664         getSema().ActOnNoexceptSpec(Loc, NoexceptExpr.get(), EST);
5665     if (NoexceptExpr.isInvalid())
5666       return true;
5667 
5668     if (ESI.NoexceptExpr != NoexceptExpr.get() || EST != ESI.Type)
5669       Changed = true;
5670     ESI.NoexceptExpr = NoexceptExpr.get();
5671     ESI.Type = EST;
5672   }
5673 
5674   if (ESI.Type != EST_Dynamic)
5675     return false;
5676 
5677   // Instantiate a dynamic exception specification's type.
5678   for (QualType T : ESI.Exceptions) {
5679     if (const PackExpansionType *PackExpansion =
5680             T->getAs<PackExpansionType>()) {
5681       Changed = true;
5682 
5683       // We have a pack expansion. Instantiate it.
5684       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
5685       SemaRef.collectUnexpandedParameterPacks(PackExpansion->getPattern(),
5686                                               Unexpanded);
5687       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
5688 
5689       // Determine whether the set of unexpanded parameter packs can and
5690       // should
5691       // be expanded.
5692       bool Expand = false;
5693       bool RetainExpansion = false;
5694       Optional<unsigned> NumExpansions = PackExpansion->getNumExpansions();
5695       // FIXME: Track the location of the ellipsis (and track source location
5696       // information for the types in the exception specification in general).
5697       if (getDerived().TryExpandParameterPacks(
5698               Loc, SourceRange(), Unexpanded, Expand,
5699               RetainExpansion, NumExpansions))
5700         return true;
5701 
5702       if (!Expand) {
5703         // We can't expand this pack expansion into separate arguments yet;
5704         // just substitute into the pattern and create a new pack expansion
5705         // type.
5706         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
5707         QualType U = getDerived().TransformType(PackExpansion->getPattern());
5708         if (U.isNull())
5709           return true;
5710 
5711         U = SemaRef.Context.getPackExpansionType(U, NumExpansions);
5712         Exceptions.push_back(U);
5713         continue;
5714       }
5715 
5716       // Substitute into the pack expansion pattern for each slice of the
5717       // pack.
5718       for (unsigned ArgIdx = 0; ArgIdx != *NumExpansions; ++ArgIdx) {
5719         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), ArgIdx);
5720 
5721         QualType U = getDerived().TransformType(PackExpansion->getPattern());
5722         if (U.isNull() || SemaRef.CheckSpecifiedExceptionType(U, Loc))
5723           return true;
5724 
5725         Exceptions.push_back(U);
5726       }
5727     } else {
5728       QualType U = getDerived().TransformType(T);
5729       if (U.isNull() || SemaRef.CheckSpecifiedExceptionType(U, Loc))
5730         return true;
5731       if (T != U)
5732         Changed = true;
5733 
5734       Exceptions.push_back(U);
5735     }
5736   }
5737 
5738   ESI.Exceptions = Exceptions;
5739   if (ESI.Exceptions.empty())
5740     ESI.Type = EST_DynamicNone;
5741   return false;
5742 }
5743 
5744 template<typename Derived>
5745 QualType TreeTransform<Derived>::TransformFunctionNoProtoType(
5746                                                  TypeLocBuilder &TLB,
5747                                                  FunctionNoProtoTypeLoc TL) {
5748   const FunctionNoProtoType *T = TL.getTypePtr();
5749   QualType ResultType = getDerived().TransformType(TLB, TL.getReturnLoc());
5750   if (ResultType.isNull())
5751     return QualType();
5752 
5753   QualType Result = TL.getType();
5754   if (getDerived().AlwaysRebuild() || ResultType != T->getReturnType())
5755     Result = getDerived().RebuildFunctionNoProtoType(ResultType);
5756 
5757   FunctionNoProtoTypeLoc NewTL = TLB.push<FunctionNoProtoTypeLoc>(Result);
5758   NewTL.setLocalRangeBegin(TL.getLocalRangeBegin());
5759   NewTL.setLParenLoc(TL.getLParenLoc());
5760   NewTL.setRParenLoc(TL.getRParenLoc());
5761   NewTL.setLocalRangeEnd(TL.getLocalRangeEnd());
5762 
5763   return Result;
5764 }
5765 
5766 template<typename Derived> QualType
5767 TreeTransform<Derived>::TransformUnresolvedUsingType(TypeLocBuilder &TLB,
5768                                                  UnresolvedUsingTypeLoc TL) {
5769   const UnresolvedUsingType *T = TL.getTypePtr();
5770   Decl *D = getDerived().TransformDecl(TL.getNameLoc(), T->getDecl());
5771   if (!D)
5772     return QualType();
5773 
5774   QualType Result = TL.getType();
5775   if (getDerived().AlwaysRebuild() || D != T->getDecl()) {
5776     Result = getDerived().RebuildUnresolvedUsingType(TL.getNameLoc(), D);
5777     if (Result.isNull())
5778       return QualType();
5779   }
5780 
5781   // We might get an arbitrary type spec type back.  We should at
5782   // least always get a type spec type, though.
5783   TypeSpecTypeLoc NewTL = TLB.pushTypeSpec(Result);
5784   NewTL.setNameLoc(TL.getNameLoc());
5785 
5786   return Result;
5787 }
5788 
5789 template<typename Derived>
5790 QualType TreeTransform<Derived>::TransformTypedefType(TypeLocBuilder &TLB,
5791                                                       TypedefTypeLoc TL) {
5792   const TypedefType *T = TL.getTypePtr();
5793   TypedefNameDecl *Typedef
5794     = cast_or_null<TypedefNameDecl>(getDerived().TransformDecl(TL.getNameLoc(),
5795                                                                T->getDecl()));
5796   if (!Typedef)
5797     return QualType();
5798 
5799   QualType Result = TL.getType();
5800   if (getDerived().AlwaysRebuild() ||
5801       Typedef != T->getDecl()) {
5802     Result = getDerived().RebuildTypedefType(Typedef);
5803     if (Result.isNull())
5804       return QualType();
5805   }
5806 
5807   TypedefTypeLoc NewTL = TLB.push<TypedefTypeLoc>(Result);
5808   NewTL.setNameLoc(TL.getNameLoc());
5809 
5810   return Result;
5811 }
5812 
5813 template<typename Derived>
5814 QualType TreeTransform<Derived>::TransformTypeOfExprType(TypeLocBuilder &TLB,
5815                                                       TypeOfExprTypeLoc TL) {
5816   // typeof expressions are not potentially evaluated contexts
5817   EnterExpressionEvaluationContext Unevaluated(
5818       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated,
5819       Sema::ReuseLambdaContextDecl);
5820 
5821   ExprResult E = getDerived().TransformExpr(TL.getUnderlyingExpr());
5822   if (E.isInvalid())
5823     return QualType();
5824 
5825   E = SemaRef.HandleExprEvaluationContextForTypeof(E.get());
5826   if (E.isInvalid())
5827     return QualType();
5828 
5829   QualType Result = TL.getType();
5830   if (getDerived().AlwaysRebuild() ||
5831       E.get() != TL.getUnderlyingExpr()) {
5832     Result = getDerived().RebuildTypeOfExprType(E.get(), TL.getTypeofLoc());
5833     if (Result.isNull())
5834       return QualType();
5835   }
5836   else E.get();
5837 
5838   TypeOfExprTypeLoc NewTL = TLB.push<TypeOfExprTypeLoc>(Result);
5839   NewTL.setTypeofLoc(TL.getTypeofLoc());
5840   NewTL.setLParenLoc(TL.getLParenLoc());
5841   NewTL.setRParenLoc(TL.getRParenLoc());
5842 
5843   return Result;
5844 }
5845 
5846 template<typename Derived>
5847 QualType TreeTransform<Derived>::TransformTypeOfType(TypeLocBuilder &TLB,
5848                                                      TypeOfTypeLoc TL) {
5849   TypeSourceInfo* Old_Under_TI = TL.getUnderlyingTInfo();
5850   TypeSourceInfo* New_Under_TI = getDerived().TransformType(Old_Under_TI);
5851   if (!New_Under_TI)
5852     return QualType();
5853 
5854   QualType Result = TL.getType();
5855   if (getDerived().AlwaysRebuild() || New_Under_TI != Old_Under_TI) {
5856     Result = getDerived().RebuildTypeOfType(New_Under_TI->getType());
5857     if (Result.isNull())
5858       return QualType();
5859   }
5860 
5861   TypeOfTypeLoc NewTL = TLB.push<TypeOfTypeLoc>(Result);
5862   NewTL.setTypeofLoc(TL.getTypeofLoc());
5863   NewTL.setLParenLoc(TL.getLParenLoc());
5864   NewTL.setRParenLoc(TL.getRParenLoc());
5865   NewTL.setUnderlyingTInfo(New_Under_TI);
5866 
5867   return Result;
5868 }
5869 
5870 template<typename Derived>
5871 QualType TreeTransform<Derived>::TransformDecltypeType(TypeLocBuilder &TLB,
5872                                                        DecltypeTypeLoc TL) {
5873   const DecltypeType *T = TL.getTypePtr();
5874 
5875   // decltype expressions are not potentially evaluated contexts
5876   EnterExpressionEvaluationContext Unevaluated(
5877       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, nullptr,
5878       Sema::ExpressionEvaluationContextRecord::EK_Decltype);
5879 
5880   ExprResult E = getDerived().TransformExpr(T->getUnderlyingExpr());
5881   if (E.isInvalid())
5882     return QualType();
5883 
5884   E = getSema().ActOnDecltypeExpression(E.get());
5885   if (E.isInvalid())
5886     return QualType();
5887 
5888   QualType Result = TL.getType();
5889   if (getDerived().AlwaysRebuild() ||
5890       E.get() != T->getUnderlyingExpr()) {
5891     Result = getDerived().RebuildDecltypeType(E.get(), TL.getNameLoc());
5892     if (Result.isNull())
5893       return QualType();
5894   }
5895   else E.get();
5896 
5897   DecltypeTypeLoc NewTL = TLB.push<DecltypeTypeLoc>(Result);
5898   NewTL.setNameLoc(TL.getNameLoc());
5899 
5900   return Result;
5901 }
5902 
5903 template<typename Derived>
5904 QualType TreeTransform<Derived>::TransformUnaryTransformType(
5905                                                             TypeLocBuilder &TLB,
5906                                                      UnaryTransformTypeLoc TL) {
5907   QualType Result = TL.getType();
5908   if (Result->isDependentType()) {
5909     const UnaryTransformType *T = TL.getTypePtr();
5910     QualType NewBase =
5911       getDerived().TransformType(TL.getUnderlyingTInfo())->getType();
5912     Result = getDerived().RebuildUnaryTransformType(NewBase,
5913                                                     T->getUTTKind(),
5914                                                     TL.getKWLoc());
5915     if (Result.isNull())
5916       return QualType();
5917   }
5918 
5919   UnaryTransformTypeLoc NewTL = TLB.push<UnaryTransformTypeLoc>(Result);
5920   NewTL.setKWLoc(TL.getKWLoc());
5921   NewTL.setParensRange(TL.getParensRange());
5922   NewTL.setUnderlyingTInfo(TL.getUnderlyingTInfo());
5923   return Result;
5924 }
5925 
5926 template<typename Derived>
5927 QualType TreeTransform<Derived>::TransformDeducedTemplateSpecializationType(
5928     TypeLocBuilder &TLB, DeducedTemplateSpecializationTypeLoc TL) {
5929   const DeducedTemplateSpecializationType *T = TL.getTypePtr();
5930 
5931   CXXScopeSpec SS;
5932   TemplateName TemplateName = getDerived().TransformTemplateName(
5933       SS, T->getTemplateName(), TL.getTemplateNameLoc());
5934   if (TemplateName.isNull())
5935     return QualType();
5936 
5937   QualType OldDeduced = T->getDeducedType();
5938   QualType NewDeduced;
5939   if (!OldDeduced.isNull()) {
5940     NewDeduced = getDerived().TransformType(OldDeduced);
5941     if (NewDeduced.isNull())
5942       return QualType();
5943   }
5944 
5945   QualType Result = getDerived().RebuildDeducedTemplateSpecializationType(
5946       TemplateName, NewDeduced);
5947   if (Result.isNull())
5948     return QualType();
5949 
5950   DeducedTemplateSpecializationTypeLoc NewTL =
5951       TLB.push<DeducedTemplateSpecializationTypeLoc>(Result);
5952   NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
5953 
5954   return Result;
5955 }
5956 
5957 template<typename Derived>
5958 QualType TreeTransform<Derived>::TransformRecordType(TypeLocBuilder &TLB,
5959                                                      RecordTypeLoc TL) {
5960   const RecordType *T = TL.getTypePtr();
5961   RecordDecl *Record
5962     = cast_or_null<RecordDecl>(getDerived().TransformDecl(TL.getNameLoc(),
5963                                                           T->getDecl()));
5964   if (!Record)
5965     return QualType();
5966 
5967   QualType Result = TL.getType();
5968   if (getDerived().AlwaysRebuild() ||
5969       Record != T->getDecl()) {
5970     Result = getDerived().RebuildRecordType(Record);
5971     if (Result.isNull())
5972       return QualType();
5973   }
5974 
5975   RecordTypeLoc NewTL = TLB.push<RecordTypeLoc>(Result);
5976   NewTL.setNameLoc(TL.getNameLoc());
5977 
5978   return Result;
5979 }
5980 
5981 template<typename Derived>
5982 QualType TreeTransform<Derived>::TransformEnumType(TypeLocBuilder &TLB,
5983                                                    EnumTypeLoc TL) {
5984   const EnumType *T = TL.getTypePtr();
5985   EnumDecl *Enum
5986     = cast_or_null<EnumDecl>(getDerived().TransformDecl(TL.getNameLoc(),
5987                                                         T->getDecl()));
5988   if (!Enum)
5989     return QualType();
5990 
5991   QualType Result = TL.getType();
5992   if (getDerived().AlwaysRebuild() ||
5993       Enum != T->getDecl()) {
5994     Result = getDerived().RebuildEnumType(Enum);
5995     if (Result.isNull())
5996       return QualType();
5997   }
5998 
5999   EnumTypeLoc NewTL = TLB.push<EnumTypeLoc>(Result);
6000   NewTL.setNameLoc(TL.getNameLoc());
6001 
6002   return Result;
6003 }
6004 
6005 template<typename Derived>
6006 QualType TreeTransform<Derived>::TransformInjectedClassNameType(
6007                                          TypeLocBuilder &TLB,
6008                                          InjectedClassNameTypeLoc TL) {
6009   Decl *D = getDerived().TransformDecl(TL.getNameLoc(),
6010                                        TL.getTypePtr()->getDecl());
6011   if (!D) return QualType();
6012 
6013   QualType T = SemaRef.Context.getTypeDeclType(cast<TypeDecl>(D));
6014   TLB.pushTypeSpec(T).setNameLoc(TL.getNameLoc());
6015   return T;
6016 }
6017 
6018 template<typename Derived>
6019 QualType TreeTransform<Derived>::TransformTemplateTypeParmType(
6020                                                 TypeLocBuilder &TLB,
6021                                                 TemplateTypeParmTypeLoc TL) {
6022   return TransformTypeSpecType(TLB, TL);
6023 }
6024 
6025 template<typename Derived>
6026 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmType(
6027                                          TypeLocBuilder &TLB,
6028                                          SubstTemplateTypeParmTypeLoc TL) {
6029   const SubstTemplateTypeParmType *T = TL.getTypePtr();
6030 
6031   // Substitute into the replacement type, which itself might involve something
6032   // that needs to be transformed. This only tends to occur with default
6033   // template arguments of template template parameters.
6034   TemporaryBase Rebase(*this, TL.getNameLoc(), DeclarationName());
6035   QualType Replacement = getDerived().TransformType(T->getReplacementType());
6036   if (Replacement.isNull())
6037     return QualType();
6038 
6039   // Always canonicalize the replacement type.
6040   Replacement = SemaRef.Context.getCanonicalType(Replacement);
6041   QualType Result
6042     = SemaRef.Context.getSubstTemplateTypeParmType(T->getReplacedParameter(),
6043                                                    Replacement);
6044 
6045   // Propagate type-source information.
6046   SubstTemplateTypeParmTypeLoc NewTL
6047     = TLB.push<SubstTemplateTypeParmTypeLoc>(Result);
6048   NewTL.setNameLoc(TL.getNameLoc());
6049   return Result;
6050 
6051 }
6052 
6053 template<typename Derived>
6054 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmPackType(
6055                                           TypeLocBuilder &TLB,
6056                                           SubstTemplateTypeParmPackTypeLoc TL) {
6057   return TransformTypeSpecType(TLB, TL);
6058 }
6059 
6060 template<typename Derived>
6061 QualType TreeTransform<Derived>::TransformTemplateSpecializationType(
6062                                                         TypeLocBuilder &TLB,
6063                                            TemplateSpecializationTypeLoc TL) {
6064   const TemplateSpecializationType *T = TL.getTypePtr();
6065 
6066   // The nested-name-specifier never matters in a TemplateSpecializationType,
6067   // because we can't have a dependent nested-name-specifier anyway.
6068   CXXScopeSpec SS;
6069   TemplateName Template
6070     = getDerived().TransformTemplateName(SS, T->getTemplateName(),
6071                                          TL.getTemplateNameLoc());
6072   if (Template.isNull())
6073     return QualType();
6074 
6075   return getDerived().TransformTemplateSpecializationType(TLB, TL, Template);
6076 }
6077 
6078 template<typename Derived>
6079 QualType TreeTransform<Derived>::TransformAtomicType(TypeLocBuilder &TLB,
6080                                                      AtomicTypeLoc TL) {
6081   QualType ValueType = getDerived().TransformType(TLB, TL.getValueLoc());
6082   if (ValueType.isNull())
6083     return QualType();
6084 
6085   QualType Result = TL.getType();
6086   if (getDerived().AlwaysRebuild() ||
6087       ValueType != TL.getValueLoc().getType()) {
6088     Result = getDerived().RebuildAtomicType(ValueType, TL.getKWLoc());
6089     if (Result.isNull())
6090       return QualType();
6091   }
6092 
6093   AtomicTypeLoc NewTL = TLB.push<AtomicTypeLoc>(Result);
6094   NewTL.setKWLoc(TL.getKWLoc());
6095   NewTL.setLParenLoc(TL.getLParenLoc());
6096   NewTL.setRParenLoc(TL.getRParenLoc());
6097 
6098   return Result;
6099 }
6100 
6101 template <typename Derived>
6102 QualType TreeTransform<Derived>::TransformPipeType(TypeLocBuilder &TLB,
6103                                                    PipeTypeLoc TL) {
6104   QualType ValueType = getDerived().TransformType(TLB, TL.getValueLoc());
6105   if (ValueType.isNull())
6106     return QualType();
6107 
6108   QualType Result = TL.getType();
6109   if (getDerived().AlwaysRebuild() || ValueType != TL.getValueLoc().getType()) {
6110     const PipeType *PT = Result->castAs<PipeType>();
6111     bool isReadPipe = PT->isReadOnly();
6112     Result = getDerived().RebuildPipeType(ValueType, TL.getKWLoc(), isReadPipe);
6113     if (Result.isNull())
6114       return QualType();
6115   }
6116 
6117   PipeTypeLoc NewTL = TLB.push<PipeTypeLoc>(Result);
6118   NewTL.setKWLoc(TL.getKWLoc());
6119 
6120   return Result;
6121 }
6122 
6123   /// Simple iterator that traverses the template arguments in a
6124   /// container that provides a \c getArgLoc() member function.
6125   ///
6126   /// This iterator is intended to be used with the iterator form of
6127   /// \c TreeTransform<Derived>::TransformTemplateArguments().
6128   template<typename ArgLocContainer>
6129   class TemplateArgumentLocContainerIterator {
6130     ArgLocContainer *Container;
6131     unsigned Index;
6132 
6133   public:
6134     typedef TemplateArgumentLoc value_type;
6135     typedef TemplateArgumentLoc reference;
6136     typedef int difference_type;
6137     typedef std::input_iterator_tag iterator_category;
6138 
6139     class pointer {
6140       TemplateArgumentLoc Arg;
6141 
6142     public:
6143       explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { }
6144 
6145       const TemplateArgumentLoc *operator->() const {
6146         return &Arg;
6147       }
6148     };
6149 
6150 
6151     TemplateArgumentLocContainerIterator() {}
6152 
6153     TemplateArgumentLocContainerIterator(ArgLocContainer &Container,
6154                                  unsigned Index)
6155       : Container(&Container), Index(Index) { }
6156 
6157     TemplateArgumentLocContainerIterator &operator++() {
6158       ++Index;
6159       return *this;
6160     }
6161 
6162     TemplateArgumentLocContainerIterator operator++(int) {
6163       TemplateArgumentLocContainerIterator Old(*this);
6164       ++(*this);
6165       return Old;
6166     }
6167 
6168     TemplateArgumentLoc operator*() const {
6169       return Container->getArgLoc(Index);
6170     }
6171 
6172     pointer operator->() const {
6173       return pointer(Container->getArgLoc(Index));
6174     }
6175 
6176     friend bool operator==(const TemplateArgumentLocContainerIterator &X,
6177                            const TemplateArgumentLocContainerIterator &Y) {
6178       return X.Container == Y.Container && X.Index == Y.Index;
6179     }
6180 
6181     friend bool operator!=(const TemplateArgumentLocContainerIterator &X,
6182                            const TemplateArgumentLocContainerIterator &Y) {
6183       return !(X == Y);
6184     }
6185   };
6186 
6187 template<typename Derived>
6188 QualType TreeTransform<Derived>::TransformAutoType(TypeLocBuilder &TLB,
6189                                                    AutoTypeLoc TL) {
6190   const AutoType *T = TL.getTypePtr();
6191   QualType OldDeduced = T->getDeducedType();
6192   QualType NewDeduced;
6193   if (!OldDeduced.isNull()) {
6194     NewDeduced = getDerived().TransformType(OldDeduced);
6195     if (NewDeduced.isNull())
6196       return QualType();
6197   }
6198 
6199   ConceptDecl *NewCD = nullptr;
6200   TemplateArgumentListInfo NewTemplateArgs;
6201   NestedNameSpecifierLoc NewNestedNameSpec;
6202   if (TL.getTypePtr()->isConstrained()) {
6203     NewCD = cast_or_null<ConceptDecl>(
6204         getDerived().TransformDecl(
6205             TL.getConceptNameLoc(),
6206             TL.getTypePtr()->getTypeConstraintConcept()));
6207 
6208     NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
6209     NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
6210     typedef TemplateArgumentLocContainerIterator<AutoTypeLoc> ArgIterator;
6211     if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
6212                                                 ArgIterator(TL,
6213                                                             TL.getNumArgs()),
6214                                                 NewTemplateArgs))
6215       return QualType();
6216 
6217     if (TL.getNestedNameSpecifierLoc()) {
6218       NewNestedNameSpec
6219         = getDerived().TransformNestedNameSpecifierLoc(
6220             TL.getNestedNameSpecifierLoc());
6221       if (!NewNestedNameSpec)
6222         return QualType();
6223     }
6224   }
6225 
6226   QualType Result = TL.getType();
6227   if (getDerived().AlwaysRebuild() || NewDeduced != OldDeduced ||
6228       T->isDependentType()) {
6229     llvm::SmallVector<TemplateArgument, 4> NewArgList;
6230     NewArgList.reserve(NewArgList.size());
6231     for (const auto &ArgLoc : NewTemplateArgs.arguments())
6232       NewArgList.push_back(ArgLoc.getArgument());
6233     Result = getDerived().RebuildAutoType(NewDeduced, T->getKeyword(), NewCD,
6234                                           NewArgList);
6235     if (Result.isNull())
6236       return QualType();
6237   }
6238 
6239   AutoTypeLoc NewTL = TLB.push<AutoTypeLoc>(Result);
6240   NewTL.setNameLoc(TL.getNameLoc());
6241   NewTL.setNestedNameSpecifierLoc(NewNestedNameSpec);
6242   NewTL.setTemplateKWLoc(TL.getTemplateKWLoc());
6243   NewTL.setConceptNameLoc(TL.getConceptNameLoc());
6244   NewTL.setFoundDecl(TL.getFoundDecl());
6245   NewTL.setLAngleLoc(TL.getLAngleLoc());
6246   NewTL.setRAngleLoc(TL.getRAngleLoc());
6247   for (unsigned I = 0; I < TL.getNumArgs(); ++I)
6248     NewTL.setArgLocInfo(I, NewTemplateArgs.arguments()[I].getLocInfo());
6249 
6250   return Result;
6251 }
6252 
6253 template <typename Derived>
6254 QualType TreeTransform<Derived>::TransformTemplateSpecializationType(
6255                                                         TypeLocBuilder &TLB,
6256                                            TemplateSpecializationTypeLoc TL,
6257                                                       TemplateName Template) {
6258   TemplateArgumentListInfo NewTemplateArgs;
6259   NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
6260   NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
6261   typedef TemplateArgumentLocContainerIterator<TemplateSpecializationTypeLoc>
6262     ArgIterator;
6263   if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
6264                                               ArgIterator(TL, TL.getNumArgs()),
6265                                               NewTemplateArgs))
6266     return QualType();
6267 
6268   // FIXME: maybe don't rebuild if all the template arguments are the same.
6269 
6270   QualType Result =
6271     getDerived().RebuildTemplateSpecializationType(Template,
6272                                                    TL.getTemplateNameLoc(),
6273                                                    NewTemplateArgs);
6274 
6275   if (!Result.isNull()) {
6276     // Specializations of template template parameters are represented as
6277     // TemplateSpecializationTypes, and substitution of type alias templates
6278     // within a dependent context can transform them into
6279     // DependentTemplateSpecializationTypes.
6280     if (isa<DependentTemplateSpecializationType>(Result)) {
6281       DependentTemplateSpecializationTypeLoc NewTL
6282         = TLB.push<DependentTemplateSpecializationTypeLoc>(Result);
6283       NewTL.setElaboratedKeywordLoc(SourceLocation());
6284       NewTL.setQualifierLoc(NestedNameSpecifierLoc());
6285       NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6286       NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6287       NewTL.setLAngleLoc(TL.getLAngleLoc());
6288       NewTL.setRAngleLoc(TL.getRAngleLoc());
6289       for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
6290         NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
6291       return Result;
6292     }
6293 
6294     TemplateSpecializationTypeLoc NewTL
6295       = TLB.push<TemplateSpecializationTypeLoc>(Result);
6296     NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6297     NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6298     NewTL.setLAngleLoc(TL.getLAngleLoc());
6299     NewTL.setRAngleLoc(TL.getRAngleLoc());
6300     for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
6301       NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
6302   }
6303 
6304   return Result;
6305 }
6306 
6307 template <typename Derived>
6308 QualType TreeTransform<Derived>::TransformDependentTemplateSpecializationType(
6309                                      TypeLocBuilder &TLB,
6310                                      DependentTemplateSpecializationTypeLoc TL,
6311                                      TemplateName Template,
6312                                      CXXScopeSpec &SS) {
6313   TemplateArgumentListInfo NewTemplateArgs;
6314   NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
6315   NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
6316   typedef TemplateArgumentLocContainerIterator<
6317             DependentTemplateSpecializationTypeLoc> ArgIterator;
6318   if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
6319                                               ArgIterator(TL, TL.getNumArgs()),
6320                                               NewTemplateArgs))
6321     return QualType();
6322 
6323   // FIXME: maybe don't rebuild if all the template arguments are the same.
6324 
6325   if (DependentTemplateName *DTN = Template.getAsDependentTemplateName()) {
6326     QualType Result
6327       = getSema().Context.getDependentTemplateSpecializationType(
6328                                                 TL.getTypePtr()->getKeyword(),
6329                                                          DTN->getQualifier(),
6330                                                          DTN->getIdentifier(),
6331                                                                NewTemplateArgs);
6332 
6333     DependentTemplateSpecializationTypeLoc NewTL
6334       = TLB.push<DependentTemplateSpecializationTypeLoc>(Result);
6335     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6336     NewTL.setQualifierLoc(SS.getWithLocInContext(SemaRef.Context));
6337     NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6338     NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6339     NewTL.setLAngleLoc(TL.getLAngleLoc());
6340     NewTL.setRAngleLoc(TL.getRAngleLoc());
6341     for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
6342       NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
6343     return Result;
6344   }
6345 
6346   QualType Result
6347     = getDerived().RebuildTemplateSpecializationType(Template,
6348                                                      TL.getTemplateNameLoc(),
6349                                                      NewTemplateArgs);
6350 
6351   if (!Result.isNull()) {
6352     /// FIXME: Wrap this in an elaborated-type-specifier?
6353     TemplateSpecializationTypeLoc NewTL
6354       = TLB.push<TemplateSpecializationTypeLoc>(Result);
6355     NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6356     NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6357     NewTL.setLAngleLoc(TL.getLAngleLoc());
6358     NewTL.setRAngleLoc(TL.getRAngleLoc());
6359     for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
6360       NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
6361   }
6362 
6363   return Result;
6364 }
6365 
6366 template<typename Derived>
6367 QualType
6368 TreeTransform<Derived>::TransformElaboratedType(TypeLocBuilder &TLB,
6369                                                 ElaboratedTypeLoc TL) {
6370   const ElaboratedType *T = TL.getTypePtr();
6371 
6372   NestedNameSpecifierLoc QualifierLoc;
6373   // NOTE: the qualifier in an ElaboratedType is optional.
6374   if (TL.getQualifierLoc()) {
6375     QualifierLoc
6376       = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc());
6377     if (!QualifierLoc)
6378       return QualType();
6379   }
6380 
6381   QualType NamedT = getDerived().TransformType(TLB, TL.getNamedTypeLoc());
6382   if (NamedT.isNull())
6383     return QualType();
6384 
6385   // C++0x [dcl.type.elab]p2:
6386   //   If the identifier resolves to a typedef-name or the simple-template-id
6387   //   resolves to an alias template specialization, the
6388   //   elaborated-type-specifier is ill-formed.
6389   if (T->getKeyword() != ETK_None && T->getKeyword() != ETK_Typename) {
6390     if (const TemplateSpecializationType *TST =
6391           NamedT->getAs<TemplateSpecializationType>()) {
6392       TemplateName Template = TST->getTemplateName();
6393       if (TypeAliasTemplateDecl *TAT = dyn_cast_or_null<TypeAliasTemplateDecl>(
6394               Template.getAsTemplateDecl())) {
6395         SemaRef.Diag(TL.getNamedTypeLoc().getBeginLoc(),
6396                      diag::err_tag_reference_non_tag)
6397             << TAT << Sema::NTK_TypeAliasTemplate
6398             << ElaboratedType::getTagTypeKindForKeyword(T->getKeyword());
6399         SemaRef.Diag(TAT->getLocation(), diag::note_declared_at);
6400       }
6401     }
6402   }
6403 
6404   QualType Result = TL.getType();
6405   if (getDerived().AlwaysRebuild() ||
6406       QualifierLoc != TL.getQualifierLoc() ||
6407       NamedT != T->getNamedType()) {
6408     Result = getDerived().RebuildElaboratedType(TL.getElaboratedKeywordLoc(),
6409                                                 T->getKeyword(),
6410                                                 QualifierLoc, NamedT);
6411     if (Result.isNull())
6412       return QualType();
6413   }
6414 
6415   ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
6416   NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6417   NewTL.setQualifierLoc(QualifierLoc);
6418   return Result;
6419 }
6420 
6421 template<typename Derived>
6422 QualType TreeTransform<Derived>::TransformAttributedType(
6423                                                 TypeLocBuilder &TLB,
6424                                                 AttributedTypeLoc TL) {
6425   const AttributedType *oldType = TL.getTypePtr();
6426   QualType modifiedType = getDerived().TransformType(TLB, TL.getModifiedLoc());
6427   if (modifiedType.isNull())
6428     return QualType();
6429 
6430   // oldAttr can be null if we started with a QualType rather than a TypeLoc.
6431   const Attr *oldAttr = TL.getAttr();
6432   const Attr *newAttr = oldAttr ? getDerived().TransformAttr(oldAttr) : nullptr;
6433   if (oldAttr && !newAttr)
6434     return QualType();
6435 
6436   QualType result = TL.getType();
6437 
6438   // FIXME: dependent operand expressions?
6439   if (getDerived().AlwaysRebuild() ||
6440       modifiedType != oldType->getModifiedType()) {
6441     // TODO: this is really lame; we should really be rebuilding the
6442     // equivalent type from first principles.
6443     QualType equivalentType
6444       = getDerived().TransformType(oldType->getEquivalentType());
6445     if (equivalentType.isNull())
6446       return QualType();
6447 
6448     // Check whether we can add nullability; it is only represented as
6449     // type sugar, and therefore cannot be diagnosed in any other way.
6450     if (auto nullability = oldType->getImmediateNullability()) {
6451       if (!modifiedType->canHaveNullability()) {
6452         SemaRef.Diag(TL.getAttr()->getLocation(),
6453                      diag::err_nullability_nonpointer)
6454             << DiagNullabilityKind(*nullability, false) << modifiedType;
6455         return QualType();
6456       }
6457     }
6458 
6459     result = SemaRef.Context.getAttributedType(TL.getAttrKind(),
6460                                                modifiedType,
6461                                                equivalentType);
6462   }
6463 
6464   AttributedTypeLoc newTL = TLB.push<AttributedTypeLoc>(result);
6465   newTL.setAttr(newAttr);
6466   return result;
6467 }
6468 
6469 template<typename Derived>
6470 QualType
6471 TreeTransform<Derived>::TransformParenType(TypeLocBuilder &TLB,
6472                                            ParenTypeLoc TL) {
6473   QualType Inner = getDerived().TransformType(TLB, TL.getInnerLoc());
6474   if (Inner.isNull())
6475     return QualType();
6476 
6477   QualType Result = TL.getType();
6478   if (getDerived().AlwaysRebuild() ||
6479       Inner != TL.getInnerLoc().getType()) {
6480     Result = getDerived().RebuildParenType(Inner);
6481     if (Result.isNull())
6482       return QualType();
6483   }
6484 
6485   ParenTypeLoc NewTL = TLB.push<ParenTypeLoc>(Result);
6486   NewTL.setLParenLoc(TL.getLParenLoc());
6487   NewTL.setRParenLoc(TL.getRParenLoc());
6488   return Result;
6489 }
6490 
6491 template <typename Derived>
6492 QualType
6493 TreeTransform<Derived>::TransformMacroQualifiedType(TypeLocBuilder &TLB,
6494                                                     MacroQualifiedTypeLoc TL) {
6495   QualType Inner = getDerived().TransformType(TLB, TL.getInnerLoc());
6496   if (Inner.isNull())
6497     return QualType();
6498 
6499   QualType Result = TL.getType();
6500   if (getDerived().AlwaysRebuild() || Inner != TL.getInnerLoc().getType()) {
6501     Result =
6502         getDerived().RebuildMacroQualifiedType(Inner, TL.getMacroIdentifier());
6503     if (Result.isNull())
6504       return QualType();
6505   }
6506 
6507   MacroQualifiedTypeLoc NewTL = TLB.push<MacroQualifiedTypeLoc>(Result);
6508   NewTL.setExpansionLoc(TL.getExpansionLoc());
6509   return Result;
6510 }
6511 
6512 template<typename Derived>
6513 QualType TreeTransform<Derived>::TransformDependentNameType(
6514     TypeLocBuilder &TLB, DependentNameTypeLoc TL) {
6515   return TransformDependentNameType(TLB, TL, false);
6516 }
6517 
6518 template<typename Derived>
6519 QualType TreeTransform<Derived>::TransformDependentNameType(
6520     TypeLocBuilder &TLB, DependentNameTypeLoc TL, bool DeducedTSTContext) {
6521   const DependentNameType *T = TL.getTypePtr();
6522 
6523   NestedNameSpecifierLoc QualifierLoc
6524     = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc());
6525   if (!QualifierLoc)
6526     return QualType();
6527 
6528   QualType Result
6529     = getDerived().RebuildDependentNameType(T->getKeyword(),
6530                                             TL.getElaboratedKeywordLoc(),
6531                                             QualifierLoc,
6532                                             T->getIdentifier(),
6533                                             TL.getNameLoc(),
6534                                             DeducedTSTContext);
6535   if (Result.isNull())
6536     return QualType();
6537 
6538   if (const ElaboratedType* ElabT = Result->getAs<ElaboratedType>()) {
6539     QualType NamedT = ElabT->getNamedType();
6540     TLB.pushTypeSpec(NamedT).setNameLoc(TL.getNameLoc());
6541 
6542     ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
6543     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6544     NewTL.setQualifierLoc(QualifierLoc);
6545   } else {
6546     DependentNameTypeLoc NewTL = TLB.push<DependentNameTypeLoc>(Result);
6547     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6548     NewTL.setQualifierLoc(QualifierLoc);
6549     NewTL.setNameLoc(TL.getNameLoc());
6550   }
6551   return Result;
6552 }
6553 
6554 template<typename Derived>
6555 QualType TreeTransform<Derived>::
6556           TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB,
6557                                  DependentTemplateSpecializationTypeLoc TL) {
6558   NestedNameSpecifierLoc QualifierLoc;
6559   if (TL.getQualifierLoc()) {
6560     QualifierLoc
6561       = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc());
6562     if (!QualifierLoc)
6563       return QualType();
6564   }
6565 
6566   return getDerived()
6567            .TransformDependentTemplateSpecializationType(TLB, TL, QualifierLoc);
6568 }
6569 
6570 template<typename Derived>
6571 QualType TreeTransform<Derived>::
6572 TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB,
6573                                    DependentTemplateSpecializationTypeLoc TL,
6574                                        NestedNameSpecifierLoc QualifierLoc) {
6575   const DependentTemplateSpecializationType *T = TL.getTypePtr();
6576 
6577   TemplateArgumentListInfo NewTemplateArgs;
6578   NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
6579   NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
6580 
6581   typedef TemplateArgumentLocContainerIterator<
6582   DependentTemplateSpecializationTypeLoc> ArgIterator;
6583   if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
6584                                               ArgIterator(TL, TL.getNumArgs()),
6585                                               NewTemplateArgs))
6586     return QualType();
6587 
6588   QualType Result = getDerived().RebuildDependentTemplateSpecializationType(
6589       T->getKeyword(), QualifierLoc, TL.getTemplateKeywordLoc(),
6590       T->getIdentifier(), TL.getTemplateNameLoc(), NewTemplateArgs,
6591       /*AllowInjectedClassName*/ false);
6592   if (Result.isNull())
6593     return QualType();
6594 
6595   if (const ElaboratedType *ElabT = dyn_cast<ElaboratedType>(Result)) {
6596     QualType NamedT = ElabT->getNamedType();
6597 
6598     // Copy information relevant to the template specialization.
6599     TemplateSpecializationTypeLoc NamedTL
6600       = TLB.push<TemplateSpecializationTypeLoc>(NamedT);
6601     NamedTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6602     NamedTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6603     NamedTL.setLAngleLoc(TL.getLAngleLoc());
6604     NamedTL.setRAngleLoc(TL.getRAngleLoc());
6605     for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I)
6606       NamedTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo());
6607 
6608     // Copy information relevant to the elaborated type.
6609     ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
6610     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6611     NewTL.setQualifierLoc(QualifierLoc);
6612   } else if (isa<DependentTemplateSpecializationType>(Result)) {
6613     DependentTemplateSpecializationTypeLoc SpecTL
6614       = TLB.push<DependentTemplateSpecializationTypeLoc>(Result);
6615     SpecTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6616     SpecTL.setQualifierLoc(QualifierLoc);
6617     SpecTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6618     SpecTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6619     SpecTL.setLAngleLoc(TL.getLAngleLoc());
6620     SpecTL.setRAngleLoc(TL.getRAngleLoc());
6621     for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I)
6622       SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo());
6623   } else {
6624     TemplateSpecializationTypeLoc SpecTL
6625       = TLB.push<TemplateSpecializationTypeLoc>(Result);
6626     SpecTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6627     SpecTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6628     SpecTL.setLAngleLoc(TL.getLAngleLoc());
6629     SpecTL.setRAngleLoc(TL.getRAngleLoc());
6630     for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I)
6631       SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo());
6632   }
6633   return Result;
6634 }
6635 
6636 template<typename Derived>
6637 QualType TreeTransform<Derived>::TransformPackExpansionType(TypeLocBuilder &TLB,
6638                                                       PackExpansionTypeLoc TL) {
6639   QualType Pattern
6640     = getDerived().TransformType(TLB, TL.getPatternLoc());
6641   if (Pattern.isNull())
6642     return QualType();
6643 
6644   QualType Result = TL.getType();
6645   if (getDerived().AlwaysRebuild() ||
6646       Pattern != TL.getPatternLoc().getType()) {
6647     Result = getDerived().RebuildPackExpansionType(Pattern,
6648                                            TL.getPatternLoc().getSourceRange(),
6649                                                    TL.getEllipsisLoc(),
6650                                            TL.getTypePtr()->getNumExpansions());
6651     if (Result.isNull())
6652       return QualType();
6653   }
6654 
6655   PackExpansionTypeLoc NewT = TLB.push<PackExpansionTypeLoc>(Result);
6656   NewT.setEllipsisLoc(TL.getEllipsisLoc());
6657   return Result;
6658 }
6659 
6660 template<typename Derived>
6661 QualType
6662 TreeTransform<Derived>::TransformObjCInterfaceType(TypeLocBuilder &TLB,
6663                                                    ObjCInterfaceTypeLoc TL) {
6664   // ObjCInterfaceType is never dependent.
6665   TLB.pushFullCopy(TL);
6666   return TL.getType();
6667 }
6668 
6669 template<typename Derived>
6670 QualType
6671 TreeTransform<Derived>::TransformObjCTypeParamType(TypeLocBuilder &TLB,
6672                                                    ObjCTypeParamTypeLoc TL) {
6673   const ObjCTypeParamType *T = TL.getTypePtr();
6674   ObjCTypeParamDecl *OTP = cast_or_null<ObjCTypeParamDecl>(
6675       getDerived().TransformDecl(T->getDecl()->getLocation(), T->getDecl()));
6676   if (!OTP)
6677     return QualType();
6678 
6679   QualType Result = TL.getType();
6680   if (getDerived().AlwaysRebuild() ||
6681       OTP != T->getDecl()) {
6682     Result = getDerived().RebuildObjCTypeParamType(OTP,
6683                  TL.getProtocolLAngleLoc(),
6684                  llvm::makeArrayRef(TL.getTypePtr()->qual_begin(),
6685                                     TL.getNumProtocols()),
6686                  TL.getProtocolLocs(),
6687                  TL.getProtocolRAngleLoc());
6688     if (Result.isNull())
6689       return QualType();
6690   }
6691 
6692   ObjCTypeParamTypeLoc NewTL = TLB.push<ObjCTypeParamTypeLoc>(Result);
6693   if (TL.getNumProtocols()) {
6694     NewTL.setProtocolLAngleLoc(TL.getProtocolLAngleLoc());
6695     for (unsigned i = 0, n = TL.getNumProtocols(); i != n; ++i)
6696       NewTL.setProtocolLoc(i, TL.getProtocolLoc(i));
6697     NewTL.setProtocolRAngleLoc(TL.getProtocolRAngleLoc());
6698   }
6699   return Result;
6700 }
6701 
6702 template<typename Derived>
6703 QualType
6704 TreeTransform<Derived>::TransformObjCObjectType(TypeLocBuilder &TLB,
6705                                                 ObjCObjectTypeLoc TL) {
6706   // Transform base type.
6707   QualType BaseType = getDerived().TransformType(TLB, TL.getBaseLoc());
6708   if (BaseType.isNull())
6709     return QualType();
6710 
6711   bool AnyChanged = BaseType != TL.getBaseLoc().getType();
6712 
6713   // Transform type arguments.
6714   SmallVector<TypeSourceInfo *, 4> NewTypeArgInfos;
6715   for (unsigned i = 0, n = TL.getNumTypeArgs(); i != n; ++i) {
6716     TypeSourceInfo *TypeArgInfo = TL.getTypeArgTInfo(i);
6717     TypeLoc TypeArgLoc = TypeArgInfo->getTypeLoc();
6718     QualType TypeArg = TypeArgInfo->getType();
6719     if (auto PackExpansionLoc = TypeArgLoc.getAs<PackExpansionTypeLoc>()) {
6720       AnyChanged = true;
6721 
6722       // We have a pack expansion. Instantiate it.
6723       const auto *PackExpansion = PackExpansionLoc.getType()
6724                                     ->castAs<PackExpansionType>();
6725       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
6726       SemaRef.collectUnexpandedParameterPacks(PackExpansion->getPattern(),
6727                                               Unexpanded);
6728       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
6729 
6730       // Determine whether the set of unexpanded parameter packs can
6731       // and should be expanded.
6732       TypeLoc PatternLoc = PackExpansionLoc.getPatternLoc();
6733       bool Expand = false;
6734       bool RetainExpansion = false;
6735       Optional<unsigned> NumExpansions = PackExpansion->getNumExpansions();
6736       if (getDerived().TryExpandParameterPacks(
6737             PackExpansionLoc.getEllipsisLoc(), PatternLoc.getSourceRange(),
6738             Unexpanded, Expand, RetainExpansion, NumExpansions))
6739         return QualType();
6740 
6741       if (!Expand) {
6742         // We can't expand this pack expansion into separate arguments yet;
6743         // just substitute into the pattern and create a new pack expansion
6744         // type.
6745         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
6746 
6747         TypeLocBuilder TypeArgBuilder;
6748         TypeArgBuilder.reserve(PatternLoc.getFullDataSize());
6749         QualType NewPatternType = getDerived().TransformType(TypeArgBuilder,
6750                                                              PatternLoc);
6751         if (NewPatternType.isNull())
6752           return QualType();
6753 
6754         QualType NewExpansionType = SemaRef.Context.getPackExpansionType(
6755                                       NewPatternType, NumExpansions);
6756         auto NewExpansionLoc = TLB.push<PackExpansionTypeLoc>(NewExpansionType);
6757         NewExpansionLoc.setEllipsisLoc(PackExpansionLoc.getEllipsisLoc());
6758         NewTypeArgInfos.push_back(
6759           TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewExpansionType));
6760         continue;
6761       }
6762 
6763       // Substitute into the pack expansion pattern for each slice of the
6764       // pack.
6765       for (unsigned ArgIdx = 0; ArgIdx != *NumExpansions; ++ArgIdx) {
6766         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), ArgIdx);
6767 
6768         TypeLocBuilder TypeArgBuilder;
6769         TypeArgBuilder.reserve(PatternLoc.getFullDataSize());
6770 
6771         QualType NewTypeArg = getDerived().TransformType(TypeArgBuilder,
6772                                                          PatternLoc);
6773         if (NewTypeArg.isNull())
6774           return QualType();
6775 
6776         NewTypeArgInfos.push_back(
6777           TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewTypeArg));
6778       }
6779 
6780       continue;
6781     }
6782 
6783     TypeLocBuilder TypeArgBuilder;
6784     TypeArgBuilder.reserve(TypeArgLoc.getFullDataSize());
6785     QualType NewTypeArg = getDerived().TransformType(TypeArgBuilder, TypeArgLoc);
6786     if (NewTypeArg.isNull())
6787       return QualType();
6788 
6789     // If nothing changed, just keep the old TypeSourceInfo.
6790     if (NewTypeArg == TypeArg) {
6791       NewTypeArgInfos.push_back(TypeArgInfo);
6792       continue;
6793     }
6794 
6795     NewTypeArgInfos.push_back(
6796       TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewTypeArg));
6797     AnyChanged = true;
6798   }
6799 
6800   QualType Result = TL.getType();
6801   if (getDerived().AlwaysRebuild() || AnyChanged) {
6802     // Rebuild the type.
6803     Result = getDerived().RebuildObjCObjectType(
6804         BaseType, TL.getBeginLoc(), TL.getTypeArgsLAngleLoc(), NewTypeArgInfos,
6805         TL.getTypeArgsRAngleLoc(), TL.getProtocolLAngleLoc(),
6806         llvm::makeArrayRef(TL.getTypePtr()->qual_begin(), TL.getNumProtocols()),
6807         TL.getProtocolLocs(), TL.getProtocolRAngleLoc());
6808 
6809     if (Result.isNull())
6810       return QualType();
6811   }
6812 
6813   ObjCObjectTypeLoc NewT = TLB.push<ObjCObjectTypeLoc>(Result);
6814   NewT.setHasBaseTypeAsWritten(true);
6815   NewT.setTypeArgsLAngleLoc(TL.getTypeArgsLAngleLoc());
6816   for (unsigned i = 0, n = TL.getNumTypeArgs(); i != n; ++i)
6817     NewT.setTypeArgTInfo(i, NewTypeArgInfos[i]);
6818   NewT.setTypeArgsRAngleLoc(TL.getTypeArgsRAngleLoc());
6819   NewT.setProtocolLAngleLoc(TL.getProtocolLAngleLoc());
6820   for (unsigned i = 0, n = TL.getNumProtocols(); i != n; ++i)
6821     NewT.setProtocolLoc(i, TL.getProtocolLoc(i));
6822   NewT.setProtocolRAngleLoc(TL.getProtocolRAngleLoc());
6823   return Result;
6824 }
6825 
6826 template<typename Derived>
6827 QualType
6828 TreeTransform<Derived>::TransformObjCObjectPointerType(TypeLocBuilder &TLB,
6829                                                ObjCObjectPointerTypeLoc TL) {
6830   QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
6831   if (PointeeType.isNull())
6832     return QualType();
6833 
6834   QualType Result = TL.getType();
6835   if (getDerived().AlwaysRebuild() ||
6836       PointeeType != TL.getPointeeLoc().getType()) {
6837     Result = getDerived().RebuildObjCObjectPointerType(PointeeType,
6838                                                        TL.getStarLoc());
6839     if (Result.isNull())
6840       return QualType();
6841   }
6842 
6843   ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result);
6844   NewT.setStarLoc(TL.getStarLoc());
6845   return Result;
6846 }
6847 
6848 //===----------------------------------------------------------------------===//
6849 // Statement transformation
6850 //===----------------------------------------------------------------------===//
6851 template<typename Derived>
6852 StmtResult
6853 TreeTransform<Derived>::TransformNullStmt(NullStmt *S) {
6854   return S;
6855 }
6856 
6857 template<typename Derived>
6858 StmtResult
6859 TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S) {
6860   return getDerived().TransformCompoundStmt(S, false);
6861 }
6862 
6863 template<typename Derived>
6864 StmtResult
6865 TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S,
6866                                               bool IsStmtExpr) {
6867   Sema::CompoundScopeRAII CompoundScope(getSema());
6868 
6869   const Stmt *ExprResult = S->getStmtExprResult();
6870   bool SubStmtInvalid = false;
6871   bool SubStmtChanged = false;
6872   SmallVector<Stmt*, 8> Statements;
6873   for (auto *B : S->body()) {
6874     StmtResult Result = getDerived().TransformStmt(
6875         B, IsStmtExpr && B == ExprResult ? SDK_StmtExprResult : SDK_Discarded);
6876 
6877     if (Result.isInvalid()) {
6878       // Immediately fail if this was a DeclStmt, since it's very
6879       // likely that this will cause problems for future statements.
6880       if (isa<DeclStmt>(B))
6881         return StmtError();
6882 
6883       // Otherwise, just keep processing substatements and fail later.
6884       SubStmtInvalid = true;
6885       continue;
6886     }
6887 
6888     SubStmtChanged = SubStmtChanged || Result.get() != B;
6889     Statements.push_back(Result.getAs<Stmt>());
6890   }
6891 
6892   if (SubStmtInvalid)
6893     return StmtError();
6894 
6895   if (!getDerived().AlwaysRebuild() &&
6896       !SubStmtChanged)
6897     return S;
6898 
6899   return getDerived().RebuildCompoundStmt(S->getLBracLoc(),
6900                                           Statements,
6901                                           S->getRBracLoc(),
6902                                           IsStmtExpr);
6903 }
6904 
6905 template<typename Derived>
6906 StmtResult
6907 TreeTransform<Derived>::TransformCaseStmt(CaseStmt *S) {
6908   ExprResult LHS, RHS;
6909   {
6910     EnterExpressionEvaluationContext Unevaluated(
6911         SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
6912 
6913     // Transform the left-hand case value.
6914     LHS = getDerived().TransformExpr(S->getLHS());
6915     LHS = SemaRef.ActOnCaseExpr(S->getCaseLoc(), LHS);
6916     if (LHS.isInvalid())
6917       return StmtError();
6918 
6919     // Transform the right-hand case value (for the GNU case-range extension).
6920     RHS = getDerived().TransformExpr(S->getRHS());
6921     RHS = SemaRef.ActOnCaseExpr(S->getCaseLoc(), RHS);
6922     if (RHS.isInvalid())
6923       return StmtError();
6924   }
6925 
6926   // Build the case statement.
6927   // Case statements are always rebuilt so that they will attached to their
6928   // transformed switch statement.
6929   StmtResult Case = getDerived().RebuildCaseStmt(S->getCaseLoc(),
6930                                                        LHS.get(),
6931                                                        S->getEllipsisLoc(),
6932                                                        RHS.get(),
6933                                                        S->getColonLoc());
6934   if (Case.isInvalid())
6935     return StmtError();
6936 
6937   // Transform the statement following the case
6938   StmtResult SubStmt =
6939       getDerived().TransformStmt(S->getSubStmt());
6940   if (SubStmt.isInvalid())
6941     return StmtError();
6942 
6943   // Attach the body to the case statement
6944   return getDerived().RebuildCaseStmtBody(Case.get(), SubStmt.get());
6945 }
6946 
6947 template <typename Derived>
6948 StmtResult TreeTransform<Derived>::TransformDefaultStmt(DefaultStmt *S) {
6949   // Transform the statement following the default case
6950   StmtResult SubStmt =
6951       getDerived().TransformStmt(S->getSubStmt());
6952   if (SubStmt.isInvalid())
6953     return StmtError();
6954 
6955   // Default statements are always rebuilt
6956   return getDerived().RebuildDefaultStmt(S->getDefaultLoc(), S->getColonLoc(),
6957                                          SubStmt.get());
6958 }
6959 
6960 template<typename Derived>
6961 StmtResult
6962 TreeTransform<Derived>::TransformLabelStmt(LabelStmt *S, StmtDiscardKind SDK) {
6963   StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt(), SDK);
6964   if (SubStmt.isInvalid())
6965     return StmtError();
6966 
6967   Decl *LD = getDerived().TransformDecl(S->getDecl()->getLocation(),
6968                                         S->getDecl());
6969   if (!LD)
6970     return StmtError();
6971 
6972   // If we're transforming "in-place" (we're not creating new local
6973   // declarations), assume we're replacing the old label statement
6974   // and clear out the reference to it.
6975   if (LD == S->getDecl())
6976     S->getDecl()->setStmt(nullptr);
6977 
6978   // FIXME: Pass the real colon location in.
6979   return getDerived().RebuildLabelStmt(S->getIdentLoc(),
6980                                        cast<LabelDecl>(LD), SourceLocation(),
6981                                        SubStmt.get());
6982 }
6983 
6984 template <typename Derived>
6985 const Attr *TreeTransform<Derived>::TransformAttr(const Attr *R) {
6986   if (!R)
6987     return R;
6988 
6989   switch (R->getKind()) {
6990 // Transform attributes with a pragma spelling by calling TransformXXXAttr.
6991 #define ATTR(X)
6992 #define PRAGMA_SPELLING_ATTR(X)                                                \
6993   case attr::X:                                                                \
6994     return getDerived().Transform##X##Attr(cast<X##Attr>(R));
6995 #include "clang/Basic/AttrList.inc"
6996   default:
6997     return R;
6998   }
6999 }
7000 
7001 template <typename Derived>
7002 StmtResult
7003 TreeTransform<Derived>::TransformAttributedStmt(AttributedStmt *S,
7004                                                 StmtDiscardKind SDK) {
7005   bool AttrsChanged = false;
7006   SmallVector<const Attr *, 1> Attrs;
7007 
7008   // Visit attributes and keep track if any are transformed.
7009   for (const auto *I : S->getAttrs()) {
7010     const Attr *R = getDerived().TransformAttr(I);
7011     AttrsChanged |= (I != R);
7012     Attrs.push_back(R);
7013   }
7014 
7015   StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt(), SDK);
7016   if (SubStmt.isInvalid())
7017     return StmtError();
7018 
7019   if (SubStmt.get() == S->getSubStmt() && !AttrsChanged)
7020     return S;
7021 
7022   return getDerived().RebuildAttributedStmt(S->getAttrLoc(), Attrs,
7023                                             SubStmt.get());
7024 }
7025 
7026 template<typename Derived>
7027 StmtResult
7028 TreeTransform<Derived>::TransformIfStmt(IfStmt *S) {
7029   // Transform the initialization statement
7030   StmtResult Init = getDerived().TransformStmt(S->getInit());
7031   if (Init.isInvalid())
7032     return StmtError();
7033 
7034   // Transform the condition
7035   Sema::ConditionResult Cond = getDerived().TransformCondition(
7036       S->getIfLoc(), S->getConditionVariable(), S->getCond(),
7037       S->isConstexpr() ? Sema::ConditionKind::ConstexprIf
7038                        : Sema::ConditionKind::Boolean);
7039   if (Cond.isInvalid())
7040     return StmtError();
7041 
7042   // If this is a constexpr if, determine which arm we should instantiate.
7043   llvm::Optional<bool> ConstexprConditionValue;
7044   if (S->isConstexpr())
7045     ConstexprConditionValue = Cond.getKnownValue();
7046 
7047   // Transform the "then" branch.
7048   StmtResult Then;
7049   if (!ConstexprConditionValue || *ConstexprConditionValue) {
7050     Then = getDerived().TransformStmt(S->getThen());
7051     if (Then.isInvalid())
7052       return StmtError();
7053   } else {
7054     Then = new (getSema().Context) NullStmt(S->getThen()->getBeginLoc());
7055   }
7056 
7057   // Transform the "else" branch.
7058   StmtResult Else;
7059   if (!ConstexprConditionValue || !*ConstexprConditionValue) {
7060     Else = getDerived().TransformStmt(S->getElse());
7061     if (Else.isInvalid())
7062       return StmtError();
7063   }
7064 
7065   if (!getDerived().AlwaysRebuild() &&
7066       Init.get() == S->getInit() &&
7067       Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) &&
7068       Then.get() == S->getThen() &&
7069       Else.get() == S->getElse())
7070     return S;
7071 
7072   return getDerived().RebuildIfStmt(S->getIfLoc(), S->isConstexpr(), Cond,
7073                                     Init.get(), Then.get(), S->getElseLoc(),
7074                                     Else.get());
7075 }
7076 
7077 template<typename Derived>
7078 StmtResult
7079 TreeTransform<Derived>::TransformSwitchStmt(SwitchStmt *S) {
7080   // Transform the initialization statement
7081   StmtResult Init = getDerived().TransformStmt(S->getInit());
7082   if (Init.isInvalid())
7083     return StmtError();
7084 
7085   // Transform the condition.
7086   Sema::ConditionResult Cond = getDerived().TransformCondition(
7087       S->getSwitchLoc(), S->getConditionVariable(), S->getCond(),
7088       Sema::ConditionKind::Switch);
7089   if (Cond.isInvalid())
7090     return StmtError();
7091 
7092   // Rebuild the switch statement.
7093   StmtResult Switch
7094     = getDerived().RebuildSwitchStmtStart(S->getSwitchLoc(), Init.get(), Cond);
7095   if (Switch.isInvalid())
7096     return StmtError();
7097 
7098   // Transform the body of the switch statement.
7099   StmtResult Body = getDerived().TransformStmt(S->getBody());
7100   if (Body.isInvalid())
7101     return StmtError();
7102 
7103   // Complete the switch statement.
7104   return getDerived().RebuildSwitchStmtBody(S->getSwitchLoc(), Switch.get(),
7105                                             Body.get());
7106 }
7107 
7108 template<typename Derived>
7109 StmtResult
7110 TreeTransform<Derived>::TransformWhileStmt(WhileStmt *S) {
7111   // Transform the condition
7112   Sema::ConditionResult Cond = getDerived().TransformCondition(
7113       S->getWhileLoc(), S->getConditionVariable(), S->getCond(),
7114       Sema::ConditionKind::Boolean);
7115   if (Cond.isInvalid())
7116     return StmtError();
7117 
7118   // Transform the body
7119   StmtResult Body = getDerived().TransformStmt(S->getBody());
7120   if (Body.isInvalid())
7121     return StmtError();
7122 
7123   if (!getDerived().AlwaysRebuild() &&
7124       Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) &&
7125       Body.get() == S->getBody())
7126     return Owned(S);
7127 
7128   return getDerived().RebuildWhileStmt(S->getWhileLoc(), Cond, Body.get());
7129 }
7130 
7131 template<typename Derived>
7132 StmtResult
7133 TreeTransform<Derived>::TransformDoStmt(DoStmt *S) {
7134   // Transform the body
7135   StmtResult Body = getDerived().TransformStmt(S->getBody());
7136   if (Body.isInvalid())
7137     return StmtError();
7138 
7139   // Transform the condition
7140   ExprResult Cond = getDerived().TransformExpr(S->getCond());
7141   if (Cond.isInvalid())
7142     return StmtError();
7143 
7144   if (!getDerived().AlwaysRebuild() &&
7145       Cond.get() == S->getCond() &&
7146       Body.get() == S->getBody())
7147     return S;
7148 
7149   return getDerived().RebuildDoStmt(S->getDoLoc(), Body.get(), S->getWhileLoc(),
7150                                     /*FIXME:*/S->getWhileLoc(), Cond.get(),
7151                                     S->getRParenLoc());
7152 }
7153 
7154 template<typename Derived>
7155 StmtResult
7156 TreeTransform<Derived>::TransformForStmt(ForStmt *S) {
7157   if (getSema().getLangOpts().OpenMP)
7158     getSema().startOpenMPLoop();
7159 
7160   // Transform the initialization statement
7161   StmtResult Init = getDerived().TransformStmt(S->getInit());
7162   if (Init.isInvalid())
7163     return StmtError();
7164 
7165   // In OpenMP loop region loop control variable must be captured and be
7166   // private. Perform analysis of first part (if any).
7167   if (getSema().getLangOpts().OpenMP && Init.isUsable())
7168     getSema().ActOnOpenMPLoopInitialization(S->getForLoc(), Init.get());
7169 
7170   // Transform the condition
7171   Sema::ConditionResult Cond = getDerived().TransformCondition(
7172       S->getForLoc(), S->getConditionVariable(), S->getCond(),
7173       Sema::ConditionKind::Boolean);
7174   if (Cond.isInvalid())
7175     return StmtError();
7176 
7177   // Transform the increment
7178   ExprResult Inc = getDerived().TransformExpr(S->getInc());
7179   if (Inc.isInvalid())
7180     return StmtError();
7181 
7182   Sema::FullExprArg FullInc(getSema().MakeFullDiscardedValueExpr(Inc.get()));
7183   if (S->getInc() && !FullInc.get())
7184     return StmtError();
7185 
7186   // Transform the body
7187   StmtResult Body = getDerived().TransformStmt(S->getBody());
7188   if (Body.isInvalid())
7189     return StmtError();
7190 
7191   if (!getDerived().AlwaysRebuild() &&
7192       Init.get() == S->getInit() &&
7193       Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) &&
7194       Inc.get() == S->getInc() &&
7195       Body.get() == S->getBody())
7196     return S;
7197 
7198   return getDerived().RebuildForStmt(S->getForLoc(), S->getLParenLoc(),
7199                                      Init.get(), Cond, FullInc,
7200                                      S->getRParenLoc(), Body.get());
7201 }
7202 
7203 template<typename Derived>
7204 StmtResult
7205 TreeTransform<Derived>::TransformGotoStmt(GotoStmt *S) {
7206   Decl *LD = getDerived().TransformDecl(S->getLabel()->getLocation(),
7207                                         S->getLabel());
7208   if (!LD)
7209     return StmtError();
7210 
7211   // Goto statements must always be rebuilt, to resolve the label.
7212   return getDerived().RebuildGotoStmt(S->getGotoLoc(), S->getLabelLoc(),
7213                                       cast<LabelDecl>(LD));
7214 }
7215 
7216 template<typename Derived>
7217 StmtResult
7218 TreeTransform<Derived>::TransformIndirectGotoStmt(IndirectGotoStmt *S) {
7219   ExprResult Target = getDerived().TransformExpr(S->getTarget());
7220   if (Target.isInvalid())
7221     return StmtError();
7222   Target = SemaRef.MaybeCreateExprWithCleanups(Target.get());
7223 
7224   if (!getDerived().AlwaysRebuild() &&
7225       Target.get() == S->getTarget())
7226     return S;
7227 
7228   return getDerived().RebuildIndirectGotoStmt(S->getGotoLoc(), S->getStarLoc(),
7229                                               Target.get());
7230 }
7231 
7232 template<typename Derived>
7233 StmtResult
7234 TreeTransform<Derived>::TransformContinueStmt(ContinueStmt *S) {
7235   return S;
7236 }
7237 
7238 template<typename Derived>
7239 StmtResult
7240 TreeTransform<Derived>::TransformBreakStmt(BreakStmt *S) {
7241   return S;
7242 }
7243 
7244 template<typename Derived>
7245 StmtResult
7246 TreeTransform<Derived>::TransformReturnStmt(ReturnStmt *S) {
7247   ExprResult Result = getDerived().TransformInitializer(S->getRetValue(),
7248                                                         /*NotCopyInit*/false);
7249   if (Result.isInvalid())
7250     return StmtError();
7251 
7252   // FIXME: We always rebuild the return statement because there is no way
7253   // to tell whether the return type of the function has changed.
7254   return getDerived().RebuildReturnStmt(S->getReturnLoc(), Result.get());
7255 }
7256 
7257 template<typename Derived>
7258 StmtResult
7259 TreeTransform<Derived>::TransformDeclStmt(DeclStmt *S) {
7260   bool DeclChanged = false;
7261   SmallVector<Decl *, 4> Decls;
7262   for (auto *D : S->decls()) {
7263     Decl *Transformed = getDerived().TransformDefinition(D->getLocation(), D);
7264     if (!Transformed)
7265       return StmtError();
7266 
7267     if (Transformed != D)
7268       DeclChanged = true;
7269 
7270     Decls.push_back(Transformed);
7271   }
7272 
7273   if (!getDerived().AlwaysRebuild() && !DeclChanged)
7274     return S;
7275 
7276   return getDerived().RebuildDeclStmt(Decls, S->getBeginLoc(), S->getEndLoc());
7277 }
7278 
7279 template<typename Derived>
7280 StmtResult
7281 TreeTransform<Derived>::TransformGCCAsmStmt(GCCAsmStmt *S) {
7282 
7283   SmallVector<Expr*, 8> Constraints;
7284   SmallVector<Expr*, 8> Exprs;
7285   SmallVector<IdentifierInfo *, 4> Names;
7286 
7287   ExprResult AsmString;
7288   SmallVector<Expr*, 8> Clobbers;
7289 
7290   bool ExprsChanged = false;
7291 
7292   // Go through the outputs.
7293   for (unsigned I = 0, E = S->getNumOutputs(); I != E; ++I) {
7294     Names.push_back(S->getOutputIdentifier(I));
7295 
7296     // No need to transform the constraint literal.
7297     Constraints.push_back(S->getOutputConstraintLiteral(I));
7298 
7299     // Transform the output expr.
7300     Expr *OutputExpr = S->getOutputExpr(I);
7301     ExprResult Result = getDerived().TransformExpr(OutputExpr);
7302     if (Result.isInvalid())
7303       return StmtError();
7304 
7305     ExprsChanged |= Result.get() != OutputExpr;
7306 
7307     Exprs.push_back(Result.get());
7308   }
7309 
7310   // Go through the inputs.
7311   for (unsigned I = 0, E = S->getNumInputs(); I != E; ++I) {
7312     Names.push_back(S->getInputIdentifier(I));
7313 
7314     // No need to transform the constraint literal.
7315     Constraints.push_back(S->getInputConstraintLiteral(I));
7316 
7317     // Transform the input expr.
7318     Expr *InputExpr = S->getInputExpr(I);
7319     ExprResult Result = getDerived().TransformExpr(InputExpr);
7320     if (Result.isInvalid())
7321       return StmtError();
7322 
7323     ExprsChanged |= Result.get() != InputExpr;
7324 
7325     Exprs.push_back(Result.get());
7326   }
7327 
7328   // Go through the Labels.
7329   for (unsigned I = 0, E = S->getNumLabels(); I != E; ++I) {
7330     Names.push_back(S->getLabelIdentifier(I));
7331 
7332     ExprResult Result = getDerived().TransformExpr(S->getLabelExpr(I));
7333     if (Result.isInvalid())
7334       return StmtError();
7335     ExprsChanged |= Result.get() != S->getLabelExpr(I);
7336     Exprs.push_back(Result.get());
7337   }
7338   if (!getDerived().AlwaysRebuild() && !ExprsChanged)
7339     return S;
7340 
7341   // Go through the clobbers.
7342   for (unsigned I = 0, E = S->getNumClobbers(); I != E; ++I)
7343     Clobbers.push_back(S->getClobberStringLiteral(I));
7344 
7345   // No need to transform the asm string literal.
7346   AsmString = S->getAsmString();
7347   return getDerived().RebuildGCCAsmStmt(S->getAsmLoc(), S->isSimple(),
7348                                         S->isVolatile(), S->getNumOutputs(),
7349                                         S->getNumInputs(), Names.data(),
7350                                         Constraints, Exprs, AsmString.get(),
7351                                         Clobbers, S->getNumLabels(),
7352                                         S->getRParenLoc());
7353 }
7354 
7355 template<typename Derived>
7356 StmtResult
7357 TreeTransform<Derived>::TransformMSAsmStmt(MSAsmStmt *S) {
7358   ArrayRef<Token> AsmToks =
7359     llvm::makeArrayRef(S->getAsmToks(), S->getNumAsmToks());
7360 
7361   bool HadError = false, HadChange = false;
7362 
7363   ArrayRef<Expr*> SrcExprs = S->getAllExprs();
7364   SmallVector<Expr*, 8> TransformedExprs;
7365   TransformedExprs.reserve(SrcExprs.size());
7366   for (unsigned i = 0, e = SrcExprs.size(); i != e; ++i) {
7367     ExprResult Result = getDerived().TransformExpr(SrcExprs[i]);
7368     if (!Result.isUsable()) {
7369       HadError = true;
7370     } else {
7371       HadChange |= (Result.get() != SrcExprs[i]);
7372       TransformedExprs.push_back(Result.get());
7373     }
7374   }
7375 
7376   if (HadError) return StmtError();
7377   if (!HadChange && !getDerived().AlwaysRebuild())
7378     return Owned(S);
7379 
7380   return getDerived().RebuildMSAsmStmt(S->getAsmLoc(), S->getLBraceLoc(),
7381                                        AsmToks, S->getAsmString(),
7382                                        S->getNumOutputs(), S->getNumInputs(),
7383                                        S->getAllConstraints(), S->getClobbers(),
7384                                        TransformedExprs, S->getEndLoc());
7385 }
7386 
7387 // C++ Coroutines TS
7388 
7389 template<typename Derived>
7390 StmtResult
7391 TreeTransform<Derived>::TransformCoroutineBodyStmt(CoroutineBodyStmt *S) {
7392   auto *ScopeInfo = SemaRef.getCurFunction();
7393   auto *FD = cast<FunctionDecl>(SemaRef.CurContext);
7394   assert(FD && ScopeInfo && !ScopeInfo->CoroutinePromise &&
7395          ScopeInfo->NeedsCoroutineSuspends &&
7396          ScopeInfo->CoroutineSuspends.first == nullptr &&
7397          ScopeInfo->CoroutineSuspends.second == nullptr &&
7398          "expected clean scope info");
7399 
7400   // Set that we have (possibly-invalid) suspend points before we do anything
7401   // that may fail.
7402   ScopeInfo->setNeedsCoroutineSuspends(false);
7403 
7404   // We re-build the coroutine promise object (and the coroutine parameters its
7405   // type and constructor depend on) based on the types used in our current
7406   // function. We must do so, and set it on the current FunctionScopeInfo,
7407   // before attempting to transform the other parts of the coroutine body
7408   // statement, such as the implicit suspend statements (because those
7409   // statements reference the FunctionScopeInfo::CoroutinePromise).
7410   if (!SemaRef.buildCoroutineParameterMoves(FD->getLocation()))
7411     return StmtError();
7412   auto *Promise = SemaRef.buildCoroutinePromise(FD->getLocation());
7413   if (!Promise)
7414     return StmtError();
7415   getDerived().transformedLocalDecl(S->getPromiseDecl(), {Promise});
7416   ScopeInfo->CoroutinePromise = Promise;
7417 
7418   // Transform the implicit coroutine statements constructed using dependent
7419   // types during the previous parse: initial and final suspensions, the return
7420   // object, and others. We also transform the coroutine function's body.
7421   StmtResult InitSuspend = getDerived().TransformStmt(S->getInitSuspendStmt());
7422   if (InitSuspend.isInvalid())
7423     return StmtError();
7424   StmtResult FinalSuspend =
7425       getDerived().TransformStmt(S->getFinalSuspendStmt());
7426   if (FinalSuspend.isInvalid())
7427     return StmtError();
7428   ScopeInfo->setCoroutineSuspends(InitSuspend.get(), FinalSuspend.get());
7429   assert(isa<Expr>(InitSuspend.get()) && isa<Expr>(FinalSuspend.get()));
7430 
7431   StmtResult BodyRes = getDerived().TransformStmt(S->getBody());
7432   if (BodyRes.isInvalid())
7433     return StmtError();
7434 
7435   CoroutineStmtBuilder Builder(SemaRef, *FD, *ScopeInfo, BodyRes.get());
7436   if (Builder.isInvalid())
7437     return StmtError();
7438 
7439   Expr *ReturnObject = S->getReturnValueInit();
7440   assert(ReturnObject && "the return object is expected to be valid");
7441   ExprResult Res = getDerived().TransformInitializer(ReturnObject,
7442                                                      /*NoCopyInit*/ false);
7443   if (Res.isInvalid())
7444     return StmtError();
7445   Builder.ReturnValue = Res.get();
7446 
7447   // If during the previous parse the coroutine still had a dependent promise
7448   // statement, we may need to build some implicit coroutine statements
7449   // (such as exception and fallthrough handlers) for the first time.
7450   if (S->hasDependentPromiseType()) {
7451     // We can only build these statements, however, if the current promise type
7452     // is not dependent.
7453     if (!Promise->getType()->isDependentType()) {
7454       assert(!S->getFallthroughHandler() && !S->getExceptionHandler() &&
7455              !S->getReturnStmtOnAllocFailure() && !S->getDeallocate() &&
7456              "these nodes should not have been built yet");
7457       if (!Builder.buildDependentStatements())
7458         return StmtError();
7459     }
7460   } else {
7461     if (auto *OnFallthrough = S->getFallthroughHandler()) {
7462       StmtResult Res = getDerived().TransformStmt(OnFallthrough);
7463       if (Res.isInvalid())
7464         return StmtError();
7465       Builder.OnFallthrough = Res.get();
7466     }
7467 
7468     if (auto *OnException = S->getExceptionHandler()) {
7469       StmtResult Res = getDerived().TransformStmt(OnException);
7470       if (Res.isInvalid())
7471         return StmtError();
7472       Builder.OnException = Res.get();
7473     }
7474 
7475     if (auto *OnAllocFailure = S->getReturnStmtOnAllocFailure()) {
7476       StmtResult Res = getDerived().TransformStmt(OnAllocFailure);
7477       if (Res.isInvalid())
7478         return StmtError();
7479       Builder.ReturnStmtOnAllocFailure = Res.get();
7480     }
7481 
7482     // Transform any additional statements we may have already built
7483     assert(S->getAllocate() && S->getDeallocate() &&
7484            "allocation and deallocation calls must already be built");
7485     ExprResult AllocRes = getDerived().TransformExpr(S->getAllocate());
7486     if (AllocRes.isInvalid())
7487       return StmtError();
7488     Builder.Allocate = AllocRes.get();
7489 
7490     ExprResult DeallocRes = getDerived().TransformExpr(S->getDeallocate());
7491     if (DeallocRes.isInvalid())
7492       return StmtError();
7493     Builder.Deallocate = DeallocRes.get();
7494 
7495     assert(S->getResultDecl() && "ResultDecl must already be built");
7496     StmtResult ResultDecl = getDerived().TransformStmt(S->getResultDecl());
7497     if (ResultDecl.isInvalid())
7498       return StmtError();
7499     Builder.ResultDecl = ResultDecl.get();
7500 
7501     if (auto *ReturnStmt = S->getReturnStmt()) {
7502       StmtResult Res = getDerived().TransformStmt(ReturnStmt);
7503       if (Res.isInvalid())
7504         return StmtError();
7505       Builder.ReturnStmt = Res.get();
7506     }
7507   }
7508 
7509   return getDerived().RebuildCoroutineBodyStmt(Builder);
7510 }
7511 
7512 template<typename Derived>
7513 StmtResult
7514 TreeTransform<Derived>::TransformCoreturnStmt(CoreturnStmt *S) {
7515   ExprResult Result = getDerived().TransformInitializer(S->getOperand(),
7516                                                         /*NotCopyInit*/false);
7517   if (Result.isInvalid())
7518     return StmtError();
7519 
7520   // Always rebuild; we don't know if this needs to be injected into a new
7521   // context or if the promise type has changed.
7522   return getDerived().RebuildCoreturnStmt(S->getKeywordLoc(), Result.get(),
7523                                           S->isImplicit());
7524 }
7525 
7526 template<typename Derived>
7527 ExprResult
7528 TreeTransform<Derived>::TransformCoawaitExpr(CoawaitExpr *E) {
7529   ExprResult Result = getDerived().TransformInitializer(E->getOperand(),
7530                                                         /*NotCopyInit*/false);
7531   if (Result.isInvalid())
7532     return ExprError();
7533 
7534   // Always rebuild; we don't know if this needs to be injected into a new
7535   // context or if the promise type has changed.
7536   return getDerived().RebuildCoawaitExpr(E->getKeywordLoc(), Result.get(),
7537                                          E->isImplicit());
7538 }
7539 
7540 template <typename Derived>
7541 ExprResult
7542 TreeTransform<Derived>::TransformDependentCoawaitExpr(DependentCoawaitExpr *E) {
7543   ExprResult OperandResult = getDerived().TransformInitializer(E->getOperand(),
7544                                                         /*NotCopyInit*/ false);
7545   if (OperandResult.isInvalid())
7546     return ExprError();
7547 
7548   ExprResult LookupResult = getDerived().TransformUnresolvedLookupExpr(
7549           E->getOperatorCoawaitLookup());
7550 
7551   if (LookupResult.isInvalid())
7552     return ExprError();
7553 
7554   // Always rebuild; we don't know if this needs to be injected into a new
7555   // context or if the promise type has changed.
7556   return getDerived().RebuildDependentCoawaitExpr(
7557       E->getKeywordLoc(), OperandResult.get(),
7558       cast<UnresolvedLookupExpr>(LookupResult.get()));
7559 }
7560 
7561 template<typename Derived>
7562 ExprResult
7563 TreeTransform<Derived>::TransformCoyieldExpr(CoyieldExpr *E) {
7564   ExprResult Result = getDerived().TransformInitializer(E->getOperand(),
7565                                                         /*NotCopyInit*/false);
7566   if (Result.isInvalid())
7567     return ExprError();
7568 
7569   // Always rebuild; we don't know if this needs to be injected into a new
7570   // context or if the promise type has changed.
7571   return getDerived().RebuildCoyieldExpr(E->getKeywordLoc(), Result.get());
7572 }
7573 
7574 // Objective-C Statements.
7575 
7576 template<typename Derived>
7577 StmtResult
7578 TreeTransform<Derived>::TransformObjCAtTryStmt(ObjCAtTryStmt *S) {
7579   // Transform the body of the @try.
7580   StmtResult TryBody = getDerived().TransformStmt(S->getTryBody());
7581   if (TryBody.isInvalid())
7582     return StmtError();
7583 
7584   // Transform the @catch statements (if present).
7585   bool AnyCatchChanged = false;
7586   SmallVector<Stmt*, 8> CatchStmts;
7587   for (unsigned I = 0, N = S->getNumCatchStmts(); I != N; ++I) {
7588     StmtResult Catch = getDerived().TransformStmt(S->getCatchStmt(I));
7589     if (Catch.isInvalid())
7590       return StmtError();
7591     if (Catch.get() != S->getCatchStmt(I))
7592       AnyCatchChanged = true;
7593     CatchStmts.push_back(Catch.get());
7594   }
7595 
7596   // Transform the @finally statement (if present).
7597   StmtResult Finally;
7598   if (S->getFinallyStmt()) {
7599     Finally = getDerived().TransformStmt(S->getFinallyStmt());
7600     if (Finally.isInvalid())
7601       return StmtError();
7602   }
7603 
7604   // If nothing changed, just retain this statement.
7605   if (!getDerived().AlwaysRebuild() &&
7606       TryBody.get() == S->getTryBody() &&
7607       !AnyCatchChanged &&
7608       Finally.get() == S->getFinallyStmt())
7609     return S;
7610 
7611   // Build a new statement.
7612   return getDerived().RebuildObjCAtTryStmt(S->getAtTryLoc(), TryBody.get(),
7613                                            CatchStmts, Finally.get());
7614 }
7615 
7616 template<typename Derived>
7617 StmtResult
7618 TreeTransform<Derived>::TransformObjCAtCatchStmt(ObjCAtCatchStmt *S) {
7619   // Transform the @catch parameter, if there is one.
7620   VarDecl *Var = nullptr;
7621   if (VarDecl *FromVar = S->getCatchParamDecl()) {
7622     TypeSourceInfo *TSInfo = nullptr;
7623     if (FromVar->getTypeSourceInfo()) {
7624       TSInfo = getDerived().TransformType(FromVar->getTypeSourceInfo());
7625       if (!TSInfo)
7626         return StmtError();
7627     }
7628 
7629     QualType T;
7630     if (TSInfo)
7631       T = TSInfo->getType();
7632     else {
7633       T = getDerived().TransformType(FromVar->getType());
7634       if (T.isNull())
7635         return StmtError();
7636     }
7637 
7638     Var = getDerived().RebuildObjCExceptionDecl(FromVar, TSInfo, T);
7639     if (!Var)
7640       return StmtError();
7641   }
7642 
7643   StmtResult Body = getDerived().TransformStmt(S->getCatchBody());
7644   if (Body.isInvalid())
7645     return StmtError();
7646 
7647   return getDerived().RebuildObjCAtCatchStmt(S->getAtCatchLoc(),
7648                                              S->getRParenLoc(),
7649                                              Var, Body.get());
7650 }
7651 
7652 template<typename Derived>
7653 StmtResult
7654 TreeTransform<Derived>::TransformObjCAtFinallyStmt(ObjCAtFinallyStmt *S) {
7655   // Transform the body.
7656   StmtResult Body = getDerived().TransformStmt(S->getFinallyBody());
7657   if (Body.isInvalid())
7658     return StmtError();
7659 
7660   // If nothing changed, just retain this statement.
7661   if (!getDerived().AlwaysRebuild() &&
7662       Body.get() == S->getFinallyBody())
7663     return S;
7664 
7665   // Build a new statement.
7666   return getDerived().RebuildObjCAtFinallyStmt(S->getAtFinallyLoc(),
7667                                                Body.get());
7668 }
7669 
7670 template<typename Derived>
7671 StmtResult
7672 TreeTransform<Derived>::TransformObjCAtThrowStmt(ObjCAtThrowStmt *S) {
7673   ExprResult Operand;
7674   if (S->getThrowExpr()) {
7675     Operand = getDerived().TransformExpr(S->getThrowExpr());
7676     if (Operand.isInvalid())
7677       return StmtError();
7678   }
7679 
7680   if (!getDerived().AlwaysRebuild() &&
7681       Operand.get() == S->getThrowExpr())
7682     return S;
7683 
7684   return getDerived().RebuildObjCAtThrowStmt(S->getThrowLoc(), Operand.get());
7685 }
7686 
7687 template<typename Derived>
7688 StmtResult
7689 TreeTransform<Derived>::TransformObjCAtSynchronizedStmt(
7690                                                   ObjCAtSynchronizedStmt *S) {
7691   // Transform the object we are locking.
7692   ExprResult Object = getDerived().TransformExpr(S->getSynchExpr());
7693   if (Object.isInvalid())
7694     return StmtError();
7695   Object =
7696     getDerived().RebuildObjCAtSynchronizedOperand(S->getAtSynchronizedLoc(),
7697                                                   Object.get());
7698   if (Object.isInvalid())
7699     return StmtError();
7700 
7701   // Transform the body.
7702   StmtResult Body = getDerived().TransformStmt(S->getSynchBody());
7703   if (Body.isInvalid())
7704     return StmtError();
7705 
7706   // If nothing change, just retain the current statement.
7707   if (!getDerived().AlwaysRebuild() &&
7708       Object.get() == S->getSynchExpr() &&
7709       Body.get() == S->getSynchBody())
7710     return S;
7711 
7712   // Build a new statement.
7713   return getDerived().RebuildObjCAtSynchronizedStmt(S->getAtSynchronizedLoc(),
7714                                                     Object.get(), Body.get());
7715 }
7716 
7717 template<typename Derived>
7718 StmtResult
7719 TreeTransform<Derived>::TransformObjCAutoreleasePoolStmt(
7720                                               ObjCAutoreleasePoolStmt *S) {
7721   // Transform the body.
7722   StmtResult Body = getDerived().TransformStmt(S->getSubStmt());
7723   if (Body.isInvalid())
7724     return StmtError();
7725 
7726   // If nothing changed, just retain this statement.
7727   if (!getDerived().AlwaysRebuild() &&
7728       Body.get() == S->getSubStmt())
7729     return S;
7730 
7731   // Build a new statement.
7732   return getDerived().RebuildObjCAutoreleasePoolStmt(
7733                         S->getAtLoc(), Body.get());
7734 }
7735 
7736 template<typename Derived>
7737 StmtResult
7738 TreeTransform<Derived>::TransformObjCForCollectionStmt(
7739                                                   ObjCForCollectionStmt *S) {
7740   // Transform the element statement.
7741   StmtResult Element =
7742       getDerived().TransformStmt(S->getElement(), SDK_NotDiscarded);
7743   if (Element.isInvalid())
7744     return StmtError();
7745 
7746   // Transform the collection expression.
7747   ExprResult Collection = getDerived().TransformExpr(S->getCollection());
7748   if (Collection.isInvalid())
7749     return StmtError();
7750 
7751   // Transform the body.
7752   StmtResult Body = getDerived().TransformStmt(S->getBody());
7753   if (Body.isInvalid())
7754     return StmtError();
7755 
7756   // If nothing changed, just retain this statement.
7757   if (!getDerived().AlwaysRebuild() &&
7758       Element.get() == S->getElement() &&
7759       Collection.get() == S->getCollection() &&
7760       Body.get() == S->getBody())
7761     return S;
7762 
7763   // Build a new statement.
7764   return getDerived().RebuildObjCForCollectionStmt(S->getForLoc(),
7765                                                    Element.get(),
7766                                                    Collection.get(),
7767                                                    S->getRParenLoc(),
7768                                                    Body.get());
7769 }
7770 
7771 template <typename Derived>
7772 StmtResult TreeTransform<Derived>::TransformCXXCatchStmt(CXXCatchStmt *S) {
7773   // Transform the exception declaration, if any.
7774   VarDecl *Var = nullptr;
7775   if (VarDecl *ExceptionDecl = S->getExceptionDecl()) {
7776     TypeSourceInfo *T =
7777         getDerived().TransformType(ExceptionDecl->getTypeSourceInfo());
7778     if (!T)
7779       return StmtError();
7780 
7781     Var = getDerived().RebuildExceptionDecl(
7782         ExceptionDecl, T, ExceptionDecl->getInnerLocStart(),
7783         ExceptionDecl->getLocation(), ExceptionDecl->getIdentifier());
7784     if (!Var || Var->isInvalidDecl())
7785       return StmtError();
7786   }
7787 
7788   // Transform the actual exception handler.
7789   StmtResult Handler = getDerived().TransformStmt(S->getHandlerBlock());
7790   if (Handler.isInvalid())
7791     return StmtError();
7792 
7793   if (!getDerived().AlwaysRebuild() && !Var &&
7794       Handler.get() == S->getHandlerBlock())
7795     return S;
7796 
7797   return getDerived().RebuildCXXCatchStmt(S->getCatchLoc(), Var, Handler.get());
7798 }
7799 
7800 template <typename Derived>
7801 StmtResult TreeTransform<Derived>::TransformCXXTryStmt(CXXTryStmt *S) {
7802   // Transform the try block itself.
7803   StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock());
7804   if (TryBlock.isInvalid())
7805     return StmtError();
7806 
7807   // Transform the handlers.
7808   bool HandlerChanged = false;
7809   SmallVector<Stmt *, 8> Handlers;
7810   for (unsigned I = 0, N = S->getNumHandlers(); I != N; ++I) {
7811     StmtResult Handler = getDerived().TransformCXXCatchStmt(S->getHandler(I));
7812     if (Handler.isInvalid())
7813       return StmtError();
7814 
7815     HandlerChanged = HandlerChanged || Handler.get() != S->getHandler(I);
7816     Handlers.push_back(Handler.getAs<Stmt>());
7817   }
7818 
7819   if (!getDerived().AlwaysRebuild() && TryBlock.get() == S->getTryBlock() &&
7820       !HandlerChanged)
7821     return S;
7822 
7823   return getDerived().RebuildCXXTryStmt(S->getTryLoc(), TryBlock.get(),
7824                                         Handlers);
7825 }
7826 
7827 template<typename Derived>
7828 StmtResult
7829 TreeTransform<Derived>::TransformCXXForRangeStmt(CXXForRangeStmt *S) {
7830   StmtResult Init =
7831       S->getInit() ? getDerived().TransformStmt(S->getInit()) : StmtResult();
7832   if (Init.isInvalid())
7833     return StmtError();
7834 
7835   StmtResult Range = getDerived().TransformStmt(S->getRangeStmt());
7836   if (Range.isInvalid())
7837     return StmtError();
7838 
7839   StmtResult Begin = getDerived().TransformStmt(S->getBeginStmt());
7840   if (Begin.isInvalid())
7841     return StmtError();
7842   StmtResult End = getDerived().TransformStmt(S->getEndStmt());
7843   if (End.isInvalid())
7844     return StmtError();
7845 
7846   ExprResult Cond = getDerived().TransformExpr(S->getCond());
7847   if (Cond.isInvalid())
7848     return StmtError();
7849   if (Cond.get())
7850     Cond = SemaRef.CheckBooleanCondition(S->getColonLoc(), Cond.get());
7851   if (Cond.isInvalid())
7852     return StmtError();
7853   if (Cond.get())
7854     Cond = SemaRef.MaybeCreateExprWithCleanups(Cond.get());
7855 
7856   ExprResult Inc = getDerived().TransformExpr(S->getInc());
7857   if (Inc.isInvalid())
7858     return StmtError();
7859   if (Inc.get())
7860     Inc = SemaRef.MaybeCreateExprWithCleanups(Inc.get());
7861 
7862   StmtResult LoopVar = getDerived().TransformStmt(S->getLoopVarStmt());
7863   if (LoopVar.isInvalid())
7864     return StmtError();
7865 
7866   StmtResult NewStmt = S;
7867   if (getDerived().AlwaysRebuild() ||
7868       Init.get() != S->getInit() ||
7869       Range.get() != S->getRangeStmt() ||
7870       Begin.get() != S->getBeginStmt() ||
7871       End.get() != S->getEndStmt() ||
7872       Cond.get() != S->getCond() ||
7873       Inc.get() != S->getInc() ||
7874       LoopVar.get() != S->getLoopVarStmt()) {
7875     NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(),
7876                                                   S->getCoawaitLoc(), Init.get(),
7877                                                   S->getColonLoc(), Range.get(),
7878                                                   Begin.get(), End.get(),
7879                                                   Cond.get(),
7880                                                   Inc.get(), LoopVar.get(),
7881                                                   S->getRParenLoc());
7882     if (NewStmt.isInvalid())
7883       return StmtError();
7884   }
7885 
7886   StmtResult Body = getDerived().TransformStmt(S->getBody());
7887   if (Body.isInvalid())
7888     return StmtError();
7889 
7890   // Body has changed but we didn't rebuild the for-range statement. Rebuild
7891   // it now so we have a new statement to attach the body to.
7892   if (Body.get() != S->getBody() && NewStmt.get() == S) {
7893     NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(),
7894                                                   S->getCoawaitLoc(), Init.get(),
7895                                                   S->getColonLoc(), Range.get(),
7896                                                   Begin.get(), End.get(),
7897                                                   Cond.get(),
7898                                                   Inc.get(), LoopVar.get(),
7899                                                   S->getRParenLoc());
7900     if (NewStmt.isInvalid())
7901       return StmtError();
7902   }
7903 
7904   if (NewStmt.get() == S)
7905     return S;
7906 
7907   return FinishCXXForRangeStmt(NewStmt.get(), Body.get());
7908 }
7909 
7910 template<typename Derived>
7911 StmtResult
7912 TreeTransform<Derived>::TransformMSDependentExistsStmt(
7913                                                     MSDependentExistsStmt *S) {
7914   // Transform the nested-name-specifier, if any.
7915   NestedNameSpecifierLoc QualifierLoc;
7916   if (S->getQualifierLoc()) {
7917     QualifierLoc
7918       = getDerived().TransformNestedNameSpecifierLoc(S->getQualifierLoc());
7919     if (!QualifierLoc)
7920       return StmtError();
7921   }
7922 
7923   // Transform the declaration name.
7924   DeclarationNameInfo NameInfo = S->getNameInfo();
7925   if (NameInfo.getName()) {
7926     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
7927     if (!NameInfo.getName())
7928       return StmtError();
7929   }
7930 
7931   // Check whether anything changed.
7932   if (!getDerived().AlwaysRebuild() &&
7933       QualifierLoc == S->getQualifierLoc() &&
7934       NameInfo.getName() == S->getNameInfo().getName())
7935     return S;
7936 
7937   // Determine whether this name exists, if we can.
7938   CXXScopeSpec SS;
7939   SS.Adopt(QualifierLoc);
7940   bool Dependent = false;
7941   switch (getSema().CheckMicrosoftIfExistsSymbol(/*S=*/nullptr, SS, NameInfo)) {
7942   case Sema::IER_Exists:
7943     if (S->isIfExists())
7944       break;
7945 
7946     return new (getSema().Context) NullStmt(S->getKeywordLoc());
7947 
7948   case Sema::IER_DoesNotExist:
7949     if (S->isIfNotExists())
7950       break;
7951 
7952     return new (getSema().Context) NullStmt(S->getKeywordLoc());
7953 
7954   case Sema::IER_Dependent:
7955     Dependent = true;
7956     break;
7957 
7958   case Sema::IER_Error:
7959     return StmtError();
7960   }
7961 
7962   // We need to continue with the instantiation, so do so now.
7963   StmtResult SubStmt = getDerived().TransformCompoundStmt(S->getSubStmt());
7964   if (SubStmt.isInvalid())
7965     return StmtError();
7966 
7967   // If we have resolved the name, just transform to the substatement.
7968   if (!Dependent)
7969     return SubStmt;
7970 
7971   // The name is still dependent, so build a dependent expression again.
7972   return getDerived().RebuildMSDependentExistsStmt(S->getKeywordLoc(),
7973                                                    S->isIfExists(),
7974                                                    QualifierLoc,
7975                                                    NameInfo,
7976                                                    SubStmt.get());
7977 }
7978 
7979 template<typename Derived>
7980 ExprResult
7981 TreeTransform<Derived>::TransformMSPropertyRefExpr(MSPropertyRefExpr *E) {
7982   NestedNameSpecifierLoc QualifierLoc;
7983   if (E->getQualifierLoc()) {
7984     QualifierLoc
7985     = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
7986     if (!QualifierLoc)
7987       return ExprError();
7988   }
7989 
7990   MSPropertyDecl *PD = cast_or_null<MSPropertyDecl>(
7991     getDerived().TransformDecl(E->getMemberLoc(), E->getPropertyDecl()));
7992   if (!PD)
7993     return ExprError();
7994 
7995   ExprResult Base = getDerived().TransformExpr(E->getBaseExpr());
7996   if (Base.isInvalid())
7997     return ExprError();
7998 
7999   return new (SemaRef.getASTContext())
8000       MSPropertyRefExpr(Base.get(), PD, E->isArrow(),
8001                         SemaRef.getASTContext().PseudoObjectTy, VK_LValue,
8002                         QualifierLoc, E->getMemberLoc());
8003 }
8004 
8005 template <typename Derived>
8006 ExprResult TreeTransform<Derived>::TransformMSPropertySubscriptExpr(
8007     MSPropertySubscriptExpr *E) {
8008   auto BaseRes = getDerived().TransformExpr(E->getBase());
8009   if (BaseRes.isInvalid())
8010     return ExprError();
8011   auto IdxRes = getDerived().TransformExpr(E->getIdx());
8012   if (IdxRes.isInvalid())
8013     return ExprError();
8014 
8015   if (!getDerived().AlwaysRebuild() &&
8016       BaseRes.get() == E->getBase() &&
8017       IdxRes.get() == E->getIdx())
8018     return E;
8019 
8020   return getDerived().RebuildArraySubscriptExpr(
8021       BaseRes.get(), SourceLocation(), IdxRes.get(), E->getRBracketLoc());
8022 }
8023 
8024 template <typename Derived>
8025 StmtResult TreeTransform<Derived>::TransformSEHTryStmt(SEHTryStmt *S) {
8026   StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock());
8027   if (TryBlock.isInvalid())
8028     return StmtError();
8029 
8030   StmtResult Handler = getDerived().TransformSEHHandler(S->getHandler());
8031   if (Handler.isInvalid())
8032     return StmtError();
8033 
8034   if (!getDerived().AlwaysRebuild() && TryBlock.get() == S->getTryBlock() &&
8035       Handler.get() == S->getHandler())
8036     return S;
8037 
8038   return getDerived().RebuildSEHTryStmt(S->getIsCXXTry(), S->getTryLoc(),
8039                                         TryBlock.get(), Handler.get());
8040 }
8041 
8042 template <typename Derived>
8043 StmtResult TreeTransform<Derived>::TransformSEHFinallyStmt(SEHFinallyStmt *S) {
8044   StmtResult Block = getDerived().TransformCompoundStmt(S->getBlock());
8045   if (Block.isInvalid())
8046     return StmtError();
8047 
8048   return getDerived().RebuildSEHFinallyStmt(S->getFinallyLoc(), Block.get());
8049 }
8050 
8051 template <typename Derived>
8052 StmtResult TreeTransform<Derived>::TransformSEHExceptStmt(SEHExceptStmt *S) {
8053   ExprResult FilterExpr = getDerived().TransformExpr(S->getFilterExpr());
8054   if (FilterExpr.isInvalid())
8055     return StmtError();
8056 
8057   StmtResult Block = getDerived().TransformCompoundStmt(S->getBlock());
8058   if (Block.isInvalid())
8059     return StmtError();
8060 
8061   return getDerived().RebuildSEHExceptStmt(S->getExceptLoc(), FilterExpr.get(),
8062                                            Block.get());
8063 }
8064 
8065 template <typename Derived>
8066 StmtResult TreeTransform<Derived>::TransformSEHHandler(Stmt *Handler) {
8067   if (isa<SEHFinallyStmt>(Handler))
8068     return getDerived().TransformSEHFinallyStmt(cast<SEHFinallyStmt>(Handler));
8069   else
8070     return getDerived().TransformSEHExceptStmt(cast<SEHExceptStmt>(Handler));
8071 }
8072 
8073 template<typename Derived>
8074 StmtResult
8075 TreeTransform<Derived>::TransformSEHLeaveStmt(SEHLeaveStmt *S) {
8076   return S;
8077 }
8078 
8079 //===----------------------------------------------------------------------===//
8080 // OpenMP directive transformation
8081 //===----------------------------------------------------------------------===//
8082 template <typename Derived>
8083 StmtResult TreeTransform<Derived>::TransformOMPExecutableDirective(
8084     OMPExecutableDirective *D) {
8085 
8086   // Transform the clauses
8087   llvm::SmallVector<OMPClause *, 16> TClauses;
8088   ArrayRef<OMPClause *> Clauses = D->clauses();
8089   TClauses.reserve(Clauses.size());
8090   for (ArrayRef<OMPClause *>::iterator I = Clauses.begin(), E = Clauses.end();
8091        I != E; ++I) {
8092     if (*I) {
8093       getDerived().getSema().StartOpenMPClause((*I)->getClauseKind());
8094       OMPClause *Clause = getDerived().TransformOMPClause(*I);
8095       getDerived().getSema().EndOpenMPClause();
8096       if (Clause)
8097         TClauses.push_back(Clause);
8098     } else {
8099       TClauses.push_back(nullptr);
8100     }
8101   }
8102   StmtResult AssociatedStmt;
8103   if (D->hasAssociatedStmt() && D->getAssociatedStmt()) {
8104     getDerived().getSema().ActOnOpenMPRegionStart(D->getDirectiveKind(),
8105                                                   /*CurScope=*/nullptr);
8106     StmtResult Body;
8107     {
8108       Sema::CompoundScopeRAII CompoundScope(getSema());
8109       Stmt *CS = D->getInnermostCapturedStmt()->getCapturedStmt();
8110       Body = getDerived().TransformStmt(CS);
8111     }
8112     AssociatedStmt =
8113         getDerived().getSema().ActOnOpenMPRegionEnd(Body, TClauses);
8114     if (AssociatedStmt.isInvalid()) {
8115       return StmtError();
8116     }
8117   }
8118   if (TClauses.size() != Clauses.size()) {
8119     return StmtError();
8120   }
8121 
8122   // Transform directive name for 'omp critical' directive.
8123   DeclarationNameInfo DirName;
8124   if (D->getDirectiveKind() == OMPD_critical) {
8125     DirName = cast<OMPCriticalDirective>(D)->getDirectiveName();
8126     DirName = getDerived().TransformDeclarationNameInfo(DirName);
8127   }
8128   OpenMPDirectiveKind CancelRegion = OMPD_unknown;
8129   if (D->getDirectiveKind() == OMPD_cancellation_point) {
8130     CancelRegion = cast<OMPCancellationPointDirective>(D)->getCancelRegion();
8131   } else if (D->getDirectiveKind() == OMPD_cancel) {
8132     CancelRegion = cast<OMPCancelDirective>(D)->getCancelRegion();
8133   }
8134 
8135   return getDerived().RebuildOMPExecutableDirective(
8136       D->getDirectiveKind(), DirName, CancelRegion, TClauses,
8137       AssociatedStmt.get(), D->getBeginLoc(), D->getEndLoc());
8138 }
8139 
8140 template <typename Derived>
8141 StmtResult
8142 TreeTransform<Derived>::TransformOMPParallelDirective(OMPParallelDirective *D) {
8143   DeclarationNameInfo DirName;
8144   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel, DirName, nullptr,
8145                                              D->getBeginLoc());
8146   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8147   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8148   return Res;
8149 }
8150 
8151 template <typename Derived>
8152 StmtResult
8153 TreeTransform<Derived>::TransformOMPSimdDirective(OMPSimdDirective *D) {
8154   DeclarationNameInfo DirName;
8155   getDerived().getSema().StartOpenMPDSABlock(OMPD_simd, DirName, nullptr,
8156                                              D->getBeginLoc());
8157   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8158   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8159   return Res;
8160 }
8161 
8162 template <typename Derived>
8163 StmtResult
8164 TreeTransform<Derived>::TransformOMPForDirective(OMPForDirective *D) {
8165   DeclarationNameInfo DirName;
8166   getDerived().getSema().StartOpenMPDSABlock(OMPD_for, DirName, nullptr,
8167                                              D->getBeginLoc());
8168   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8169   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8170   return Res;
8171 }
8172 
8173 template <typename Derived>
8174 StmtResult
8175 TreeTransform<Derived>::TransformOMPForSimdDirective(OMPForSimdDirective *D) {
8176   DeclarationNameInfo DirName;
8177   getDerived().getSema().StartOpenMPDSABlock(OMPD_for_simd, DirName, nullptr,
8178                                              D->getBeginLoc());
8179   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8180   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8181   return Res;
8182 }
8183 
8184 template <typename Derived>
8185 StmtResult
8186 TreeTransform<Derived>::TransformOMPSectionsDirective(OMPSectionsDirective *D) {
8187   DeclarationNameInfo DirName;
8188   getDerived().getSema().StartOpenMPDSABlock(OMPD_sections, DirName, nullptr,
8189                                              D->getBeginLoc());
8190   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8191   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8192   return Res;
8193 }
8194 
8195 template <typename Derived>
8196 StmtResult
8197 TreeTransform<Derived>::TransformOMPSectionDirective(OMPSectionDirective *D) {
8198   DeclarationNameInfo DirName;
8199   getDerived().getSema().StartOpenMPDSABlock(OMPD_section, DirName, nullptr,
8200                                              D->getBeginLoc());
8201   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8202   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8203   return Res;
8204 }
8205 
8206 template <typename Derived>
8207 StmtResult
8208 TreeTransform<Derived>::TransformOMPSingleDirective(OMPSingleDirective *D) {
8209   DeclarationNameInfo DirName;
8210   getDerived().getSema().StartOpenMPDSABlock(OMPD_single, DirName, nullptr,
8211                                              D->getBeginLoc());
8212   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8213   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8214   return Res;
8215 }
8216 
8217 template <typename Derived>
8218 StmtResult
8219 TreeTransform<Derived>::TransformOMPMasterDirective(OMPMasterDirective *D) {
8220   DeclarationNameInfo DirName;
8221   getDerived().getSema().StartOpenMPDSABlock(OMPD_master, DirName, nullptr,
8222                                              D->getBeginLoc());
8223   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8224   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8225   return Res;
8226 }
8227 
8228 template <typename Derived>
8229 StmtResult
8230 TreeTransform<Derived>::TransformOMPCriticalDirective(OMPCriticalDirective *D) {
8231   getDerived().getSema().StartOpenMPDSABlock(
8232       OMPD_critical, D->getDirectiveName(), nullptr, D->getBeginLoc());
8233   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8234   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8235   return Res;
8236 }
8237 
8238 template <typename Derived>
8239 StmtResult TreeTransform<Derived>::TransformOMPParallelForDirective(
8240     OMPParallelForDirective *D) {
8241   DeclarationNameInfo DirName;
8242   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_for, DirName,
8243                                              nullptr, D->getBeginLoc());
8244   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8245   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8246   return Res;
8247 }
8248 
8249 template <typename Derived>
8250 StmtResult TreeTransform<Derived>::TransformOMPParallelForSimdDirective(
8251     OMPParallelForSimdDirective *D) {
8252   DeclarationNameInfo DirName;
8253   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_for_simd, DirName,
8254                                              nullptr, D->getBeginLoc());
8255   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8256   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8257   return Res;
8258 }
8259 
8260 template <typename Derived>
8261 StmtResult TreeTransform<Derived>::TransformOMPParallelMasterDirective(
8262     OMPParallelMasterDirective *D) {
8263   DeclarationNameInfo DirName;
8264   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_master, DirName,
8265                                              nullptr, D->getBeginLoc());
8266   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8267   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8268   return Res;
8269 }
8270 
8271 template <typename Derived>
8272 StmtResult TreeTransform<Derived>::TransformOMPParallelSectionsDirective(
8273     OMPParallelSectionsDirective *D) {
8274   DeclarationNameInfo DirName;
8275   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_sections, DirName,
8276                                              nullptr, D->getBeginLoc());
8277   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8278   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8279   return Res;
8280 }
8281 
8282 template <typename Derived>
8283 StmtResult
8284 TreeTransform<Derived>::TransformOMPTaskDirective(OMPTaskDirective *D) {
8285   DeclarationNameInfo DirName;
8286   getDerived().getSema().StartOpenMPDSABlock(OMPD_task, DirName, nullptr,
8287                                              D->getBeginLoc());
8288   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8289   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8290   return Res;
8291 }
8292 
8293 template <typename Derived>
8294 StmtResult TreeTransform<Derived>::TransformOMPTaskyieldDirective(
8295     OMPTaskyieldDirective *D) {
8296   DeclarationNameInfo DirName;
8297   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskyield, DirName, nullptr,
8298                                              D->getBeginLoc());
8299   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8300   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8301   return Res;
8302 }
8303 
8304 template <typename Derived>
8305 StmtResult
8306 TreeTransform<Derived>::TransformOMPBarrierDirective(OMPBarrierDirective *D) {
8307   DeclarationNameInfo DirName;
8308   getDerived().getSema().StartOpenMPDSABlock(OMPD_barrier, DirName, nullptr,
8309                                              D->getBeginLoc());
8310   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8311   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8312   return Res;
8313 }
8314 
8315 template <typename Derived>
8316 StmtResult
8317 TreeTransform<Derived>::TransformOMPTaskwaitDirective(OMPTaskwaitDirective *D) {
8318   DeclarationNameInfo DirName;
8319   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskwait, DirName, nullptr,
8320                                              D->getBeginLoc());
8321   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8322   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8323   return Res;
8324 }
8325 
8326 template <typename Derived>
8327 StmtResult TreeTransform<Derived>::TransformOMPTaskgroupDirective(
8328     OMPTaskgroupDirective *D) {
8329   DeclarationNameInfo DirName;
8330   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskgroup, DirName, nullptr,
8331                                              D->getBeginLoc());
8332   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8333   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8334   return Res;
8335 }
8336 
8337 template <typename Derived>
8338 StmtResult
8339 TreeTransform<Derived>::TransformOMPFlushDirective(OMPFlushDirective *D) {
8340   DeclarationNameInfo DirName;
8341   getDerived().getSema().StartOpenMPDSABlock(OMPD_flush, DirName, nullptr,
8342                                              D->getBeginLoc());
8343   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8344   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8345   return Res;
8346 }
8347 
8348 template <typename Derived>
8349 StmtResult
8350 TreeTransform<Derived>::TransformOMPDepobjDirective(OMPDepobjDirective *D) {
8351   DeclarationNameInfo DirName;
8352   getDerived().getSema().StartOpenMPDSABlock(OMPD_depobj, DirName, nullptr,
8353                                              D->getBeginLoc());
8354   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8355   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8356   return Res;
8357 }
8358 
8359 template <typename Derived>
8360 StmtResult
8361 TreeTransform<Derived>::TransformOMPScanDirective(OMPScanDirective *D) {
8362   DeclarationNameInfo DirName;
8363   getDerived().getSema().StartOpenMPDSABlock(OMPD_scan, DirName, nullptr,
8364                                              D->getBeginLoc());
8365   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8366   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8367   return Res;
8368 }
8369 
8370 template <typename Derived>
8371 StmtResult
8372 TreeTransform<Derived>::TransformOMPOrderedDirective(OMPOrderedDirective *D) {
8373   DeclarationNameInfo DirName;
8374   getDerived().getSema().StartOpenMPDSABlock(OMPD_ordered, DirName, nullptr,
8375                                              D->getBeginLoc());
8376   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8377   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8378   return Res;
8379 }
8380 
8381 template <typename Derived>
8382 StmtResult
8383 TreeTransform<Derived>::TransformOMPAtomicDirective(OMPAtomicDirective *D) {
8384   DeclarationNameInfo DirName;
8385   getDerived().getSema().StartOpenMPDSABlock(OMPD_atomic, DirName, nullptr,
8386                                              D->getBeginLoc());
8387   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8388   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8389   return Res;
8390 }
8391 
8392 template <typename Derived>
8393 StmtResult
8394 TreeTransform<Derived>::TransformOMPTargetDirective(OMPTargetDirective *D) {
8395   DeclarationNameInfo DirName;
8396   getDerived().getSema().StartOpenMPDSABlock(OMPD_target, DirName, nullptr,
8397                                              D->getBeginLoc());
8398   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8399   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8400   return Res;
8401 }
8402 
8403 template <typename Derived>
8404 StmtResult TreeTransform<Derived>::TransformOMPTargetDataDirective(
8405     OMPTargetDataDirective *D) {
8406   DeclarationNameInfo DirName;
8407   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_data, DirName, nullptr,
8408                                              D->getBeginLoc());
8409   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8410   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8411   return Res;
8412 }
8413 
8414 template <typename Derived>
8415 StmtResult TreeTransform<Derived>::TransformOMPTargetEnterDataDirective(
8416     OMPTargetEnterDataDirective *D) {
8417   DeclarationNameInfo DirName;
8418   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_enter_data, DirName,
8419                                              nullptr, D->getBeginLoc());
8420   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8421   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8422   return Res;
8423 }
8424 
8425 template <typename Derived>
8426 StmtResult TreeTransform<Derived>::TransformOMPTargetExitDataDirective(
8427     OMPTargetExitDataDirective *D) {
8428   DeclarationNameInfo DirName;
8429   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_exit_data, DirName,
8430                                              nullptr, D->getBeginLoc());
8431   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8432   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8433   return Res;
8434 }
8435 
8436 template <typename Derived>
8437 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelDirective(
8438     OMPTargetParallelDirective *D) {
8439   DeclarationNameInfo DirName;
8440   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel, DirName,
8441                                              nullptr, D->getBeginLoc());
8442   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8443   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8444   return Res;
8445 }
8446 
8447 template <typename Derived>
8448 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelForDirective(
8449     OMPTargetParallelForDirective *D) {
8450   DeclarationNameInfo DirName;
8451   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel_for, DirName,
8452                                              nullptr, D->getBeginLoc());
8453   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8454   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8455   return Res;
8456 }
8457 
8458 template <typename Derived>
8459 StmtResult TreeTransform<Derived>::TransformOMPTargetUpdateDirective(
8460     OMPTargetUpdateDirective *D) {
8461   DeclarationNameInfo DirName;
8462   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_update, DirName,
8463                                              nullptr, D->getBeginLoc());
8464   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8465   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8466   return Res;
8467 }
8468 
8469 template <typename Derived>
8470 StmtResult
8471 TreeTransform<Derived>::TransformOMPTeamsDirective(OMPTeamsDirective *D) {
8472   DeclarationNameInfo DirName;
8473   getDerived().getSema().StartOpenMPDSABlock(OMPD_teams, DirName, nullptr,
8474                                              D->getBeginLoc());
8475   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8476   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8477   return Res;
8478 }
8479 
8480 template <typename Derived>
8481 StmtResult TreeTransform<Derived>::TransformOMPCancellationPointDirective(
8482     OMPCancellationPointDirective *D) {
8483   DeclarationNameInfo DirName;
8484   getDerived().getSema().StartOpenMPDSABlock(OMPD_cancellation_point, DirName,
8485                                              nullptr, D->getBeginLoc());
8486   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8487   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8488   return Res;
8489 }
8490 
8491 template <typename Derived>
8492 StmtResult
8493 TreeTransform<Derived>::TransformOMPCancelDirective(OMPCancelDirective *D) {
8494   DeclarationNameInfo DirName;
8495   getDerived().getSema().StartOpenMPDSABlock(OMPD_cancel, DirName, nullptr,
8496                                              D->getBeginLoc());
8497   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8498   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8499   return Res;
8500 }
8501 
8502 template <typename Derived>
8503 StmtResult
8504 TreeTransform<Derived>::TransformOMPTaskLoopDirective(OMPTaskLoopDirective *D) {
8505   DeclarationNameInfo DirName;
8506   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskloop, DirName, nullptr,
8507                                              D->getBeginLoc());
8508   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8509   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8510   return Res;
8511 }
8512 
8513 template <typename Derived>
8514 StmtResult TreeTransform<Derived>::TransformOMPTaskLoopSimdDirective(
8515     OMPTaskLoopSimdDirective *D) {
8516   DeclarationNameInfo DirName;
8517   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskloop_simd, DirName,
8518                                              nullptr, D->getBeginLoc());
8519   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8520   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8521   return Res;
8522 }
8523 
8524 template <typename Derived>
8525 StmtResult TreeTransform<Derived>::TransformOMPMasterTaskLoopDirective(
8526     OMPMasterTaskLoopDirective *D) {
8527   DeclarationNameInfo DirName;
8528   getDerived().getSema().StartOpenMPDSABlock(OMPD_master_taskloop, DirName,
8529                                              nullptr, D->getBeginLoc());
8530   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8531   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8532   return Res;
8533 }
8534 
8535 template <typename Derived>
8536 StmtResult TreeTransform<Derived>::TransformOMPMasterTaskLoopSimdDirective(
8537     OMPMasterTaskLoopSimdDirective *D) {
8538   DeclarationNameInfo DirName;
8539   getDerived().getSema().StartOpenMPDSABlock(OMPD_master_taskloop_simd, DirName,
8540                                              nullptr, D->getBeginLoc());
8541   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8542   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8543   return Res;
8544 }
8545 
8546 template <typename Derived>
8547 StmtResult TreeTransform<Derived>::TransformOMPParallelMasterTaskLoopDirective(
8548     OMPParallelMasterTaskLoopDirective *D) {
8549   DeclarationNameInfo DirName;
8550   getDerived().getSema().StartOpenMPDSABlock(
8551       OMPD_parallel_master_taskloop, DirName, nullptr, D->getBeginLoc());
8552   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8553   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8554   return Res;
8555 }
8556 
8557 template <typename Derived>
8558 StmtResult
8559 TreeTransform<Derived>::TransformOMPParallelMasterTaskLoopSimdDirective(
8560     OMPParallelMasterTaskLoopSimdDirective *D) {
8561   DeclarationNameInfo DirName;
8562   getDerived().getSema().StartOpenMPDSABlock(
8563       OMPD_parallel_master_taskloop_simd, DirName, nullptr, D->getBeginLoc());
8564   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8565   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8566   return Res;
8567 }
8568 
8569 template <typename Derived>
8570 StmtResult TreeTransform<Derived>::TransformOMPDistributeDirective(
8571     OMPDistributeDirective *D) {
8572   DeclarationNameInfo DirName;
8573   getDerived().getSema().StartOpenMPDSABlock(OMPD_distribute, DirName, nullptr,
8574                                              D->getBeginLoc());
8575   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8576   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8577   return Res;
8578 }
8579 
8580 template <typename Derived>
8581 StmtResult TreeTransform<Derived>::TransformOMPDistributeParallelForDirective(
8582     OMPDistributeParallelForDirective *D) {
8583   DeclarationNameInfo DirName;
8584   getDerived().getSema().StartOpenMPDSABlock(
8585       OMPD_distribute_parallel_for, DirName, nullptr, D->getBeginLoc());
8586   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8587   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8588   return Res;
8589 }
8590 
8591 template <typename Derived>
8592 StmtResult
8593 TreeTransform<Derived>::TransformOMPDistributeParallelForSimdDirective(
8594     OMPDistributeParallelForSimdDirective *D) {
8595   DeclarationNameInfo DirName;
8596   getDerived().getSema().StartOpenMPDSABlock(
8597       OMPD_distribute_parallel_for_simd, DirName, nullptr, D->getBeginLoc());
8598   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8599   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8600   return Res;
8601 }
8602 
8603 template <typename Derived>
8604 StmtResult TreeTransform<Derived>::TransformOMPDistributeSimdDirective(
8605     OMPDistributeSimdDirective *D) {
8606   DeclarationNameInfo DirName;
8607   getDerived().getSema().StartOpenMPDSABlock(OMPD_distribute_simd, DirName,
8608                                              nullptr, D->getBeginLoc());
8609   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8610   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8611   return Res;
8612 }
8613 
8614 template <typename Derived>
8615 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelForSimdDirective(
8616     OMPTargetParallelForSimdDirective *D) {
8617   DeclarationNameInfo DirName;
8618   getDerived().getSema().StartOpenMPDSABlock(
8619       OMPD_target_parallel_for_simd, DirName, nullptr, D->getBeginLoc());
8620   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8621   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8622   return Res;
8623 }
8624 
8625 template <typename Derived>
8626 StmtResult TreeTransform<Derived>::TransformOMPTargetSimdDirective(
8627     OMPTargetSimdDirective *D) {
8628   DeclarationNameInfo DirName;
8629   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_simd, DirName, nullptr,
8630                                              D->getBeginLoc());
8631   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8632   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8633   return Res;
8634 }
8635 
8636 template <typename Derived>
8637 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeDirective(
8638     OMPTeamsDistributeDirective *D) {
8639   DeclarationNameInfo DirName;
8640   getDerived().getSema().StartOpenMPDSABlock(OMPD_teams_distribute, DirName,
8641                                              nullptr, D->getBeginLoc());
8642   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8643   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8644   return Res;
8645 }
8646 
8647 template <typename Derived>
8648 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeSimdDirective(
8649     OMPTeamsDistributeSimdDirective *D) {
8650   DeclarationNameInfo DirName;
8651   getDerived().getSema().StartOpenMPDSABlock(
8652       OMPD_teams_distribute_simd, DirName, nullptr, D->getBeginLoc());
8653   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8654   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8655   return Res;
8656 }
8657 
8658 template <typename Derived>
8659 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeParallelForSimdDirective(
8660     OMPTeamsDistributeParallelForSimdDirective *D) {
8661   DeclarationNameInfo DirName;
8662   getDerived().getSema().StartOpenMPDSABlock(
8663       OMPD_teams_distribute_parallel_for_simd, DirName, nullptr,
8664       D->getBeginLoc());
8665   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8666   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8667   return Res;
8668 }
8669 
8670 template <typename Derived>
8671 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeParallelForDirective(
8672     OMPTeamsDistributeParallelForDirective *D) {
8673   DeclarationNameInfo DirName;
8674   getDerived().getSema().StartOpenMPDSABlock(
8675       OMPD_teams_distribute_parallel_for, DirName, nullptr, D->getBeginLoc());
8676   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8677   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8678   return Res;
8679 }
8680 
8681 template <typename Derived>
8682 StmtResult TreeTransform<Derived>::TransformOMPTargetTeamsDirective(
8683     OMPTargetTeamsDirective *D) {
8684   DeclarationNameInfo DirName;
8685   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_teams, DirName,
8686                                              nullptr, D->getBeginLoc());
8687   auto Res = getDerived().TransformOMPExecutableDirective(D);
8688   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8689   return Res;
8690 }
8691 
8692 template <typename Derived>
8693 StmtResult TreeTransform<Derived>::TransformOMPTargetTeamsDistributeDirective(
8694     OMPTargetTeamsDistributeDirective *D) {
8695   DeclarationNameInfo DirName;
8696   getDerived().getSema().StartOpenMPDSABlock(
8697       OMPD_target_teams_distribute, DirName, nullptr, D->getBeginLoc());
8698   auto Res = getDerived().TransformOMPExecutableDirective(D);
8699   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8700   return Res;
8701 }
8702 
8703 template <typename Derived>
8704 StmtResult
8705 TreeTransform<Derived>::TransformOMPTargetTeamsDistributeParallelForDirective(
8706     OMPTargetTeamsDistributeParallelForDirective *D) {
8707   DeclarationNameInfo DirName;
8708   getDerived().getSema().StartOpenMPDSABlock(
8709       OMPD_target_teams_distribute_parallel_for, DirName, nullptr,
8710       D->getBeginLoc());
8711   auto Res = getDerived().TransformOMPExecutableDirective(D);
8712   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8713   return Res;
8714 }
8715 
8716 template <typename Derived>
8717 StmtResult TreeTransform<Derived>::
8718     TransformOMPTargetTeamsDistributeParallelForSimdDirective(
8719         OMPTargetTeamsDistributeParallelForSimdDirective *D) {
8720   DeclarationNameInfo DirName;
8721   getDerived().getSema().StartOpenMPDSABlock(
8722       OMPD_target_teams_distribute_parallel_for_simd, DirName, nullptr,
8723       D->getBeginLoc());
8724   auto Res = getDerived().TransformOMPExecutableDirective(D);
8725   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8726   return Res;
8727 }
8728 
8729 template <typename Derived>
8730 StmtResult
8731 TreeTransform<Derived>::TransformOMPTargetTeamsDistributeSimdDirective(
8732     OMPTargetTeamsDistributeSimdDirective *D) {
8733   DeclarationNameInfo DirName;
8734   getDerived().getSema().StartOpenMPDSABlock(
8735       OMPD_target_teams_distribute_simd, DirName, nullptr, D->getBeginLoc());
8736   auto Res = getDerived().TransformOMPExecutableDirective(D);
8737   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8738   return Res;
8739 }
8740 
8741 
8742 //===----------------------------------------------------------------------===//
8743 // OpenMP clause transformation
8744 //===----------------------------------------------------------------------===//
8745 template <typename Derived>
8746 OMPClause *TreeTransform<Derived>::TransformOMPIfClause(OMPIfClause *C) {
8747   ExprResult Cond = getDerived().TransformExpr(C->getCondition());
8748   if (Cond.isInvalid())
8749     return nullptr;
8750   return getDerived().RebuildOMPIfClause(
8751       C->getNameModifier(), Cond.get(), C->getBeginLoc(), C->getLParenLoc(),
8752       C->getNameModifierLoc(), C->getColonLoc(), C->getEndLoc());
8753 }
8754 
8755 template <typename Derived>
8756 OMPClause *TreeTransform<Derived>::TransformOMPFinalClause(OMPFinalClause *C) {
8757   ExprResult Cond = getDerived().TransformExpr(C->getCondition());
8758   if (Cond.isInvalid())
8759     return nullptr;
8760   return getDerived().RebuildOMPFinalClause(Cond.get(), C->getBeginLoc(),
8761                                             C->getLParenLoc(), C->getEndLoc());
8762 }
8763 
8764 template <typename Derived>
8765 OMPClause *
8766 TreeTransform<Derived>::TransformOMPNumThreadsClause(OMPNumThreadsClause *C) {
8767   ExprResult NumThreads = getDerived().TransformExpr(C->getNumThreads());
8768   if (NumThreads.isInvalid())
8769     return nullptr;
8770   return getDerived().RebuildOMPNumThreadsClause(
8771       NumThreads.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
8772 }
8773 
8774 template <typename Derived>
8775 OMPClause *
8776 TreeTransform<Derived>::TransformOMPSafelenClause(OMPSafelenClause *C) {
8777   ExprResult E = getDerived().TransformExpr(C->getSafelen());
8778   if (E.isInvalid())
8779     return nullptr;
8780   return getDerived().RebuildOMPSafelenClause(
8781       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
8782 }
8783 
8784 template <typename Derived>
8785 OMPClause *
8786 TreeTransform<Derived>::TransformOMPAllocatorClause(OMPAllocatorClause *C) {
8787   ExprResult E = getDerived().TransformExpr(C->getAllocator());
8788   if (E.isInvalid())
8789     return nullptr;
8790   return getDerived().RebuildOMPAllocatorClause(
8791       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
8792 }
8793 
8794 template <typename Derived>
8795 OMPClause *
8796 TreeTransform<Derived>::TransformOMPSimdlenClause(OMPSimdlenClause *C) {
8797   ExprResult E = getDerived().TransformExpr(C->getSimdlen());
8798   if (E.isInvalid())
8799     return nullptr;
8800   return getDerived().RebuildOMPSimdlenClause(
8801       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
8802 }
8803 
8804 template <typename Derived>
8805 OMPClause *
8806 TreeTransform<Derived>::TransformOMPCollapseClause(OMPCollapseClause *C) {
8807   ExprResult E = getDerived().TransformExpr(C->getNumForLoops());
8808   if (E.isInvalid())
8809     return nullptr;
8810   return getDerived().RebuildOMPCollapseClause(
8811       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
8812 }
8813 
8814 template <typename Derived>
8815 OMPClause *
8816 TreeTransform<Derived>::TransformOMPDefaultClause(OMPDefaultClause *C) {
8817   return getDerived().RebuildOMPDefaultClause(
8818       C->getDefaultKind(), C->getDefaultKindKwLoc(), C->getBeginLoc(),
8819       C->getLParenLoc(), C->getEndLoc());
8820 }
8821 
8822 template <typename Derived>
8823 OMPClause *
8824 TreeTransform<Derived>::TransformOMPProcBindClause(OMPProcBindClause *C) {
8825   return getDerived().RebuildOMPProcBindClause(
8826       C->getProcBindKind(), C->getProcBindKindKwLoc(), C->getBeginLoc(),
8827       C->getLParenLoc(), C->getEndLoc());
8828 }
8829 
8830 template <typename Derived>
8831 OMPClause *
8832 TreeTransform<Derived>::TransformOMPScheduleClause(OMPScheduleClause *C) {
8833   ExprResult E = getDerived().TransformExpr(C->getChunkSize());
8834   if (E.isInvalid())
8835     return nullptr;
8836   return getDerived().RebuildOMPScheduleClause(
8837       C->getFirstScheduleModifier(), C->getSecondScheduleModifier(),
8838       C->getScheduleKind(), E.get(), C->getBeginLoc(), C->getLParenLoc(),
8839       C->getFirstScheduleModifierLoc(), C->getSecondScheduleModifierLoc(),
8840       C->getScheduleKindLoc(), C->getCommaLoc(), C->getEndLoc());
8841 }
8842 
8843 template <typename Derived>
8844 OMPClause *
8845 TreeTransform<Derived>::TransformOMPOrderedClause(OMPOrderedClause *C) {
8846   ExprResult E;
8847   if (auto *Num = C->getNumForLoops()) {
8848     E = getDerived().TransformExpr(Num);
8849     if (E.isInvalid())
8850       return nullptr;
8851   }
8852   return getDerived().RebuildOMPOrderedClause(C->getBeginLoc(), C->getEndLoc(),
8853                                               C->getLParenLoc(), E.get());
8854 }
8855 
8856 template <typename Derived>
8857 OMPClause *
8858 TreeTransform<Derived>::TransformOMPDetachClause(OMPDetachClause *C) {
8859   ExprResult E;
8860   if (Expr *Evt = C->getEventHandler()) {
8861     E = getDerived().TransformExpr(Evt);
8862     if (E.isInvalid())
8863       return nullptr;
8864   }
8865   return getDerived().RebuildOMPDetachClause(E.get(), C->getBeginLoc(),
8866                                              C->getLParenLoc(), C->getEndLoc());
8867 }
8868 
8869 template <typename Derived>
8870 OMPClause *
8871 TreeTransform<Derived>::TransformOMPNowaitClause(OMPNowaitClause *C) {
8872   // No need to rebuild this clause, no template-dependent parameters.
8873   return C;
8874 }
8875 
8876 template <typename Derived>
8877 OMPClause *
8878 TreeTransform<Derived>::TransformOMPUntiedClause(OMPUntiedClause *C) {
8879   // No need to rebuild this clause, no template-dependent parameters.
8880   return C;
8881 }
8882 
8883 template <typename Derived>
8884 OMPClause *
8885 TreeTransform<Derived>::TransformOMPMergeableClause(OMPMergeableClause *C) {
8886   // No need to rebuild this clause, no template-dependent parameters.
8887   return C;
8888 }
8889 
8890 template <typename Derived>
8891 OMPClause *TreeTransform<Derived>::TransformOMPReadClause(OMPReadClause *C) {
8892   // No need to rebuild this clause, no template-dependent parameters.
8893   return C;
8894 }
8895 
8896 template <typename Derived>
8897 OMPClause *TreeTransform<Derived>::TransformOMPWriteClause(OMPWriteClause *C) {
8898   // No need to rebuild this clause, no template-dependent parameters.
8899   return C;
8900 }
8901 
8902 template <typename Derived>
8903 OMPClause *
8904 TreeTransform<Derived>::TransformOMPUpdateClause(OMPUpdateClause *C) {
8905   // No need to rebuild this clause, no template-dependent parameters.
8906   return C;
8907 }
8908 
8909 template <typename Derived>
8910 OMPClause *
8911 TreeTransform<Derived>::TransformOMPCaptureClause(OMPCaptureClause *C) {
8912   // No need to rebuild this clause, no template-dependent parameters.
8913   return C;
8914 }
8915 
8916 template <typename Derived>
8917 OMPClause *
8918 TreeTransform<Derived>::TransformOMPSeqCstClause(OMPSeqCstClause *C) {
8919   // No need to rebuild this clause, no template-dependent parameters.
8920   return C;
8921 }
8922 
8923 template <typename Derived>
8924 OMPClause *
8925 TreeTransform<Derived>::TransformOMPAcqRelClause(OMPAcqRelClause *C) {
8926   // No need to rebuild this clause, no template-dependent parameters.
8927   return C;
8928 }
8929 
8930 template <typename Derived>
8931 OMPClause *
8932 TreeTransform<Derived>::TransformOMPAcquireClause(OMPAcquireClause *C) {
8933   // No need to rebuild this clause, no template-dependent parameters.
8934   return C;
8935 }
8936 
8937 template <typename Derived>
8938 OMPClause *
8939 TreeTransform<Derived>::TransformOMPReleaseClause(OMPReleaseClause *C) {
8940   // No need to rebuild this clause, no template-dependent parameters.
8941   return C;
8942 }
8943 
8944 template <typename Derived>
8945 OMPClause *
8946 TreeTransform<Derived>::TransformOMPRelaxedClause(OMPRelaxedClause *C) {
8947   // No need to rebuild this clause, no template-dependent parameters.
8948   return C;
8949 }
8950 
8951 template <typename Derived>
8952 OMPClause *
8953 TreeTransform<Derived>::TransformOMPThreadsClause(OMPThreadsClause *C) {
8954   // No need to rebuild this clause, no template-dependent parameters.
8955   return C;
8956 }
8957 
8958 template <typename Derived>
8959 OMPClause *TreeTransform<Derived>::TransformOMPSIMDClause(OMPSIMDClause *C) {
8960   // No need to rebuild this clause, no template-dependent parameters.
8961   return C;
8962 }
8963 
8964 template <typename Derived>
8965 OMPClause *
8966 TreeTransform<Derived>::TransformOMPNogroupClause(OMPNogroupClause *C) {
8967   // No need to rebuild this clause, no template-dependent parameters.
8968   return C;
8969 }
8970 
8971 template <typename Derived>
8972 OMPClause *
8973 TreeTransform<Derived>::TransformOMPDestroyClause(OMPDestroyClause *C) {
8974   // No need to rebuild this clause, no template-dependent parameters.
8975   return C;
8976 }
8977 
8978 template <typename Derived>
8979 OMPClause *TreeTransform<Derived>::TransformOMPUnifiedAddressClause(
8980     OMPUnifiedAddressClause *C) {
8981   llvm_unreachable("unified_address clause cannot appear in dependent context");
8982 }
8983 
8984 template <typename Derived>
8985 OMPClause *TreeTransform<Derived>::TransformOMPUnifiedSharedMemoryClause(
8986     OMPUnifiedSharedMemoryClause *C) {
8987   llvm_unreachable(
8988       "unified_shared_memory clause cannot appear in dependent context");
8989 }
8990 
8991 template <typename Derived>
8992 OMPClause *TreeTransform<Derived>::TransformOMPReverseOffloadClause(
8993     OMPReverseOffloadClause *C) {
8994   llvm_unreachable("reverse_offload clause cannot appear in dependent context");
8995 }
8996 
8997 template <typename Derived>
8998 OMPClause *TreeTransform<Derived>::TransformOMPDynamicAllocatorsClause(
8999     OMPDynamicAllocatorsClause *C) {
9000   llvm_unreachable(
9001       "dynamic_allocators clause cannot appear in dependent context");
9002 }
9003 
9004 template <typename Derived>
9005 OMPClause *TreeTransform<Derived>::TransformOMPAtomicDefaultMemOrderClause(
9006     OMPAtomicDefaultMemOrderClause *C) {
9007   llvm_unreachable(
9008       "atomic_default_mem_order clause cannot appear in dependent context");
9009 }
9010 
9011 template <typename Derived>
9012 OMPClause *
9013 TreeTransform<Derived>::TransformOMPPrivateClause(OMPPrivateClause *C) {
9014   llvm::SmallVector<Expr *, 16> Vars;
9015   Vars.reserve(C->varlist_size());
9016   for (auto *VE : C->varlists()) {
9017     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9018     if (EVar.isInvalid())
9019       return nullptr;
9020     Vars.push_back(EVar.get());
9021   }
9022   return getDerived().RebuildOMPPrivateClause(
9023       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9024 }
9025 
9026 template <typename Derived>
9027 OMPClause *TreeTransform<Derived>::TransformOMPFirstprivateClause(
9028     OMPFirstprivateClause *C) {
9029   llvm::SmallVector<Expr *, 16> Vars;
9030   Vars.reserve(C->varlist_size());
9031   for (auto *VE : C->varlists()) {
9032     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9033     if (EVar.isInvalid())
9034       return nullptr;
9035     Vars.push_back(EVar.get());
9036   }
9037   return getDerived().RebuildOMPFirstprivateClause(
9038       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9039 }
9040 
9041 template <typename Derived>
9042 OMPClause *
9043 TreeTransform<Derived>::TransformOMPLastprivateClause(OMPLastprivateClause *C) {
9044   llvm::SmallVector<Expr *, 16> Vars;
9045   Vars.reserve(C->varlist_size());
9046   for (auto *VE : C->varlists()) {
9047     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9048     if (EVar.isInvalid())
9049       return nullptr;
9050     Vars.push_back(EVar.get());
9051   }
9052   return getDerived().RebuildOMPLastprivateClause(
9053       Vars, C->getKind(), C->getKindLoc(), C->getColonLoc(), C->getBeginLoc(),
9054       C->getLParenLoc(), C->getEndLoc());
9055 }
9056 
9057 template <typename Derived>
9058 OMPClause *
9059 TreeTransform<Derived>::TransformOMPSharedClause(OMPSharedClause *C) {
9060   llvm::SmallVector<Expr *, 16> Vars;
9061   Vars.reserve(C->varlist_size());
9062   for (auto *VE : C->varlists()) {
9063     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9064     if (EVar.isInvalid())
9065       return nullptr;
9066     Vars.push_back(EVar.get());
9067   }
9068   return getDerived().RebuildOMPSharedClause(Vars, C->getBeginLoc(),
9069                                              C->getLParenLoc(), C->getEndLoc());
9070 }
9071 
9072 template <typename Derived>
9073 OMPClause *
9074 TreeTransform<Derived>::TransformOMPReductionClause(OMPReductionClause *C) {
9075   llvm::SmallVector<Expr *, 16> Vars;
9076   Vars.reserve(C->varlist_size());
9077   for (auto *VE : C->varlists()) {
9078     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9079     if (EVar.isInvalid())
9080       return nullptr;
9081     Vars.push_back(EVar.get());
9082   }
9083   CXXScopeSpec ReductionIdScopeSpec;
9084   ReductionIdScopeSpec.Adopt(C->getQualifierLoc());
9085 
9086   DeclarationNameInfo NameInfo = C->getNameInfo();
9087   if (NameInfo.getName()) {
9088     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
9089     if (!NameInfo.getName())
9090       return nullptr;
9091   }
9092   // Build a list of all UDR decls with the same names ranged by the Scopes.
9093   // The Scope boundary is a duplication of the previous decl.
9094   llvm::SmallVector<Expr *, 16> UnresolvedReductions;
9095   for (auto *E : C->reduction_ops()) {
9096     // Transform all the decls.
9097     if (E) {
9098       auto *ULE = cast<UnresolvedLookupExpr>(E);
9099       UnresolvedSet<8> Decls;
9100       for (auto *D : ULE->decls()) {
9101         NamedDecl *InstD =
9102             cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D));
9103         Decls.addDecl(InstD, InstD->getAccess());
9104       }
9105       UnresolvedReductions.push_back(
9106        UnresolvedLookupExpr::Create(
9107           SemaRef.Context, /*NamingClass=*/nullptr,
9108           ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context),
9109           NameInfo, /*ADL=*/true, ULE->isOverloaded(),
9110           Decls.begin(), Decls.end()));
9111     } else
9112       UnresolvedReductions.push_back(nullptr);
9113   }
9114   return getDerived().RebuildOMPReductionClause(
9115       Vars, C->getModifier(), C->getBeginLoc(), C->getLParenLoc(),
9116       C->getModifierLoc(), C->getColonLoc(), C->getEndLoc(),
9117       ReductionIdScopeSpec, NameInfo, UnresolvedReductions);
9118 }
9119 
9120 template <typename Derived>
9121 OMPClause *TreeTransform<Derived>::TransformOMPTaskReductionClause(
9122     OMPTaskReductionClause *C) {
9123   llvm::SmallVector<Expr *, 16> Vars;
9124   Vars.reserve(C->varlist_size());
9125   for (auto *VE : C->varlists()) {
9126     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9127     if (EVar.isInvalid())
9128       return nullptr;
9129     Vars.push_back(EVar.get());
9130   }
9131   CXXScopeSpec ReductionIdScopeSpec;
9132   ReductionIdScopeSpec.Adopt(C->getQualifierLoc());
9133 
9134   DeclarationNameInfo NameInfo = C->getNameInfo();
9135   if (NameInfo.getName()) {
9136     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
9137     if (!NameInfo.getName())
9138       return nullptr;
9139   }
9140   // Build a list of all UDR decls with the same names ranged by the Scopes.
9141   // The Scope boundary is a duplication of the previous decl.
9142   llvm::SmallVector<Expr *, 16> UnresolvedReductions;
9143   for (auto *E : C->reduction_ops()) {
9144     // Transform all the decls.
9145     if (E) {
9146       auto *ULE = cast<UnresolvedLookupExpr>(E);
9147       UnresolvedSet<8> Decls;
9148       for (auto *D : ULE->decls()) {
9149         NamedDecl *InstD =
9150             cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D));
9151         Decls.addDecl(InstD, InstD->getAccess());
9152       }
9153       UnresolvedReductions.push_back(UnresolvedLookupExpr::Create(
9154           SemaRef.Context, /*NamingClass=*/nullptr,
9155           ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), NameInfo,
9156           /*ADL=*/true, ULE->isOverloaded(), Decls.begin(), Decls.end()));
9157     } else
9158       UnresolvedReductions.push_back(nullptr);
9159   }
9160   return getDerived().RebuildOMPTaskReductionClause(
9161       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(),
9162       C->getEndLoc(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions);
9163 }
9164 
9165 template <typename Derived>
9166 OMPClause *
9167 TreeTransform<Derived>::TransformOMPInReductionClause(OMPInReductionClause *C) {
9168   llvm::SmallVector<Expr *, 16> Vars;
9169   Vars.reserve(C->varlist_size());
9170   for (auto *VE : C->varlists()) {
9171     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9172     if (EVar.isInvalid())
9173       return nullptr;
9174     Vars.push_back(EVar.get());
9175   }
9176   CXXScopeSpec ReductionIdScopeSpec;
9177   ReductionIdScopeSpec.Adopt(C->getQualifierLoc());
9178 
9179   DeclarationNameInfo NameInfo = C->getNameInfo();
9180   if (NameInfo.getName()) {
9181     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
9182     if (!NameInfo.getName())
9183       return nullptr;
9184   }
9185   // Build a list of all UDR decls with the same names ranged by the Scopes.
9186   // The Scope boundary is a duplication of the previous decl.
9187   llvm::SmallVector<Expr *, 16> UnresolvedReductions;
9188   for (auto *E : C->reduction_ops()) {
9189     // Transform all the decls.
9190     if (E) {
9191       auto *ULE = cast<UnresolvedLookupExpr>(E);
9192       UnresolvedSet<8> Decls;
9193       for (auto *D : ULE->decls()) {
9194         NamedDecl *InstD =
9195             cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D));
9196         Decls.addDecl(InstD, InstD->getAccess());
9197       }
9198       UnresolvedReductions.push_back(UnresolvedLookupExpr::Create(
9199           SemaRef.Context, /*NamingClass=*/nullptr,
9200           ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), NameInfo,
9201           /*ADL=*/true, ULE->isOverloaded(), Decls.begin(), Decls.end()));
9202     } else
9203       UnresolvedReductions.push_back(nullptr);
9204   }
9205   return getDerived().RebuildOMPInReductionClause(
9206       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(),
9207       C->getEndLoc(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions);
9208 }
9209 
9210 template <typename Derived>
9211 OMPClause *
9212 TreeTransform<Derived>::TransformOMPLinearClause(OMPLinearClause *C) {
9213   llvm::SmallVector<Expr *, 16> Vars;
9214   Vars.reserve(C->varlist_size());
9215   for (auto *VE : C->varlists()) {
9216     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9217     if (EVar.isInvalid())
9218       return nullptr;
9219     Vars.push_back(EVar.get());
9220   }
9221   ExprResult Step = getDerived().TransformExpr(C->getStep());
9222   if (Step.isInvalid())
9223     return nullptr;
9224   return getDerived().RebuildOMPLinearClause(
9225       Vars, Step.get(), C->getBeginLoc(), C->getLParenLoc(), C->getModifier(),
9226       C->getModifierLoc(), C->getColonLoc(), C->getEndLoc());
9227 }
9228 
9229 template <typename Derived>
9230 OMPClause *
9231 TreeTransform<Derived>::TransformOMPAlignedClause(OMPAlignedClause *C) {
9232   llvm::SmallVector<Expr *, 16> Vars;
9233   Vars.reserve(C->varlist_size());
9234   for (auto *VE : C->varlists()) {
9235     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9236     if (EVar.isInvalid())
9237       return nullptr;
9238     Vars.push_back(EVar.get());
9239   }
9240   ExprResult Alignment = getDerived().TransformExpr(C->getAlignment());
9241   if (Alignment.isInvalid())
9242     return nullptr;
9243   return getDerived().RebuildOMPAlignedClause(
9244       Vars, Alignment.get(), C->getBeginLoc(), C->getLParenLoc(),
9245       C->getColonLoc(), C->getEndLoc());
9246 }
9247 
9248 template <typename Derived>
9249 OMPClause *
9250 TreeTransform<Derived>::TransformOMPCopyinClause(OMPCopyinClause *C) {
9251   llvm::SmallVector<Expr *, 16> Vars;
9252   Vars.reserve(C->varlist_size());
9253   for (auto *VE : C->varlists()) {
9254     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9255     if (EVar.isInvalid())
9256       return nullptr;
9257     Vars.push_back(EVar.get());
9258   }
9259   return getDerived().RebuildOMPCopyinClause(Vars, C->getBeginLoc(),
9260                                              C->getLParenLoc(), C->getEndLoc());
9261 }
9262 
9263 template <typename Derived>
9264 OMPClause *
9265 TreeTransform<Derived>::TransformOMPCopyprivateClause(OMPCopyprivateClause *C) {
9266   llvm::SmallVector<Expr *, 16> Vars;
9267   Vars.reserve(C->varlist_size());
9268   for (auto *VE : C->varlists()) {
9269     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9270     if (EVar.isInvalid())
9271       return nullptr;
9272     Vars.push_back(EVar.get());
9273   }
9274   return getDerived().RebuildOMPCopyprivateClause(
9275       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9276 }
9277 
9278 template <typename Derived>
9279 OMPClause *TreeTransform<Derived>::TransformOMPFlushClause(OMPFlushClause *C) {
9280   llvm::SmallVector<Expr *, 16> Vars;
9281   Vars.reserve(C->varlist_size());
9282   for (auto *VE : C->varlists()) {
9283     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9284     if (EVar.isInvalid())
9285       return nullptr;
9286     Vars.push_back(EVar.get());
9287   }
9288   return getDerived().RebuildOMPFlushClause(Vars, C->getBeginLoc(),
9289                                             C->getLParenLoc(), C->getEndLoc());
9290 }
9291 
9292 template <typename Derived>
9293 OMPClause *
9294 TreeTransform<Derived>::TransformOMPDepobjClause(OMPDepobjClause *C) {
9295   ExprResult E = getDerived().TransformExpr(C->getDepobj());
9296   if (E.isInvalid())
9297     return nullptr;
9298   return getDerived().RebuildOMPDepobjClause(E.get(), C->getBeginLoc(),
9299                                              C->getLParenLoc(), C->getEndLoc());
9300 }
9301 
9302 template <typename Derived>
9303 OMPClause *
9304 TreeTransform<Derived>::TransformOMPDependClause(OMPDependClause *C) {
9305   llvm::SmallVector<Expr *, 16> Vars;
9306   Expr *DepModifier = C->getModifier();
9307   if (DepModifier) {
9308     ExprResult DepModRes = getDerived().TransformExpr(DepModifier);
9309     if (DepModRes.isInvalid())
9310       return nullptr;
9311     DepModifier = DepModRes.get();
9312   }
9313   Vars.reserve(C->varlist_size());
9314   for (auto *VE : C->varlists()) {
9315     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9316     if (EVar.isInvalid())
9317       return nullptr;
9318     Vars.push_back(EVar.get());
9319   }
9320   return getDerived().RebuildOMPDependClause(
9321       DepModifier, C->getDependencyKind(), C->getDependencyLoc(),
9322       C->getColonLoc(), Vars, C->getBeginLoc(), C->getLParenLoc(),
9323       C->getEndLoc());
9324 }
9325 
9326 template <typename Derived>
9327 OMPClause *
9328 TreeTransform<Derived>::TransformOMPDeviceClause(OMPDeviceClause *C) {
9329   ExprResult E = getDerived().TransformExpr(C->getDevice());
9330   if (E.isInvalid())
9331     return nullptr;
9332   return getDerived().RebuildOMPDeviceClause(
9333       C->getModifier(), E.get(), C->getBeginLoc(), C->getLParenLoc(),
9334       C->getModifierLoc(), C->getEndLoc());
9335 }
9336 
9337 template <typename Derived, class T>
9338 bool transformOMPMappableExprListClause(
9339     TreeTransform<Derived> &TT, OMPMappableExprListClause<T> *C,
9340     llvm::SmallVectorImpl<Expr *> &Vars, CXXScopeSpec &MapperIdScopeSpec,
9341     DeclarationNameInfo &MapperIdInfo,
9342     llvm::SmallVectorImpl<Expr *> &UnresolvedMappers) {
9343   // Transform expressions in the list.
9344   Vars.reserve(C->varlist_size());
9345   for (auto *VE : C->varlists()) {
9346     ExprResult EVar = TT.getDerived().TransformExpr(cast<Expr>(VE));
9347     if (EVar.isInvalid())
9348       return true;
9349     Vars.push_back(EVar.get());
9350   }
9351   // Transform mapper scope specifier and identifier.
9352   NestedNameSpecifierLoc QualifierLoc;
9353   if (C->getMapperQualifierLoc()) {
9354     QualifierLoc = TT.getDerived().TransformNestedNameSpecifierLoc(
9355         C->getMapperQualifierLoc());
9356     if (!QualifierLoc)
9357       return true;
9358   }
9359   MapperIdScopeSpec.Adopt(QualifierLoc);
9360   MapperIdInfo = C->getMapperIdInfo();
9361   if (MapperIdInfo.getName()) {
9362     MapperIdInfo = TT.getDerived().TransformDeclarationNameInfo(MapperIdInfo);
9363     if (!MapperIdInfo.getName())
9364       return true;
9365   }
9366   // Build a list of all candidate OMPDeclareMapperDecls, which is provided by
9367   // the previous user-defined mapper lookup in dependent environment.
9368   for (auto *E : C->mapperlists()) {
9369     // Transform all the decls.
9370     if (E) {
9371       auto *ULE = cast<UnresolvedLookupExpr>(E);
9372       UnresolvedSet<8> Decls;
9373       for (auto *D : ULE->decls()) {
9374         NamedDecl *InstD =
9375             cast<NamedDecl>(TT.getDerived().TransformDecl(E->getExprLoc(), D));
9376         Decls.addDecl(InstD, InstD->getAccess());
9377       }
9378       UnresolvedMappers.push_back(UnresolvedLookupExpr::Create(
9379           TT.getSema().Context, /*NamingClass=*/nullptr,
9380           MapperIdScopeSpec.getWithLocInContext(TT.getSema().Context),
9381           MapperIdInfo, /*ADL=*/true, ULE->isOverloaded(), Decls.begin(),
9382           Decls.end()));
9383     } else {
9384       UnresolvedMappers.push_back(nullptr);
9385     }
9386   }
9387   return false;
9388 }
9389 
9390 template <typename Derived>
9391 OMPClause *TreeTransform<Derived>::TransformOMPMapClause(OMPMapClause *C) {
9392   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9393   llvm::SmallVector<Expr *, 16> Vars;
9394   CXXScopeSpec MapperIdScopeSpec;
9395   DeclarationNameInfo MapperIdInfo;
9396   llvm::SmallVector<Expr *, 16> UnresolvedMappers;
9397   if (transformOMPMappableExprListClause<Derived, OMPMapClause>(
9398           *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers))
9399     return nullptr;
9400   return getDerived().RebuildOMPMapClause(
9401       C->getMapTypeModifiers(), C->getMapTypeModifiersLoc(), MapperIdScopeSpec,
9402       MapperIdInfo, C->getMapType(), C->isImplicitMapType(), C->getMapLoc(),
9403       C->getColonLoc(), Vars, Locs, UnresolvedMappers);
9404 }
9405 
9406 template <typename Derived>
9407 OMPClause *
9408 TreeTransform<Derived>::TransformOMPAllocateClause(OMPAllocateClause *C) {
9409   Expr *Allocator = C->getAllocator();
9410   if (Allocator) {
9411     ExprResult AllocatorRes = getDerived().TransformExpr(Allocator);
9412     if (AllocatorRes.isInvalid())
9413       return nullptr;
9414     Allocator = AllocatorRes.get();
9415   }
9416   llvm::SmallVector<Expr *, 16> Vars;
9417   Vars.reserve(C->varlist_size());
9418   for (auto *VE : C->varlists()) {
9419     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9420     if (EVar.isInvalid())
9421       return nullptr;
9422     Vars.push_back(EVar.get());
9423   }
9424   return getDerived().RebuildOMPAllocateClause(
9425       Allocator, Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(),
9426       C->getEndLoc());
9427 }
9428 
9429 template <typename Derived>
9430 OMPClause *
9431 TreeTransform<Derived>::TransformOMPNumTeamsClause(OMPNumTeamsClause *C) {
9432   ExprResult E = getDerived().TransformExpr(C->getNumTeams());
9433   if (E.isInvalid())
9434     return nullptr;
9435   return getDerived().RebuildOMPNumTeamsClause(
9436       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9437 }
9438 
9439 template <typename Derived>
9440 OMPClause *
9441 TreeTransform<Derived>::TransformOMPThreadLimitClause(OMPThreadLimitClause *C) {
9442   ExprResult E = getDerived().TransformExpr(C->getThreadLimit());
9443   if (E.isInvalid())
9444     return nullptr;
9445   return getDerived().RebuildOMPThreadLimitClause(
9446       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9447 }
9448 
9449 template <typename Derived>
9450 OMPClause *
9451 TreeTransform<Derived>::TransformOMPPriorityClause(OMPPriorityClause *C) {
9452   ExprResult E = getDerived().TransformExpr(C->getPriority());
9453   if (E.isInvalid())
9454     return nullptr;
9455   return getDerived().RebuildOMPPriorityClause(
9456       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9457 }
9458 
9459 template <typename Derived>
9460 OMPClause *
9461 TreeTransform<Derived>::TransformOMPGrainsizeClause(OMPGrainsizeClause *C) {
9462   ExprResult E = getDerived().TransformExpr(C->getGrainsize());
9463   if (E.isInvalid())
9464     return nullptr;
9465   return getDerived().RebuildOMPGrainsizeClause(
9466       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9467 }
9468 
9469 template <typename Derived>
9470 OMPClause *
9471 TreeTransform<Derived>::TransformOMPNumTasksClause(OMPNumTasksClause *C) {
9472   ExprResult E = getDerived().TransformExpr(C->getNumTasks());
9473   if (E.isInvalid())
9474     return nullptr;
9475   return getDerived().RebuildOMPNumTasksClause(
9476       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9477 }
9478 
9479 template <typename Derived>
9480 OMPClause *TreeTransform<Derived>::TransformOMPHintClause(OMPHintClause *C) {
9481   ExprResult E = getDerived().TransformExpr(C->getHint());
9482   if (E.isInvalid())
9483     return nullptr;
9484   return getDerived().RebuildOMPHintClause(E.get(), C->getBeginLoc(),
9485                                            C->getLParenLoc(), C->getEndLoc());
9486 }
9487 
9488 template <typename Derived>
9489 OMPClause *TreeTransform<Derived>::TransformOMPDistScheduleClause(
9490     OMPDistScheduleClause *C) {
9491   ExprResult E = getDerived().TransformExpr(C->getChunkSize());
9492   if (E.isInvalid())
9493     return nullptr;
9494   return getDerived().RebuildOMPDistScheduleClause(
9495       C->getDistScheduleKind(), E.get(), C->getBeginLoc(), C->getLParenLoc(),
9496       C->getDistScheduleKindLoc(), C->getCommaLoc(), C->getEndLoc());
9497 }
9498 
9499 template <typename Derived>
9500 OMPClause *
9501 TreeTransform<Derived>::TransformOMPDefaultmapClause(OMPDefaultmapClause *C) {
9502   // Rebuild Defaultmap Clause since we need to invoke the checking of
9503   // defaultmap(none:variable-category) after template initialization.
9504   return getDerived().RebuildOMPDefaultmapClause(C->getDefaultmapModifier(),
9505                                                  C->getDefaultmapKind(),
9506                                                  C->getBeginLoc(),
9507                                                  C->getLParenLoc(),
9508                                                  C->getDefaultmapModifierLoc(),
9509                                                  C->getDefaultmapKindLoc(),
9510                                                  C->getEndLoc());
9511 }
9512 
9513 template <typename Derived>
9514 OMPClause *TreeTransform<Derived>::TransformOMPToClause(OMPToClause *C) {
9515   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9516   llvm::SmallVector<Expr *, 16> Vars;
9517   CXXScopeSpec MapperIdScopeSpec;
9518   DeclarationNameInfo MapperIdInfo;
9519   llvm::SmallVector<Expr *, 16> UnresolvedMappers;
9520   if (transformOMPMappableExprListClause<Derived, OMPToClause>(
9521           *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers))
9522     return nullptr;
9523   return getDerived().RebuildOMPToClause(Vars, MapperIdScopeSpec, MapperIdInfo,
9524                                          Locs, UnresolvedMappers);
9525 }
9526 
9527 template <typename Derived>
9528 OMPClause *TreeTransform<Derived>::TransformOMPFromClause(OMPFromClause *C) {
9529   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9530   llvm::SmallVector<Expr *, 16> Vars;
9531   CXXScopeSpec MapperIdScopeSpec;
9532   DeclarationNameInfo MapperIdInfo;
9533   llvm::SmallVector<Expr *, 16> UnresolvedMappers;
9534   if (transformOMPMappableExprListClause<Derived, OMPFromClause>(
9535           *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers))
9536     return nullptr;
9537   return getDerived().RebuildOMPFromClause(
9538       Vars, MapperIdScopeSpec, MapperIdInfo, Locs, UnresolvedMappers);
9539 }
9540 
9541 template <typename Derived>
9542 OMPClause *TreeTransform<Derived>::TransformOMPUseDevicePtrClause(
9543     OMPUseDevicePtrClause *C) {
9544   llvm::SmallVector<Expr *, 16> Vars;
9545   Vars.reserve(C->varlist_size());
9546   for (auto *VE : C->varlists()) {
9547     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9548     if (EVar.isInvalid())
9549       return nullptr;
9550     Vars.push_back(EVar.get());
9551   }
9552   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9553   return getDerived().RebuildOMPUseDevicePtrClause(Vars, Locs);
9554 }
9555 
9556 template <typename Derived>
9557 OMPClause *
9558 TreeTransform<Derived>::TransformOMPIsDevicePtrClause(OMPIsDevicePtrClause *C) {
9559   llvm::SmallVector<Expr *, 16> Vars;
9560   Vars.reserve(C->varlist_size());
9561   for (auto *VE : C->varlists()) {
9562     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9563     if (EVar.isInvalid())
9564       return nullptr;
9565     Vars.push_back(EVar.get());
9566   }
9567   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9568   return getDerived().RebuildOMPIsDevicePtrClause(Vars, Locs);
9569 }
9570 
9571 template <typename Derived>
9572 OMPClause *
9573 TreeTransform<Derived>::TransformOMPNontemporalClause(OMPNontemporalClause *C) {
9574   llvm::SmallVector<Expr *, 16> Vars;
9575   Vars.reserve(C->varlist_size());
9576   for (auto *VE : C->varlists()) {
9577     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9578     if (EVar.isInvalid())
9579       return nullptr;
9580     Vars.push_back(EVar.get());
9581   }
9582   return getDerived().RebuildOMPNontemporalClause(
9583       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9584 }
9585 
9586 template <typename Derived>
9587 OMPClause *
9588 TreeTransform<Derived>::TransformOMPInclusiveClause(OMPInclusiveClause *C) {
9589   llvm::SmallVector<Expr *, 16> Vars;
9590   Vars.reserve(C->varlist_size());
9591   for (auto *VE : C->varlists()) {
9592     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9593     if (EVar.isInvalid())
9594       return nullptr;
9595     Vars.push_back(EVar.get());
9596   }
9597   return getDerived().RebuildOMPInclusiveClause(
9598       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9599 }
9600 
9601 template <typename Derived>
9602 OMPClause *
9603 TreeTransform<Derived>::TransformOMPExclusiveClause(OMPExclusiveClause *C) {
9604   llvm::SmallVector<Expr *, 16> Vars;
9605   Vars.reserve(C->varlist_size());
9606   for (auto *VE : C->varlists()) {
9607     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9608     if (EVar.isInvalid())
9609       return nullptr;
9610     Vars.push_back(EVar.get());
9611   }
9612   return getDerived().RebuildOMPExclusiveClause(
9613       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9614 }
9615 
9616 template <typename Derived>
9617 OMPClause *
9618 TreeTransform<Derived>::TransformOMPOrderClause(OMPOrderClause *C) {
9619   return getDerived().RebuildOMPOrderClause(C->getKind(), C->getKindKwLoc(),
9620                                             C->getBeginLoc(), C->getLParenLoc(),
9621                                             C->getEndLoc());
9622 }
9623 
9624 //===----------------------------------------------------------------------===//
9625 // Expression transformation
9626 //===----------------------------------------------------------------------===//
9627 template<typename Derived>
9628 ExprResult
9629 TreeTransform<Derived>::TransformConstantExpr(ConstantExpr *E) {
9630   return TransformExpr(E->getSubExpr());
9631 }
9632 
9633 template<typename Derived>
9634 ExprResult
9635 TreeTransform<Derived>::TransformPredefinedExpr(PredefinedExpr *E) {
9636   if (!E->isTypeDependent())
9637     return E;
9638 
9639   return getDerived().RebuildPredefinedExpr(E->getLocation(),
9640                                             E->getIdentKind());
9641 }
9642 
9643 template<typename Derived>
9644 ExprResult
9645 TreeTransform<Derived>::TransformDeclRefExpr(DeclRefExpr *E) {
9646   NestedNameSpecifierLoc QualifierLoc;
9647   if (E->getQualifierLoc()) {
9648     QualifierLoc
9649       = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
9650     if (!QualifierLoc)
9651       return ExprError();
9652   }
9653 
9654   ValueDecl *ND
9655     = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getLocation(),
9656                                                          E->getDecl()));
9657   if (!ND)
9658     return ExprError();
9659 
9660   NamedDecl *Found = ND;
9661   if (E->getFoundDecl() != E->getDecl()) {
9662     Found = cast_or_null<NamedDecl>(
9663         getDerived().TransformDecl(E->getLocation(), E->getFoundDecl()));
9664     if (!Found)
9665       return ExprError();
9666   }
9667 
9668   DeclarationNameInfo NameInfo = E->getNameInfo();
9669   if (NameInfo.getName()) {
9670     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
9671     if (!NameInfo.getName())
9672       return ExprError();
9673   }
9674 
9675   if (!getDerived().AlwaysRebuild() &&
9676       QualifierLoc == E->getQualifierLoc() &&
9677       ND == E->getDecl() &&
9678       Found == E->getFoundDecl() &&
9679       NameInfo.getName() == E->getDecl()->getDeclName() &&
9680       !E->hasExplicitTemplateArgs()) {
9681 
9682     // Mark it referenced in the new context regardless.
9683     // FIXME: this is a bit instantiation-specific.
9684     SemaRef.MarkDeclRefReferenced(E);
9685 
9686     return E;
9687   }
9688 
9689   TemplateArgumentListInfo TransArgs, *TemplateArgs = nullptr;
9690   if (E->hasExplicitTemplateArgs()) {
9691     TemplateArgs = &TransArgs;
9692     TransArgs.setLAngleLoc(E->getLAngleLoc());
9693     TransArgs.setRAngleLoc(E->getRAngleLoc());
9694     if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
9695                                                 E->getNumTemplateArgs(),
9696                                                 TransArgs))
9697       return ExprError();
9698   }
9699 
9700   return getDerived().RebuildDeclRefExpr(QualifierLoc, ND, NameInfo,
9701                                          Found, TemplateArgs);
9702 }
9703 
9704 template<typename Derived>
9705 ExprResult
9706 TreeTransform<Derived>::TransformIntegerLiteral(IntegerLiteral *E) {
9707   return E;
9708 }
9709 
9710 template <typename Derived>
9711 ExprResult TreeTransform<Derived>::TransformFixedPointLiteral(
9712     FixedPointLiteral *E) {
9713   return E;
9714 }
9715 
9716 template<typename Derived>
9717 ExprResult
9718 TreeTransform<Derived>::TransformFloatingLiteral(FloatingLiteral *E) {
9719   return E;
9720 }
9721 
9722 template<typename Derived>
9723 ExprResult
9724 TreeTransform<Derived>::TransformImaginaryLiteral(ImaginaryLiteral *E) {
9725   return E;
9726 }
9727 
9728 template<typename Derived>
9729 ExprResult
9730 TreeTransform<Derived>::TransformStringLiteral(StringLiteral *E) {
9731   return E;
9732 }
9733 
9734 template<typename Derived>
9735 ExprResult
9736 TreeTransform<Derived>::TransformCharacterLiteral(CharacterLiteral *E) {
9737   return E;
9738 }
9739 
9740 template<typename Derived>
9741 ExprResult
9742 TreeTransform<Derived>::TransformUserDefinedLiteral(UserDefinedLiteral *E) {
9743   if (FunctionDecl *FD = E->getDirectCallee())
9744     SemaRef.MarkFunctionReferenced(E->getBeginLoc(), FD);
9745   return SemaRef.MaybeBindToTemporary(E);
9746 }
9747 
9748 template<typename Derived>
9749 ExprResult
9750 TreeTransform<Derived>::TransformGenericSelectionExpr(GenericSelectionExpr *E) {
9751   ExprResult ControllingExpr =
9752     getDerived().TransformExpr(E->getControllingExpr());
9753   if (ControllingExpr.isInvalid())
9754     return ExprError();
9755 
9756   SmallVector<Expr *, 4> AssocExprs;
9757   SmallVector<TypeSourceInfo *, 4> AssocTypes;
9758   for (const GenericSelectionExpr::Association Assoc : E->associations()) {
9759     TypeSourceInfo *TSI = Assoc.getTypeSourceInfo();
9760     if (TSI) {
9761       TypeSourceInfo *AssocType = getDerived().TransformType(TSI);
9762       if (!AssocType)
9763         return ExprError();
9764       AssocTypes.push_back(AssocType);
9765     } else {
9766       AssocTypes.push_back(nullptr);
9767     }
9768 
9769     ExprResult AssocExpr =
9770         getDerived().TransformExpr(Assoc.getAssociationExpr());
9771     if (AssocExpr.isInvalid())
9772       return ExprError();
9773     AssocExprs.push_back(AssocExpr.get());
9774   }
9775 
9776   return getDerived().RebuildGenericSelectionExpr(E->getGenericLoc(),
9777                                                   E->getDefaultLoc(),
9778                                                   E->getRParenLoc(),
9779                                                   ControllingExpr.get(),
9780                                                   AssocTypes,
9781                                                   AssocExprs);
9782 }
9783 
9784 template<typename Derived>
9785 ExprResult
9786 TreeTransform<Derived>::TransformParenExpr(ParenExpr *E) {
9787   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
9788   if (SubExpr.isInvalid())
9789     return ExprError();
9790 
9791   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr())
9792     return E;
9793 
9794   return getDerived().RebuildParenExpr(SubExpr.get(), E->getLParen(),
9795                                        E->getRParen());
9796 }
9797 
9798 /// The operand of a unary address-of operator has special rules: it's
9799 /// allowed to refer to a non-static member of a class even if there's no 'this'
9800 /// object available.
9801 template<typename Derived>
9802 ExprResult
9803 TreeTransform<Derived>::TransformAddressOfOperand(Expr *E) {
9804   if (DependentScopeDeclRefExpr *DRE = dyn_cast<DependentScopeDeclRefExpr>(E))
9805     return getDerived().TransformDependentScopeDeclRefExpr(DRE, true, nullptr);
9806   else
9807     return getDerived().TransformExpr(E);
9808 }
9809 
9810 template<typename Derived>
9811 ExprResult
9812 TreeTransform<Derived>::TransformUnaryOperator(UnaryOperator *E) {
9813   ExprResult SubExpr;
9814   if (E->getOpcode() == UO_AddrOf)
9815     SubExpr = TransformAddressOfOperand(E->getSubExpr());
9816   else
9817     SubExpr = TransformExpr(E->getSubExpr());
9818   if (SubExpr.isInvalid())
9819     return ExprError();
9820 
9821   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr())
9822     return E;
9823 
9824   return getDerived().RebuildUnaryOperator(E->getOperatorLoc(),
9825                                            E->getOpcode(),
9826                                            SubExpr.get());
9827 }
9828 
9829 template<typename Derived>
9830 ExprResult
9831 TreeTransform<Derived>::TransformOffsetOfExpr(OffsetOfExpr *E) {
9832   // Transform the type.
9833   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo());
9834   if (!Type)
9835     return ExprError();
9836 
9837   // Transform all of the components into components similar to what the
9838   // parser uses.
9839   // FIXME: It would be slightly more efficient in the non-dependent case to
9840   // just map FieldDecls, rather than requiring the rebuilder to look for
9841   // the fields again. However, __builtin_offsetof is rare enough in
9842   // template code that we don't care.
9843   bool ExprChanged = false;
9844   typedef Sema::OffsetOfComponent Component;
9845   SmallVector<Component, 4> Components;
9846   for (unsigned I = 0, N = E->getNumComponents(); I != N; ++I) {
9847     const OffsetOfNode &ON = E->getComponent(I);
9848     Component Comp;
9849     Comp.isBrackets = true;
9850     Comp.LocStart = ON.getSourceRange().getBegin();
9851     Comp.LocEnd = ON.getSourceRange().getEnd();
9852     switch (ON.getKind()) {
9853     case OffsetOfNode::Array: {
9854       Expr *FromIndex = E->getIndexExpr(ON.getArrayExprIndex());
9855       ExprResult Index = getDerived().TransformExpr(FromIndex);
9856       if (Index.isInvalid())
9857         return ExprError();
9858 
9859       ExprChanged = ExprChanged || Index.get() != FromIndex;
9860       Comp.isBrackets = true;
9861       Comp.U.E = Index.get();
9862       break;
9863     }
9864 
9865     case OffsetOfNode::Field:
9866     case OffsetOfNode::Identifier:
9867       Comp.isBrackets = false;
9868       Comp.U.IdentInfo = ON.getFieldName();
9869       if (!Comp.U.IdentInfo)
9870         continue;
9871 
9872       break;
9873 
9874     case OffsetOfNode::Base:
9875       // Will be recomputed during the rebuild.
9876       continue;
9877     }
9878 
9879     Components.push_back(Comp);
9880   }
9881 
9882   // If nothing changed, retain the existing expression.
9883   if (!getDerived().AlwaysRebuild() &&
9884       Type == E->getTypeSourceInfo() &&
9885       !ExprChanged)
9886     return E;
9887 
9888   // Build a new offsetof expression.
9889   return getDerived().RebuildOffsetOfExpr(E->getOperatorLoc(), Type,
9890                                           Components, E->getRParenLoc());
9891 }
9892 
9893 template<typename Derived>
9894 ExprResult
9895 TreeTransform<Derived>::TransformOpaqueValueExpr(OpaqueValueExpr *E) {
9896   assert((!E->getSourceExpr() || getDerived().AlreadyTransformed(E->getType())) &&
9897          "opaque value expression requires transformation");
9898   return E;
9899 }
9900 
9901 template<typename Derived>
9902 ExprResult
9903 TreeTransform<Derived>::TransformTypoExpr(TypoExpr *E) {
9904   return E;
9905 }
9906 
9907 template <typename Derived>
9908 ExprResult TreeTransform<Derived>::TransformRecoveryExpr(RecoveryExpr *E) {
9909   llvm::SmallVector<Expr *, 8> Children;
9910   bool Changed = false;
9911   for (Expr *C : E->subExpressions()) {
9912     ExprResult NewC = getDerived().TransformExpr(C);
9913     if (NewC.isInvalid())
9914       return ExprError();
9915     Children.push_back(NewC.get());
9916 
9917     Changed |= NewC.get() != C;
9918   }
9919   if (!getDerived().AlwaysRebuild() && !Changed)
9920     return E;
9921   return getDerived().RebuildRecoveryExpr(E->getBeginLoc(), E->getEndLoc(),
9922                                           Children);
9923 }
9924 
9925 template<typename Derived>
9926 ExprResult
9927 TreeTransform<Derived>::TransformPseudoObjectExpr(PseudoObjectExpr *E) {
9928   // Rebuild the syntactic form.  The original syntactic form has
9929   // opaque-value expressions in it, so strip those away and rebuild
9930   // the result.  This is a really awful way of doing this, but the
9931   // better solution (rebuilding the semantic expressions and
9932   // rebinding OVEs as necessary) doesn't work; we'd need
9933   // TreeTransform to not strip away implicit conversions.
9934   Expr *newSyntacticForm = SemaRef.recreateSyntacticForm(E);
9935   ExprResult result = getDerived().TransformExpr(newSyntacticForm);
9936   if (result.isInvalid()) return ExprError();
9937 
9938   // If that gives us a pseudo-object result back, the pseudo-object
9939   // expression must have been an lvalue-to-rvalue conversion which we
9940   // should reapply.
9941   if (result.get()->hasPlaceholderType(BuiltinType::PseudoObject))
9942     result = SemaRef.checkPseudoObjectRValue(result.get());
9943 
9944   return result;
9945 }
9946 
9947 template<typename Derived>
9948 ExprResult
9949 TreeTransform<Derived>::TransformUnaryExprOrTypeTraitExpr(
9950                                                 UnaryExprOrTypeTraitExpr *E) {
9951   if (E->isArgumentType()) {
9952     TypeSourceInfo *OldT = E->getArgumentTypeInfo();
9953 
9954     TypeSourceInfo *NewT = getDerived().TransformType(OldT);
9955     if (!NewT)
9956       return ExprError();
9957 
9958     if (!getDerived().AlwaysRebuild() && OldT == NewT)
9959       return E;
9960 
9961     return getDerived().RebuildUnaryExprOrTypeTrait(NewT, E->getOperatorLoc(),
9962                                                     E->getKind(),
9963                                                     E->getSourceRange());
9964   }
9965 
9966   // C++0x [expr.sizeof]p1:
9967   //   The operand is either an expression, which is an unevaluated operand
9968   //   [...]
9969   EnterExpressionEvaluationContext Unevaluated(
9970       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated,
9971       Sema::ReuseLambdaContextDecl);
9972 
9973   // Try to recover if we have something like sizeof(T::X) where X is a type.
9974   // Notably, there must be *exactly* one set of parens if X is a type.
9975   TypeSourceInfo *RecoveryTSI = nullptr;
9976   ExprResult SubExpr;
9977   auto *PE = dyn_cast<ParenExpr>(E->getArgumentExpr());
9978   if (auto *DRE =
9979           PE ? dyn_cast<DependentScopeDeclRefExpr>(PE->getSubExpr()) : nullptr)
9980     SubExpr = getDerived().TransformParenDependentScopeDeclRefExpr(
9981         PE, DRE, false, &RecoveryTSI);
9982   else
9983     SubExpr = getDerived().TransformExpr(E->getArgumentExpr());
9984 
9985   if (RecoveryTSI) {
9986     return getDerived().RebuildUnaryExprOrTypeTrait(
9987         RecoveryTSI, E->getOperatorLoc(), E->getKind(), E->getSourceRange());
9988   } else if (SubExpr.isInvalid())
9989     return ExprError();
9990 
9991   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getArgumentExpr())
9992     return E;
9993 
9994   return getDerived().RebuildUnaryExprOrTypeTrait(SubExpr.get(),
9995                                                   E->getOperatorLoc(),
9996                                                   E->getKind(),
9997                                                   E->getSourceRange());
9998 }
9999 
10000 template<typename Derived>
10001 ExprResult
10002 TreeTransform<Derived>::TransformArraySubscriptExpr(ArraySubscriptExpr *E) {
10003   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
10004   if (LHS.isInvalid())
10005     return ExprError();
10006 
10007   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
10008   if (RHS.isInvalid())
10009     return ExprError();
10010 
10011 
10012   if (!getDerived().AlwaysRebuild() &&
10013       LHS.get() == E->getLHS() &&
10014       RHS.get() == E->getRHS())
10015     return E;
10016 
10017   return getDerived().RebuildArraySubscriptExpr(
10018       LHS.get(),
10019       /*FIXME:*/ E->getLHS()->getBeginLoc(), RHS.get(), E->getRBracketLoc());
10020 }
10021 
10022 template <typename Derived>
10023 ExprResult
10024 TreeTransform<Derived>::TransformOMPArraySectionExpr(OMPArraySectionExpr *E) {
10025   ExprResult Base = getDerived().TransformExpr(E->getBase());
10026   if (Base.isInvalid())
10027     return ExprError();
10028 
10029   ExprResult LowerBound;
10030   if (E->getLowerBound()) {
10031     LowerBound = getDerived().TransformExpr(E->getLowerBound());
10032     if (LowerBound.isInvalid())
10033       return ExprError();
10034   }
10035 
10036   ExprResult Length;
10037   if (E->getLength()) {
10038     Length = getDerived().TransformExpr(E->getLength());
10039     if (Length.isInvalid())
10040       return ExprError();
10041   }
10042 
10043   if (!getDerived().AlwaysRebuild() && Base.get() == E->getBase() &&
10044       LowerBound.get() == E->getLowerBound() && Length.get() == E->getLength())
10045     return E;
10046 
10047   return getDerived().RebuildOMPArraySectionExpr(
10048       Base.get(), E->getBase()->getEndLoc(), LowerBound.get(), E->getColonLoc(),
10049       Length.get(), E->getRBracketLoc());
10050 }
10051 
10052 template <typename Derived>
10053 ExprResult
10054 TreeTransform<Derived>::TransformOMPArrayShapingExpr(OMPArrayShapingExpr *E) {
10055   ExprResult Base = getDerived().TransformExpr(E->getBase());
10056   if (Base.isInvalid())
10057     return ExprError();
10058 
10059   SmallVector<Expr *, 4> Dims;
10060   bool ErrorFound = false;
10061   for (Expr *Dim : E->getDimensions()) {
10062     ExprResult DimRes = getDerived().TransformExpr(Dim);
10063     if (DimRes.isInvalid()) {
10064       ErrorFound = true;
10065       continue;
10066     }
10067     Dims.push_back(DimRes.get());
10068   }
10069 
10070   if (ErrorFound)
10071     return ExprError();
10072   return getDerived().RebuildOMPArrayShapingExpr(Base.get(), E->getLParenLoc(),
10073                                                  E->getRParenLoc(), Dims,
10074                                                  E->getBracketsRanges());
10075 }
10076 
10077 template <typename Derived>
10078 ExprResult
10079 TreeTransform<Derived>::TransformOMPIteratorExpr(OMPIteratorExpr *E) {
10080   unsigned NumIterators = E->numOfIterators();
10081   SmallVector<Sema::OMPIteratorData, 4> Data(NumIterators);
10082 
10083   bool ErrorFound = false;
10084   bool NeedToRebuild = getDerived().AlwaysRebuild();
10085   for (unsigned I = 0; I < NumIterators; ++I) {
10086     auto *D = cast<VarDecl>(E->getIteratorDecl(I));
10087     Data[I].DeclIdent = D->getIdentifier();
10088     Data[I].DeclIdentLoc = D->getLocation();
10089     if (D->getLocation() == D->getBeginLoc()) {
10090       assert(SemaRef.Context.hasSameType(D->getType(), SemaRef.Context.IntTy) &&
10091              "Implicit type must be int.");
10092     } else {
10093       TypeSourceInfo *TSI = getDerived().TransformType(D->getTypeSourceInfo());
10094       QualType DeclTy = getDerived().TransformType(D->getType());
10095       Data[I].Type = SemaRef.CreateParsedType(DeclTy, TSI);
10096     }
10097     OMPIteratorExpr::IteratorRange Range = E->getIteratorRange(I);
10098     ExprResult Begin = getDerived().TransformExpr(Range.Begin);
10099     ExprResult End = getDerived().TransformExpr(Range.End);
10100     ExprResult Step = getDerived().TransformExpr(Range.Step);
10101     ErrorFound = ErrorFound ||
10102                  !(!D->getTypeSourceInfo() || (Data[I].Type.getAsOpaquePtr() &&
10103                                                !Data[I].Type.get().isNull())) ||
10104                  Begin.isInvalid() || End.isInvalid() || Step.isInvalid();
10105     if (ErrorFound)
10106       continue;
10107     Data[I].Range.Begin = Begin.get();
10108     Data[I].Range.End = End.get();
10109     Data[I].Range.Step = Step.get();
10110     Data[I].AssignLoc = E->getAssignLoc(I);
10111     Data[I].ColonLoc = E->getColonLoc(I);
10112     Data[I].SecColonLoc = E->getSecondColonLoc(I);
10113     NeedToRebuild =
10114         NeedToRebuild ||
10115         (D->getTypeSourceInfo() && Data[I].Type.get().getTypePtrOrNull() !=
10116                                        D->getType().getTypePtrOrNull()) ||
10117         Range.Begin != Data[I].Range.Begin || Range.End != Data[I].Range.End ||
10118         Range.Step != Data[I].Range.Step;
10119   }
10120   if (ErrorFound)
10121     return ExprError();
10122   if (!NeedToRebuild)
10123     return E;
10124 
10125   ExprResult Res = getDerived().RebuildOMPIteratorExpr(
10126       E->getIteratorKwLoc(), E->getLParenLoc(), E->getRParenLoc(), Data);
10127   if (!Res.isUsable())
10128     return Res;
10129   auto *IE = cast<OMPIteratorExpr>(Res.get());
10130   for (unsigned I = 0; I < NumIterators; ++I)
10131     getDerived().transformedLocalDecl(E->getIteratorDecl(I),
10132                                       IE->getIteratorDecl(I));
10133   return Res;
10134 }
10135 
10136 template<typename Derived>
10137 ExprResult
10138 TreeTransform<Derived>::TransformCallExpr(CallExpr *E) {
10139   // Transform the callee.
10140   ExprResult Callee = getDerived().TransformExpr(E->getCallee());
10141   if (Callee.isInvalid())
10142     return ExprError();
10143 
10144   // Transform arguments.
10145   bool ArgChanged = false;
10146   SmallVector<Expr*, 8> Args;
10147   if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
10148                                   &ArgChanged))
10149     return ExprError();
10150 
10151   if (!getDerived().AlwaysRebuild() &&
10152       Callee.get() == E->getCallee() &&
10153       !ArgChanged)
10154     return SemaRef.MaybeBindToTemporary(E);
10155 
10156   // FIXME: Wrong source location information for the '('.
10157   SourceLocation FakeLParenLoc
10158     = ((Expr *)Callee.get())->getSourceRange().getBegin();
10159   return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc,
10160                                       Args,
10161                                       E->getRParenLoc());
10162 }
10163 
10164 template<typename Derived>
10165 ExprResult
10166 TreeTransform<Derived>::TransformMemberExpr(MemberExpr *E) {
10167   ExprResult Base = getDerived().TransformExpr(E->getBase());
10168   if (Base.isInvalid())
10169     return ExprError();
10170 
10171   NestedNameSpecifierLoc QualifierLoc;
10172   if (E->hasQualifier()) {
10173     QualifierLoc
10174       = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
10175 
10176     if (!QualifierLoc)
10177       return ExprError();
10178   }
10179   SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc();
10180 
10181   ValueDecl *Member
10182     = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getMemberLoc(),
10183                                                          E->getMemberDecl()));
10184   if (!Member)
10185     return ExprError();
10186 
10187   NamedDecl *FoundDecl = E->getFoundDecl();
10188   if (FoundDecl == E->getMemberDecl()) {
10189     FoundDecl = Member;
10190   } else {
10191     FoundDecl = cast_or_null<NamedDecl>(
10192                    getDerived().TransformDecl(E->getMemberLoc(), FoundDecl));
10193     if (!FoundDecl)
10194       return ExprError();
10195   }
10196 
10197   if (!getDerived().AlwaysRebuild() &&
10198       Base.get() == E->getBase() &&
10199       QualifierLoc == E->getQualifierLoc() &&
10200       Member == E->getMemberDecl() &&
10201       FoundDecl == E->getFoundDecl() &&
10202       !E->hasExplicitTemplateArgs()) {
10203 
10204     // Mark it referenced in the new context regardless.
10205     // FIXME: this is a bit instantiation-specific.
10206     SemaRef.MarkMemberReferenced(E);
10207 
10208     return E;
10209   }
10210 
10211   TemplateArgumentListInfo TransArgs;
10212   if (E->hasExplicitTemplateArgs()) {
10213     TransArgs.setLAngleLoc(E->getLAngleLoc());
10214     TransArgs.setRAngleLoc(E->getRAngleLoc());
10215     if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
10216                                                 E->getNumTemplateArgs(),
10217                                                 TransArgs))
10218       return ExprError();
10219   }
10220 
10221   // FIXME: Bogus source location for the operator
10222   SourceLocation FakeOperatorLoc =
10223       SemaRef.getLocForEndOfToken(E->getBase()->getSourceRange().getEnd());
10224 
10225   // FIXME: to do this check properly, we will need to preserve the
10226   // first-qualifier-in-scope here, just in case we had a dependent
10227   // base (and therefore couldn't do the check) and a
10228   // nested-name-qualifier (and therefore could do the lookup).
10229   NamedDecl *FirstQualifierInScope = nullptr;
10230   DeclarationNameInfo MemberNameInfo = E->getMemberNameInfo();
10231   if (MemberNameInfo.getName()) {
10232     MemberNameInfo = getDerived().TransformDeclarationNameInfo(MemberNameInfo);
10233     if (!MemberNameInfo.getName())
10234       return ExprError();
10235   }
10236 
10237   return getDerived().RebuildMemberExpr(Base.get(), FakeOperatorLoc,
10238                                         E->isArrow(),
10239                                         QualifierLoc,
10240                                         TemplateKWLoc,
10241                                         MemberNameInfo,
10242                                         Member,
10243                                         FoundDecl,
10244                                         (E->hasExplicitTemplateArgs()
10245                                            ? &TransArgs : nullptr),
10246                                         FirstQualifierInScope);
10247 }
10248 
10249 template<typename Derived>
10250 ExprResult
10251 TreeTransform<Derived>::TransformBinaryOperator(BinaryOperator *E) {
10252   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
10253   if (LHS.isInvalid())
10254     return ExprError();
10255 
10256   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
10257   if (RHS.isInvalid())
10258     return ExprError();
10259 
10260   if (!getDerived().AlwaysRebuild() &&
10261       LHS.get() == E->getLHS() &&
10262       RHS.get() == E->getRHS())
10263     return E;
10264 
10265   Sema::FPFeaturesStateRAII FPFeaturesState(getSema());
10266   getSema().FPFeatures = E->getFPFeatures();
10267 
10268   return getDerived().RebuildBinaryOperator(E->getOperatorLoc(), E->getOpcode(),
10269                                             LHS.get(), RHS.get());
10270 }
10271 
10272 template <typename Derived>
10273 ExprResult TreeTransform<Derived>::TransformCXXRewrittenBinaryOperator(
10274     CXXRewrittenBinaryOperator *E) {
10275   CXXRewrittenBinaryOperator::DecomposedForm Decomp = E->getDecomposedForm();
10276 
10277   ExprResult LHS = getDerived().TransformExpr(const_cast<Expr*>(Decomp.LHS));
10278   if (LHS.isInvalid())
10279     return ExprError();
10280 
10281   ExprResult RHS = getDerived().TransformExpr(const_cast<Expr*>(Decomp.RHS));
10282   if (RHS.isInvalid())
10283     return ExprError();
10284 
10285   if (!getDerived().AlwaysRebuild() &&
10286       LHS.get() == Decomp.LHS &&
10287       RHS.get() == Decomp.RHS)
10288     return E;
10289 
10290   // Extract the already-resolved callee declarations so that we can restrict
10291   // ourselves to using them as the unqualified lookup results when rebuilding.
10292   UnresolvedSet<2> UnqualLookups;
10293   Expr *PossibleBinOps[] = {E->getSemanticForm(),
10294                             const_cast<Expr *>(Decomp.InnerBinOp)};
10295   for (Expr *PossibleBinOp : PossibleBinOps) {
10296     auto *Op = dyn_cast<CXXOperatorCallExpr>(PossibleBinOp->IgnoreImplicit());
10297     if (!Op)
10298       continue;
10299     auto *Callee = dyn_cast<DeclRefExpr>(Op->getCallee()->IgnoreImplicit());
10300     if (!Callee || isa<CXXMethodDecl>(Callee->getDecl()))
10301       continue;
10302 
10303     // Transform the callee in case we built a call to a local extern
10304     // declaration.
10305     NamedDecl *Found = cast_or_null<NamedDecl>(getDerived().TransformDecl(
10306         E->getOperatorLoc(), Callee->getFoundDecl()));
10307     if (!Found)
10308       return ExprError();
10309     UnqualLookups.addDecl(Found);
10310   }
10311 
10312   return getDerived().RebuildCXXRewrittenBinaryOperator(
10313       E->getOperatorLoc(), Decomp.Opcode, UnqualLookups, LHS.get(), RHS.get());
10314 }
10315 
10316 template<typename Derived>
10317 ExprResult
10318 TreeTransform<Derived>::TransformCompoundAssignOperator(
10319                                                       CompoundAssignOperator *E) {
10320   return getDerived().TransformBinaryOperator(E);
10321 }
10322 
10323 template<typename Derived>
10324 ExprResult TreeTransform<Derived>::
10325 TransformBinaryConditionalOperator(BinaryConditionalOperator *e) {
10326   // Just rebuild the common and RHS expressions and see whether we
10327   // get any changes.
10328 
10329   ExprResult commonExpr = getDerived().TransformExpr(e->getCommon());
10330   if (commonExpr.isInvalid())
10331     return ExprError();
10332 
10333   ExprResult rhs = getDerived().TransformExpr(e->getFalseExpr());
10334   if (rhs.isInvalid())
10335     return ExprError();
10336 
10337   if (!getDerived().AlwaysRebuild() &&
10338       commonExpr.get() == e->getCommon() &&
10339       rhs.get() == e->getFalseExpr())
10340     return e;
10341 
10342   return getDerived().RebuildConditionalOperator(commonExpr.get(),
10343                                                  e->getQuestionLoc(),
10344                                                  nullptr,
10345                                                  e->getColonLoc(),
10346                                                  rhs.get());
10347 }
10348 
10349 template<typename Derived>
10350 ExprResult
10351 TreeTransform<Derived>::TransformConditionalOperator(ConditionalOperator *E) {
10352   ExprResult Cond = getDerived().TransformExpr(E->getCond());
10353   if (Cond.isInvalid())
10354     return ExprError();
10355 
10356   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
10357   if (LHS.isInvalid())
10358     return ExprError();
10359 
10360   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
10361   if (RHS.isInvalid())
10362     return ExprError();
10363 
10364   if (!getDerived().AlwaysRebuild() &&
10365       Cond.get() == E->getCond() &&
10366       LHS.get() == E->getLHS() &&
10367       RHS.get() == E->getRHS())
10368     return E;
10369 
10370   return getDerived().RebuildConditionalOperator(Cond.get(),
10371                                                  E->getQuestionLoc(),
10372                                                  LHS.get(),
10373                                                  E->getColonLoc(),
10374                                                  RHS.get());
10375 }
10376 
10377 template<typename Derived>
10378 ExprResult
10379 TreeTransform<Derived>::TransformImplicitCastExpr(ImplicitCastExpr *E) {
10380   // Implicit casts are eliminated during transformation, since they
10381   // will be recomputed by semantic analysis after transformation.
10382   return getDerived().TransformExpr(E->getSubExprAsWritten());
10383 }
10384 
10385 template<typename Derived>
10386 ExprResult
10387 TreeTransform<Derived>::TransformCStyleCastExpr(CStyleCastExpr *E) {
10388   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten());
10389   if (!Type)
10390     return ExprError();
10391 
10392   ExprResult SubExpr
10393     = getDerived().TransformExpr(E->getSubExprAsWritten());
10394   if (SubExpr.isInvalid())
10395     return ExprError();
10396 
10397   if (!getDerived().AlwaysRebuild() &&
10398       Type == E->getTypeInfoAsWritten() &&
10399       SubExpr.get() == E->getSubExpr())
10400     return E;
10401 
10402   return getDerived().RebuildCStyleCastExpr(E->getLParenLoc(),
10403                                             Type,
10404                                             E->getRParenLoc(),
10405                                             SubExpr.get());
10406 }
10407 
10408 template<typename Derived>
10409 ExprResult
10410 TreeTransform<Derived>::TransformCompoundLiteralExpr(CompoundLiteralExpr *E) {
10411   TypeSourceInfo *OldT = E->getTypeSourceInfo();
10412   TypeSourceInfo *NewT = getDerived().TransformType(OldT);
10413   if (!NewT)
10414     return ExprError();
10415 
10416   ExprResult Init = getDerived().TransformExpr(E->getInitializer());
10417   if (Init.isInvalid())
10418     return ExprError();
10419 
10420   if (!getDerived().AlwaysRebuild() &&
10421       OldT == NewT &&
10422       Init.get() == E->getInitializer())
10423     return SemaRef.MaybeBindToTemporary(E);
10424 
10425   // Note: the expression type doesn't necessarily match the
10426   // type-as-written, but that's okay, because it should always be
10427   // derivable from the initializer.
10428 
10429   return getDerived().RebuildCompoundLiteralExpr(
10430       E->getLParenLoc(), NewT,
10431       /*FIXME:*/ E->getInitializer()->getEndLoc(), Init.get());
10432 }
10433 
10434 template<typename Derived>
10435 ExprResult
10436 TreeTransform<Derived>::TransformExtVectorElementExpr(ExtVectorElementExpr *E) {
10437   ExprResult Base = getDerived().TransformExpr(E->getBase());
10438   if (Base.isInvalid())
10439     return ExprError();
10440 
10441   if (!getDerived().AlwaysRebuild() &&
10442       Base.get() == E->getBase())
10443     return E;
10444 
10445   // FIXME: Bad source location
10446   SourceLocation FakeOperatorLoc =
10447       SemaRef.getLocForEndOfToken(E->getBase()->getEndLoc());
10448   return getDerived().RebuildExtVectorElementExpr(Base.get(), FakeOperatorLoc,
10449                                                   E->getAccessorLoc(),
10450                                                   E->getAccessor());
10451 }
10452 
10453 template<typename Derived>
10454 ExprResult
10455 TreeTransform<Derived>::TransformInitListExpr(InitListExpr *E) {
10456   if (InitListExpr *Syntactic = E->getSyntacticForm())
10457     E = Syntactic;
10458 
10459   bool InitChanged = false;
10460 
10461   EnterExpressionEvaluationContext Context(
10462       getSema(), EnterExpressionEvaluationContext::InitList);
10463 
10464   SmallVector<Expr*, 4> Inits;
10465   if (getDerived().TransformExprs(E->getInits(), E->getNumInits(), false,
10466                                   Inits, &InitChanged))
10467     return ExprError();
10468 
10469   if (!getDerived().AlwaysRebuild() && !InitChanged) {
10470     // FIXME: Attempt to reuse the existing syntactic form of the InitListExpr
10471     // in some cases. We can't reuse it in general, because the syntactic and
10472     // semantic forms are linked, and we can't know that semantic form will
10473     // match even if the syntactic form does.
10474   }
10475 
10476   return getDerived().RebuildInitList(E->getLBraceLoc(), Inits,
10477                                       E->getRBraceLoc());
10478 }
10479 
10480 template<typename Derived>
10481 ExprResult
10482 TreeTransform<Derived>::TransformDesignatedInitExpr(DesignatedInitExpr *E) {
10483   Designation Desig;
10484 
10485   // transform the initializer value
10486   ExprResult Init = getDerived().TransformExpr(E->getInit());
10487   if (Init.isInvalid())
10488     return ExprError();
10489 
10490   // transform the designators.
10491   SmallVector<Expr*, 4> ArrayExprs;
10492   bool ExprChanged = false;
10493   for (const DesignatedInitExpr::Designator &D : E->designators()) {
10494     if (D.isFieldDesignator()) {
10495       Desig.AddDesignator(Designator::getField(D.getFieldName(),
10496                                                D.getDotLoc(),
10497                                                D.getFieldLoc()));
10498       if (D.getField()) {
10499         FieldDecl *Field = cast_or_null<FieldDecl>(
10500             getDerived().TransformDecl(D.getFieldLoc(), D.getField()));
10501         if (Field != D.getField())
10502           // Rebuild the expression when the transformed FieldDecl is
10503           // different to the already assigned FieldDecl.
10504           ExprChanged = true;
10505       } else {
10506         // Ensure that the designator expression is rebuilt when there isn't
10507         // a resolved FieldDecl in the designator as we don't want to assign
10508         // a FieldDecl to a pattern designator that will be instantiated again.
10509         ExprChanged = true;
10510       }
10511       continue;
10512     }
10513 
10514     if (D.isArrayDesignator()) {
10515       ExprResult Index = getDerived().TransformExpr(E->getArrayIndex(D));
10516       if (Index.isInvalid())
10517         return ExprError();
10518 
10519       Desig.AddDesignator(
10520           Designator::getArray(Index.get(), D.getLBracketLoc()));
10521 
10522       ExprChanged = ExprChanged || Init.get() != E->getArrayIndex(D);
10523       ArrayExprs.push_back(Index.get());
10524       continue;
10525     }
10526 
10527     assert(D.isArrayRangeDesignator() && "New kind of designator?");
10528     ExprResult Start
10529       = getDerived().TransformExpr(E->getArrayRangeStart(D));
10530     if (Start.isInvalid())
10531       return ExprError();
10532 
10533     ExprResult End = getDerived().TransformExpr(E->getArrayRangeEnd(D));
10534     if (End.isInvalid())
10535       return ExprError();
10536 
10537     Desig.AddDesignator(Designator::getArrayRange(Start.get(),
10538                                                   End.get(),
10539                                                   D.getLBracketLoc(),
10540                                                   D.getEllipsisLoc()));
10541 
10542     ExprChanged = ExprChanged || Start.get() != E->getArrayRangeStart(D) ||
10543                   End.get() != E->getArrayRangeEnd(D);
10544 
10545     ArrayExprs.push_back(Start.get());
10546     ArrayExprs.push_back(End.get());
10547   }
10548 
10549   if (!getDerived().AlwaysRebuild() &&
10550       Init.get() == E->getInit() &&
10551       !ExprChanged)
10552     return E;
10553 
10554   return getDerived().RebuildDesignatedInitExpr(Desig, ArrayExprs,
10555                                                 E->getEqualOrColonLoc(),
10556                                                 E->usesGNUSyntax(), Init.get());
10557 }
10558 
10559 // Seems that if TransformInitListExpr() only works on the syntactic form of an
10560 // InitListExpr, then a DesignatedInitUpdateExpr is not encountered.
10561 template<typename Derived>
10562 ExprResult
10563 TreeTransform<Derived>::TransformDesignatedInitUpdateExpr(
10564     DesignatedInitUpdateExpr *E) {
10565   llvm_unreachable("Unexpected DesignatedInitUpdateExpr in syntactic form of "
10566                    "initializer");
10567   return ExprError();
10568 }
10569 
10570 template<typename Derived>
10571 ExprResult
10572 TreeTransform<Derived>::TransformNoInitExpr(
10573     NoInitExpr *E) {
10574   llvm_unreachable("Unexpected NoInitExpr in syntactic form of initializer");
10575   return ExprError();
10576 }
10577 
10578 template<typename Derived>
10579 ExprResult
10580 TreeTransform<Derived>::TransformArrayInitLoopExpr(ArrayInitLoopExpr *E) {
10581   llvm_unreachable("Unexpected ArrayInitLoopExpr outside of initializer");
10582   return ExprError();
10583 }
10584 
10585 template<typename Derived>
10586 ExprResult
10587 TreeTransform<Derived>::TransformArrayInitIndexExpr(ArrayInitIndexExpr *E) {
10588   llvm_unreachable("Unexpected ArrayInitIndexExpr outside of initializer");
10589   return ExprError();
10590 }
10591 
10592 template<typename Derived>
10593 ExprResult
10594 TreeTransform<Derived>::TransformImplicitValueInitExpr(
10595                                                      ImplicitValueInitExpr *E) {
10596   TemporaryBase Rebase(*this, E->getBeginLoc(), DeclarationName());
10597 
10598   // FIXME: Will we ever have proper type location here? Will we actually
10599   // need to transform the type?
10600   QualType T = getDerived().TransformType(E->getType());
10601   if (T.isNull())
10602     return ExprError();
10603 
10604   if (!getDerived().AlwaysRebuild() &&
10605       T == E->getType())
10606     return E;
10607 
10608   return getDerived().RebuildImplicitValueInitExpr(T);
10609 }
10610 
10611 template<typename Derived>
10612 ExprResult
10613 TreeTransform<Derived>::TransformVAArgExpr(VAArgExpr *E) {
10614   TypeSourceInfo *TInfo = getDerived().TransformType(E->getWrittenTypeInfo());
10615   if (!TInfo)
10616     return ExprError();
10617 
10618   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
10619   if (SubExpr.isInvalid())
10620     return ExprError();
10621 
10622   if (!getDerived().AlwaysRebuild() &&
10623       TInfo == E->getWrittenTypeInfo() &&
10624       SubExpr.get() == E->getSubExpr())
10625     return E;
10626 
10627   return getDerived().RebuildVAArgExpr(E->getBuiltinLoc(), SubExpr.get(),
10628                                        TInfo, E->getRParenLoc());
10629 }
10630 
10631 template<typename Derived>
10632 ExprResult
10633 TreeTransform<Derived>::TransformParenListExpr(ParenListExpr *E) {
10634   bool ArgumentChanged = false;
10635   SmallVector<Expr*, 4> Inits;
10636   if (TransformExprs(E->getExprs(), E->getNumExprs(), true, Inits,
10637                      &ArgumentChanged))
10638     return ExprError();
10639 
10640   return getDerived().RebuildParenListExpr(E->getLParenLoc(),
10641                                            Inits,
10642                                            E->getRParenLoc());
10643 }
10644 
10645 /// Transform an address-of-label expression.
10646 ///
10647 /// By default, the transformation of an address-of-label expression always
10648 /// rebuilds the expression, so that the label identifier can be resolved to
10649 /// the corresponding label statement by semantic analysis.
10650 template<typename Derived>
10651 ExprResult
10652 TreeTransform<Derived>::TransformAddrLabelExpr(AddrLabelExpr *E) {
10653   Decl *LD = getDerived().TransformDecl(E->getLabel()->getLocation(),
10654                                         E->getLabel());
10655   if (!LD)
10656     return ExprError();
10657 
10658   return getDerived().RebuildAddrLabelExpr(E->getAmpAmpLoc(), E->getLabelLoc(),
10659                                            cast<LabelDecl>(LD));
10660 }
10661 
10662 template<typename Derived>
10663 ExprResult
10664 TreeTransform<Derived>::TransformStmtExpr(StmtExpr *E) {
10665   SemaRef.ActOnStartStmtExpr();
10666   StmtResult SubStmt
10667     = getDerived().TransformCompoundStmt(E->getSubStmt(), true);
10668   if (SubStmt.isInvalid()) {
10669     SemaRef.ActOnStmtExprError();
10670     return ExprError();
10671   }
10672 
10673   unsigned OldDepth = E->getTemplateDepth();
10674   unsigned NewDepth = getDerived().TransformTemplateDepth(OldDepth);
10675 
10676   if (!getDerived().AlwaysRebuild() && OldDepth == NewDepth &&
10677       SubStmt.get() == E->getSubStmt()) {
10678     // Calling this an 'error' is unintuitive, but it does the right thing.
10679     SemaRef.ActOnStmtExprError();
10680     return SemaRef.MaybeBindToTemporary(E);
10681   }
10682 
10683   return getDerived().RebuildStmtExpr(E->getLParenLoc(), SubStmt.get(),
10684                                       E->getRParenLoc(), NewDepth);
10685 }
10686 
10687 template<typename Derived>
10688 ExprResult
10689 TreeTransform<Derived>::TransformChooseExpr(ChooseExpr *E) {
10690   ExprResult Cond = getDerived().TransformExpr(E->getCond());
10691   if (Cond.isInvalid())
10692     return ExprError();
10693 
10694   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
10695   if (LHS.isInvalid())
10696     return ExprError();
10697 
10698   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
10699   if (RHS.isInvalid())
10700     return ExprError();
10701 
10702   if (!getDerived().AlwaysRebuild() &&
10703       Cond.get() == E->getCond() &&
10704       LHS.get() == E->getLHS() &&
10705       RHS.get() == E->getRHS())
10706     return E;
10707 
10708   return getDerived().RebuildChooseExpr(E->getBuiltinLoc(),
10709                                         Cond.get(), LHS.get(), RHS.get(),
10710                                         E->getRParenLoc());
10711 }
10712 
10713 template<typename Derived>
10714 ExprResult
10715 TreeTransform<Derived>::TransformGNUNullExpr(GNUNullExpr *E) {
10716   return E;
10717 }
10718 
10719 template<typename Derived>
10720 ExprResult
10721 TreeTransform<Derived>::TransformCXXOperatorCallExpr(CXXOperatorCallExpr *E) {
10722   switch (E->getOperator()) {
10723   case OO_New:
10724   case OO_Delete:
10725   case OO_Array_New:
10726   case OO_Array_Delete:
10727     llvm_unreachable("new and delete operators cannot use CXXOperatorCallExpr");
10728 
10729   case OO_Call: {
10730     // This is a call to an object's operator().
10731     assert(E->getNumArgs() >= 1 && "Object call is missing arguments");
10732 
10733     // Transform the object itself.
10734     ExprResult Object = getDerived().TransformExpr(E->getArg(0));
10735     if (Object.isInvalid())
10736       return ExprError();
10737 
10738     // FIXME: Poor location information
10739     SourceLocation FakeLParenLoc = SemaRef.getLocForEndOfToken(
10740         static_cast<Expr *>(Object.get())->getEndLoc());
10741 
10742     // Transform the call arguments.
10743     SmallVector<Expr*, 8> Args;
10744     if (getDerived().TransformExprs(E->getArgs() + 1, E->getNumArgs() - 1, true,
10745                                     Args))
10746       return ExprError();
10747 
10748     return getDerived().RebuildCallExpr(Object.get(), FakeLParenLoc, Args,
10749                                         E->getEndLoc());
10750   }
10751 
10752 #define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly) \
10753   case OO_##Name:
10754 #define OVERLOADED_OPERATOR_MULTI(Name,Spelling,Unary,Binary,MemberOnly)
10755 #include "clang/Basic/OperatorKinds.def"
10756   case OO_Subscript:
10757     // Handled below.
10758     break;
10759 
10760   case OO_Conditional:
10761     llvm_unreachable("conditional operator is not actually overloadable");
10762 
10763   case OO_None:
10764   case NUM_OVERLOADED_OPERATORS:
10765     llvm_unreachable("not an overloaded operator?");
10766   }
10767 
10768   ExprResult Callee = getDerived().TransformExpr(E->getCallee());
10769   if (Callee.isInvalid())
10770     return ExprError();
10771 
10772   ExprResult First;
10773   if (E->getOperator() == OO_Amp)
10774     First = getDerived().TransformAddressOfOperand(E->getArg(0));
10775   else
10776     First = getDerived().TransformExpr(E->getArg(0));
10777   if (First.isInvalid())
10778     return ExprError();
10779 
10780   ExprResult Second;
10781   if (E->getNumArgs() == 2) {
10782     Second = getDerived().TransformExpr(E->getArg(1));
10783     if (Second.isInvalid())
10784       return ExprError();
10785   }
10786 
10787   if (!getDerived().AlwaysRebuild() &&
10788       Callee.get() == E->getCallee() &&
10789       First.get() == E->getArg(0) &&
10790       (E->getNumArgs() != 2 || Second.get() == E->getArg(1)))
10791     return SemaRef.MaybeBindToTemporary(E);
10792 
10793   Sema::FPFeaturesStateRAII FPFeaturesState(getSema());
10794   getSema().FPFeatures = E->getFPFeatures();
10795 
10796   return getDerived().RebuildCXXOperatorCallExpr(E->getOperator(),
10797                                                  E->getOperatorLoc(),
10798                                                  Callee.get(),
10799                                                  First.get(),
10800                                                  Second.get());
10801 }
10802 
10803 template<typename Derived>
10804 ExprResult
10805 TreeTransform<Derived>::TransformCXXMemberCallExpr(CXXMemberCallExpr *E) {
10806   return getDerived().TransformCallExpr(E);
10807 }
10808 
10809 template <typename Derived>
10810 ExprResult TreeTransform<Derived>::TransformSourceLocExpr(SourceLocExpr *E) {
10811   bool NeedRebuildFunc = E->getIdentKind() == SourceLocExpr::Function &&
10812                          getSema().CurContext != E->getParentContext();
10813 
10814   if (!getDerived().AlwaysRebuild() && !NeedRebuildFunc)
10815     return E;
10816 
10817   return getDerived().RebuildSourceLocExpr(E->getIdentKind(), E->getBeginLoc(),
10818                                            E->getEndLoc(),
10819                                            getSema().CurContext);
10820 }
10821 
10822 template<typename Derived>
10823 ExprResult
10824 TreeTransform<Derived>::TransformCUDAKernelCallExpr(CUDAKernelCallExpr *E) {
10825   // Transform the callee.
10826   ExprResult Callee = getDerived().TransformExpr(E->getCallee());
10827   if (Callee.isInvalid())
10828     return ExprError();
10829 
10830   // Transform exec config.
10831   ExprResult EC = getDerived().TransformCallExpr(E->getConfig());
10832   if (EC.isInvalid())
10833     return ExprError();
10834 
10835   // Transform arguments.
10836   bool ArgChanged = false;
10837   SmallVector<Expr*, 8> Args;
10838   if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
10839                                   &ArgChanged))
10840     return ExprError();
10841 
10842   if (!getDerived().AlwaysRebuild() &&
10843       Callee.get() == E->getCallee() &&
10844       !ArgChanged)
10845     return SemaRef.MaybeBindToTemporary(E);
10846 
10847   // FIXME: Wrong source location information for the '('.
10848   SourceLocation FakeLParenLoc
10849     = ((Expr *)Callee.get())->getSourceRange().getBegin();
10850   return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc,
10851                                       Args,
10852                                       E->getRParenLoc(), EC.get());
10853 }
10854 
10855 template<typename Derived>
10856 ExprResult
10857 TreeTransform<Derived>::TransformCXXNamedCastExpr(CXXNamedCastExpr *E) {
10858   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten());
10859   if (!Type)
10860     return ExprError();
10861 
10862   ExprResult SubExpr
10863     = getDerived().TransformExpr(E->getSubExprAsWritten());
10864   if (SubExpr.isInvalid())
10865     return ExprError();
10866 
10867   if (!getDerived().AlwaysRebuild() &&
10868       Type == E->getTypeInfoAsWritten() &&
10869       SubExpr.get() == E->getSubExpr())
10870     return E;
10871   return getDerived().RebuildCXXNamedCastExpr(
10872       E->getOperatorLoc(), E->getStmtClass(), E->getAngleBrackets().getBegin(),
10873       Type, E->getAngleBrackets().getEnd(),
10874       // FIXME. this should be '(' location
10875       E->getAngleBrackets().getEnd(), SubExpr.get(), E->getRParenLoc());
10876 }
10877 
10878 template<typename Derived>
10879 ExprResult
10880 TreeTransform<Derived>::TransformBuiltinBitCastExpr(BuiltinBitCastExpr *BCE) {
10881   TypeSourceInfo *TSI =
10882       getDerived().TransformType(BCE->getTypeInfoAsWritten());
10883   if (!TSI)
10884     return ExprError();
10885 
10886   ExprResult Sub = getDerived().TransformExpr(BCE->getSubExpr());
10887   if (Sub.isInvalid())
10888     return ExprError();
10889 
10890   return getDerived().RebuildBuiltinBitCastExpr(BCE->getBeginLoc(), TSI,
10891                                                 Sub.get(), BCE->getEndLoc());
10892 }
10893 
10894 template<typename Derived>
10895 ExprResult
10896 TreeTransform<Derived>::TransformCXXStaticCastExpr(CXXStaticCastExpr *E) {
10897   return getDerived().TransformCXXNamedCastExpr(E);
10898 }
10899 
10900 template<typename Derived>
10901 ExprResult
10902 TreeTransform<Derived>::TransformCXXDynamicCastExpr(CXXDynamicCastExpr *E) {
10903   return getDerived().TransformCXXNamedCastExpr(E);
10904 }
10905 
10906 template<typename Derived>
10907 ExprResult
10908 TreeTransform<Derived>::TransformCXXReinterpretCastExpr(
10909                                                       CXXReinterpretCastExpr *E) {
10910   return getDerived().TransformCXXNamedCastExpr(E);
10911 }
10912 
10913 template<typename Derived>
10914 ExprResult
10915 TreeTransform<Derived>::TransformCXXConstCastExpr(CXXConstCastExpr *E) {
10916   return getDerived().TransformCXXNamedCastExpr(E);
10917 }
10918 
10919 template<typename Derived>
10920 ExprResult
10921 TreeTransform<Derived>::TransformCXXFunctionalCastExpr(
10922                                                      CXXFunctionalCastExpr *E) {
10923   TypeSourceInfo *Type =
10924       getDerived().TransformTypeWithDeducedTST(E->getTypeInfoAsWritten());
10925   if (!Type)
10926     return ExprError();
10927 
10928   ExprResult SubExpr
10929     = getDerived().TransformExpr(E->getSubExprAsWritten());
10930   if (SubExpr.isInvalid())
10931     return ExprError();
10932 
10933   if (!getDerived().AlwaysRebuild() &&
10934       Type == E->getTypeInfoAsWritten() &&
10935       SubExpr.get() == E->getSubExpr())
10936     return E;
10937 
10938   return getDerived().RebuildCXXFunctionalCastExpr(Type,
10939                                                    E->getLParenLoc(),
10940                                                    SubExpr.get(),
10941                                                    E->getRParenLoc(),
10942                                                    E->isListInitialization());
10943 }
10944 
10945 template<typename Derived>
10946 ExprResult
10947 TreeTransform<Derived>::TransformCXXTypeidExpr(CXXTypeidExpr *E) {
10948   if (E->isTypeOperand()) {
10949     TypeSourceInfo *TInfo
10950       = getDerived().TransformType(E->getTypeOperandSourceInfo());
10951     if (!TInfo)
10952       return ExprError();
10953 
10954     if (!getDerived().AlwaysRebuild() &&
10955         TInfo == E->getTypeOperandSourceInfo())
10956       return E;
10957 
10958     return getDerived().RebuildCXXTypeidExpr(E->getType(), E->getBeginLoc(),
10959                                              TInfo, E->getEndLoc());
10960   }
10961 
10962   // We don't know whether the subexpression is potentially evaluated until
10963   // after we perform semantic analysis.  We speculatively assume it is
10964   // unevaluated; it will get fixed later if the subexpression is in fact
10965   // potentially evaluated.
10966   EnterExpressionEvaluationContext Unevaluated(
10967       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated,
10968       Sema::ReuseLambdaContextDecl);
10969 
10970   ExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand());
10971   if (SubExpr.isInvalid())
10972     return ExprError();
10973 
10974   if (!getDerived().AlwaysRebuild() &&
10975       SubExpr.get() == E->getExprOperand())
10976     return E;
10977 
10978   return getDerived().RebuildCXXTypeidExpr(E->getType(), E->getBeginLoc(),
10979                                            SubExpr.get(), E->getEndLoc());
10980 }
10981 
10982 template<typename Derived>
10983 ExprResult
10984 TreeTransform<Derived>::TransformCXXUuidofExpr(CXXUuidofExpr *E) {
10985   if (E->isTypeOperand()) {
10986     TypeSourceInfo *TInfo
10987       = getDerived().TransformType(E->getTypeOperandSourceInfo());
10988     if (!TInfo)
10989       return ExprError();
10990 
10991     if (!getDerived().AlwaysRebuild() &&
10992         TInfo == E->getTypeOperandSourceInfo())
10993       return E;
10994 
10995     return getDerived().RebuildCXXUuidofExpr(E->getType(), E->getBeginLoc(),
10996                                              TInfo, E->getEndLoc());
10997   }
10998 
10999   EnterExpressionEvaluationContext Unevaluated(
11000       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
11001 
11002   ExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand());
11003   if (SubExpr.isInvalid())
11004     return ExprError();
11005 
11006   if (!getDerived().AlwaysRebuild() &&
11007       SubExpr.get() == E->getExprOperand())
11008     return E;
11009 
11010   return getDerived().RebuildCXXUuidofExpr(E->getType(), E->getBeginLoc(),
11011                                            SubExpr.get(), E->getEndLoc());
11012 }
11013 
11014 template<typename Derived>
11015 ExprResult
11016 TreeTransform<Derived>::TransformCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) {
11017   return E;
11018 }
11019 
11020 template<typename Derived>
11021 ExprResult
11022 TreeTransform<Derived>::TransformCXXNullPtrLiteralExpr(
11023                                                      CXXNullPtrLiteralExpr *E) {
11024   return E;
11025 }
11026 
11027 template<typename Derived>
11028 ExprResult
11029 TreeTransform<Derived>::TransformCXXThisExpr(CXXThisExpr *E) {
11030   QualType T = getSema().getCurrentThisType();
11031 
11032   if (!getDerived().AlwaysRebuild() && T == E->getType()) {
11033     // Mark it referenced in the new context regardless.
11034     // FIXME: this is a bit instantiation-specific.
11035     getSema().MarkThisReferenced(E);
11036     return E;
11037   }
11038 
11039   return getDerived().RebuildCXXThisExpr(E->getBeginLoc(), T, E->isImplicit());
11040 }
11041 
11042 template<typename Derived>
11043 ExprResult
11044 TreeTransform<Derived>::TransformCXXThrowExpr(CXXThrowExpr *E) {
11045   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
11046   if (SubExpr.isInvalid())
11047     return ExprError();
11048 
11049   if (!getDerived().AlwaysRebuild() &&
11050       SubExpr.get() == E->getSubExpr())
11051     return E;
11052 
11053   return getDerived().RebuildCXXThrowExpr(E->getThrowLoc(), SubExpr.get(),
11054                                           E->isThrownVariableInScope());
11055 }
11056 
11057 template<typename Derived>
11058 ExprResult
11059 TreeTransform<Derived>::TransformCXXDefaultArgExpr(CXXDefaultArgExpr *E) {
11060   ParmVarDecl *Param = cast_or_null<ParmVarDecl>(
11061       getDerived().TransformDecl(E->getBeginLoc(), E->getParam()));
11062   if (!Param)
11063     return ExprError();
11064 
11065   if (!getDerived().AlwaysRebuild() && Param == E->getParam() &&
11066       E->getUsedContext() == SemaRef.CurContext)
11067     return E;
11068 
11069   return getDerived().RebuildCXXDefaultArgExpr(E->getUsedLocation(), Param);
11070 }
11071 
11072 template<typename Derived>
11073 ExprResult
11074 TreeTransform<Derived>::TransformCXXDefaultInitExpr(CXXDefaultInitExpr *E) {
11075   FieldDecl *Field = cast_or_null<FieldDecl>(
11076       getDerived().TransformDecl(E->getBeginLoc(), E->getField()));
11077   if (!Field)
11078     return ExprError();
11079 
11080   if (!getDerived().AlwaysRebuild() && Field == E->getField() &&
11081       E->getUsedContext() == SemaRef.CurContext)
11082     return E;
11083 
11084   return getDerived().RebuildCXXDefaultInitExpr(E->getExprLoc(), Field);
11085 }
11086 
11087 template<typename Derived>
11088 ExprResult
11089 TreeTransform<Derived>::TransformCXXScalarValueInitExpr(
11090                                                     CXXScalarValueInitExpr *E) {
11091   TypeSourceInfo *T = getDerived().TransformType(E->getTypeSourceInfo());
11092   if (!T)
11093     return ExprError();
11094 
11095   if (!getDerived().AlwaysRebuild() &&
11096       T == E->getTypeSourceInfo())
11097     return E;
11098 
11099   return getDerived().RebuildCXXScalarValueInitExpr(T,
11100                                           /*FIXME:*/T->getTypeLoc().getEndLoc(),
11101                                                     E->getRParenLoc());
11102 }
11103 
11104 template<typename Derived>
11105 ExprResult
11106 TreeTransform<Derived>::TransformCXXNewExpr(CXXNewExpr *E) {
11107   // Transform the type that we're allocating
11108   TypeSourceInfo *AllocTypeInfo =
11109       getDerived().TransformTypeWithDeducedTST(E->getAllocatedTypeSourceInfo());
11110   if (!AllocTypeInfo)
11111     return ExprError();
11112 
11113   // Transform the size of the array we're allocating (if any).
11114   Optional<Expr *> ArraySize;
11115   if (Optional<Expr *> OldArraySize = E->getArraySize()) {
11116     ExprResult NewArraySize;
11117     if (*OldArraySize) {
11118       NewArraySize = getDerived().TransformExpr(*OldArraySize);
11119       if (NewArraySize.isInvalid())
11120         return ExprError();
11121     }
11122     ArraySize = NewArraySize.get();
11123   }
11124 
11125   // Transform the placement arguments (if any).
11126   bool ArgumentChanged = false;
11127   SmallVector<Expr*, 8> PlacementArgs;
11128   if (getDerived().TransformExprs(E->getPlacementArgs(),
11129                                   E->getNumPlacementArgs(), true,
11130                                   PlacementArgs, &ArgumentChanged))
11131     return ExprError();
11132 
11133   // Transform the initializer (if any).
11134   Expr *OldInit = E->getInitializer();
11135   ExprResult NewInit;
11136   if (OldInit)
11137     NewInit = getDerived().TransformInitializer(OldInit, true);
11138   if (NewInit.isInvalid())
11139     return ExprError();
11140 
11141   // Transform new operator and delete operator.
11142   FunctionDecl *OperatorNew = nullptr;
11143   if (E->getOperatorNew()) {
11144     OperatorNew = cast_or_null<FunctionDecl>(
11145         getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorNew()));
11146     if (!OperatorNew)
11147       return ExprError();
11148   }
11149 
11150   FunctionDecl *OperatorDelete = nullptr;
11151   if (E->getOperatorDelete()) {
11152     OperatorDelete = cast_or_null<FunctionDecl>(
11153         getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorDelete()));
11154     if (!OperatorDelete)
11155       return ExprError();
11156   }
11157 
11158   if (!getDerived().AlwaysRebuild() &&
11159       AllocTypeInfo == E->getAllocatedTypeSourceInfo() &&
11160       ArraySize == E->getArraySize() &&
11161       NewInit.get() == OldInit &&
11162       OperatorNew == E->getOperatorNew() &&
11163       OperatorDelete == E->getOperatorDelete() &&
11164       !ArgumentChanged) {
11165     // Mark any declarations we need as referenced.
11166     // FIXME: instantiation-specific.
11167     if (OperatorNew)
11168       SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorNew);
11169     if (OperatorDelete)
11170       SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorDelete);
11171 
11172     if (E->isArray() && !E->getAllocatedType()->isDependentType()) {
11173       QualType ElementType
11174         = SemaRef.Context.getBaseElementType(E->getAllocatedType());
11175       if (const RecordType *RecordT = ElementType->getAs<RecordType>()) {
11176         CXXRecordDecl *Record = cast<CXXRecordDecl>(RecordT->getDecl());
11177         if (CXXDestructorDecl *Destructor = SemaRef.LookupDestructor(Record)) {
11178           SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Destructor);
11179         }
11180       }
11181     }
11182 
11183     return E;
11184   }
11185 
11186   QualType AllocType = AllocTypeInfo->getType();
11187   if (!ArraySize) {
11188     // If no array size was specified, but the new expression was
11189     // instantiated with an array type (e.g., "new T" where T is
11190     // instantiated with "int[4]"), extract the outer bound from the
11191     // array type as our array size. We do this with constant and
11192     // dependently-sized array types.
11193     const ArrayType *ArrayT = SemaRef.Context.getAsArrayType(AllocType);
11194     if (!ArrayT) {
11195       // Do nothing
11196     } else if (const ConstantArrayType *ConsArrayT
11197                                      = dyn_cast<ConstantArrayType>(ArrayT)) {
11198       ArraySize = IntegerLiteral::Create(SemaRef.Context, ConsArrayT->getSize(),
11199                                          SemaRef.Context.getSizeType(),
11200                                          /*FIXME:*/ E->getBeginLoc());
11201       AllocType = ConsArrayT->getElementType();
11202     } else if (const DependentSizedArrayType *DepArrayT
11203                               = dyn_cast<DependentSizedArrayType>(ArrayT)) {
11204       if (DepArrayT->getSizeExpr()) {
11205         ArraySize = DepArrayT->getSizeExpr();
11206         AllocType = DepArrayT->getElementType();
11207       }
11208     }
11209   }
11210 
11211   return getDerived().RebuildCXXNewExpr(
11212       E->getBeginLoc(), E->isGlobalNew(),
11213       /*FIXME:*/ E->getBeginLoc(), PlacementArgs,
11214       /*FIXME:*/ E->getBeginLoc(), E->getTypeIdParens(), AllocType,
11215       AllocTypeInfo, ArraySize, E->getDirectInitRange(), NewInit.get());
11216 }
11217 
11218 template<typename Derived>
11219 ExprResult
11220 TreeTransform<Derived>::TransformCXXDeleteExpr(CXXDeleteExpr *E) {
11221   ExprResult Operand = getDerived().TransformExpr(E->getArgument());
11222   if (Operand.isInvalid())
11223     return ExprError();
11224 
11225   // Transform the delete operator, if known.
11226   FunctionDecl *OperatorDelete = nullptr;
11227   if (E->getOperatorDelete()) {
11228     OperatorDelete = cast_or_null<FunctionDecl>(
11229         getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorDelete()));
11230     if (!OperatorDelete)
11231       return ExprError();
11232   }
11233 
11234   if (!getDerived().AlwaysRebuild() &&
11235       Operand.get() == E->getArgument() &&
11236       OperatorDelete == E->getOperatorDelete()) {
11237     // Mark any declarations we need as referenced.
11238     // FIXME: instantiation-specific.
11239     if (OperatorDelete)
11240       SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorDelete);
11241 
11242     if (!E->getArgument()->isTypeDependent()) {
11243       QualType Destroyed = SemaRef.Context.getBaseElementType(
11244                                                          E->getDestroyedType());
11245       if (const RecordType *DestroyedRec = Destroyed->getAs<RecordType>()) {
11246         CXXRecordDecl *Record = cast<CXXRecordDecl>(DestroyedRec->getDecl());
11247         SemaRef.MarkFunctionReferenced(E->getBeginLoc(),
11248                                        SemaRef.LookupDestructor(Record));
11249       }
11250     }
11251 
11252     return E;
11253   }
11254 
11255   return getDerived().RebuildCXXDeleteExpr(
11256       E->getBeginLoc(), E->isGlobalDelete(), E->isArrayForm(), Operand.get());
11257 }
11258 
11259 template<typename Derived>
11260 ExprResult
11261 TreeTransform<Derived>::TransformCXXPseudoDestructorExpr(
11262                                                      CXXPseudoDestructorExpr *E) {
11263   ExprResult Base = getDerived().TransformExpr(E->getBase());
11264   if (Base.isInvalid())
11265     return ExprError();
11266 
11267   ParsedType ObjectTypePtr;
11268   bool MayBePseudoDestructor = false;
11269   Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(),
11270                                               E->getOperatorLoc(),
11271                                         E->isArrow()? tok::arrow : tok::period,
11272                                               ObjectTypePtr,
11273                                               MayBePseudoDestructor);
11274   if (Base.isInvalid())
11275     return ExprError();
11276 
11277   QualType ObjectType = ObjectTypePtr.get();
11278   NestedNameSpecifierLoc QualifierLoc = E->getQualifierLoc();
11279   if (QualifierLoc) {
11280     QualifierLoc
11281       = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc, ObjectType);
11282     if (!QualifierLoc)
11283       return ExprError();
11284   }
11285   CXXScopeSpec SS;
11286   SS.Adopt(QualifierLoc);
11287 
11288   PseudoDestructorTypeStorage Destroyed;
11289   if (E->getDestroyedTypeInfo()) {
11290     TypeSourceInfo *DestroyedTypeInfo
11291       = getDerived().TransformTypeInObjectScope(E->getDestroyedTypeInfo(),
11292                                                 ObjectType, nullptr, SS);
11293     if (!DestroyedTypeInfo)
11294       return ExprError();
11295     Destroyed = DestroyedTypeInfo;
11296   } else if (!ObjectType.isNull() && ObjectType->isDependentType()) {
11297     // We aren't likely to be able to resolve the identifier down to a type
11298     // now anyway, so just retain the identifier.
11299     Destroyed = PseudoDestructorTypeStorage(E->getDestroyedTypeIdentifier(),
11300                                             E->getDestroyedTypeLoc());
11301   } else {
11302     // Look for a destructor known with the given name.
11303     ParsedType T = SemaRef.getDestructorName(E->getTildeLoc(),
11304                                               *E->getDestroyedTypeIdentifier(),
11305                                                 E->getDestroyedTypeLoc(),
11306                                                 /*Scope=*/nullptr,
11307                                                 SS, ObjectTypePtr,
11308                                                 false);
11309     if (!T)
11310       return ExprError();
11311 
11312     Destroyed
11313       = SemaRef.Context.getTrivialTypeSourceInfo(SemaRef.GetTypeFromParser(T),
11314                                                  E->getDestroyedTypeLoc());
11315   }
11316 
11317   TypeSourceInfo *ScopeTypeInfo = nullptr;
11318   if (E->getScopeTypeInfo()) {
11319     CXXScopeSpec EmptySS;
11320     ScopeTypeInfo = getDerived().TransformTypeInObjectScope(
11321                       E->getScopeTypeInfo(), ObjectType, nullptr, EmptySS);
11322     if (!ScopeTypeInfo)
11323       return ExprError();
11324   }
11325 
11326   return getDerived().RebuildCXXPseudoDestructorExpr(Base.get(),
11327                                                      E->getOperatorLoc(),
11328                                                      E->isArrow(),
11329                                                      SS,
11330                                                      ScopeTypeInfo,
11331                                                      E->getColonColonLoc(),
11332                                                      E->getTildeLoc(),
11333                                                      Destroyed);
11334 }
11335 
11336 template <typename Derived>
11337 bool TreeTransform<Derived>::TransformOverloadExprDecls(OverloadExpr *Old,
11338                                                         bool RequiresADL,
11339                                                         LookupResult &R) {
11340   // Transform all the decls.
11341   bool AllEmptyPacks = true;
11342   for (auto *OldD : Old->decls()) {
11343     Decl *InstD = getDerived().TransformDecl(Old->getNameLoc(), OldD);
11344     if (!InstD) {
11345       // Silently ignore these if a UsingShadowDecl instantiated to nothing.
11346       // This can happen because of dependent hiding.
11347       if (isa<UsingShadowDecl>(OldD))
11348         continue;
11349       else {
11350         R.clear();
11351         return true;
11352       }
11353     }
11354 
11355     // Expand using pack declarations.
11356     NamedDecl *SingleDecl = cast<NamedDecl>(InstD);
11357     ArrayRef<NamedDecl*> Decls = SingleDecl;
11358     if (auto *UPD = dyn_cast<UsingPackDecl>(InstD))
11359       Decls = UPD->expansions();
11360 
11361     // Expand using declarations.
11362     for (auto *D : Decls) {
11363       if (auto *UD = dyn_cast<UsingDecl>(D)) {
11364         for (auto *SD : UD->shadows())
11365           R.addDecl(SD);
11366       } else {
11367         R.addDecl(D);
11368       }
11369     }
11370 
11371     AllEmptyPacks &= Decls.empty();
11372   };
11373 
11374   // C++ [temp.res]/8.4.2:
11375   //   The program is ill-formed, no diagnostic required, if [...] lookup for
11376   //   a name in the template definition found a using-declaration, but the
11377   //   lookup in the corresponding scope in the instantiation odoes not find
11378   //   any declarations because the using-declaration was a pack expansion and
11379   //   the corresponding pack is empty
11380   if (AllEmptyPacks && !RequiresADL) {
11381     getSema().Diag(Old->getNameLoc(), diag::err_using_pack_expansion_empty)
11382         << isa<UnresolvedMemberExpr>(Old) << Old->getName();
11383     return true;
11384   }
11385 
11386   // Resolve a kind, but don't do any further analysis.  If it's
11387   // ambiguous, the callee needs to deal with it.
11388   R.resolveKind();
11389   return false;
11390 }
11391 
11392 template<typename Derived>
11393 ExprResult
11394 TreeTransform<Derived>::TransformUnresolvedLookupExpr(
11395                                                   UnresolvedLookupExpr *Old) {
11396   LookupResult R(SemaRef, Old->getName(), Old->getNameLoc(),
11397                  Sema::LookupOrdinaryName);
11398 
11399   // Transform the declaration set.
11400   if (TransformOverloadExprDecls(Old, Old->requiresADL(), R))
11401     return ExprError();
11402 
11403   // Rebuild the nested-name qualifier, if present.
11404   CXXScopeSpec SS;
11405   if (Old->getQualifierLoc()) {
11406     NestedNameSpecifierLoc QualifierLoc
11407       = getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc());
11408     if (!QualifierLoc)
11409       return ExprError();
11410 
11411     SS.Adopt(QualifierLoc);
11412   }
11413 
11414   if (Old->getNamingClass()) {
11415     CXXRecordDecl *NamingClass
11416       = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl(
11417                                                             Old->getNameLoc(),
11418                                                         Old->getNamingClass()));
11419     if (!NamingClass) {
11420       R.clear();
11421       return ExprError();
11422     }
11423 
11424     R.setNamingClass(NamingClass);
11425   }
11426 
11427   SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc();
11428 
11429   // If we have neither explicit template arguments, nor the template keyword,
11430   // it's a normal declaration name or member reference.
11431   if (!Old->hasExplicitTemplateArgs() && !TemplateKWLoc.isValid()) {
11432     NamedDecl *D = R.getAsSingle<NamedDecl>();
11433     // In a C++11 unevaluated context, an UnresolvedLookupExpr might refer to an
11434     // instance member. In other contexts, BuildPossibleImplicitMemberExpr will
11435     // give a good diagnostic.
11436     if (D && D->isCXXInstanceMember()) {
11437       return SemaRef.BuildPossibleImplicitMemberExpr(SS, TemplateKWLoc, R,
11438                                                      /*TemplateArgs=*/nullptr,
11439                                                      /*Scope=*/nullptr);
11440     }
11441 
11442     return getDerived().RebuildDeclarationNameExpr(SS, R, Old->requiresADL());
11443   }
11444 
11445   // If we have template arguments, rebuild them, then rebuild the
11446   // templateid expression.
11447   TemplateArgumentListInfo TransArgs(Old->getLAngleLoc(), Old->getRAngleLoc());
11448   if (Old->hasExplicitTemplateArgs() &&
11449       getDerived().TransformTemplateArguments(Old->getTemplateArgs(),
11450                                               Old->getNumTemplateArgs(),
11451                                               TransArgs)) {
11452     R.clear();
11453     return ExprError();
11454   }
11455 
11456   return getDerived().RebuildTemplateIdExpr(SS, TemplateKWLoc, R,
11457                                             Old->requiresADL(), &TransArgs);
11458 }
11459 
11460 template<typename Derived>
11461 ExprResult
11462 TreeTransform<Derived>::TransformTypeTraitExpr(TypeTraitExpr *E) {
11463   bool ArgChanged = false;
11464   SmallVector<TypeSourceInfo *, 4> Args;
11465   for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) {
11466     TypeSourceInfo *From = E->getArg(I);
11467     TypeLoc FromTL = From->getTypeLoc();
11468     if (!FromTL.getAs<PackExpansionTypeLoc>()) {
11469       TypeLocBuilder TLB;
11470       TLB.reserve(FromTL.getFullDataSize());
11471       QualType To = getDerived().TransformType(TLB, FromTL);
11472       if (To.isNull())
11473         return ExprError();
11474 
11475       if (To == From->getType())
11476         Args.push_back(From);
11477       else {
11478         Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
11479         ArgChanged = true;
11480       }
11481       continue;
11482     }
11483 
11484     ArgChanged = true;
11485 
11486     // We have a pack expansion. Instantiate it.
11487     PackExpansionTypeLoc ExpansionTL = FromTL.castAs<PackExpansionTypeLoc>();
11488     TypeLoc PatternTL = ExpansionTL.getPatternLoc();
11489     SmallVector<UnexpandedParameterPack, 2> Unexpanded;
11490     SemaRef.collectUnexpandedParameterPacks(PatternTL, Unexpanded);
11491 
11492     // Determine whether the set of unexpanded parameter packs can and should
11493     // be expanded.
11494     bool Expand = true;
11495     bool RetainExpansion = false;
11496     Optional<unsigned> OrigNumExpansions =
11497         ExpansionTL.getTypePtr()->getNumExpansions();
11498     Optional<unsigned> NumExpansions = OrigNumExpansions;
11499     if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(),
11500                                              PatternTL.getSourceRange(),
11501                                              Unexpanded,
11502                                              Expand, RetainExpansion,
11503                                              NumExpansions))
11504       return ExprError();
11505 
11506     if (!Expand) {
11507       // The transform has determined that we should perform a simple
11508       // transformation on the pack expansion, producing another pack
11509       // expansion.
11510       Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
11511 
11512       TypeLocBuilder TLB;
11513       TLB.reserve(From->getTypeLoc().getFullDataSize());
11514 
11515       QualType To = getDerived().TransformType(TLB, PatternTL);
11516       if (To.isNull())
11517         return ExprError();
11518 
11519       To = getDerived().RebuildPackExpansionType(To,
11520                                                  PatternTL.getSourceRange(),
11521                                                  ExpansionTL.getEllipsisLoc(),
11522                                                  NumExpansions);
11523       if (To.isNull())
11524         return ExprError();
11525 
11526       PackExpansionTypeLoc ToExpansionTL
11527         = TLB.push<PackExpansionTypeLoc>(To);
11528       ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc());
11529       Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
11530       continue;
11531     }
11532 
11533     // Expand the pack expansion by substituting for each argument in the
11534     // pack(s).
11535     for (unsigned I = 0; I != *NumExpansions; ++I) {
11536       Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(SemaRef, I);
11537       TypeLocBuilder TLB;
11538       TLB.reserve(PatternTL.getFullDataSize());
11539       QualType To = getDerived().TransformType(TLB, PatternTL);
11540       if (To.isNull())
11541         return ExprError();
11542 
11543       if (To->containsUnexpandedParameterPack()) {
11544         To = getDerived().RebuildPackExpansionType(To,
11545                                                    PatternTL.getSourceRange(),
11546                                                    ExpansionTL.getEllipsisLoc(),
11547                                                    NumExpansions);
11548         if (To.isNull())
11549           return ExprError();
11550 
11551         PackExpansionTypeLoc ToExpansionTL
11552           = TLB.push<PackExpansionTypeLoc>(To);
11553         ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc());
11554       }
11555 
11556       Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
11557     }
11558 
11559     if (!RetainExpansion)
11560       continue;
11561 
11562     // If we're supposed to retain a pack expansion, do so by temporarily
11563     // forgetting the partially-substituted parameter pack.
11564     ForgetPartiallySubstitutedPackRAII Forget(getDerived());
11565 
11566     TypeLocBuilder TLB;
11567     TLB.reserve(From->getTypeLoc().getFullDataSize());
11568 
11569     QualType To = getDerived().TransformType(TLB, PatternTL);
11570     if (To.isNull())
11571       return ExprError();
11572 
11573     To = getDerived().RebuildPackExpansionType(To,
11574                                                PatternTL.getSourceRange(),
11575                                                ExpansionTL.getEllipsisLoc(),
11576                                                NumExpansions);
11577     if (To.isNull())
11578       return ExprError();
11579 
11580     PackExpansionTypeLoc ToExpansionTL
11581       = TLB.push<PackExpansionTypeLoc>(To);
11582     ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc());
11583     Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
11584   }
11585 
11586   if (!getDerived().AlwaysRebuild() && !ArgChanged)
11587     return E;
11588 
11589   return getDerived().RebuildTypeTrait(E->getTrait(), E->getBeginLoc(), Args,
11590                                        E->getEndLoc());
11591 }
11592 
11593 template<typename Derived>
11594 ExprResult
11595 TreeTransform<Derived>::TransformConceptSpecializationExpr(
11596                                                  ConceptSpecializationExpr *E) {
11597   const ASTTemplateArgumentListInfo *Old = E->getTemplateArgsAsWritten();
11598   TemplateArgumentListInfo TransArgs(Old->LAngleLoc, Old->RAngleLoc);
11599   if (getDerived().TransformTemplateArguments(Old->getTemplateArgs(),
11600                                               Old->NumTemplateArgs, TransArgs))
11601     return ExprError();
11602 
11603   return getDerived().RebuildConceptSpecializationExpr(
11604       E->getNestedNameSpecifierLoc(), E->getTemplateKWLoc(),
11605       E->getConceptNameInfo(), E->getFoundDecl(), E->getNamedConcept(),
11606       &TransArgs);
11607 }
11608 
11609 template<typename Derived>
11610 ExprResult
11611 TreeTransform<Derived>::TransformRequiresExpr(RequiresExpr *E) {
11612   SmallVector<ParmVarDecl*, 4> TransParams;
11613   SmallVector<QualType, 4> TransParamTypes;
11614   Sema::ExtParameterInfoBuilder ExtParamInfos;
11615 
11616   // C++2a [expr.prim.req]p2
11617   // Expressions appearing within a requirement-body are unevaluated operands.
11618   EnterExpressionEvaluationContext Ctx(
11619       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
11620 
11621   RequiresExprBodyDecl *Body = RequiresExprBodyDecl::Create(
11622       getSema().Context, getSema().CurContext,
11623       E->getBody()->getBeginLoc());
11624 
11625   Sema::ContextRAII SavedContext(getSema(), Body, /*NewThisContext*/false);
11626 
11627   if (getDerived().TransformFunctionTypeParams(E->getRequiresKWLoc(),
11628                                                E->getLocalParameters(),
11629                                                /*ParamTypes=*/nullptr,
11630                                                /*ParamInfos=*/nullptr,
11631                                                TransParamTypes, &TransParams,
11632                                                ExtParamInfos))
11633     return ExprError();
11634 
11635   for (ParmVarDecl *Param : TransParams)
11636     Param->setDeclContext(Body);
11637 
11638   SmallVector<concepts::Requirement *, 4> TransReqs;
11639   if (getDerived().TransformRequiresExprRequirements(E->getRequirements(),
11640                                                      TransReqs))
11641     return ExprError();
11642 
11643   for (concepts::Requirement *Req : TransReqs) {
11644     if (auto *ER = dyn_cast<concepts::ExprRequirement>(Req)) {
11645       if (ER->getReturnTypeRequirement().isTypeConstraint()) {
11646         ER->getReturnTypeRequirement()
11647                 .getTypeConstraintTemplateParameterList()->getParam(0)
11648                 ->setDeclContext(Body);
11649       }
11650     }
11651   }
11652 
11653   return getDerived().RebuildRequiresExpr(E->getRequiresKWLoc(), Body,
11654                                           TransParams, TransReqs,
11655                                           E->getRBraceLoc());
11656 }
11657 
11658 template<typename Derived>
11659 bool TreeTransform<Derived>::TransformRequiresExprRequirements(
11660     ArrayRef<concepts::Requirement *> Reqs,
11661     SmallVectorImpl<concepts::Requirement *> &Transformed) {
11662   for (concepts::Requirement *Req : Reqs) {
11663     concepts::Requirement *TransReq = nullptr;
11664     if (auto *TypeReq = dyn_cast<concepts::TypeRequirement>(Req))
11665       TransReq = getDerived().TransformTypeRequirement(TypeReq);
11666     else if (auto *ExprReq = dyn_cast<concepts::ExprRequirement>(Req))
11667       TransReq = getDerived().TransformExprRequirement(ExprReq);
11668     else
11669       TransReq = getDerived().TransformNestedRequirement(
11670                      cast<concepts::NestedRequirement>(Req));
11671     if (!TransReq)
11672       return true;
11673     Transformed.push_back(TransReq);
11674   }
11675   return false;
11676 }
11677 
11678 template<typename Derived>
11679 concepts::TypeRequirement *
11680 TreeTransform<Derived>::TransformTypeRequirement(
11681     concepts::TypeRequirement *Req) {
11682   if (Req->isSubstitutionFailure()) {
11683     if (getDerived().AlwaysRebuild())
11684       return getDerived().RebuildTypeRequirement(
11685               Req->getSubstitutionDiagnostic());
11686     return Req;
11687   }
11688   TypeSourceInfo *TransType = getDerived().TransformType(Req->getType());
11689   if (!TransType)
11690     return nullptr;
11691   return getDerived().RebuildTypeRequirement(TransType);
11692 }
11693 
11694 template<typename Derived>
11695 concepts::ExprRequirement *
11696 TreeTransform<Derived>::TransformExprRequirement(concepts::ExprRequirement *Req) {
11697   llvm::PointerUnion<Expr *, concepts::Requirement::SubstitutionDiagnostic *> TransExpr;
11698   if (Req->isExprSubstitutionFailure())
11699     TransExpr = Req->getExprSubstitutionDiagnostic();
11700   else {
11701     ExprResult TransExprRes = getDerived().TransformExpr(Req->getExpr());
11702     if (TransExprRes.isInvalid())
11703       return nullptr;
11704     TransExpr = TransExprRes.get();
11705   }
11706 
11707   llvm::Optional<concepts::ExprRequirement::ReturnTypeRequirement> TransRetReq;
11708   const auto &RetReq = Req->getReturnTypeRequirement();
11709   if (RetReq.isEmpty())
11710     TransRetReq.emplace();
11711   else if (RetReq.isSubstitutionFailure())
11712     TransRetReq.emplace(RetReq.getSubstitutionDiagnostic());
11713   else if (RetReq.isTypeConstraint()) {
11714     TemplateParameterList *OrigTPL =
11715         RetReq.getTypeConstraintTemplateParameterList();
11716     TemplateParameterList *TPL =
11717         getDerived().TransformTemplateParameterList(OrigTPL);
11718     if (!TPL)
11719       return nullptr;
11720     TransRetReq.emplace(TPL);
11721   }
11722   assert(TransRetReq.hasValue() &&
11723          "All code paths leading here must set TransRetReq");
11724   if (Expr *E = TransExpr.dyn_cast<Expr *>())
11725     return getDerived().RebuildExprRequirement(E, Req->isSimple(),
11726                                                Req->getNoexceptLoc(),
11727                                                std::move(*TransRetReq));
11728   return getDerived().RebuildExprRequirement(
11729       TransExpr.get<concepts::Requirement::SubstitutionDiagnostic *>(),
11730       Req->isSimple(), Req->getNoexceptLoc(), std::move(*TransRetReq));
11731 }
11732 
11733 template<typename Derived>
11734 concepts::NestedRequirement *
11735 TreeTransform<Derived>::TransformNestedRequirement(
11736     concepts::NestedRequirement *Req) {
11737   if (Req->isSubstitutionFailure()) {
11738     if (getDerived().AlwaysRebuild())
11739       return getDerived().RebuildNestedRequirement(
11740           Req->getSubstitutionDiagnostic());
11741     return Req;
11742   }
11743   ExprResult TransConstraint =
11744       getDerived().TransformExpr(Req->getConstraintExpr());
11745   if (TransConstraint.isInvalid())
11746     return nullptr;
11747   return getDerived().RebuildNestedRequirement(TransConstraint.get());
11748 }
11749 
11750 template<typename Derived>
11751 ExprResult
11752 TreeTransform<Derived>::TransformArrayTypeTraitExpr(ArrayTypeTraitExpr *E) {
11753   TypeSourceInfo *T = getDerived().TransformType(E->getQueriedTypeSourceInfo());
11754   if (!T)
11755     return ExprError();
11756 
11757   if (!getDerived().AlwaysRebuild() &&
11758       T == E->getQueriedTypeSourceInfo())
11759     return E;
11760 
11761   ExprResult SubExpr;
11762   {
11763     EnterExpressionEvaluationContext Unevaluated(
11764         SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
11765     SubExpr = getDerived().TransformExpr(E->getDimensionExpression());
11766     if (SubExpr.isInvalid())
11767       return ExprError();
11768 
11769     if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getDimensionExpression())
11770       return E;
11771   }
11772 
11773   return getDerived().RebuildArrayTypeTrait(E->getTrait(), E->getBeginLoc(), T,
11774                                             SubExpr.get(), E->getEndLoc());
11775 }
11776 
11777 template<typename Derived>
11778 ExprResult
11779 TreeTransform<Derived>::TransformExpressionTraitExpr(ExpressionTraitExpr *E) {
11780   ExprResult SubExpr;
11781   {
11782     EnterExpressionEvaluationContext Unevaluated(
11783         SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
11784     SubExpr = getDerived().TransformExpr(E->getQueriedExpression());
11785     if (SubExpr.isInvalid())
11786       return ExprError();
11787 
11788     if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getQueriedExpression())
11789       return E;
11790   }
11791 
11792   return getDerived().RebuildExpressionTrait(E->getTrait(), E->getBeginLoc(),
11793                                              SubExpr.get(), E->getEndLoc());
11794 }
11795 
11796 template <typename Derived>
11797 ExprResult TreeTransform<Derived>::TransformParenDependentScopeDeclRefExpr(
11798     ParenExpr *PE, DependentScopeDeclRefExpr *DRE, bool AddrTaken,
11799     TypeSourceInfo **RecoveryTSI) {
11800   ExprResult NewDRE = getDerived().TransformDependentScopeDeclRefExpr(
11801       DRE, AddrTaken, RecoveryTSI);
11802 
11803   // Propagate both errors and recovered types, which return ExprEmpty.
11804   if (!NewDRE.isUsable())
11805     return NewDRE;
11806 
11807   // We got an expr, wrap it up in parens.
11808   if (!getDerived().AlwaysRebuild() && NewDRE.get() == DRE)
11809     return PE;
11810   return getDerived().RebuildParenExpr(NewDRE.get(), PE->getLParen(),
11811                                        PE->getRParen());
11812 }
11813 
11814 template <typename Derived>
11815 ExprResult TreeTransform<Derived>::TransformDependentScopeDeclRefExpr(
11816     DependentScopeDeclRefExpr *E) {
11817   return TransformDependentScopeDeclRefExpr(E, /*IsAddressOfOperand=*/false,
11818                                             nullptr);
11819 }
11820 
11821 template<typename Derived>
11822 ExprResult
11823 TreeTransform<Derived>::TransformDependentScopeDeclRefExpr(
11824                                                DependentScopeDeclRefExpr *E,
11825                                                bool IsAddressOfOperand,
11826                                                TypeSourceInfo **RecoveryTSI) {
11827   assert(E->getQualifierLoc());
11828   NestedNameSpecifierLoc QualifierLoc
11829   = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
11830   if (!QualifierLoc)
11831     return ExprError();
11832   SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc();
11833 
11834   // TODO: If this is a conversion-function-id, verify that the
11835   // destination type name (if present) resolves the same way after
11836   // instantiation as it did in the local scope.
11837 
11838   DeclarationNameInfo NameInfo
11839     = getDerived().TransformDeclarationNameInfo(E->getNameInfo());
11840   if (!NameInfo.getName())
11841     return ExprError();
11842 
11843   if (!E->hasExplicitTemplateArgs()) {
11844     if (!getDerived().AlwaysRebuild() &&
11845         QualifierLoc == E->getQualifierLoc() &&
11846         // Note: it is sufficient to compare the Name component of NameInfo:
11847         // if name has not changed, DNLoc has not changed either.
11848         NameInfo.getName() == E->getDeclName())
11849       return E;
11850 
11851     return getDerived().RebuildDependentScopeDeclRefExpr(
11852         QualifierLoc, TemplateKWLoc, NameInfo, /*TemplateArgs=*/nullptr,
11853         IsAddressOfOperand, RecoveryTSI);
11854   }
11855 
11856   TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc());
11857   if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
11858                                               E->getNumTemplateArgs(),
11859                                               TransArgs))
11860     return ExprError();
11861 
11862   return getDerived().RebuildDependentScopeDeclRefExpr(
11863       QualifierLoc, TemplateKWLoc, NameInfo, &TransArgs, IsAddressOfOperand,
11864       RecoveryTSI);
11865 }
11866 
11867 template<typename Derived>
11868 ExprResult
11869 TreeTransform<Derived>::TransformCXXConstructExpr(CXXConstructExpr *E) {
11870   // CXXConstructExprs other than for list-initialization and
11871   // CXXTemporaryObjectExpr are always implicit, so when we have
11872   // a 1-argument construction we just transform that argument.
11873   if (getDerived().AllowSkippingCXXConstructExpr() &&
11874       ((E->getNumArgs() == 1 ||
11875         (E->getNumArgs() > 1 && getDerived().DropCallArgument(E->getArg(1)))) &&
11876        (!getDerived().DropCallArgument(E->getArg(0))) &&
11877        !E->isListInitialization()))
11878     return getDerived().TransformExpr(E->getArg(0));
11879 
11880   TemporaryBase Rebase(*this, /*FIXME*/ E->getBeginLoc(), DeclarationName());
11881 
11882   QualType T = getDerived().TransformType(E->getType());
11883   if (T.isNull())
11884     return ExprError();
11885 
11886   CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>(
11887       getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor()));
11888   if (!Constructor)
11889     return ExprError();
11890 
11891   bool ArgumentChanged = false;
11892   SmallVector<Expr*, 8> Args;
11893   {
11894     EnterExpressionEvaluationContext Context(
11895         getSema(), EnterExpressionEvaluationContext::InitList,
11896         E->isListInitialization());
11897     if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
11898                                     &ArgumentChanged))
11899       return ExprError();
11900   }
11901 
11902   if (!getDerived().AlwaysRebuild() &&
11903       T == E->getType() &&
11904       Constructor == E->getConstructor() &&
11905       !ArgumentChanged) {
11906     // Mark the constructor as referenced.
11907     // FIXME: Instantiation-specific
11908     SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor);
11909     return E;
11910   }
11911 
11912   return getDerived().RebuildCXXConstructExpr(
11913       T, /*FIXME:*/ E->getBeginLoc(), Constructor, E->isElidable(), Args,
11914       E->hadMultipleCandidates(), E->isListInitialization(),
11915       E->isStdInitListInitialization(), E->requiresZeroInitialization(),
11916       E->getConstructionKind(), E->getParenOrBraceRange());
11917 }
11918 
11919 template<typename Derived>
11920 ExprResult TreeTransform<Derived>::TransformCXXInheritedCtorInitExpr(
11921     CXXInheritedCtorInitExpr *E) {
11922   QualType T = getDerived().TransformType(E->getType());
11923   if (T.isNull())
11924     return ExprError();
11925 
11926   CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>(
11927       getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor()));
11928   if (!Constructor)
11929     return ExprError();
11930 
11931   if (!getDerived().AlwaysRebuild() &&
11932       T == E->getType() &&
11933       Constructor == E->getConstructor()) {
11934     // Mark the constructor as referenced.
11935     // FIXME: Instantiation-specific
11936     SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor);
11937     return E;
11938   }
11939 
11940   return getDerived().RebuildCXXInheritedCtorInitExpr(
11941       T, E->getLocation(), Constructor,
11942       E->constructsVBase(), E->inheritedFromVBase());
11943 }
11944 
11945 /// Transform a C++ temporary-binding expression.
11946 ///
11947 /// Since CXXBindTemporaryExpr nodes are implicitly generated, we just
11948 /// transform the subexpression and return that.
11949 template<typename Derived>
11950 ExprResult
11951 TreeTransform<Derived>::TransformCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) {
11952   return getDerived().TransformExpr(E->getSubExpr());
11953 }
11954 
11955 /// Transform a C++ expression that contains cleanups that should
11956 /// be run after the expression is evaluated.
11957 ///
11958 /// Since ExprWithCleanups nodes are implicitly generated, we
11959 /// just transform the subexpression and return that.
11960 template<typename Derived>
11961 ExprResult
11962 TreeTransform<Derived>::TransformExprWithCleanups(ExprWithCleanups *E) {
11963   return getDerived().TransformExpr(E->getSubExpr());
11964 }
11965 
11966 template<typename Derived>
11967 ExprResult
11968 TreeTransform<Derived>::TransformCXXTemporaryObjectExpr(
11969                                                     CXXTemporaryObjectExpr *E) {
11970   TypeSourceInfo *T =
11971       getDerived().TransformTypeWithDeducedTST(E->getTypeSourceInfo());
11972   if (!T)
11973     return ExprError();
11974 
11975   CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>(
11976       getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor()));
11977   if (!Constructor)
11978     return ExprError();
11979 
11980   bool ArgumentChanged = false;
11981   SmallVector<Expr*, 8> Args;
11982   Args.reserve(E->getNumArgs());
11983   {
11984     EnterExpressionEvaluationContext Context(
11985         getSema(), EnterExpressionEvaluationContext::InitList,
11986         E->isListInitialization());
11987     if (TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
11988                        &ArgumentChanged))
11989       return ExprError();
11990   }
11991 
11992   if (!getDerived().AlwaysRebuild() &&
11993       T == E->getTypeSourceInfo() &&
11994       Constructor == E->getConstructor() &&
11995       !ArgumentChanged) {
11996     // FIXME: Instantiation-specific
11997     SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor);
11998     return SemaRef.MaybeBindToTemporary(E);
11999   }
12000 
12001   // FIXME: We should just pass E->isListInitialization(), but we're not
12002   // prepared to handle list-initialization without a child InitListExpr.
12003   SourceLocation LParenLoc = T->getTypeLoc().getEndLoc();
12004   return getDerived().RebuildCXXTemporaryObjectExpr(
12005       T, LParenLoc, Args, E->getEndLoc(),
12006       /*ListInitialization=*/LParenLoc.isInvalid());
12007 }
12008 
12009 template<typename Derived>
12010 ExprResult
12011 TreeTransform<Derived>::TransformLambdaExpr(LambdaExpr *E) {
12012   // Transform any init-capture expressions before entering the scope of the
12013   // lambda body, because they are not semantically within that scope.
12014   typedef std::pair<ExprResult, QualType> InitCaptureInfoTy;
12015   struct TransformedInitCapture {
12016     // The location of the ... if the result is retaining a pack expansion.
12017     SourceLocation EllipsisLoc;
12018     // Zero or more expansions of the init-capture.
12019     SmallVector<InitCaptureInfoTy, 4> Expansions;
12020   };
12021   SmallVector<TransformedInitCapture, 4> InitCaptures;
12022   InitCaptures.resize(E->explicit_capture_end() - E->explicit_capture_begin());
12023   for (LambdaExpr::capture_iterator C = E->capture_begin(),
12024                                     CEnd = E->capture_end();
12025        C != CEnd; ++C) {
12026     if (!E->isInitCapture(C))
12027       continue;
12028 
12029     TransformedInitCapture &Result = InitCaptures[C - E->capture_begin()];
12030     VarDecl *OldVD = C->getCapturedVar();
12031 
12032     auto SubstInitCapture = [&](SourceLocation EllipsisLoc,
12033                                 Optional<unsigned> NumExpansions) {
12034       ExprResult NewExprInitResult = getDerived().TransformInitializer(
12035           OldVD->getInit(), OldVD->getInitStyle() == VarDecl::CallInit);
12036 
12037       if (NewExprInitResult.isInvalid()) {
12038         Result.Expansions.push_back(InitCaptureInfoTy(ExprError(), QualType()));
12039         return;
12040       }
12041       Expr *NewExprInit = NewExprInitResult.get();
12042 
12043       QualType NewInitCaptureType =
12044           getSema().buildLambdaInitCaptureInitialization(
12045               C->getLocation(), OldVD->getType()->isReferenceType(),
12046               EllipsisLoc, NumExpansions, OldVD->getIdentifier(),
12047               C->getCapturedVar()->getInitStyle() != VarDecl::CInit,
12048               NewExprInit);
12049       Result.Expansions.push_back(
12050           InitCaptureInfoTy(NewExprInit, NewInitCaptureType));
12051     };
12052 
12053     // If this is an init-capture pack, consider expanding the pack now.
12054     if (OldVD->isParameterPack()) {
12055       PackExpansionTypeLoc ExpansionTL = OldVD->getTypeSourceInfo()
12056                                              ->getTypeLoc()
12057                                              .castAs<PackExpansionTypeLoc>();
12058       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
12059       SemaRef.collectUnexpandedParameterPacks(OldVD->getInit(), Unexpanded);
12060 
12061       // Determine whether the set of unexpanded parameter packs can and should
12062       // be expanded.
12063       bool Expand = true;
12064       bool RetainExpansion = false;
12065       Optional<unsigned> OrigNumExpansions =
12066           ExpansionTL.getTypePtr()->getNumExpansions();
12067       Optional<unsigned> NumExpansions = OrigNumExpansions;
12068       if (getDerived().TryExpandParameterPacks(
12069               ExpansionTL.getEllipsisLoc(),
12070               OldVD->getInit()->getSourceRange(), Unexpanded, Expand,
12071               RetainExpansion, NumExpansions))
12072         return ExprError();
12073       if (Expand) {
12074         for (unsigned I = 0; I != *NumExpansions; ++I) {
12075           Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
12076           SubstInitCapture(SourceLocation(), None);
12077         }
12078       }
12079       if (!Expand || RetainExpansion) {
12080         ForgetPartiallySubstitutedPackRAII Forget(getDerived());
12081         SubstInitCapture(ExpansionTL.getEllipsisLoc(), NumExpansions);
12082         Result.EllipsisLoc = ExpansionTL.getEllipsisLoc();
12083       }
12084     } else {
12085       SubstInitCapture(SourceLocation(), None);
12086     }
12087   }
12088 
12089   LambdaScopeInfo *LSI = getSema().PushLambdaScope();
12090   Sema::FunctionScopeRAII FuncScopeCleanup(getSema());
12091 
12092   // Transform the template parameters, and add them to the current
12093   // instantiation scope. The null case is handled correctly.
12094   auto TPL = getDerived().TransformTemplateParameterList(
12095       E->getTemplateParameterList());
12096   LSI->GLTemplateParameterList = TPL;
12097 
12098   // Transform the type of the original lambda's call operator.
12099   // The transformation MUST be done in the CurrentInstantiationScope since
12100   // it introduces a mapping of the original to the newly created
12101   // transformed parameters.
12102   TypeSourceInfo *NewCallOpTSI = nullptr;
12103   {
12104     TypeSourceInfo *OldCallOpTSI = E->getCallOperator()->getTypeSourceInfo();
12105     FunctionProtoTypeLoc OldCallOpFPTL =
12106         OldCallOpTSI->getTypeLoc().getAs<FunctionProtoTypeLoc>();
12107 
12108     TypeLocBuilder NewCallOpTLBuilder;
12109     SmallVector<QualType, 4> ExceptionStorage;
12110     TreeTransform *This = this; // Work around gcc.gnu.org/PR56135.
12111     QualType NewCallOpType = TransformFunctionProtoType(
12112         NewCallOpTLBuilder, OldCallOpFPTL, nullptr, Qualifiers(),
12113         [&](FunctionProtoType::ExceptionSpecInfo &ESI, bool &Changed) {
12114           return This->TransformExceptionSpec(OldCallOpFPTL.getBeginLoc(), ESI,
12115                                               ExceptionStorage, Changed);
12116         });
12117     if (NewCallOpType.isNull())
12118       return ExprError();
12119     NewCallOpTSI = NewCallOpTLBuilder.getTypeSourceInfo(getSema().Context,
12120                                                         NewCallOpType);
12121   }
12122 
12123   // Transform the trailing requires clause
12124   ExprResult NewTrailingRequiresClause;
12125   if (Expr *TRC = E->getCallOperator()->getTrailingRequiresClause())
12126     // FIXME: Concepts: Substitution into requires clause should only happen
12127     //                  when checking satisfaction.
12128     NewTrailingRequiresClause = getDerived().TransformExpr(TRC);
12129 
12130   // Create the local class that will describe the lambda.
12131   // FIXME: KnownDependent below is wrong when substituting inside a templated
12132   // context that isn't a DeclContext (such as a variable template).
12133   CXXRecordDecl *OldClass = E->getLambdaClass();
12134   CXXRecordDecl *Class
12135     = getSema().createLambdaClosureType(E->getIntroducerRange(),
12136                                         NewCallOpTSI,
12137                                         /*KnownDependent=*/false,
12138                                         E->getCaptureDefault());
12139   getDerived().transformedLocalDecl(OldClass, {Class});
12140 
12141   Optional<std::tuple<unsigned, bool, Decl *>> Mangling;
12142   if (getDerived().ReplacingOriginal())
12143     Mangling = std::make_tuple(OldClass->getLambdaManglingNumber(),
12144                                OldClass->hasKnownLambdaInternalLinkage(),
12145                                OldClass->getLambdaContextDecl());
12146 
12147   // Build the call operator.
12148   CXXMethodDecl *NewCallOperator = getSema().startLambdaDefinition(
12149       Class, E->getIntroducerRange(), NewCallOpTSI,
12150       E->getCallOperator()->getEndLoc(),
12151       NewCallOpTSI->getTypeLoc().castAs<FunctionProtoTypeLoc>().getParams(),
12152       E->getCallOperator()->getConstexprKind(),
12153       NewTrailingRequiresClause.get());
12154 
12155   LSI->CallOperator = NewCallOperator;
12156 
12157   for (unsigned I = 0, NumParams = NewCallOperator->getNumParams();
12158        I != NumParams; ++I) {
12159     auto *P = NewCallOperator->getParamDecl(I);
12160     if (P->hasUninstantiatedDefaultArg()) {
12161       EnterExpressionEvaluationContext Eval(
12162           getSema(),
12163           Sema::ExpressionEvaluationContext::PotentiallyEvaluatedIfUsed, P);
12164       ExprResult R = getDerived().TransformExpr(
12165           E->getCallOperator()->getParamDecl(I)->getDefaultArg());
12166       P->setDefaultArg(R.get());
12167     }
12168   }
12169 
12170   getDerived().transformAttrs(E->getCallOperator(), NewCallOperator);
12171   getDerived().transformedLocalDecl(E->getCallOperator(), {NewCallOperator});
12172 
12173   // Number the lambda for linkage purposes if necessary.
12174   getSema().handleLambdaNumbering(Class, NewCallOperator, Mangling);
12175 
12176   // Introduce the context of the call operator.
12177   Sema::ContextRAII SavedContext(getSema(), NewCallOperator,
12178                                  /*NewThisContext*/false);
12179 
12180   // Enter the scope of the lambda.
12181   getSema().buildLambdaScope(LSI, NewCallOperator,
12182                              E->getIntroducerRange(),
12183                              E->getCaptureDefault(),
12184                              E->getCaptureDefaultLoc(),
12185                              E->hasExplicitParameters(),
12186                              E->hasExplicitResultType(),
12187                              E->isMutable());
12188 
12189   bool Invalid = false;
12190 
12191   // Transform captures.
12192   for (LambdaExpr::capture_iterator C = E->capture_begin(),
12193                                  CEnd = E->capture_end();
12194        C != CEnd; ++C) {
12195     // When we hit the first implicit capture, tell Sema that we've finished
12196     // the list of explicit captures.
12197     if (C->isImplicit())
12198       break;
12199 
12200     // Capturing 'this' is trivial.
12201     if (C->capturesThis()) {
12202       getSema().CheckCXXThisCapture(C->getLocation(), C->isExplicit(),
12203                                     /*BuildAndDiagnose*/ true, nullptr,
12204                                     C->getCaptureKind() == LCK_StarThis);
12205       continue;
12206     }
12207     // Captured expression will be recaptured during captured variables
12208     // rebuilding.
12209     if (C->capturesVLAType())
12210       continue;
12211 
12212     // Rebuild init-captures, including the implied field declaration.
12213     if (E->isInitCapture(C)) {
12214       TransformedInitCapture &NewC = InitCaptures[C - E->capture_begin()];
12215 
12216       VarDecl *OldVD = C->getCapturedVar();
12217       llvm::SmallVector<Decl*, 4> NewVDs;
12218 
12219       for (InitCaptureInfoTy &Info : NewC.Expansions) {
12220         ExprResult Init = Info.first;
12221         QualType InitQualType = Info.second;
12222         if (Init.isInvalid() || InitQualType.isNull()) {
12223           Invalid = true;
12224           break;
12225         }
12226         VarDecl *NewVD = getSema().createLambdaInitCaptureVarDecl(
12227             OldVD->getLocation(), InitQualType, NewC.EllipsisLoc,
12228             OldVD->getIdentifier(), OldVD->getInitStyle(), Init.get());
12229         if (!NewVD) {
12230           Invalid = true;
12231           break;
12232         }
12233         NewVDs.push_back(NewVD);
12234         getSema().addInitCapture(LSI, NewVD);
12235       }
12236 
12237       if (Invalid)
12238         break;
12239 
12240       getDerived().transformedLocalDecl(OldVD, NewVDs);
12241       continue;
12242     }
12243 
12244     assert(C->capturesVariable() && "unexpected kind of lambda capture");
12245 
12246     // Determine the capture kind for Sema.
12247     Sema::TryCaptureKind Kind
12248       = C->isImplicit()? Sema::TryCapture_Implicit
12249                        : C->getCaptureKind() == LCK_ByCopy
12250                            ? Sema::TryCapture_ExplicitByVal
12251                            : Sema::TryCapture_ExplicitByRef;
12252     SourceLocation EllipsisLoc;
12253     if (C->isPackExpansion()) {
12254       UnexpandedParameterPack Unexpanded(C->getCapturedVar(), C->getLocation());
12255       bool ShouldExpand = false;
12256       bool RetainExpansion = false;
12257       Optional<unsigned> NumExpansions;
12258       if (getDerived().TryExpandParameterPacks(C->getEllipsisLoc(),
12259                                                C->getLocation(),
12260                                                Unexpanded,
12261                                                ShouldExpand, RetainExpansion,
12262                                                NumExpansions)) {
12263         Invalid = true;
12264         continue;
12265       }
12266 
12267       if (ShouldExpand) {
12268         // The transform has determined that we should perform an expansion;
12269         // transform and capture each of the arguments.
12270         // expansion of the pattern. Do so.
12271         VarDecl *Pack = C->getCapturedVar();
12272         for (unsigned I = 0; I != *NumExpansions; ++I) {
12273           Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
12274           VarDecl *CapturedVar
12275             = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(),
12276                                                                Pack));
12277           if (!CapturedVar) {
12278             Invalid = true;
12279             continue;
12280           }
12281 
12282           // Capture the transformed variable.
12283           getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind);
12284         }
12285 
12286         // FIXME: Retain a pack expansion if RetainExpansion is true.
12287 
12288         continue;
12289       }
12290 
12291       EllipsisLoc = C->getEllipsisLoc();
12292     }
12293 
12294     // Transform the captured variable.
12295     VarDecl *CapturedVar
12296       = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(),
12297                                                          C->getCapturedVar()));
12298     if (!CapturedVar || CapturedVar->isInvalidDecl()) {
12299       Invalid = true;
12300       continue;
12301     }
12302 
12303     // Capture the transformed variable.
12304     getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind,
12305                                  EllipsisLoc);
12306   }
12307   getSema().finishLambdaExplicitCaptures(LSI);
12308 
12309   // FIXME: Sema's lambda-building mechanism expects us to push an expression
12310   // evaluation context even if we're not transforming the function body.
12311   getSema().PushExpressionEvaluationContext(
12312       Sema::ExpressionEvaluationContext::PotentiallyEvaluated);
12313 
12314   // Instantiate the body of the lambda expression.
12315   StmtResult Body =
12316       Invalid ? StmtError() : getDerived().TransformLambdaBody(E, E->getBody());
12317 
12318   // ActOnLambda* will pop the function scope for us.
12319   FuncScopeCleanup.disable();
12320 
12321   if (Body.isInvalid()) {
12322     SavedContext.pop();
12323     getSema().ActOnLambdaError(E->getBeginLoc(), /*CurScope=*/nullptr,
12324                                /*IsInstantiation=*/true);
12325     return ExprError();
12326   }
12327 
12328   // Copy the LSI before ActOnFinishFunctionBody removes it.
12329   // FIXME: This is dumb. Store the lambda information somewhere that outlives
12330   // the call operator.
12331   auto LSICopy = *LSI;
12332   getSema().ActOnFinishFunctionBody(NewCallOperator, Body.get(),
12333                                     /*IsInstantiation*/ true);
12334   SavedContext.pop();
12335 
12336   return getSema().BuildLambdaExpr(E->getBeginLoc(), Body.get()->getEndLoc(),
12337                                    &LSICopy);
12338 }
12339 
12340 template<typename Derived>
12341 StmtResult
12342 TreeTransform<Derived>::TransformLambdaBody(LambdaExpr *E, Stmt *S) {
12343   return TransformStmt(S);
12344 }
12345 
12346 template<typename Derived>
12347 StmtResult
12348 TreeTransform<Derived>::SkipLambdaBody(LambdaExpr *E, Stmt *S) {
12349   // Transform captures.
12350   for (LambdaExpr::capture_iterator C = E->capture_begin(),
12351                                  CEnd = E->capture_end();
12352        C != CEnd; ++C) {
12353     // When we hit the first implicit capture, tell Sema that we've finished
12354     // the list of explicit captures.
12355     if (!C->isImplicit())
12356       continue;
12357 
12358     // Capturing 'this' is trivial.
12359     if (C->capturesThis()) {
12360       getSema().CheckCXXThisCapture(C->getLocation(), C->isExplicit(),
12361                                     /*BuildAndDiagnose*/ true, nullptr,
12362                                     C->getCaptureKind() == LCK_StarThis);
12363       continue;
12364     }
12365     // Captured expression will be recaptured during captured variables
12366     // rebuilding.
12367     if (C->capturesVLAType())
12368       continue;
12369 
12370     assert(C->capturesVariable() && "unexpected kind of lambda capture");
12371     assert(!E->isInitCapture(C) && "implicit init-capture?");
12372 
12373     // Transform the captured variable.
12374     VarDecl *CapturedVar = cast_or_null<VarDecl>(
12375         getDerived().TransformDecl(C->getLocation(), C->getCapturedVar()));
12376     if (!CapturedVar || CapturedVar->isInvalidDecl())
12377       return StmtError();
12378 
12379     // Capture the transformed variable.
12380     getSema().tryCaptureVariable(CapturedVar, C->getLocation());
12381   }
12382 
12383   return S;
12384 }
12385 
12386 template<typename Derived>
12387 ExprResult
12388 TreeTransform<Derived>::TransformCXXUnresolvedConstructExpr(
12389                                                   CXXUnresolvedConstructExpr *E) {
12390   TypeSourceInfo *T =
12391       getDerived().TransformTypeWithDeducedTST(E->getTypeSourceInfo());
12392   if (!T)
12393     return ExprError();
12394 
12395   bool ArgumentChanged = false;
12396   SmallVector<Expr*, 8> Args;
12397   Args.reserve(E->arg_size());
12398   {
12399     EnterExpressionEvaluationContext Context(
12400         getSema(), EnterExpressionEvaluationContext::InitList,
12401         E->isListInitialization());
12402     if (getDerived().TransformExprs(E->arg_begin(), E->arg_size(), true, Args,
12403                                     &ArgumentChanged))
12404       return ExprError();
12405   }
12406 
12407   if (!getDerived().AlwaysRebuild() &&
12408       T == E->getTypeSourceInfo() &&
12409       !ArgumentChanged)
12410     return E;
12411 
12412   // FIXME: we're faking the locations of the commas
12413   return getDerived().RebuildCXXUnresolvedConstructExpr(
12414       T, E->getLParenLoc(), Args, E->getRParenLoc(), E->isListInitialization());
12415 }
12416 
12417 template<typename Derived>
12418 ExprResult
12419 TreeTransform<Derived>::TransformCXXDependentScopeMemberExpr(
12420                                              CXXDependentScopeMemberExpr *E) {
12421   // Transform the base of the expression.
12422   ExprResult Base((Expr*) nullptr);
12423   Expr *OldBase;
12424   QualType BaseType;
12425   QualType ObjectType;
12426   if (!E->isImplicitAccess()) {
12427     OldBase = E->getBase();
12428     Base = getDerived().TransformExpr(OldBase);
12429     if (Base.isInvalid())
12430       return ExprError();
12431 
12432     // Start the member reference and compute the object's type.
12433     ParsedType ObjectTy;
12434     bool MayBePseudoDestructor = false;
12435     Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(),
12436                                                 E->getOperatorLoc(),
12437                                       E->isArrow()? tok::arrow : tok::period,
12438                                                 ObjectTy,
12439                                                 MayBePseudoDestructor);
12440     if (Base.isInvalid())
12441       return ExprError();
12442 
12443     ObjectType = ObjectTy.get();
12444     BaseType = ((Expr*) Base.get())->getType();
12445   } else {
12446     OldBase = nullptr;
12447     BaseType = getDerived().TransformType(E->getBaseType());
12448     ObjectType = BaseType->castAs<PointerType>()->getPointeeType();
12449   }
12450 
12451   // Transform the first part of the nested-name-specifier that qualifies
12452   // the member name.
12453   NamedDecl *FirstQualifierInScope
12454     = getDerived().TransformFirstQualifierInScope(
12455                                             E->getFirstQualifierFoundInScope(),
12456                                             E->getQualifierLoc().getBeginLoc());
12457 
12458   NestedNameSpecifierLoc QualifierLoc;
12459   if (E->getQualifier()) {
12460     QualifierLoc
12461       = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc(),
12462                                                      ObjectType,
12463                                                      FirstQualifierInScope);
12464     if (!QualifierLoc)
12465       return ExprError();
12466   }
12467 
12468   SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc();
12469 
12470   // TODO: If this is a conversion-function-id, verify that the
12471   // destination type name (if present) resolves the same way after
12472   // instantiation as it did in the local scope.
12473 
12474   DeclarationNameInfo NameInfo
12475     = getDerived().TransformDeclarationNameInfo(E->getMemberNameInfo());
12476   if (!NameInfo.getName())
12477     return ExprError();
12478 
12479   if (!E->hasExplicitTemplateArgs()) {
12480     // This is a reference to a member without an explicitly-specified
12481     // template argument list. Optimize for this common case.
12482     if (!getDerived().AlwaysRebuild() &&
12483         Base.get() == OldBase &&
12484         BaseType == E->getBaseType() &&
12485         QualifierLoc == E->getQualifierLoc() &&
12486         NameInfo.getName() == E->getMember() &&
12487         FirstQualifierInScope == E->getFirstQualifierFoundInScope())
12488       return E;
12489 
12490     return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(),
12491                                                        BaseType,
12492                                                        E->isArrow(),
12493                                                        E->getOperatorLoc(),
12494                                                        QualifierLoc,
12495                                                        TemplateKWLoc,
12496                                                        FirstQualifierInScope,
12497                                                        NameInfo,
12498                                                        /*TemplateArgs*/nullptr);
12499   }
12500 
12501   TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc());
12502   if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
12503                                               E->getNumTemplateArgs(),
12504                                               TransArgs))
12505     return ExprError();
12506 
12507   return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(),
12508                                                      BaseType,
12509                                                      E->isArrow(),
12510                                                      E->getOperatorLoc(),
12511                                                      QualifierLoc,
12512                                                      TemplateKWLoc,
12513                                                      FirstQualifierInScope,
12514                                                      NameInfo,
12515                                                      &TransArgs);
12516 }
12517 
12518 template<typename Derived>
12519 ExprResult
12520 TreeTransform<Derived>::TransformUnresolvedMemberExpr(UnresolvedMemberExpr *Old) {
12521   // Transform the base of the expression.
12522   ExprResult Base((Expr*) nullptr);
12523   QualType BaseType;
12524   if (!Old->isImplicitAccess()) {
12525     Base = getDerived().TransformExpr(Old->getBase());
12526     if (Base.isInvalid())
12527       return ExprError();
12528     Base = getSema().PerformMemberExprBaseConversion(Base.get(),
12529                                                      Old->isArrow());
12530     if (Base.isInvalid())
12531       return ExprError();
12532     BaseType = Base.get()->getType();
12533   } else {
12534     BaseType = getDerived().TransformType(Old->getBaseType());
12535   }
12536 
12537   NestedNameSpecifierLoc QualifierLoc;
12538   if (Old->getQualifierLoc()) {
12539     QualifierLoc
12540     = getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc());
12541     if (!QualifierLoc)
12542       return ExprError();
12543   }
12544 
12545   SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc();
12546 
12547   LookupResult R(SemaRef, Old->getMemberNameInfo(),
12548                  Sema::LookupOrdinaryName);
12549 
12550   // Transform the declaration set.
12551   if (TransformOverloadExprDecls(Old, /*RequiresADL*/false, R))
12552     return ExprError();
12553 
12554   // Determine the naming class.
12555   if (Old->getNamingClass()) {
12556     CXXRecordDecl *NamingClass
12557       = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl(
12558                                                           Old->getMemberLoc(),
12559                                                         Old->getNamingClass()));
12560     if (!NamingClass)
12561       return ExprError();
12562 
12563     R.setNamingClass(NamingClass);
12564   }
12565 
12566   TemplateArgumentListInfo TransArgs;
12567   if (Old->hasExplicitTemplateArgs()) {
12568     TransArgs.setLAngleLoc(Old->getLAngleLoc());
12569     TransArgs.setRAngleLoc(Old->getRAngleLoc());
12570     if (getDerived().TransformTemplateArguments(Old->getTemplateArgs(),
12571                                                 Old->getNumTemplateArgs(),
12572                                                 TransArgs))
12573       return ExprError();
12574   }
12575 
12576   // FIXME: to do this check properly, we will need to preserve the
12577   // first-qualifier-in-scope here, just in case we had a dependent
12578   // base (and therefore couldn't do the check) and a
12579   // nested-name-qualifier (and therefore could do the lookup).
12580   NamedDecl *FirstQualifierInScope = nullptr;
12581 
12582   return getDerived().RebuildUnresolvedMemberExpr(Base.get(),
12583                                                   BaseType,
12584                                                   Old->getOperatorLoc(),
12585                                                   Old->isArrow(),
12586                                                   QualifierLoc,
12587                                                   TemplateKWLoc,
12588                                                   FirstQualifierInScope,
12589                                                   R,
12590                                               (Old->hasExplicitTemplateArgs()
12591                                                   ? &TransArgs : nullptr));
12592 }
12593 
12594 template<typename Derived>
12595 ExprResult
12596 TreeTransform<Derived>::TransformCXXNoexceptExpr(CXXNoexceptExpr *E) {
12597   EnterExpressionEvaluationContext Unevaluated(
12598       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
12599   ExprResult SubExpr = getDerived().TransformExpr(E->getOperand());
12600   if (SubExpr.isInvalid())
12601     return ExprError();
12602 
12603   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getOperand())
12604     return E;
12605 
12606   return getDerived().RebuildCXXNoexceptExpr(E->getSourceRange(),SubExpr.get());
12607 }
12608 
12609 template<typename Derived>
12610 ExprResult
12611 TreeTransform<Derived>::TransformPackExpansionExpr(PackExpansionExpr *E) {
12612   ExprResult Pattern = getDerived().TransformExpr(E->getPattern());
12613   if (Pattern.isInvalid())
12614     return ExprError();
12615 
12616   if (!getDerived().AlwaysRebuild() && Pattern.get() == E->getPattern())
12617     return E;
12618 
12619   return getDerived().RebuildPackExpansion(Pattern.get(), E->getEllipsisLoc(),
12620                                            E->getNumExpansions());
12621 }
12622 
12623 template<typename Derived>
12624 ExprResult
12625 TreeTransform<Derived>::TransformSizeOfPackExpr(SizeOfPackExpr *E) {
12626   // If E is not value-dependent, then nothing will change when we transform it.
12627   // Note: This is an instantiation-centric view.
12628   if (!E->isValueDependent())
12629     return E;
12630 
12631   EnterExpressionEvaluationContext Unevaluated(
12632       getSema(), Sema::ExpressionEvaluationContext::Unevaluated);
12633 
12634   ArrayRef<TemplateArgument> PackArgs;
12635   TemplateArgument ArgStorage;
12636 
12637   // Find the argument list to transform.
12638   if (E->isPartiallySubstituted()) {
12639     PackArgs = E->getPartialArguments();
12640   } else if (E->isValueDependent()) {
12641     UnexpandedParameterPack Unexpanded(E->getPack(), E->getPackLoc());
12642     bool ShouldExpand = false;
12643     bool RetainExpansion = false;
12644     Optional<unsigned> NumExpansions;
12645     if (getDerived().TryExpandParameterPacks(E->getOperatorLoc(), E->getPackLoc(),
12646                                              Unexpanded,
12647                                              ShouldExpand, RetainExpansion,
12648                                              NumExpansions))
12649       return ExprError();
12650 
12651     // If we need to expand the pack, build a template argument from it and
12652     // expand that.
12653     if (ShouldExpand) {
12654       auto *Pack = E->getPack();
12655       if (auto *TTPD = dyn_cast<TemplateTypeParmDecl>(Pack)) {
12656         ArgStorage = getSema().Context.getPackExpansionType(
12657             getSema().Context.getTypeDeclType(TTPD), None);
12658       } else if (auto *TTPD = dyn_cast<TemplateTemplateParmDecl>(Pack)) {
12659         ArgStorage = TemplateArgument(TemplateName(TTPD), None);
12660       } else {
12661         auto *VD = cast<ValueDecl>(Pack);
12662         ExprResult DRE = getSema().BuildDeclRefExpr(
12663             VD, VD->getType().getNonLValueExprType(getSema().Context),
12664             VD->getType()->isReferenceType() ? VK_LValue : VK_RValue,
12665             E->getPackLoc());
12666         if (DRE.isInvalid())
12667           return ExprError();
12668         ArgStorage = new (getSema().Context) PackExpansionExpr(
12669             getSema().Context.DependentTy, DRE.get(), E->getPackLoc(), None);
12670       }
12671       PackArgs = ArgStorage;
12672     }
12673   }
12674 
12675   // If we're not expanding the pack, just transform the decl.
12676   if (!PackArgs.size()) {
12677     auto *Pack = cast_or_null<NamedDecl>(
12678         getDerived().TransformDecl(E->getPackLoc(), E->getPack()));
12679     if (!Pack)
12680       return ExprError();
12681     return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), Pack,
12682                                               E->getPackLoc(),
12683                                               E->getRParenLoc(), None, None);
12684   }
12685 
12686   // Try to compute the result without performing a partial substitution.
12687   Optional<unsigned> Result = 0;
12688   for (const TemplateArgument &Arg : PackArgs) {
12689     if (!Arg.isPackExpansion()) {
12690       Result = *Result + 1;
12691       continue;
12692     }
12693 
12694     TemplateArgumentLoc ArgLoc;
12695     InventTemplateArgumentLoc(Arg, ArgLoc);
12696 
12697     // Find the pattern of the pack expansion.
12698     SourceLocation Ellipsis;
12699     Optional<unsigned> OrigNumExpansions;
12700     TemplateArgumentLoc Pattern =
12701         getSema().getTemplateArgumentPackExpansionPattern(ArgLoc, Ellipsis,
12702                                                           OrigNumExpansions);
12703 
12704     // Substitute under the pack expansion. Do not expand the pack (yet).
12705     TemplateArgumentLoc OutPattern;
12706     Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
12707     if (getDerived().TransformTemplateArgument(Pattern, OutPattern,
12708                                                /*Uneval*/ true))
12709       return true;
12710 
12711     // See if we can determine the number of arguments from the result.
12712     Optional<unsigned> NumExpansions =
12713         getSema().getFullyPackExpandedSize(OutPattern.getArgument());
12714     if (!NumExpansions) {
12715       // No: we must be in an alias template expansion, and we're going to need
12716       // to actually expand the packs.
12717       Result = None;
12718       break;
12719     }
12720 
12721     Result = *Result + *NumExpansions;
12722   }
12723 
12724   // Common case: we could determine the number of expansions without
12725   // substituting.
12726   if (Result)
12727     return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(),
12728                                               E->getPackLoc(),
12729                                               E->getRParenLoc(), *Result, None);
12730 
12731   TemplateArgumentListInfo TransformedPackArgs(E->getPackLoc(),
12732                                                E->getPackLoc());
12733   {
12734     TemporaryBase Rebase(*this, E->getPackLoc(), getBaseEntity());
12735     typedef TemplateArgumentLocInventIterator<
12736         Derived, const TemplateArgument*> PackLocIterator;
12737     if (TransformTemplateArguments(PackLocIterator(*this, PackArgs.begin()),
12738                                    PackLocIterator(*this, PackArgs.end()),
12739                                    TransformedPackArgs, /*Uneval*/true))
12740       return ExprError();
12741   }
12742 
12743   // Check whether we managed to fully-expand the pack.
12744   // FIXME: Is it possible for us to do so and not hit the early exit path?
12745   SmallVector<TemplateArgument, 8> Args;
12746   bool PartialSubstitution = false;
12747   for (auto &Loc : TransformedPackArgs.arguments()) {
12748     Args.push_back(Loc.getArgument());
12749     if (Loc.getArgument().isPackExpansion())
12750       PartialSubstitution = true;
12751   }
12752 
12753   if (PartialSubstitution)
12754     return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(),
12755                                               E->getPackLoc(),
12756                                               E->getRParenLoc(), None, Args);
12757 
12758   return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(),
12759                                             E->getPackLoc(), E->getRParenLoc(),
12760                                             Args.size(), None);
12761 }
12762 
12763 template<typename Derived>
12764 ExprResult
12765 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmPackExpr(
12766                                           SubstNonTypeTemplateParmPackExpr *E) {
12767   // Default behavior is to do nothing with this transformation.
12768   return E;
12769 }
12770 
12771 template<typename Derived>
12772 ExprResult
12773 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmExpr(
12774                                           SubstNonTypeTemplateParmExpr *E) {
12775   // Default behavior is to do nothing with this transformation.
12776   return E;
12777 }
12778 
12779 template<typename Derived>
12780 ExprResult
12781 TreeTransform<Derived>::TransformFunctionParmPackExpr(FunctionParmPackExpr *E) {
12782   // Default behavior is to do nothing with this transformation.
12783   return E;
12784 }
12785 
12786 template<typename Derived>
12787 ExprResult
12788 TreeTransform<Derived>::TransformMaterializeTemporaryExpr(
12789                                                   MaterializeTemporaryExpr *E) {
12790   return getDerived().TransformExpr(E->getSubExpr());
12791 }
12792 
12793 template<typename Derived>
12794 ExprResult
12795 TreeTransform<Derived>::TransformCXXFoldExpr(CXXFoldExpr *E) {
12796   Expr *Pattern = E->getPattern();
12797 
12798   SmallVector<UnexpandedParameterPack, 2> Unexpanded;
12799   getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
12800   assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
12801 
12802   // Determine whether the set of unexpanded parameter packs can and should
12803   // be expanded.
12804   bool Expand = true;
12805   bool RetainExpansion = false;
12806   Optional<unsigned> OrigNumExpansions = E->getNumExpansions(),
12807                      NumExpansions = OrigNumExpansions;
12808   if (getDerived().TryExpandParameterPacks(E->getEllipsisLoc(),
12809                                            Pattern->getSourceRange(),
12810                                            Unexpanded,
12811                                            Expand, RetainExpansion,
12812                                            NumExpansions))
12813     return true;
12814 
12815   if (!Expand) {
12816     // Do not expand any packs here, just transform and rebuild a fold
12817     // expression.
12818     Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
12819 
12820     ExprResult LHS =
12821         E->getLHS() ? getDerived().TransformExpr(E->getLHS()) : ExprResult();
12822     if (LHS.isInvalid())
12823       return true;
12824 
12825     ExprResult RHS =
12826         E->getRHS() ? getDerived().TransformExpr(E->getRHS()) : ExprResult();
12827     if (RHS.isInvalid())
12828       return true;
12829 
12830     if (!getDerived().AlwaysRebuild() &&
12831         LHS.get() == E->getLHS() && RHS.get() == E->getRHS())
12832       return E;
12833 
12834     return getDerived().RebuildCXXFoldExpr(
12835         E->getBeginLoc(), LHS.get(), E->getOperator(), E->getEllipsisLoc(),
12836         RHS.get(), E->getEndLoc(), NumExpansions);
12837   }
12838 
12839   // The transform has determined that we should perform an elementwise
12840   // expansion of the pattern. Do so.
12841   ExprResult Result = getDerived().TransformExpr(E->getInit());
12842   if (Result.isInvalid())
12843     return true;
12844   bool LeftFold = E->isLeftFold();
12845 
12846   // If we're retaining an expansion for a right fold, it is the innermost
12847   // component and takes the init (if any).
12848   if (!LeftFold && RetainExpansion) {
12849     ForgetPartiallySubstitutedPackRAII Forget(getDerived());
12850 
12851     ExprResult Out = getDerived().TransformExpr(Pattern);
12852     if (Out.isInvalid())
12853       return true;
12854 
12855     Result = getDerived().RebuildCXXFoldExpr(
12856         E->getBeginLoc(), Out.get(), E->getOperator(), E->getEllipsisLoc(),
12857         Result.get(), E->getEndLoc(), OrigNumExpansions);
12858     if (Result.isInvalid())
12859       return true;
12860   }
12861 
12862   for (unsigned I = 0; I != *NumExpansions; ++I) {
12863     Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(
12864         getSema(), LeftFold ? I : *NumExpansions - I - 1);
12865     ExprResult Out = getDerived().TransformExpr(Pattern);
12866     if (Out.isInvalid())
12867       return true;
12868 
12869     if (Out.get()->containsUnexpandedParameterPack()) {
12870       // We still have a pack; retain a pack expansion for this slice.
12871       Result = getDerived().RebuildCXXFoldExpr(
12872           E->getBeginLoc(), LeftFold ? Result.get() : Out.get(),
12873           E->getOperator(), E->getEllipsisLoc(),
12874           LeftFold ? Out.get() : Result.get(), E->getEndLoc(),
12875           OrigNumExpansions);
12876     } else if (Result.isUsable()) {
12877       // We've got down to a single element; build a binary operator.
12878       Result = getDerived().RebuildBinaryOperator(
12879           E->getEllipsisLoc(), E->getOperator(),
12880           LeftFold ? Result.get() : Out.get(),
12881           LeftFold ? Out.get() : Result.get());
12882     } else
12883       Result = Out;
12884 
12885     if (Result.isInvalid())
12886       return true;
12887   }
12888 
12889   // If we're retaining an expansion for a left fold, it is the outermost
12890   // component and takes the complete expansion so far as its init (if any).
12891   if (LeftFold && RetainExpansion) {
12892     ForgetPartiallySubstitutedPackRAII Forget(getDerived());
12893 
12894     ExprResult Out = getDerived().TransformExpr(Pattern);
12895     if (Out.isInvalid())
12896       return true;
12897 
12898     Result = getDerived().RebuildCXXFoldExpr(
12899         E->getBeginLoc(), Result.get(), E->getOperator(), E->getEllipsisLoc(),
12900         Out.get(), E->getEndLoc(), OrigNumExpansions);
12901     if (Result.isInvalid())
12902       return true;
12903   }
12904 
12905   // If we had no init and an empty pack, and we're not retaining an expansion,
12906   // then produce a fallback value or error.
12907   if (Result.isUnset())
12908     return getDerived().RebuildEmptyCXXFoldExpr(E->getEllipsisLoc(),
12909                                                 E->getOperator());
12910 
12911   return Result;
12912 }
12913 
12914 template<typename Derived>
12915 ExprResult
12916 TreeTransform<Derived>::TransformCXXStdInitializerListExpr(
12917     CXXStdInitializerListExpr *E) {
12918   return getDerived().TransformExpr(E->getSubExpr());
12919 }
12920 
12921 template<typename Derived>
12922 ExprResult
12923 TreeTransform<Derived>::TransformObjCStringLiteral(ObjCStringLiteral *E) {
12924   return SemaRef.MaybeBindToTemporary(E);
12925 }
12926 
12927 template<typename Derived>
12928 ExprResult
12929 TreeTransform<Derived>::TransformObjCBoolLiteralExpr(ObjCBoolLiteralExpr *E) {
12930   return E;
12931 }
12932 
12933 template<typename Derived>
12934 ExprResult
12935 TreeTransform<Derived>::TransformObjCBoxedExpr(ObjCBoxedExpr *E) {
12936   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
12937   if (SubExpr.isInvalid())
12938     return ExprError();
12939 
12940   if (!getDerived().AlwaysRebuild() &&
12941       SubExpr.get() == E->getSubExpr())
12942     return E;
12943 
12944   return getDerived().RebuildObjCBoxedExpr(E->getSourceRange(), SubExpr.get());
12945 }
12946 
12947 template<typename Derived>
12948 ExprResult
12949 TreeTransform<Derived>::TransformObjCArrayLiteral(ObjCArrayLiteral *E) {
12950   // Transform each of the elements.
12951   SmallVector<Expr *, 8> Elements;
12952   bool ArgChanged = false;
12953   if (getDerived().TransformExprs(E->getElements(), E->getNumElements(),
12954                                   /*IsCall=*/false, Elements, &ArgChanged))
12955     return ExprError();
12956 
12957   if (!getDerived().AlwaysRebuild() && !ArgChanged)
12958     return SemaRef.MaybeBindToTemporary(E);
12959 
12960   return getDerived().RebuildObjCArrayLiteral(E->getSourceRange(),
12961                                               Elements.data(),
12962                                               Elements.size());
12963 }
12964 
12965 template<typename Derived>
12966 ExprResult
12967 TreeTransform<Derived>::TransformObjCDictionaryLiteral(
12968                                                     ObjCDictionaryLiteral *E) {
12969   // Transform each of the elements.
12970   SmallVector<ObjCDictionaryElement, 8> Elements;
12971   bool ArgChanged = false;
12972   for (unsigned I = 0, N = E->getNumElements(); I != N; ++I) {
12973     ObjCDictionaryElement OrigElement = E->getKeyValueElement(I);
12974 
12975     if (OrigElement.isPackExpansion()) {
12976       // This key/value element is a pack expansion.
12977       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
12978       getSema().collectUnexpandedParameterPacks(OrigElement.Key, Unexpanded);
12979       getSema().collectUnexpandedParameterPacks(OrigElement.Value, Unexpanded);
12980       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
12981 
12982       // Determine whether the set of unexpanded parameter packs can
12983       // and should be expanded.
12984       bool Expand = true;
12985       bool RetainExpansion = false;
12986       Optional<unsigned> OrigNumExpansions = OrigElement.NumExpansions;
12987       Optional<unsigned> NumExpansions = OrigNumExpansions;
12988       SourceRange PatternRange(OrigElement.Key->getBeginLoc(),
12989                                OrigElement.Value->getEndLoc());
12990       if (getDerived().TryExpandParameterPacks(OrigElement.EllipsisLoc,
12991                                                PatternRange, Unexpanded, Expand,
12992                                                RetainExpansion, NumExpansions))
12993         return ExprError();
12994 
12995       if (!Expand) {
12996         // The transform has determined that we should perform a simple
12997         // transformation on the pack expansion, producing another pack
12998         // expansion.
12999         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
13000         ExprResult Key = getDerived().TransformExpr(OrigElement.Key);
13001         if (Key.isInvalid())
13002           return ExprError();
13003 
13004         if (Key.get() != OrigElement.Key)
13005           ArgChanged = true;
13006 
13007         ExprResult Value = getDerived().TransformExpr(OrigElement.Value);
13008         if (Value.isInvalid())
13009           return ExprError();
13010 
13011         if (Value.get() != OrigElement.Value)
13012           ArgChanged = true;
13013 
13014         ObjCDictionaryElement Expansion = {
13015           Key.get(), Value.get(), OrigElement.EllipsisLoc, NumExpansions
13016         };
13017         Elements.push_back(Expansion);
13018         continue;
13019       }
13020 
13021       // Record right away that the argument was changed.  This needs
13022       // to happen even if the array expands to nothing.
13023       ArgChanged = true;
13024 
13025       // The transform has determined that we should perform an elementwise
13026       // expansion of the pattern. Do so.
13027       for (unsigned I = 0; I != *NumExpansions; ++I) {
13028         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
13029         ExprResult Key = getDerived().TransformExpr(OrigElement.Key);
13030         if (Key.isInvalid())
13031           return ExprError();
13032 
13033         ExprResult Value = getDerived().TransformExpr(OrigElement.Value);
13034         if (Value.isInvalid())
13035           return ExprError();
13036 
13037         ObjCDictionaryElement Element = {
13038           Key.get(), Value.get(), SourceLocation(), NumExpansions
13039         };
13040 
13041         // If any unexpanded parameter packs remain, we still have a
13042         // pack expansion.
13043         // FIXME: Can this really happen?
13044         if (Key.get()->containsUnexpandedParameterPack() ||
13045             Value.get()->containsUnexpandedParameterPack())
13046           Element.EllipsisLoc = OrigElement.EllipsisLoc;
13047 
13048         Elements.push_back(Element);
13049       }
13050 
13051       // FIXME: Retain a pack expansion if RetainExpansion is true.
13052 
13053       // We've finished with this pack expansion.
13054       continue;
13055     }
13056 
13057     // Transform and check key.
13058     ExprResult Key = getDerived().TransformExpr(OrigElement.Key);
13059     if (Key.isInvalid())
13060       return ExprError();
13061 
13062     if (Key.get() != OrigElement.Key)
13063       ArgChanged = true;
13064 
13065     // Transform and check value.
13066     ExprResult Value
13067       = getDerived().TransformExpr(OrigElement.Value);
13068     if (Value.isInvalid())
13069       return ExprError();
13070 
13071     if (Value.get() != OrigElement.Value)
13072       ArgChanged = true;
13073 
13074     ObjCDictionaryElement Element = {
13075       Key.get(), Value.get(), SourceLocation(), None
13076     };
13077     Elements.push_back(Element);
13078   }
13079 
13080   if (!getDerived().AlwaysRebuild() && !ArgChanged)
13081     return SemaRef.MaybeBindToTemporary(E);
13082 
13083   return getDerived().RebuildObjCDictionaryLiteral(E->getSourceRange(),
13084                                                    Elements);
13085 }
13086 
13087 template<typename Derived>
13088 ExprResult
13089 TreeTransform<Derived>::TransformObjCEncodeExpr(ObjCEncodeExpr *E) {
13090   TypeSourceInfo *EncodedTypeInfo
13091     = getDerived().TransformType(E->getEncodedTypeSourceInfo());
13092   if (!EncodedTypeInfo)
13093     return ExprError();
13094 
13095   if (!getDerived().AlwaysRebuild() &&
13096       EncodedTypeInfo == E->getEncodedTypeSourceInfo())
13097     return E;
13098 
13099   return getDerived().RebuildObjCEncodeExpr(E->getAtLoc(),
13100                                             EncodedTypeInfo,
13101                                             E->getRParenLoc());
13102 }
13103 
13104 template<typename Derived>
13105 ExprResult TreeTransform<Derived>::
13106 TransformObjCIndirectCopyRestoreExpr(ObjCIndirectCopyRestoreExpr *E) {
13107   // This is a kind of implicit conversion, and it needs to get dropped
13108   // and recomputed for the same general reasons that ImplicitCastExprs
13109   // do, as well a more specific one: this expression is only valid when
13110   // it appears *immediately* as an argument expression.
13111   return getDerived().TransformExpr(E->getSubExpr());
13112 }
13113 
13114 template<typename Derived>
13115 ExprResult TreeTransform<Derived>::
13116 TransformObjCBridgedCastExpr(ObjCBridgedCastExpr *E) {
13117   TypeSourceInfo *TSInfo
13118     = getDerived().TransformType(E->getTypeInfoAsWritten());
13119   if (!TSInfo)
13120     return ExprError();
13121 
13122   ExprResult Result = getDerived().TransformExpr(E->getSubExpr());
13123   if (Result.isInvalid())
13124     return ExprError();
13125 
13126   if (!getDerived().AlwaysRebuild() &&
13127       TSInfo == E->getTypeInfoAsWritten() &&
13128       Result.get() == E->getSubExpr())
13129     return E;
13130 
13131   return SemaRef.BuildObjCBridgedCast(E->getLParenLoc(), E->getBridgeKind(),
13132                                       E->getBridgeKeywordLoc(), TSInfo,
13133                                       Result.get());
13134 }
13135 
13136 template <typename Derived>
13137 ExprResult TreeTransform<Derived>::TransformObjCAvailabilityCheckExpr(
13138     ObjCAvailabilityCheckExpr *E) {
13139   return E;
13140 }
13141 
13142 template<typename Derived>
13143 ExprResult
13144 TreeTransform<Derived>::TransformObjCMessageExpr(ObjCMessageExpr *E) {
13145   // Transform arguments.
13146   bool ArgChanged = false;
13147   SmallVector<Expr*, 8> Args;
13148   Args.reserve(E->getNumArgs());
13149   if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), false, Args,
13150                                   &ArgChanged))
13151     return ExprError();
13152 
13153   if (E->getReceiverKind() == ObjCMessageExpr::Class) {
13154     // Class message: transform the receiver type.
13155     TypeSourceInfo *ReceiverTypeInfo
13156       = getDerived().TransformType(E->getClassReceiverTypeInfo());
13157     if (!ReceiverTypeInfo)
13158       return ExprError();
13159 
13160     // If nothing changed, just retain the existing message send.
13161     if (!getDerived().AlwaysRebuild() &&
13162         ReceiverTypeInfo == E->getClassReceiverTypeInfo() && !ArgChanged)
13163       return SemaRef.MaybeBindToTemporary(E);
13164 
13165     // Build a new class message send.
13166     SmallVector<SourceLocation, 16> SelLocs;
13167     E->getSelectorLocs(SelLocs);
13168     return getDerived().RebuildObjCMessageExpr(ReceiverTypeInfo,
13169                                                E->getSelector(),
13170                                                SelLocs,
13171                                                E->getMethodDecl(),
13172                                                E->getLeftLoc(),
13173                                                Args,
13174                                                E->getRightLoc());
13175   }
13176   else if (E->getReceiverKind() == ObjCMessageExpr::SuperClass ||
13177            E->getReceiverKind() == ObjCMessageExpr::SuperInstance) {
13178     if (!E->getMethodDecl())
13179       return ExprError();
13180 
13181     // Build a new class message send to 'super'.
13182     SmallVector<SourceLocation, 16> SelLocs;
13183     E->getSelectorLocs(SelLocs);
13184     return getDerived().RebuildObjCMessageExpr(E->getSuperLoc(),
13185                                                E->getSelector(),
13186                                                SelLocs,
13187                                                E->getReceiverType(),
13188                                                E->getMethodDecl(),
13189                                                E->getLeftLoc(),
13190                                                Args,
13191                                                E->getRightLoc());
13192   }
13193 
13194   // Instance message: transform the receiver
13195   assert(E->getReceiverKind() == ObjCMessageExpr::Instance &&
13196          "Only class and instance messages may be instantiated");
13197   ExprResult Receiver
13198     = getDerived().TransformExpr(E->getInstanceReceiver());
13199   if (Receiver.isInvalid())
13200     return ExprError();
13201 
13202   // If nothing changed, just retain the existing message send.
13203   if (!getDerived().AlwaysRebuild() &&
13204       Receiver.get() == E->getInstanceReceiver() && !ArgChanged)
13205     return SemaRef.MaybeBindToTemporary(E);
13206 
13207   // Build a new instance message send.
13208   SmallVector<SourceLocation, 16> SelLocs;
13209   E->getSelectorLocs(SelLocs);
13210   return getDerived().RebuildObjCMessageExpr(Receiver.get(),
13211                                              E->getSelector(),
13212                                              SelLocs,
13213                                              E->getMethodDecl(),
13214                                              E->getLeftLoc(),
13215                                              Args,
13216                                              E->getRightLoc());
13217 }
13218 
13219 template<typename Derived>
13220 ExprResult
13221 TreeTransform<Derived>::TransformObjCSelectorExpr(ObjCSelectorExpr *E) {
13222   return E;
13223 }
13224 
13225 template<typename Derived>
13226 ExprResult
13227 TreeTransform<Derived>::TransformObjCProtocolExpr(ObjCProtocolExpr *E) {
13228   return E;
13229 }
13230 
13231 template<typename Derived>
13232 ExprResult
13233 TreeTransform<Derived>::TransformObjCIvarRefExpr(ObjCIvarRefExpr *E) {
13234   // Transform the base expression.
13235   ExprResult Base = getDerived().TransformExpr(E->getBase());
13236   if (Base.isInvalid())
13237     return ExprError();
13238 
13239   // We don't need to transform the ivar; it will never change.
13240 
13241   // If nothing changed, just retain the existing expression.
13242   if (!getDerived().AlwaysRebuild() &&
13243       Base.get() == E->getBase())
13244     return E;
13245 
13246   return getDerived().RebuildObjCIvarRefExpr(Base.get(), E->getDecl(),
13247                                              E->getLocation(),
13248                                              E->isArrow(), E->isFreeIvar());
13249 }
13250 
13251 template<typename Derived>
13252 ExprResult
13253 TreeTransform<Derived>::TransformObjCPropertyRefExpr(ObjCPropertyRefExpr *E) {
13254   // 'super' and types never change. Property never changes. Just
13255   // retain the existing expression.
13256   if (!E->isObjectReceiver())
13257     return E;
13258 
13259   // Transform the base expression.
13260   ExprResult Base = getDerived().TransformExpr(E->getBase());
13261   if (Base.isInvalid())
13262     return ExprError();
13263 
13264   // We don't need to transform the property; it will never change.
13265 
13266   // If nothing changed, just retain the existing expression.
13267   if (!getDerived().AlwaysRebuild() &&
13268       Base.get() == E->getBase())
13269     return E;
13270 
13271   if (E->isExplicitProperty())
13272     return getDerived().RebuildObjCPropertyRefExpr(Base.get(),
13273                                                    E->getExplicitProperty(),
13274                                                    E->getLocation());
13275 
13276   return getDerived().RebuildObjCPropertyRefExpr(Base.get(),
13277                                                  SemaRef.Context.PseudoObjectTy,
13278                                                  E->getImplicitPropertyGetter(),
13279                                                  E->getImplicitPropertySetter(),
13280                                                  E->getLocation());
13281 }
13282 
13283 template<typename Derived>
13284 ExprResult
13285 TreeTransform<Derived>::TransformObjCSubscriptRefExpr(ObjCSubscriptRefExpr *E) {
13286   // Transform the base expression.
13287   ExprResult Base = getDerived().TransformExpr(E->getBaseExpr());
13288   if (Base.isInvalid())
13289     return ExprError();
13290 
13291   // Transform the key expression.
13292   ExprResult Key = getDerived().TransformExpr(E->getKeyExpr());
13293   if (Key.isInvalid())
13294     return ExprError();
13295 
13296   // If nothing changed, just retain the existing expression.
13297   if (!getDerived().AlwaysRebuild() &&
13298       Key.get() == E->getKeyExpr() && Base.get() == E->getBaseExpr())
13299     return E;
13300 
13301   return getDerived().RebuildObjCSubscriptRefExpr(E->getRBracket(),
13302                                                   Base.get(), Key.get(),
13303                                                   E->getAtIndexMethodDecl(),
13304                                                   E->setAtIndexMethodDecl());
13305 }
13306 
13307 template<typename Derived>
13308 ExprResult
13309 TreeTransform<Derived>::TransformObjCIsaExpr(ObjCIsaExpr *E) {
13310   // Transform the base expression.
13311   ExprResult Base = getDerived().TransformExpr(E->getBase());
13312   if (Base.isInvalid())
13313     return ExprError();
13314 
13315   // If nothing changed, just retain the existing expression.
13316   if (!getDerived().AlwaysRebuild() &&
13317       Base.get() == E->getBase())
13318     return E;
13319 
13320   return getDerived().RebuildObjCIsaExpr(Base.get(), E->getIsaMemberLoc(),
13321                                          E->getOpLoc(),
13322                                          E->isArrow());
13323 }
13324 
13325 template<typename Derived>
13326 ExprResult
13327 TreeTransform<Derived>::TransformShuffleVectorExpr(ShuffleVectorExpr *E) {
13328   bool ArgumentChanged = false;
13329   SmallVector<Expr*, 8> SubExprs;
13330   SubExprs.reserve(E->getNumSubExprs());
13331   if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false,
13332                                   SubExprs, &ArgumentChanged))
13333     return ExprError();
13334 
13335   if (!getDerived().AlwaysRebuild() &&
13336       !ArgumentChanged)
13337     return E;
13338 
13339   return getDerived().RebuildShuffleVectorExpr(E->getBuiltinLoc(),
13340                                                SubExprs,
13341                                                E->getRParenLoc());
13342 }
13343 
13344 template<typename Derived>
13345 ExprResult
13346 TreeTransform<Derived>::TransformConvertVectorExpr(ConvertVectorExpr *E) {
13347   ExprResult SrcExpr = getDerived().TransformExpr(E->getSrcExpr());
13348   if (SrcExpr.isInvalid())
13349     return ExprError();
13350 
13351   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo());
13352   if (!Type)
13353     return ExprError();
13354 
13355   if (!getDerived().AlwaysRebuild() &&
13356       Type == E->getTypeSourceInfo() &&
13357       SrcExpr.get() == E->getSrcExpr())
13358     return E;
13359 
13360   return getDerived().RebuildConvertVectorExpr(E->getBuiltinLoc(),
13361                                                SrcExpr.get(), Type,
13362                                                E->getRParenLoc());
13363 }
13364 
13365 template<typename Derived>
13366 ExprResult
13367 TreeTransform<Derived>::TransformBlockExpr(BlockExpr *E) {
13368   BlockDecl *oldBlock = E->getBlockDecl();
13369 
13370   SemaRef.ActOnBlockStart(E->getCaretLocation(), /*Scope=*/nullptr);
13371   BlockScopeInfo *blockScope = SemaRef.getCurBlock();
13372 
13373   blockScope->TheDecl->setIsVariadic(oldBlock->isVariadic());
13374   blockScope->TheDecl->setBlockMissingReturnType(
13375                          oldBlock->blockMissingReturnType());
13376 
13377   SmallVector<ParmVarDecl*, 4> params;
13378   SmallVector<QualType, 4> paramTypes;
13379 
13380   const FunctionProtoType *exprFunctionType = E->getFunctionType();
13381 
13382   // Parameter substitution.
13383   Sema::ExtParameterInfoBuilder extParamInfos;
13384   if (getDerived().TransformFunctionTypeParams(
13385           E->getCaretLocation(), oldBlock->parameters(), nullptr,
13386           exprFunctionType->getExtParameterInfosOrNull(), paramTypes, &params,
13387           extParamInfos)) {
13388     getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr);
13389     return ExprError();
13390   }
13391 
13392   QualType exprResultType =
13393       getDerived().TransformType(exprFunctionType->getReturnType());
13394 
13395   auto epi = exprFunctionType->getExtProtoInfo();
13396   epi.ExtParameterInfos = extParamInfos.getPointerOrNull(paramTypes.size());
13397 
13398   QualType functionType =
13399     getDerived().RebuildFunctionProtoType(exprResultType, paramTypes, epi);
13400   blockScope->FunctionType = functionType;
13401 
13402   // Set the parameters on the block decl.
13403   if (!params.empty())
13404     blockScope->TheDecl->setParams(params);
13405 
13406   if (!oldBlock->blockMissingReturnType()) {
13407     blockScope->HasImplicitReturnType = false;
13408     blockScope->ReturnType = exprResultType;
13409   }
13410 
13411   // Transform the body
13412   StmtResult body = getDerived().TransformStmt(E->getBody());
13413   if (body.isInvalid()) {
13414     getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr);
13415     return ExprError();
13416   }
13417 
13418 #ifndef NDEBUG
13419   // In builds with assertions, make sure that we captured everything we
13420   // captured before.
13421   if (!SemaRef.getDiagnostics().hasErrorOccurred()) {
13422     for (const auto &I : oldBlock->captures()) {
13423       VarDecl *oldCapture = I.getVariable();
13424 
13425       // Ignore parameter packs.
13426       if (oldCapture->isParameterPack())
13427         continue;
13428 
13429       VarDecl *newCapture =
13430         cast<VarDecl>(getDerived().TransformDecl(E->getCaretLocation(),
13431                                                  oldCapture));
13432       assert(blockScope->CaptureMap.count(newCapture));
13433     }
13434     assert(oldBlock->capturesCXXThis() == blockScope->isCXXThisCaptured());
13435   }
13436 #endif
13437 
13438   return SemaRef.ActOnBlockStmtExpr(E->getCaretLocation(), body.get(),
13439                                     /*Scope=*/nullptr);
13440 }
13441 
13442 template<typename Derived>
13443 ExprResult
13444 TreeTransform<Derived>::TransformAsTypeExpr(AsTypeExpr *E) {
13445   llvm_unreachable("Cannot transform asType expressions yet");
13446 }
13447 
13448 template<typename Derived>
13449 ExprResult
13450 TreeTransform<Derived>::TransformAtomicExpr(AtomicExpr *E) {
13451   bool ArgumentChanged = false;
13452   SmallVector<Expr*, 8> SubExprs;
13453   SubExprs.reserve(E->getNumSubExprs());
13454   if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false,
13455                                   SubExprs, &ArgumentChanged))
13456     return ExprError();
13457 
13458   if (!getDerived().AlwaysRebuild() &&
13459       !ArgumentChanged)
13460     return E;
13461 
13462   return getDerived().RebuildAtomicExpr(E->getBuiltinLoc(), SubExprs,
13463                                         E->getOp(), E->getRParenLoc());
13464 }
13465 
13466 //===----------------------------------------------------------------------===//
13467 // Type reconstruction
13468 //===----------------------------------------------------------------------===//
13469 
13470 template<typename Derived>
13471 QualType TreeTransform<Derived>::RebuildPointerType(QualType PointeeType,
13472                                                     SourceLocation Star) {
13473   return SemaRef.BuildPointerType(PointeeType, Star,
13474                                   getDerived().getBaseEntity());
13475 }
13476 
13477 template<typename Derived>
13478 QualType TreeTransform<Derived>::RebuildBlockPointerType(QualType PointeeType,
13479                                                          SourceLocation Star) {
13480   return SemaRef.BuildBlockPointerType(PointeeType, Star,
13481                                        getDerived().getBaseEntity());
13482 }
13483 
13484 template<typename Derived>
13485 QualType
13486 TreeTransform<Derived>::RebuildReferenceType(QualType ReferentType,
13487                                              bool WrittenAsLValue,
13488                                              SourceLocation Sigil) {
13489   return SemaRef.BuildReferenceType(ReferentType, WrittenAsLValue,
13490                                     Sigil, getDerived().getBaseEntity());
13491 }
13492 
13493 template<typename Derived>
13494 QualType
13495 TreeTransform<Derived>::RebuildMemberPointerType(QualType PointeeType,
13496                                                  QualType ClassType,
13497                                                  SourceLocation Sigil) {
13498   return SemaRef.BuildMemberPointerType(PointeeType, ClassType, Sigil,
13499                                         getDerived().getBaseEntity());
13500 }
13501 
13502 template<typename Derived>
13503 QualType TreeTransform<Derived>::RebuildObjCTypeParamType(
13504            const ObjCTypeParamDecl *Decl,
13505            SourceLocation ProtocolLAngleLoc,
13506            ArrayRef<ObjCProtocolDecl *> Protocols,
13507            ArrayRef<SourceLocation> ProtocolLocs,
13508            SourceLocation ProtocolRAngleLoc) {
13509   return SemaRef.BuildObjCTypeParamType(Decl,
13510                                         ProtocolLAngleLoc, Protocols,
13511                                         ProtocolLocs, ProtocolRAngleLoc,
13512                                         /*FailOnError=*/true);
13513 }
13514 
13515 template<typename Derived>
13516 QualType TreeTransform<Derived>::RebuildObjCObjectType(
13517            QualType BaseType,
13518            SourceLocation Loc,
13519            SourceLocation TypeArgsLAngleLoc,
13520            ArrayRef<TypeSourceInfo *> TypeArgs,
13521            SourceLocation TypeArgsRAngleLoc,
13522            SourceLocation ProtocolLAngleLoc,
13523            ArrayRef<ObjCProtocolDecl *> Protocols,
13524            ArrayRef<SourceLocation> ProtocolLocs,
13525            SourceLocation ProtocolRAngleLoc) {
13526   return SemaRef.BuildObjCObjectType(BaseType, Loc, TypeArgsLAngleLoc,
13527                                      TypeArgs, TypeArgsRAngleLoc,
13528                                      ProtocolLAngleLoc, Protocols, ProtocolLocs,
13529                                      ProtocolRAngleLoc,
13530                                      /*FailOnError=*/true);
13531 }
13532 
13533 template<typename Derived>
13534 QualType TreeTransform<Derived>::RebuildObjCObjectPointerType(
13535            QualType PointeeType,
13536            SourceLocation Star) {
13537   return SemaRef.Context.getObjCObjectPointerType(PointeeType);
13538 }
13539 
13540 template<typename Derived>
13541 QualType
13542 TreeTransform<Derived>::RebuildArrayType(QualType ElementType,
13543                                          ArrayType::ArraySizeModifier SizeMod,
13544                                          const llvm::APInt *Size,
13545                                          Expr *SizeExpr,
13546                                          unsigned IndexTypeQuals,
13547                                          SourceRange BracketsRange) {
13548   if (SizeExpr || !Size)
13549     return SemaRef.BuildArrayType(ElementType, SizeMod, SizeExpr,
13550                                   IndexTypeQuals, BracketsRange,
13551                                   getDerived().getBaseEntity());
13552 
13553   QualType Types[] = {
13554     SemaRef.Context.UnsignedCharTy, SemaRef.Context.UnsignedShortTy,
13555     SemaRef.Context.UnsignedIntTy, SemaRef.Context.UnsignedLongTy,
13556     SemaRef.Context.UnsignedLongLongTy, SemaRef.Context.UnsignedInt128Ty
13557   };
13558   const unsigned NumTypes = llvm::array_lengthof(Types);
13559   QualType SizeType;
13560   for (unsigned I = 0; I != NumTypes; ++I)
13561     if (Size->getBitWidth() == SemaRef.Context.getIntWidth(Types[I])) {
13562       SizeType = Types[I];
13563       break;
13564     }
13565 
13566   // Note that we can return a VariableArrayType here in the case where
13567   // the element type was a dependent VariableArrayType.
13568   IntegerLiteral *ArraySize
13569       = IntegerLiteral::Create(SemaRef.Context, *Size, SizeType,
13570                                /*FIXME*/BracketsRange.getBegin());
13571   return SemaRef.BuildArrayType(ElementType, SizeMod, ArraySize,
13572                                 IndexTypeQuals, BracketsRange,
13573                                 getDerived().getBaseEntity());
13574 }
13575 
13576 template<typename Derived>
13577 QualType
13578 TreeTransform<Derived>::RebuildConstantArrayType(QualType ElementType,
13579                                                  ArrayType::ArraySizeModifier SizeMod,
13580                                                  const llvm::APInt &Size,
13581                                                  Expr *SizeExpr,
13582                                                  unsigned IndexTypeQuals,
13583                                                  SourceRange BracketsRange) {
13584   return getDerived().RebuildArrayType(ElementType, SizeMod, &Size, SizeExpr,
13585                                         IndexTypeQuals, BracketsRange);
13586 }
13587 
13588 template<typename Derived>
13589 QualType
13590 TreeTransform<Derived>::RebuildIncompleteArrayType(QualType ElementType,
13591                                           ArrayType::ArraySizeModifier SizeMod,
13592                                                  unsigned IndexTypeQuals,
13593                                                    SourceRange BracketsRange) {
13594   return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr, nullptr,
13595                                        IndexTypeQuals, BracketsRange);
13596 }
13597 
13598 template<typename Derived>
13599 QualType
13600 TreeTransform<Derived>::RebuildVariableArrayType(QualType ElementType,
13601                                           ArrayType::ArraySizeModifier SizeMod,
13602                                                  Expr *SizeExpr,
13603                                                  unsigned IndexTypeQuals,
13604                                                  SourceRange BracketsRange) {
13605   return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr,
13606                                        SizeExpr,
13607                                        IndexTypeQuals, BracketsRange);
13608 }
13609 
13610 template<typename Derived>
13611 QualType
13612 TreeTransform<Derived>::RebuildDependentSizedArrayType(QualType ElementType,
13613                                           ArrayType::ArraySizeModifier SizeMod,
13614                                                        Expr *SizeExpr,
13615                                                        unsigned IndexTypeQuals,
13616                                                    SourceRange BracketsRange) {
13617   return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr,
13618                                        SizeExpr,
13619                                        IndexTypeQuals, BracketsRange);
13620 }
13621 
13622 template <typename Derived>
13623 QualType TreeTransform<Derived>::RebuildDependentAddressSpaceType(
13624     QualType PointeeType, Expr *AddrSpaceExpr, SourceLocation AttributeLoc) {
13625   return SemaRef.BuildAddressSpaceAttr(PointeeType, AddrSpaceExpr,
13626                                           AttributeLoc);
13627 }
13628 
13629 template <typename Derived>
13630 QualType
13631 TreeTransform<Derived>::RebuildVectorType(QualType ElementType,
13632                                           unsigned NumElements,
13633                                           VectorType::VectorKind VecKind) {
13634   // FIXME: semantic checking!
13635   return SemaRef.Context.getVectorType(ElementType, NumElements, VecKind);
13636 }
13637 
13638 template <typename Derived>
13639 QualType TreeTransform<Derived>::RebuildDependentVectorType(
13640     QualType ElementType, Expr *SizeExpr, SourceLocation AttributeLoc,
13641     VectorType::VectorKind VecKind) {
13642   return SemaRef.BuildVectorType(ElementType, SizeExpr, AttributeLoc);
13643 }
13644 
13645 template<typename Derived>
13646 QualType TreeTransform<Derived>::RebuildExtVectorType(QualType ElementType,
13647                                                       unsigned NumElements,
13648                                                  SourceLocation AttributeLoc) {
13649   llvm::APInt numElements(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy),
13650                           NumElements, true);
13651   IntegerLiteral *VectorSize
13652     = IntegerLiteral::Create(SemaRef.Context, numElements, SemaRef.Context.IntTy,
13653                              AttributeLoc);
13654   return SemaRef.BuildExtVectorType(ElementType, VectorSize, AttributeLoc);
13655 }
13656 
13657 template<typename Derived>
13658 QualType
13659 TreeTransform<Derived>::RebuildDependentSizedExtVectorType(QualType ElementType,
13660                                                            Expr *SizeExpr,
13661                                                   SourceLocation AttributeLoc) {
13662   return SemaRef.BuildExtVectorType(ElementType, SizeExpr, AttributeLoc);
13663 }
13664 
13665 template<typename Derived>
13666 QualType TreeTransform<Derived>::RebuildFunctionProtoType(
13667     QualType T,
13668     MutableArrayRef<QualType> ParamTypes,
13669     const FunctionProtoType::ExtProtoInfo &EPI) {
13670   return SemaRef.BuildFunctionType(T, ParamTypes,
13671                                    getDerived().getBaseLocation(),
13672                                    getDerived().getBaseEntity(),
13673                                    EPI);
13674 }
13675 
13676 template<typename Derived>
13677 QualType TreeTransform<Derived>::RebuildFunctionNoProtoType(QualType T) {
13678   return SemaRef.Context.getFunctionNoProtoType(T);
13679 }
13680 
13681 template<typename Derived>
13682 QualType TreeTransform<Derived>::RebuildUnresolvedUsingType(SourceLocation Loc,
13683                                                             Decl *D) {
13684   assert(D && "no decl found");
13685   if (D->isInvalidDecl()) return QualType();
13686 
13687   // FIXME: Doesn't account for ObjCInterfaceDecl!
13688   TypeDecl *Ty;
13689   if (auto *UPD = dyn_cast<UsingPackDecl>(D)) {
13690     // A valid resolved using typename pack expansion decl can have multiple
13691     // UsingDecls, but they must each have exactly one type, and it must be
13692     // the same type in every case. But we must have at least one expansion!
13693     if (UPD->expansions().empty()) {
13694       getSema().Diag(Loc, diag::err_using_pack_expansion_empty)
13695           << UPD->isCXXClassMember() << UPD;
13696       return QualType();
13697     }
13698 
13699     // We might still have some unresolved types. Try to pick a resolved type
13700     // if we can. The final instantiation will check that the remaining
13701     // unresolved types instantiate to the type we pick.
13702     QualType FallbackT;
13703     QualType T;
13704     for (auto *E : UPD->expansions()) {
13705       QualType ThisT = RebuildUnresolvedUsingType(Loc, E);
13706       if (ThisT.isNull())
13707         continue;
13708       else if (ThisT->getAs<UnresolvedUsingType>())
13709         FallbackT = ThisT;
13710       else if (T.isNull())
13711         T = ThisT;
13712       else
13713         assert(getSema().Context.hasSameType(ThisT, T) &&
13714                "mismatched resolved types in using pack expansion");
13715     }
13716     return T.isNull() ? FallbackT : T;
13717   } else if (auto *Using = dyn_cast<UsingDecl>(D)) {
13718     assert(Using->hasTypename() &&
13719            "UnresolvedUsingTypenameDecl transformed to non-typename using");
13720 
13721     // A valid resolved using typename decl points to exactly one type decl.
13722     assert(++Using->shadow_begin() == Using->shadow_end());
13723     Ty = cast<TypeDecl>((*Using->shadow_begin())->getTargetDecl());
13724   } else {
13725     assert(isa<UnresolvedUsingTypenameDecl>(D) &&
13726            "UnresolvedUsingTypenameDecl transformed to non-using decl");
13727     Ty = cast<UnresolvedUsingTypenameDecl>(D);
13728   }
13729 
13730   return SemaRef.Context.getTypeDeclType(Ty);
13731 }
13732 
13733 template<typename Derived>
13734 QualType TreeTransform<Derived>::RebuildTypeOfExprType(Expr *E,
13735                                                        SourceLocation Loc) {
13736   return SemaRef.BuildTypeofExprType(E, Loc);
13737 }
13738 
13739 template<typename Derived>
13740 QualType TreeTransform<Derived>::RebuildTypeOfType(QualType Underlying) {
13741   return SemaRef.Context.getTypeOfType(Underlying);
13742 }
13743 
13744 template<typename Derived>
13745 QualType TreeTransform<Derived>::RebuildDecltypeType(Expr *E,
13746                                                      SourceLocation Loc) {
13747   return SemaRef.BuildDecltypeType(E, Loc);
13748 }
13749 
13750 template<typename Derived>
13751 QualType TreeTransform<Derived>::RebuildUnaryTransformType(QualType BaseType,
13752                                             UnaryTransformType::UTTKind UKind,
13753                                             SourceLocation Loc) {
13754   return SemaRef.BuildUnaryTransformType(BaseType, UKind, Loc);
13755 }
13756 
13757 template<typename Derived>
13758 QualType TreeTransform<Derived>::RebuildTemplateSpecializationType(
13759                                                       TemplateName Template,
13760                                              SourceLocation TemplateNameLoc,
13761                                      TemplateArgumentListInfo &TemplateArgs) {
13762   return SemaRef.CheckTemplateIdType(Template, TemplateNameLoc, TemplateArgs);
13763 }
13764 
13765 template<typename Derived>
13766 QualType TreeTransform<Derived>::RebuildAtomicType(QualType ValueType,
13767                                                    SourceLocation KWLoc) {
13768   return SemaRef.BuildAtomicType(ValueType, KWLoc);
13769 }
13770 
13771 template<typename Derived>
13772 QualType TreeTransform<Derived>::RebuildPipeType(QualType ValueType,
13773                                                  SourceLocation KWLoc,
13774                                                  bool isReadPipe) {
13775   return isReadPipe ? SemaRef.BuildReadPipeType(ValueType, KWLoc)
13776                     : SemaRef.BuildWritePipeType(ValueType, KWLoc);
13777 }
13778 
13779 template<typename Derived>
13780 TemplateName
13781 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS,
13782                                             bool TemplateKW,
13783                                             TemplateDecl *Template) {
13784   return SemaRef.Context.getQualifiedTemplateName(SS.getScopeRep(), TemplateKW,
13785                                                   Template);
13786 }
13787 
13788 template<typename Derived>
13789 TemplateName
13790 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS,
13791                                             SourceLocation TemplateKWLoc,
13792                                             const IdentifierInfo &Name,
13793                                             SourceLocation NameLoc,
13794                                             QualType ObjectType,
13795                                             NamedDecl *FirstQualifierInScope,
13796                                             bool AllowInjectedClassName) {
13797   UnqualifiedId TemplateName;
13798   TemplateName.setIdentifier(&Name, NameLoc);
13799   Sema::TemplateTy Template;
13800   getSema().ActOnTemplateName(/*Scope=*/nullptr, SS, TemplateKWLoc,
13801                               TemplateName, ParsedType::make(ObjectType),
13802                               /*EnteringContext=*/false, Template,
13803                               AllowInjectedClassName);
13804   return Template.get();
13805 }
13806 
13807 template<typename Derived>
13808 TemplateName
13809 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS,
13810                                             SourceLocation TemplateKWLoc,
13811                                             OverloadedOperatorKind Operator,
13812                                             SourceLocation NameLoc,
13813                                             QualType ObjectType,
13814                                             bool AllowInjectedClassName) {
13815   UnqualifiedId Name;
13816   // FIXME: Bogus location information.
13817   SourceLocation SymbolLocations[3] = { NameLoc, NameLoc, NameLoc };
13818   Name.setOperatorFunctionId(NameLoc, Operator, SymbolLocations);
13819   Sema::TemplateTy Template;
13820   getSema().ActOnTemplateName(
13821       /*Scope=*/nullptr, SS, TemplateKWLoc, Name, ParsedType::make(ObjectType),
13822       /*EnteringContext=*/false, Template, AllowInjectedClassName);
13823   return Template.get();
13824 }
13825 
13826 template<typename Derived>
13827 ExprResult
13828 TreeTransform<Derived>::RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op,
13829                                                    SourceLocation OpLoc,
13830                                                    Expr *OrigCallee,
13831                                                    Expr *First,
13832                                                    Expr *Second) {
13833   Expr *Callee = OrigCallee->IgnoreParenCasts();
13834   bool isPostIncDec = Second && (Op == OO_PlusPlus || Op == OO_MinusMinus);
13835 
13836   if (First->getObjectKind() == OK_ObjCProperty) {
13837     BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op);
13838     if (BinaryOperator::isAssignmentOp(Opc))
13839       return SemaRef.checkPseudoObjectAssignment(/*Scope=*/nullptr, OpLoc, Opc,
13840                                                  First, Second);
13841     ExprResult Result = SemaRef.CheckPlaceholderExpr(First);
13842     if (Result.isInvalid())
13843       return ExprError();
13844     First = Result.get();
13845   }
13846 
13847   if (Second && Second->getObjectKind() == OK_ObjCProperty) {
13848     ExprResult Result = SemaRef.CheckPlaceholderExpr(Second);
13849     if (Result.isInvalid())
13850       return ExprError();
13851     Second = Result.get();
13852   }
13853 
13854   // Determine whether this should be a builtin operation.
13855   if (Op == OO_Subscript) {
13856     if (!First->getType()->isOverloadableType() &&
13857         !Second->getType()->isOverloadableType())
13858       return getSema().CreateBuiltinArraySubscriptExpr(
13859           First, Callee->getBeginLoc(), Second, OpLoc);
13860   } else if (Op == OO_Arrow) {
13861     // -> is never a builtin operation.
13862     return SemaRef.BuildOverloadedArrowExpr(nullptr, First, OpLoc);
13863   } else if (Second == nullptr || isPostIncDec) {
13864     if (!First->getType()->isOverloadableType() ||
13865         (Op == OO_Amp && getSema().isQualifiedMemberAccess(First))) {
13866       // The argument is not of overloadable type, or this is an expression
13867       // of the form &Class::member, so try to create a built-in unary
13868       // operation.
13869       UnaryOperatorKind Opc
13870         = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec);
13871 
13872       return getSema().CreateBuiltinUnaryOp(OpLoc, Opc, First);
13873     }
13874   } else {
13875     if (!First->getType()->isOverloadableType() &&
13876         !Second->getType()->isOverloadableType()) {
13877       // Neither of the arguments is an overloadable type, so try to
13878       // create a built-in binary operation.
13879       BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op);
13880       ExprResult Result
13881         = SemaRef.CreateBuiltinBinOp(OpLoc, Opc, First, Second);
13882       if (Result.isInvalid())
13883         return ExprError();
13884 
13885       return Result;
13886     }
13887   }
13888 
13889   // Compute the transformed set of functions (and function templates) to be
13890   // used during overload resolution.
13891   UnresolvedSet<16> Functions;
13892   bool RequiresADL;
13893 
13894   if (UnresolvedLookupExpr *ULE = dyn_cast<UnresolvedLookupExpr>(Callee)) {
13895     Functions.append(ULE->decls_begin(), ULE->decls_end());
13896     // If the overload could not be resolved in the template definition
13897     // (because we had a dependent argument), ADL is performed as part of
13898     // template instantiation.
13899     RequiresADL = ULE->requiresADL();
13900   } else {
13901     // If we've resolved this to a particular non-member function, just call
13902     // that function. If we resolved it to a member function,
13903     // CreateOverloaded* will find that function for us.
13904     NamedDecl *ND = cast<DeclRefExpr>(Callee)->getDecl();
13905     if (!isa<CXXMethodDecl>(ND))
13906       Functions.addDecl(ND);
13907     RequiresADL = false;
13908   }
13909 
13910   // Add any functions found via argument-dependent lookup.
13911   Expr *Args[2] = { First, Second };
13912   unsigned NumArgs = 1 + (Second != nullptr);
13913 
13914   // Create the overloaded operator invocation for unary operators.
13915   if (NumArgs == 1 || isPostIncDec) {
13916     UnaryOperatorKind Opc
13917       = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec);
13918     return SemaRef.CreateOverloadedUnaryOp(OpLoc, Opc, Functions, First,
13919                                            RequiresADL);
13920   }
13921 
13922   if (Op == OO_Subscript) {
13923     SourceLocation LBrace;
13924     SourceLocation RBrace;
13925 
13926     if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Callee)) {
13927         DeclarationNameLoc NameLoc = DRE->getNameInfo().getInfo();
13928         LBrace = SourceLocation::getFromRawEncoding(
13929                     NameLoc.CXXOperatorName.BeginOpNameLoc);
13930         RBrace = SourceLocation::getFromRawEncoding(
13931                     NameLoc.CXXOperatorName.EndOpNameLoc);
13932     } else {
13933       LBrace = Callee->getBeginLoc();
13934       RBrace = OpLoc;
13935     }
13936 
13937     return SemaRef.CreateOverloadedArraySubscriptExpr(LBrace, RBrace,
13938                                                       First, Second);
13939   }
13940 
13941   // Create the overloaded operator invocation for binary operators.
13942   BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op);
13943   ExprResult Result = SemaRef.CreateOverloadedBinOp(
13944       OpLoc, Opc, Functions, Args[0], Args[1], RequiresADL);
13945   if (Result.isInvalid())
13946     return ExprError();
13947 
13948   return Result;
13949 }
13950 
13951 template<typename Derived>
13952 ExprResult
13953 TreeTransform<Derived>::RebuildCXXPseudoDestructorExpr(Expr *Base,
13954                                                      SourceLocation OperatorLoc,
13955                                                        bool isArrow,
13956                                                        CXXScopeSpec &SS,
13957                                                      TypeSourceInfo *ScopeType,
13958                                                        SourceLocation CCLoc,
13959                                                        SourceLocation TildeLoc,
13960                                         PseudoDestructorTypeStorage Destroyed) {
13961   QualType BaseType = Base->getType();
13962   if (Base->isTypeDependent() || Destroyed.getIdentifier() ||
13963       (!isArrow && !BaseType->getAs<RecordType>()) ||
13964       (isArrow && BaseType->getAs<PointerType>() &&
13965        !BaseType->castAs<PointerType>()->getPointeeType()
13966                                               ->template getAs<RecordType>())){
13967     // This pseudo-destructor expression is still a pseudo-destructor.
13968     return SemaRef.BuildPseudoDestructorExpr(
13969         Base, OperatorLoc, isArrow ? tok::arrow : tok::period, SS, ScopeType,
13970         CCLoc, TildeLoc, Destroyed);
13971   }
13972 
13973   TypeSourceInfo *DestroyedType = Destroyed.getTypeSourceInfo();
13974   DeclarationName Name(SemaRef.Context.DeclarationNames.getCXXDestructorName(
13975                  SemaRef.Context.getCanonicalType(DestroyedType->getType())));
13976   DeclarationNameInfo NameInfo(Name, Destroyed.getLocation());
13977   NameInfo.setNamedTypeInfo(DestroyedType);
13978 
13979   // The scope type is now known to be a valid nested name specifier
13980   // component. Tack it on to the end of the nested name specifier.
13981   if (ScopeType) {
13982     if (!ScopeType->getType()->getAs<TagType>()) {
13983       getSema().Diag(ScopeType->getTypeLoc().getBeginLoc(),
13984                      diag::err_expected_class_or_namespace)
13985           << ScopeType->getType() << getSema().getLangOpts().CPlusPlus;
13986       return ExprError();
13987     }
13988     SS.Extend(SemaRef.Context, SourceLocation(), ScopeType->getTypeLoc(),
13989               CCLoc);
13990   }
13991 
13992   SourceLocation TemplateKWLoc; // FIXME: retrieve it from caller.
13993   return getSema().BuildMemberReferenceExpr(Base, BaseType,
13994                                             OperatorLoc, isArrow,
13995                                             SS, TemplateKWLoc,
13996                                             /*FIXME: FirstQualifier*/ nullptr,
13997                                             NameInfo,
13998                                             /*TemplateArgs*/ nullptr,
13999                                             /*S*/nullptr);
14000 }
14001 
14002 template<typename Derived>
14003 StmtResult
14004 TreeTransform<Derived>::TransformCapturedStmt(CapturedStmt *S) {
14005   SourceLocation Loc = S->getBeginLoc();
14006   CapturedDecl *CD = S->getCapturedDecl();
14007   unsigned NumParams = CD->getNumParams();
14008   unsigned ContextParamPos = CD->getContextParamPosition();
14009   SmallVector<Sema::CapturedParamNameType, 4> Params;
14010   for (unsigned I = 0; I < NumParams; ++I) {
14011     if (I != ContextParamPos) {
14012       Params.push_back(
14013              std::make_pair(
14014                   CD->getParam(I)->getName(),
14015                   getDerived().TransformType(CD->getParam(I)->getType())));
14016     } else {
14017       Params.push_back(std::make_pair(StringRef(), QualType()));
14018     }
14019   }
14020   getSema().ActOnCapturedRegionStart(Loc, /*CurScope*/nullptr,
14021                                      S->getCapturedRegionKind(), Params);
14022   StmtResult Body;
14023   {
14024     Sema::CompoundScopeRAII CompoundScope(getSema());
14025     Body = getDerived().TransformStmt(S->getCapturedStmt());
14026   }
14027 
14028   if (Body.isInvalid()) {
14029     getSema().ActOnCapturedRegionError();
14030     return StmtError();
14031   }
14032 
14033   return getSema().ActOnCapturedRegionEnd(Body.get());
14034 }
14035 
14036 } // end namespace clang
14037 
14038 #endif // LLVM_CLANG_LIB_SEMA_TREETRANSFORM_H
14039