xref: /freebsd-src/contrib/llvm-project/clang/lib/Sema/TreeTransform.h (revision 17f01e9963948a18f55eb97173123702c5dae671)
1 //===------- TreeTransform.h - Semantic Tree Transformation -----*- C++ -*-===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //===----------------------------------------------------------------------===//
7 //
8 //  This file implements a semantic tree transformation that takes a given
9 //  AST and rebuilds it, possibly transforming some nodes in the process.
10 //
11 //===----------------------------------------------------------------------===//
12 
13 #ifndef LLVM_CLANG_LIB_SEMA_TREETRANSFORM_H
14 #define LLVM_CLANG_LIB_SEMA_TREETRANSFORM_H
15 
16 #include "CoroutineStmtBuilder.h"
17 #include "TypeLocBuilder.h"
18 #include "clang/AST/Decl.h"
19 #include "clang/AST/DeclObjC.h"
20 #include "clang/AST/DeclTemplate.h"
21 #include "clang/AST/Expr.h"
22 #include "clang/AST/ExprConcepts.h"
23 #include "clang/AST/ExprCXX.h"
24 #include "clang/AST/ExprObjC.h"
25 #include "clang/AST/ExprOpenMP.h"
26 #include "clang/AST/OpenMPClause.h"
27 #include "clang/AST/Stmt.h"
28 #include "clang/AST/StmtCXX.h"
29 #include "clang/AST/StmtObjC.h"
30 #include "clang/AST/StmtOpenMP.h"
31 #include "clang/Sema/Designator.h"
32 #include "clang/Sema/Lookup.h"
33 #include "clang/Sema/Ownership.h"
34 #include "clang/Sema/ParsedTemplate.h"
35 #include "clang/Sema/ScopeInfo.h"
36 #include "clang/Sema/SemaDiagnostic.h"
37 #include "clang/Sema/SemaInternal.h"
38 #include "llvm/ADT/ArrayRef.h"
39 #include "llvm/Support/ErrorHandling.h"
40 #include <algorithm>
41 
42 using namespace llvm::omp;
43 
44 namespace clang {
45 using namespace sema;
46 
47 /// A semantic tree transformation that allows one to transform one
48 /// abstract syntax tree into another.
49 ///
50 /// A new tree transformation is defined by creating a new subclass \c X of
51 /// \c TreeTransform<X> and then overriding certain operations to provide
52 /// behavior specific to that transformation. For example, template
53 /// instantiation is implemented as a tree transformation where the
54 /// transformation of TemplateTypeParmType nodes involves substituting the
55 /// template arguments for their corresponding template parameters; a similar
56 /// transformation is performed for non-type template parameters and
57 /// template template parameters.
58 ///
59 /// This tree-transformation template uses static polymorphism to allow
60 /// subclasses to customize any of its operations. Thus, a subclass can
61 /// override any of the transformation or rebuild operators by providing an
62 /// operation with the same signature as the default implementation. The
63 /// overriding function should not be virtual.
64 ///
65 /// Semantic tree transformations are split into two stages, either of which
66 /// can be replaced by a subclass. The "transform" step transforms an AST node
67 /// or the parts of an AST node using the various transformation functions,
68 /// then passes the pieces on to the "rebuild" step, which constructs a new AST
69 /// node of the appropriate kind from the pieces. The default transformation
70 /// routines recursively transform the operands to composite AST nodes (e.g.,
71 /// the pointee type of a PointerType node) and, if any of those operand nodes
72 /// were changed by the transformation, invokes the rebuild operation to create
73 /// a new AST node.
74 ///
75 /// Subclasses can customize the transformation at various levels. The
76 /// most coarse-grained transformations involve replacing TransformType(),
77 /// TransformExpr(), TransformDecl(), TransformNestedNameSpecifierLoc(),
78 /// TransformTemplateName(), or TransformTemplateArgument() with entirely
79 /// new implementations.
80 ///
81 /// For more fine-grained transformations, subclasses can replace any of the
82 /// \c TransformXXX functions (where XXX is the name of an AST node, e.g.,
83 /// PointerType, StmtExpr) to alter the transformation. As mentioned previously,
84 /// replacing TransformTemplateTypeParmType() allows template instantiation
85 /// to substitute template arguments for their corresponding template
86 /// parameters. Additionally, subclasses can override the \c RebuildXXX
87 /// functions to control how AST nodes are rebuilt when their operands change.
88 /// By default, \c TreeTransform will invoke semantic analysis to rebuild
89 /// AST nodes. However, certain other tree transformations (e.g, cloning) may
90 /// be able to use more efficient rebuild steps.
91 ///
92 /// There are a handful of other functions that can be overridden, allowing one
93 /// to avoid traversing nodes that don't need any transformation
94 /// (\c AlreadyTransformed()), force rebuilding AST nodes even when their
95 /// operands have not changed (\c AlwaysRebuild()), and customize the
96 /// default locations and entity names used for type-checking
97 /// (\c getBaseLocation(), \c getBaseEntity()).
98 template<typename Derived>
99 class TreeTransform {
100   /// Private RAII object that helps us forget and then re-remember
101   /// the template argument corresponding to a partially-substituted parameter
102   /// pack.
103   class ForgetPartiallySubstitutedPackRAII {
104     Derived &Self;
105     TemplateArgument Old;
106 
107   public:
108     ForgetPartiallySubstitutedPackRAII(Derived &Self) : Self(Self) {
109       Old = Self.ForgetPartiallySubstitutedPack();
110     }
111 
112     ~ForgetPartiallySubstitutedPackRAII() {
113       Self.RememberPartiallySubstitutedPack(Old);
114     }
115   };
116 
117 protected:
118   Sema &SemaRef;
119 
120   /// The set of local declarations that have been transformed, for
121   /// cases where we are forced to build new declarations within the transformer
122   /// rather than in the subclass (e.g., lambda closure types).
123   llvm::DenseMap<Decl *, Decl *> TransformedLocalDecls;
124 
125 public:
126   /// Initializes a new tree transformer.
127   TreeTransform(Sema &SemaRef) : SemaRef(SemaRef) { }
128 
129   /// Retrieves a reference to the derived class.
130   Derived &getDerived() { return static_cast<Derived&>(*this); }
131 
132   /// Retrieves a reference to the derived class.
133   const Derived &getDerived() const {
134     return static_cast<const Derived&>(*this);
135   }
136 
137   static inline ExprResult Owned(Expr *E) { return E; }
138   static inline StmtResult Owned(Stmt *S) { return S; }
139 
140   /// Retrieves a reference to the semantic analysis object used for
141   /// this tree transform.
142   Sema &getSema() const { return SemaRef; }
143 
144   /// Whether the transformation should always rebuild AST nodes, even
145   /// if none of the children have changed.
146   ///
147   /// Subclasses may override this function to specify when the transformation
148   /// should rebuild all AST nodes.
149   ///
150   /// We must always rebuild all AST nodes when performing variadic template
151   /// pack expansion, in order to avoid violating the AST invariant that each
152   /// statement node appears at most once in its containing declaration.
153   bool AlwaysRebuild() { return SemaRef.ArgumentPackSubstitutionIndex != -1; }
154 
155   /// Whether the transformation is forming an expression or statement that
156   /// replaces the original. In this case, we'll reuse mangling numbers from
157   /// existing lambdas.
158   bool ReplacingOriginal() { return false; }
159 
160   /// Returns the location of the entity being transformed, if that
161   /// information was not available elsewhere in the AST.
162   ///
163   /// By default, returns no source-location information. Subclasses can
164   /// provide an alternative implementation that provides better location
165   /// information.
166   SourceLocation getBaseLocation() { return SourceLocation(); }
167 
168   /// Returns the name of the entity being transformed, if that
169   /// information was not available elsewhere in the AST.
170   ///
171   /// By default, returns an empty name. Subclasses can provide an alternative
172   /// implementation with a more precise name.
173   DeclarationName getBaseEntity() { return DeclarationName(); }
174 
175   /// Sets the "base" location and entity when that
176   /// information is known based on another transformation.
177   ///
178   /// By default, the source location and entity are ignored. Subclasses can
179   /// override this function to provide a customized implementation.
180   void setBase(SourceLocation Loc, DeclarationName Entity) { }
181 
182   /// RAII object that temporarily sets the base location and entity
183   /// used for reporting diagnostics in types.
184   class TemporaryBase {
185     TreeTransform &Self;
186     SourceLocation OldLocation;
187     DeclarationName OldEntity;
188 
189   public:
190     TemporaryBase(TreeTransform &Self, SourceLocation Location,
191                   DeclarationName Entity) : Self(Self) {
192       OldLocation = Self.getDerived().getBaseLocation();
193       OldEntity = Self.getDerived().getBaseEntity();
194 
195       if (Location.isValid())
196         Self.getDerived().setBase(Location, Entity);
197     }
198 
199     ~TemporaryBase() {
200       Self.getDerived().setBase(OldLocation, OldEntity);
201     }
202   };
203 
204   /// Determine whether the given type \p T has already been
205   /// transformed.
206   ///
207   /// Subclasses can provide an alternative implementation of this routine
208   /// to short-circuit evaluation when it is known that a given type will
209   /// not change. For example, template instantiation need not traverse
210   /// non-dependent types.
211   bool AlreadyTransformed(QualType T) {
212     return T.isNull();
213   }
214 
215   /// Determine whether the given call argument should be dropped, e.g.,
216   /// because it is a default argument.
217   ///
218   /// Subclasses can provide an alternative implementation of this routine to
219   /// determine which kinds of call arguments get dropped. By default,
220   /// CXXDefaultArgument nodes are dropped (prior to transformation).
221   bool DropCallArgument(Expr *E) {
222     return E->isDefaultArgument();
223   }
224 
225   /// Determine whether we should expand a pack expansion with the
226   /// given set of parameter packs into separate arguments by repeatedly
227   /// transforming the pattern.
228   ///
229   /// By default, the transformer never tries to expand pack expansions.
230   /// Subclasses can override this routine to provide different behavior.
231   ///
232   /// \param EllipsisLoc The location of the ellipsis that identifies the
233   /// pack expansion.
234   ///
235   /// \param PatternRange The source range that covers the entire pattern of
236   /// the pack expansion.
237   ///
238   /// \param Unexpanded The set of unexpanded parameter packs within the
239   /// pattern.
240   ///
241   /// \param ShouldExpand Will be set to \c true if the transformer should
242   /// expand the corresponding pack expansions into separate arguments. When
243   /// set, \c NumExpansions must also be set.
244   ///
245   /// \param RetainExpansion Whether the caller should add an unexpanded
246   /// pack expansion after all of the expanded arguments. This is used
247   /// when extending explicitly-specified template argument packs per
248   /// C++0x [temp.arg.explicit]p9.
249   ///
250   /// \param NumExpansions The number of separate arguments that will be in
251   /// the expanded form of the corresponding pack expansion. This is both an
252   /// input and an output parameter, which can be set by the caller if the
253   /// number of expansions is known a priori (e.g., due to a prior substitution)
254   /// and will be set by the callee when the number of expansions is known.
255   /// The callee must set this value when \c ShouldExpand is \c true; it may
256   /// set this value in other cases.
257   ///
258   /// \returns true if an error occurred (e.g., because the parameter packs
259   /// are to be instantiated with arguments of different lengths), false
260   /// otherwise. If false, \c ShouldExpand (and possibly \c NumExpansions)
261   /// must be set.
262   bool TryExpandParameterPacks(SourceLocation EllipsisLoc,
263                                SourceRange PatternRange,
264                                ArrayRef<UnexpandedParameterPack> Unexpanded,
265                                bool &ShouldExpand,
266                                bool &RetainExpansion,
267                                Optional<unsigned> &NumExpansions) {
268     ShouldExpand = false;
269     return false;
270   }
271 
272   /// "Forget" about the partially-substituted pack template argument,
273   /// when performing an instantiation that must preserve the parameter pack
274   /// use.
275   ///
276   /// This routine is meant to be overridden by the template instantiator.
277   TemplateArgument ForgetPartiallySubstitutedPack() {
278     return TemplateArgument();
279   }
280 
281   /// "Remember" the partially-substituted pack template argument
282   /// after performing an instantiation that must preserve the parameter pack
283   /// use.
284   ///
285   /// This routine is meant to be overridden by the template instantiator.
286   void RememberPartiallySubstitutedPack(TemplateArgument Arg) { }
287 
288   /// Note to the derived class when a function parameter pack is
289   /// being expanded.
290   void ExpandingFunctionParameterPack(ParmVarDecl *Pack) { }
291 
292   /// Transforms the given type into another type.
293   ///
294   /// By default, this routine transforms a type by creating a
295   /// TypeSourceInfo for it and delegating to the appropriate
296   /// function.  This is expensive, but we don't mind, because
297   /// this method is deprecated anyway;  all users should be
298   /// switched to storing TypeSourceInfos.
299   ///
300   /// \returns the transformed type.
301   QualType TransformType(QualType T);
302 
303   /// Transforms the given type-with-location into a new
304   /// type-with-location.
305   ///
306   /// By default, this routine transforms a type by delegating to the
307   /// appropriate TransformXXXType to build a new type.  Subclasses
308   /// may override this function (to take over all type
309   /// transformations) or some set of the TransformXXXType functions
310   /// to alter the transformation.
311   TypeSourceInfo *TransformType(TypeSourceInfo *DI);
312 
313   /// Transform the given type-with-location into a new
314   /// type, collecting location information in the given builder
315   /// as necessary.
316   ///
317   QualType TransformType(TypeLocBuilder &TLB, TypeLoc TL);
318 
319   /// Transform a type that is permitted to produce a
320   /// DeducedTemplateSpecializationType.
321   ///
322   /// This is used in the (relatively rare) contexts where it is acceptable
323   /// for transformation to produce a class template type with deduced
324   /// template arguments.
325   /// @{
326   QualType TransformTypeWithDeducedTST(QualType T);
327   TypeSourceInfo *TransformTypeWithDeducedTST(TypeSourceInfo *DI);
328   /// @}
329 
330   /// The reason why the value of a statement is not discarded, if any.
331   enum StmtDiscardKind {
332     SDK_Discarded,
333     SDK_NotDiscarded,
334     SDK_StmtExprResult,
335   };
336 
337   /// Transform the given statement.
338   ///
339   /// By default, this routine transforms a statement by delegating to the
340   /// appropriate TransformXXXStmt function to transform a specific kind of
341   /// statement or the TransformExpr() function to transform an expression.
342   /// Subclasses may override this function to transform statements using some
343   /// other mechanism.
344   ///
345   /// \returns the transformed statement.
346   StmtResult TransformStmt(Stmt *S, StmtDiscardKind SDK = SDK_Discarded);
347 
348   /// Transform the given statement.
349   ///
350   /// By default, this routine transforms a statement by delegating to the
351   /// appropriate TransformOMPXXXClause function to transform a specific kind
352   /// of clause. Subclasses may override this function to transform statements
353   /// using some other mechanism.
354   ///
355   /// \returns the transformed OpenMP clause.
356   OMPClause *TransformOMPClause(OMPClause *S);
357 
358   /// Transform the given attribute.
359   ///
360   /// By default, this routine transforms a statement by delegating to the
361   /// appropriate TransformXXXAttr function to transform a specific kind
362   /// of attribute. Subclasses may override this function to transform
363   /// attributed statements using some other mechanism.
364   ///
365   /// \returns the transformed attribute
366   const Attr *TransformAttr(const Attr *S);
367 
368 /// Transform the specified attribute.
369 ///
370 /// Subclasses should override the transformation of attributes with a pragma
371 /// spelling to transform expressions stored within the attribute.
372 ///
373 /// \returns the transformed attribute.
374 #define ATTR(X)
375 #define PRAGMA_SPELLING_ATTR(X)                                                \
376   const X##Attr *Transform##X##Attr(const X##Attr *R) { return R; }
377 #include "clang/Basic/AttrList.inc"
378 
379   /// Transform the given expression.
380   ///
381   /// By default, this routine transforms an expression by delegating to the
382   /// appropriate TransformXXXExpr function to build a new expression.
383   /// Subclasses may override this function to transform expressions using some
384   /// other mechanism.
385   ///
386   /// \returns the transformed expression.
387   ExprResult TransformExpr(Expr *E);
388 
389   /// Transform the given initializer.
390   ///
391   /// By default, this routine transforms an initializer by stripping off the
392   /// semantic nodes added by initialization, then passing the result to
393   /// TransformExpr or TransformExprs.
394   ///
395   /// \returns the transformed initializer.
396   ExprResult TransformInitializer(Expr *Init, bool NotCopyInit);
397 
398   /// Transform the given list of expressions.
399   ///
400   /// This routine transforms a list of expressions by invoking
401   /// \c TransformExpr() for each subexpression. However, it also provides
402   /// support for variadic templates by expanding any pack expansions (if the
403   /// derived class permits such expansion) along the way. When pack expansions
404   /// are present, the number of outputs may not equal the number of inputs.
405   ///
406   /// \param Inputs The set of expressions to be transformed.
407   ///
408   /// \param NumInputs The number of expressions in \c Inputs.
409   ///
410   /// \param IsCall If \c true, then this transform is being performed on
411   /// function-call arguments, and any arguments that should be dropped, will
412   /// be.
413   ///
414   /// \param Outputs The transformed input expressions will be added to this
415   /// vector.
416   ///
417   /// \param ArgChanged If non-NULL, will be set \c true if any argument changed
418   /// due to transformation.
419   ///
420   /// \returns true if an error occurred, false otherwise.
421   bool TransformExprs(Expr *const *Inputs, unsigned NumInputs, bool IsCall,
422                       SmallVectorImpl<Expr *> &Outputs,
423                       bool *ArgChanged = nullptr);
424 
425   /// Transform the given declaration, which is referenced from a type
426   /// or expression.
427   ///
428   /// By default, acts as the identity function on declarations, unless the
429   /// transformer has had to transform the declaration itself. Subclasses
430   /// may override this function to provide alternate behavior.
431   Decl *TransformDecl(SourceLocation Loc, Decl *D) {
432     llvm::DenseMap<Decl *, Decl *>::iterator Known
433       = TransformedLocalDecls.find(D);
434     if (Known != TransformedLocalDecls.end())
435       return Known->second;
436 
437     return D;
438   }
439 
440   /// Transform the specified condition.
441   ///
442   /// By default, this transforms the variable and expression and rebuilds
443   /// the condition.
444   Sema::ConditionResult TransformCondition(SourceLocation Loc, VarDecl *Var,
445                                            Expr *Expr,
446                                            Sema::ConditionKind Kind);
447 
448   /// Transform the attributes associated with the given declaration and
449   /// place them on the new declaration.
450   ///
451   /// By default, this operation does nothing. Subclasses may override this
452   /// behavior to transform attributes.
453   void transformAttrs(Decl *Old, Decl *New) { }
454 
455   /// Note that a local declaration has been transformed by this
456   /// transformer.
457   ///
458   /// Local declarations are typically transformed via a call to
459   /// TransformDefinition. However, in some cases (e.g., lambda expressions),
460   /// the transformer itself has to transform the declarations. This routine
461   /// can be overridden by a subclass that keeps track of such mappings.
462   void transformedLocalDecl(Decl *Old, ArrayRef<Decl *> New) {
463     assert(New.size() == 1 &&
464            "must override transformedLocalDecl if performing pack expansion");
465     TransformedLocalDecls[Old] = New.front();
466   }
467 
468   /// Transform the definition of the given declaration.
469   ///
470   /// By default, invokes TransformDecl() to transform the declaration.
471   /// Subclasses may override this function to provide alternate behavior.
472   Decl *TransformDefinition(SourceLocation Loc, Decl *D) {
473     return getDerived().TransformDecl(Loc, D);
474   }
475 
476   /// Transform the given declaration, which was the first part of a
477   /// nested-name-specifier in a member access expression.
478   ///
479   /// This specific declaration transformation only applies to the first
480   /// identifier in a nested-name-specifier of a member access expression, e.g.,
481   /// the \c T in \c x->T::member
482   ///
483   /// By default, invokes TransformDecl() to transform the declaration.
484   /// Subclasses may override this function to provide alternate behavior.
485   NamedDecl *TransformFirstQualifierInScope(NamedDecl *D, SourceLocation Loc) {
486     return cast_or_null<NamedDecl>(getDerived().TransformDecl(Loc, D));
487   }
488 
489   /// Transform the set of declarations in an OverloadExpr.
490   bool TransformOverloadExprDecls(OverloadExpr *Old, bool RequiresADL,
491                                   LookupResult &R);
492 
493   /// Transform the given nested-name-specifier with source-location
494   /// information.
495   ///
496   /// By default, transforms all of the types and declarations within the
497   /// nested-name-specifier. Subclasses may override this function to provide
498   /// alternate behavior.
499   NestedNameSpecifierLoc
500   TransformNestedNameSpecifierLoc(NestedNameSpecifierLoc NNS,
501                                   QualType ObjectType = QualType(),
502                                   NamedDecl *FirstQualifierInScope = nullptr);
503 
504   /// Transform the given declaration name.
505   ///
506   /// By default, transforms the types of conversion function, constructor,
507   /// and destructor names and then (if needed) rebuilds the declaration name.
508   /// Identifiers and selectors are returned unmodified. Sublcasses may
509   /// override this function to provide alternate behavior.
510   DeclarationNameInfo
511   TransformDeclarationNameInfo(const DeclarationNameInfo &NameInfo);
512 
513   bool TransformRequiresExprRequirements(ArrayRef<concepts::Requirement *> Reqs,
514       llvm::SmallVectorImpl<concepts::Requirement *> &Transformed);
515   concepts::TypeRequirement *
516   TransformTypeRequirement(concepts::TypeRequirement *Req);
517   concepts::ExprRequirement *
518   TransformExprRequirement(concepts::ExprRequirement *Req);
519   concepts::NestedRequirement *
520   TransformNestedRequirement(concepts::NestedRequirement *Req);
521 
522   /// Transform the given template name.
523   ///
524   /// \param SS The nested-name-specifier that qualifies the template
525   /// name. This nested-name-specifier must already have been transformed.
526   ///
527   /// \param Name The template name to transform.
528   ///
529   /// \param NameLoc The source location of the template name.
530   ///
531   /// \param ObjectType If we're translating a template name within a member
532   /// access expression, this is the type of the object whose member template
533   /// is being referenced.
534   ///
535   /// \param FirstQualifierInScope If the first part of a nested-name-specifier
536   /// also refers to a name within the current (lexical) scope, this is the
537   /// declaration it refers to.
538   ///
539   /// By default, transforms the template name by transforming the declarations
540   /// and nested-name-specifiers that occur within the template name.
541   /// Subclasses may override this function to provide alternate behavior.
542   TemplateName
543   TransformTemplateName(CXXScopeSpec &SS, TemplateName Name,
544                         SourceLocation NameLoc,
545                         QualType ObjectType = QualType(),
546                         NamedDecl *FirstQualifierInScope = nullptr,
547                         bool AllowInjectedClassName = false);
548 
549   /// Transform the given template argument.
550   ///
551   /// By default, this operation transforms the type, expression, or
552   /// declaration stored within the template argument and constructs a
553   /// new template argument from the transformed result. Subclasses may
554   /// override this function to provide alternate behavior.
555   ///
556   /// Returns true if there was an error.
557   bool TransformTemplateArgument(const TemplateArgumentLoc &Input,
558                                  TemplateArgumentLoc &Output,
559                                  bool Uneval = false);
560 
561   /// Transform the given set of template arguments.
562   ///
563   /// By default, this operation transforms all of the template arguments
564   /// in the input set using \c TransformTemplateArgument(), and appends
565   /// the transformed arguments to the output list.
566   ///
567   /// Note that this overload of \c TransformTemplateArguments() is merely
568   /// a convenience function. Subclasses that wish to override this behavior
569   /// should override the iterator-based member template version.
570   ///
571   /// \param Inputs The set of template arguments to be transformed.
572   ///
573   /// \param NumInputs The number of template arguments in \p Inputs.
574   ///
575   /// \param Outputs The set of transformed template arguments output by this
576   /// routine.
577   ///
578   /// Returns true if an error occurred.
579   bool TransformTemplateArguments(const TemplateArgumentLoc *Inputs,
580                                   unsigned NumInputs,
581                                   TemplateArgumentListInfo &Outputs,
582                                   bool Uneval = false) {
583     return TransformTemplateArguments(Inputs, Inputs + NumInputs, Outputs,
584                                       Uneval);
585   }
586 
587   /// Transform the given set of template arguments.
588   ///
589   /// By default, this operation transforms all of the template arguments
590   /// in the input set using \c TransformTemplateArgument(), and appends
591   /// the transformed arguments to the output list.
592   ///
593   /// \param First An iterator to the first template argument.
594   ///
595   /// \param Last An iterator one step past the last template argument.
596   ///
597   /// \param Outputs The set of transformed template arguments output by this
598   /// routine.
599   ///
600   /// Returns true if an error occurred.
601   template<typename InputIterator>
602   bool TransformTemplateArguments(InputIterator First,
603                                   InputIterator Last,
604                                   TemplateArgumentListInfo &Outputs,
605                                   bool Uneval = false);
606 
607   /// Fakes up a TemplateArgumentLoc for a given TemplateArgument.
608   void InventTemplateArgumentLoc(const TemplateArgument &Arg,
609                                  TemplateArgumentLoc &ArgLoc);
610 
611   /// Fakes up a TypeSourceInfo for a type.
612   TypeSourceInfo *InventTypeSourceInfo(QualType T) {
613     return SemaRef.Context.getTrivialTypeSourceInfo(T,
614                        getDerived().getBaseLocation());
615   }
616 
617 #define ABSTRACT_TYPELOC(CLASS, PARENT)
618 #define TYPELOC(CLASS, PARENT)                                   \
619   QualType Transform##CLASS##Type(TypeLocBuilder &TLB, CLASS##TypeLoc T);
620 #include "clang/AST/TypeLocNodes.def"
621 
622   template<typename Fn>
623   QualType TransformFunctionProtoType(TypeLocBuilder &TLB,
624                                       FunctionProtoTypeLoc TL,
625                                       CXXRecordDecl *ThisContext,
626                                       Qualifiers ThisTypeQuals,
627                                       Fn TransformExceptionSpec);
628 
629   bool TransformExceptionSpec(SourceLocation Loc,
630                               FunctionProtoType::ExceptionSpecInfo &ESI,
631                               SmallVectorImpl<QualType> &Exceptions,
632                               bool &Changed);
633 
634   StmtResult TransformSEHHandler(Stmt *Handler);
635 
636   QualType
637   TransformTemplateSpecializationType(TypeLocBuilder &TLB,
638                                       TemplateSpecializationTypeLoc TL,
639                                       TemplateName Template);
640 
641   QualType
642   TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB,
643                                       DependentTemplateSpecializationTypeLoc TL,
644                                                TemplateName Template,
645                                                CXXScopeSpec &SS);
646 
647   QualType TransformDependentTemplateSpecializationType(
648       TypeLocBuilder &TLB, DependentTemplateSpecializationTypeLoc TL,
649       NestedNameSpecifierLoc QualifierLoc);
650 
651   /// Transforms the parameters of a function type into the
652   /// given vectors.
653   ///
654   /// The result vectors should be kept in sync; null entries in the
655   /// variables vector are acceptable.
656   ///
657   /// Return true on error.
658   bool TransformFunctionTypeParams(
659       SourceLocation Loc, ArrayRef<ParmVarDecl *> Params,
660       const QualType *ParamTypes,
661       const FunctionProtoType::ExtParameterInfo *ParamInfos,
662       SmallVectorImpl<QualType> &PTypes, SmallVectorImpl<ParmVarDecl *> *PVars,
663       Sema::ExtParameterInfoBuilder &PInfos);
664 
665   /// Transforms a single function-type parameter.  Return null
666   /// on error.
667   ///
668   /// \param indexAdjustment - A number to add to the parameter's
669   ///   scope index;  can be negative
670   ParmVarDecl *TransformFunctionTypeParam(ParmVarDecl *OldParm,
671                                           int indexAdjustment,
672                                           Optional<unsigned> NumExpansions,
673                                           bool ExpectParameterPack);
674 
675   /// Transform the body of a lambda-expression.
676   StmtResult TransformLambdaBody(LambdaExpr *E, Stmt *Body);
677   /// Alternative implementation of TransformLambdaBody that skips transforming
678   /// the body.
679   StmtResult SkipLambdaBody(LambdaExpr *E, Stmt *Body);
680 
681   QualType TransformReferenceType(TypeLocBuilder &TLB, ReferenceTypeLoc TL);
682 
683   StmtResult TransformCompoundStmt(CompoundStmt *S, bool IsStmtExpr);
684   ExprResult TransformCXXNamedCastExpr(CXXNamedCastExpr *E);
685 
686   TemplateParameterList *TransformTemplateParameterList(
687         TemplateParameterList *TPL) {
688     return TPL;
689   }
690 
691   ExprResult TransformAddressOfOperand(Expr *E);
692 
693   ExprResult TransformDependentScopeDeclRefExpr(DependentScopeDeclRefExpr *E,
694                                                 bool IsAddressOfOperand,
695                                                 TypeSourceInfo **RecoveryTSI);
696 
697   ExprResult TransformParenDependentScopeDeclRefExpr(
698       ParenExpr *PE, DependentScopeDeclRefExpr *DRE, bool IsAddressOfOperand,
699       TypeSourceInfo **RecoveryTSI);
700 
701   StmtResult TransformOMPExecutableDirective(OMPExecutableDirective *S);
702 
703 // FIXME: We use LLVM_ATTRIBUTE_NOINLINE because inlining causes a ridiculous
704 // amount of stack usage with clang.
705 #define STMT(Node, Parent)                        \
706   LLVM_ATTRIBUTE_NOINLINE \
707   StmtResult Transform##Node(Node *S);
708 #define VALUESTMT(Node, Parent)                   \
709   LLVM_ATTRIBUTE_NOINLINE \
710   StmtResult Transform##Node(Node *S, StmtDiscardKind SDK);
711 #define EXPR(Node, Parent)                        \
712   LLVM_ATTRIBUTE_NOINLINE \
713   ExprResult Transform##Node(Node *E);
714 #define ABSTRACT_STMT(Stmt)
715 #include "clang/AST/StmtNodes.inc"
716 
717 #define OPENMP_CLAUSE(Name, Class)                        \
718   LLVM_ATTRIBUTE_NOINLINE \
719   OMPClause *Transform ## Class(Class *S);
720 #include "clang/Basic/OpenMPKinds.def"
721 
722   /// Build a new qualified type given its unqualified type and type location.
723   ///
724   /// By default, this routine adds type qualifiers only to types that can
725   /// have qualifiers, and silently suppresses those qualifiers that are not
726   /// permitted. Subclasses may override this routine to provide different
727   /// behavior.
728   QualType RebuildQualifiedType(QualType T, QualifiedTypeLoc TL);
729 
730   /// Build a new pointer type given its pointee type.
731   ///
732   /// By default, performs semantic analysis when building the pointer type.
733   /// Subclasses may override this routine to provide different behavior.
734   QualType RebuildPointerType(QualType PointeeType, SourceLocation Sigil);
735 
736   /// Build a new block pointer type given its pointee type.
737   ///
738   /// By default, performs semantic analysis when building the block pointer
739   /// type. Subclasses may override this routine to provide different behavior.
740   QualType RebuildBlockPointerType(QualType PointeeType, SourceLocation Sigil);
741 
742   /// Build a new reference type given the type it references.
743   ///
744   /// By default, performs semantic analysis when building the
745   /// reference type. Subclasses may override this routine to provide
746   /// different behavior.
747   ///
748   /// \param LValue whether the type was written with an lvalue sigil
749   /// or an rvalue sigil.
750   QualType RebuildReferenceType(QualType ReferentType,
751                                 bool LValue,
752                                 SourceLocation Sigil);
753 
754   /// Build a new member pointer type given the pointee type and the
755   /// class type it refers into.
756   ///
757   /// By default, performs semantic analysis when building the member pointer
758   /// type. Subclasses may override this routine to provide different behavior.
759   QualType RebuildMemberPointerType(QualType PointeeType, QualType ClassType,
760                                     SourceLocation Sigil);
761 
762   QualType RebuildObjCTypeParamType(const ObjCTypeParamDecl *Decl,
763                                     SourceLocation ProtocolLAngleLoc,
764                                     ArrayRef<ObjCProtocolDecl *> Protocols,
765                                     ArrayRef<SourceLocation> ProtocolLocs,
766                                     SourceLocation ProtocolRAngleLoc);
767 
768   /// Build an Objective-C object type.
769   ///
770   /// By default, performs semantic analysis when building the object type.
771   /// Subclasses may override this routine to provide different behavior.
772   QualType RebuildObjCObjectType(QualType BaseType,
773                                  SourceLocation Loc,
774                                  SourceLocation TypeArgsLAngleLoc,
775                                  ArrayRef<TypeSourceInfo *> TypeArgs,
776                                  SourceLocation TypeArgsRAngleLoc,
777                                  SourceLocation ProtocolLAngleLoc,
778                                  ArrayRef<ObjCProtocolDecl *> Protocols,
779                                  ArrayRef<SourceLocation> ProtocolLocs,
780                                  SourceLocation ProtocolRAngleLoc);
781 
782   /// Build a new Objective-C object pointer type given the pointee type.
783   ///
784   /// By default, directly builds the pointer type, with no additional semantic
785   /// analysis.
786   QualType RebuildObjCObjectPointerType(QualType PointeeType,
787                                         SourceLocation Star);
788 
789   /// Build a new array type given the element type, size
790   /// modifier, size of the array (if known), size expression, and index type
791   /// qualifiers.
792   ///
793   /// By default, performs semantic analysis when building the array type.
794   /// Subclasses may override this routine to provide different behavior.
795   /// Also by default, all of the other Rebuild*Array
796   QualType RebuildArrayType(QualType ElementType,
797                             ArrayType::ArraySizeModifier SizeMod,
798                             const llvm::APInt *Size,
799                             Expr *SizeExpr,
800                             unsigned IndexTypeQuals,
801                             SourceRange BracketsRange);
802 
803   /// Build a new constant array type given the element type, size
804   /// modifier, (known) size of the array, and index type qualifiers.
805   ///
806   /// By default, performs semantic analysis when building the array type.
807   /// Subclasses may override this routine to provide different behavior.
808   QualType RebuildConstantArrayType(QualType ElementType,
809                                     ArrayType::ArraySizeModifier SizeMod,
810                                     const llvm::APInt &Size,
811                                     Expr *SizeExpr,
812                                     unsigned IndexTypeQuals,
813                                     SourceRange BracketsRange);
814 
815   /// Build a new incomplete array type given the element type, size
816   /// modifier, and index type qualifiers.
817   ///
818   /// By default, performs semantic analysis when building the array type.
819   /// Subclasses may override this routine to provide different behavior.
820   QualType RebuildIncompleteArrayType(QualType ElementType,
821                                       ArrayType::ArraySizeModifier SizeMod,
822                                       unsigned IndexTypeQuals,
823                                       SourceRange BracketsRange);
824 
825   /// Build a new variable-length array type given the element type,
826   /// size modifier, size expression, and index type qualifiers.
827   ///
828   /// By default, performs semantic analysis when building the array type.
829   /// Subclasses may override this routine to provide different behavior.
830   QualType RebuildVariableArrayType(QualType ElementType,
831                                     ArrayType::ArraySizeModifier SizeMod,
832                                     Expr *SizeExpr,
833                                     unsigned IndexTypeQuals,
834                                     SourceRange BracketsRange);
835 
836   /// Build a new dependent-sized array type given the element type,
837   /// size modifier, size expression, and index type qualifiers.
838   ///
839   /// By default, performs semantic analysis when building the array type.
840   /// Subclasses may override this routine to provide different behavior.
841   QualType RebuildDependentSizedArrayType(QualType ElementType,
842                                           ArrayType::ArraySizeModifier SizeMod,
843                                           Expr *SizeExpr,
844                                           unsigned IndexTypeQuals,
845                                           SourceRange BracketsRange);
846 
847   /// Build a new vector type given the element type and
848   /// number of elements.
849   ///
850   /// By default, performs semantic analysis when building the vector type.
851   /// Subclasses may override this routine to provide different behavior.
852   QualType RebuildVectorType(QualType ElementType, unsigned NumElements,
853                              VectorType::VectorKind VecKind);
854 
855   /// Build a new potentially dependently-sized extended vector type
856   /// given the element type and number of elements.
857   ///
858   /// By default, performs semantic analysis when building the vector type.
859   /// Subclasses may override this routine to provide different behavior.
860   QualType RebuildDependentVectorType(QualType ElementType, Expr *SizeExpr,
861                                            SourceLocation AttributeLoc,
862                                            VectorType::VectorKind);
863 
864   /// Build a new extended vector type given the element type and
865   /// number of elements.
866   ///
867   /// By default, performs semantic analysis when building the vector type.
868   /// Subclasses may override this routine to provide different behavior.
869   QualType RebuildExtVectorType(QualType ElementType, unsigned NumElements,
870                                 SourceLocation AttributeLoc);
871 
872   /// Build a new potentially dependently-sized extended vector type
873   /// given the element type and number of elements.
874   ///
875   /// By default, performs semantic analysis when building the vector type.
876   /// Subclasses may override this routine to provide different behavior.
877   QualType RebuildDependentSizedExtVectorType(QualType ElementType,
878                                               Expr *SizeExpr,
879                                               SourceLocation AttributeLoc);
880 
881   /// Build a new DependentAddressSpaceType or return the pointee
882   /// type variable with the correct address space (retrieved from
883   /// AddrSpaceExpr) applied to it. The former will be returned in cases
884   /// where the address space remains dependent.
885   ///
886   /// By default, performs semantic analysis when building the type with address
887   /// space applied. Subclasses may override this routine to provide different
888   /// behavior.
889   QualType RebuildDependentAddressSpaceType(QualType PointeeType,
890                                             Expr *AddrSpaceExpr,
891                                             SourceLocation AttributeLoc);
892 
893   /// Build a new function type.
894   ///
895   /// By default, performs semantic analysis when building the function type.
896   /// Subclasses may override this routine to provide different behavior.
897   QualType RebuildFunctionProtoType(QualType T,
898                                     MutableArrayRef<QualType> ParamTypes,
899                                     const FunctionProtoType::ExtProtoInfo &EPI);
900 
901   /// Build a new unprototyped function type.
902   QualType RebuildFunctionNoProtoType(QualType ResultType);
903 
904   /// Rebuild an unresolved typename type, given the decl that
905   /// the UnresolvedUsingTypenameDecl was transformed to.
906   QualType RebuildUnresolvedUsingType(SourceLocation NameLoc, Decl *D);
907 
908   /// Build a new typedef type.
909   QualType RebuildTypedefType(TypedefNameDecl *Typedef) {
910     return SemaRef.Context.getTypeDeclType(Typedef);
911   }
912 
913   /// Build a new MacroDefined type.
914   QualType RebuildMacroQualifiedType(QualType T,
915                                      const IdentifierInfo *MacroII) {
916     return SemaRef.Context.getMacroQualifiedType(T, MacroII);
917   }
918 
919   /// Build a new class/struct/union type.
920   QualType RebuildRecordType(RecordDecl *Record) {
921     return SemaRef.Context.getTypeDeclType(Record);
922   }
923 
924   /// Build a new Enum type.
925   QualType RebuildEnumType(EnumDecl *Enum) {
926     return SemaRef.Context.getTypeDeclType(Enum);
927   }
928 
929   /// Build a new typeof(expr) type.
930   ///
931   /// By default, performs semantic analysis when building the typeof type.
932   /// Subclasses may override this routine to provide different behavior.
933   QualType RebuildTypeOfExprType(Expr *Underlying, SourceLocation Loc);
934 
935   /// Build a new typeof(type) type.
936   ///
937   /// By default, builds a new TypeOfType with the given underlying type.
938   QualType RebuildTypeOfType(QualType Underlying);
939 
940   /// Build a new unary transform type.
941   QualType RebuildUnaryTransformType(QualType BaseType,
942                                      UnaryTransformType::UTTKind UKind,
943                                      SourceLocation Loc);
944 
945   /// Build a new C++11 decltype type.
946   ///
947   /// By default, performs semantic analysis when building the decltype type.
948   /// Subclasses may override this routine to provide different behavior.
949   QualType RebuildDecltypeType(Expr *Underlying, SourceLocation Loc);
950 
951   /// Build a new C++11 auto type.
952   ///
953   /// By default, builds a new AutoType with the given deduced type.
954   QualType RebuildAutoType(QualType Deduced, AutoTypeKeyword Keyword,
955                            ConceptDecl *TypeConstraintConcept,
956                            ArrayRef<TemplateArgument> TypeConstraintArgs) {
957     // Note, IsDependent is always false here: we implicitly convert an 'auto'
958     // which has been deduced to a dependent type into an undeduced 'auto', so
959     // that we'll retry deduction after the transformation.
960     return SemaRef.Context.getAutoType(Deduced, Keyword,
961                                        /*IsDependent*/ false, /*IsPack=*/false,
962                                        TypeConstraintConcept,
963                                        TypeConstraintArgs);
964   }
965 
966   /// By default, builds a new DeducedTemplateSpecializationType with the given
967   /// deduced type.
968   QualType RebuildDeducedTemplateSpecializationType(TemplateName Template,
969       QualType Deduced) {
970     return SemaRef.Context.getDeducedTemplateSpecializationType(
971         Template, Deduced, /*IsDependent*/ false);
972   }
973 
974   /// Build a new template specialization type.
975   ///
976   /// By default, performs semantic analysis when building the template
977   /// specialization type. Subclasses may override this routine to provide
978   /// different behavior.
979   QualType RebuildTemplateSpecializationType(TemplateName Template,
980                                              SourceLocation TemplateLoc,
981                                              TemplateArgumentListInfo &Args);
982 
983   /// Build a new parenthesized type.
984   ///
985   /// By default, builds a new ParenType type from the inner type.
986   /// Subclasses may override this routine to provide different behavior.
987   QualType RebuildParenType(QualType InnerType) {
988     return SemaRef.BuildParenType(InnerType);
989   }
990 
991   /// Build a new qualified name type.
992   ///
993   /// By default, builds a new ElaboratedType type from the keyword,
994   /// the nested-name-specifier and the named type.
995   /// Subclasses may override this routine to provide different behavior.
996   QualType RebuildElaboratedType(SourceLocation KeywordLoc,
997                                  ElaboratedTypeKeyword Keyword,
998                                  NestedNameSpecifierLoc QualifierLoc,
999                                  QualType Named) {
1000     return SemaRef.Context.getElaboratedType(Keyword,
1001                                          QualifierLoc.getNestedNameSpecifier(),
1002                                              Named);
1003   }
1004 
1005   /// Build a new typename type that refers to a template-id.
1006   ///
1007   /// By default, builds a new DependentNameType type from the
1008   /// nested-name-specifier and the given type. Subclasses may override
1009   /// this routine to provide different behavior.
1010   QualType RebuildDependentTemplateSpecializationType(
1011                                           ElaboratedTypeKeyword Keyword,
1012                                           NestedNameSpecifierLoc QualifierLoc,
1013                                           SourceLocation TemplateKWLoc,
1014                                           const IdentifierInfo *Name,
1015                                           SourceLocation NameLoc,
1016                                           TemplateArgumentListInfo &Args,
1017                                           bool AllowInjectedClassName) {
1018     // Rebuild the template name.
1019     // TODO: avoid TemplateName abstraction
1020     CXXScopeSpec SS;
1021     SS.Adopt(QualifierLoc);
1022     TemplateName InstName = getDerived().RebuildTemplateName(
1023         SS, TemplateKWLoc, *Name, NameLoc, QualType(), nullptr,
1024         AllowInjectedClassName);
1025 
1026     if (InstName.isNull())
1027       return QualType();
1028 
1029     // If it's still dependent, make a dependent specialization.
1030     if (InstName.getAsDependentTemplateName())
1031       return SemaRef.Context.getDependentTemplateSpecializationType(Keyword,
1032                                           QualifierLoc.getNestedNameSpecifier(),
1033                                                                     Name,
1034                                                                     Args);
1035 
1036     // Otherwise, make an elaborated type wrapping a non-dependent
1037     // specialization.
1038     QualType T =
1039     getDerived().RebuildTemplateSpecializationType(InstName, NameLoc, Args);
1040     if (T.isNull()) return QualType();
1041 
1042     if (Keyword == ETK_None && QualifierLoc.getNestedNameSpecifier() == nullptr)
1043       return T;
1044 
1045     return SemaRef.Context.getElaboratedType(Keyword,
1046                                        QualifierLoc.getNestedNameSpecifier(),
1047                                              T);
1048   }
1049 
1050   /// Build a new typename type that refers to an identifier.
1051   ///
1052   /// By default, performs semantic analysis when building the typename type
1053   /// (or elaborated type). Subclasses may override this routine to provide
1054   /// different behavior.
1055   QualType RebuildDependentNameType(ElaboratedTypeKeyword Keyword,
1056                                     SourceLocation KeywordLoc,
1057                                     NestedNameSpecifierLoc QualifierLoc,
1058                                     const IdentifierInfo *Id,
1059                                     SourceLocation IdLoc,
1060                                     bool DeducedTSTContext) {
1061     CXXScopeSpec SS;
1062     SS.Adopt(QualifierLoc);
1063 
1064     if (QualifierLoc.getNestedNameSpecifier()->isDependent()) {
1065       // If the name is still dependent, just build a new dependent name type.
1066       if (!SemaRef.computeDeclContext(SS))
1067         return SemaRef.Context.getDependentNameType(Keyword,
1068                                           QualifierLoc.getNestedNameSpecifier(),
1069                                                     Id);
1070     }
1071 
1072     if (Keyword == ETK_None || Keyword == ETK_Typename) {
1073       return SemaRef.CheckTypenameType(Keyword, KeywordLoc, QualifierLoc,
1074                                        *Id, IdLoc, DeducedTSTContext);
1075     }
1076 
1077     TagTypeKind Kind = TypeWithKeyword::getTagTypeKindForKeyword(Keyword);
1078 
1079     // We had a dependent elaborated-type-specifier that has been transformed
1080     // into a non-dependent elaborated-type-specifier. Find the tag we're
1081     // referring to.
1082     LookupResult Result(SemaRef, Id, IdLoc, Sema::LookupTagName);
1083     DeclContext *DC = SemaRef.computeDeclContext(SS, false);
1084     if (!DC)
1085       return QualType();
1086 
1087     if (SemaRef.RequireCompleteDeclContext(SS, DC))
1088       return QualType();
1089 
1090     TagDecl *Tag = nullptr;
1091     SemaRef.LookupQualifiedName(Result, DC);
1092     switch (Result.getResultKind()) {
1093       case LookupResult::NotFound:
1094       case LookupResult::NotFoundInCurrentInstantiation:
1095         break;
1096 
1097       case LookupResult::Found:
1098         Tag = Result.getAsSingle<TagDecl>();
1099         break;
1100 
1101       case LookupResult::FoundOverloaded:
1102       case LookupResult::FoundUnresolvedValue:
1103         llvm_unreachable("Tag lookup cannot find non-tags");
1104 
1105       case LookupResult::Ambiguous:
1106         // Let the LookupResult structure handle ambiguities.
1107         return QualType();
1108     }
1109 
1110     if (!Tag) {
1111       // Check where the name exists but isn't a tag type and use that to emit
1112       // better diagnostics.
1113       LookupResult Result(SemaRef, Id, IdLoc, Sema::LookupTagName);
1114       SemaRef.LookupQualifiedName(Result, DC);
1115       switch (Result.getResultKind()) {
1116         case LookupResult::Found:
1117         case LookupResult::FoundOverloaded:
1118         case LookupResult::FoundUnresolvedValue: {
1119           NamedDecl *SomeDecl = Result.getRepresentativeDecl();
1120           Sema::NonTagKind NTK = SemaRef.getNonTagTypeDeclKind(SomeDecl, Kind);
1121           SemaRef.Diag(IdLoc, diag::err_tag_reference_non_tag) << SomeDecl
1122                                                                << NTK << Kind;
1123           SemaRef.Diag(SomeDecl->getLocation(), diag::note_declared_at);
1124           break;
1125         }
1126         default:
1127           SemaRef.Diag(IdLoc, diag::err_not_tag_in_scope)
1128               << Kind << Id << DC << QualifierLoc.getSourceRange();
1129           break;
1130       }
1131       return QualType();
1132     }
1133 
1134     if (!SemaRef.isAcceptableTagRedeclaration(Tag, Kind, /*isDefinition*/false,
1135                                               IdLoc, Id)) {
1136       SemaRef.Diag(KeywordLoc, diag::err_use_with_wrong_tag) << Id;
1137       SemaRef.Diag(Tag->getLocation(), diag::note_previous_use);
1138       return QualType();
1139     }
1140 
1141     // Build the elaborated-type-specifier type.
1142     QualType T = SemaRef.Context.getTypeDeclType(Tag);
1143     return SemaRef.Context.getElaboratedType(Keyword,
1144                                          QualifierLoc.getNestedNameSpecifier(),
1145                                              T);
1146   }
1147 
1148   /// Build a new pack expansion type.
1149   ///
1150   /// By default, builds a new PackExpansionType type from the given pattern.
1151   /// Subclasses may override this routine to provide different behavior.
1152   QualType RebuildPackExpansionType(QualType Pattern,
1153                                     SourceRange PatternRange,
1154                                     SourceLocation EllipsisLoc,
1155                                     Optional<unsigned> NumExpansions) {
1156     return getSema().CheckPackExpansion(Pattern, PatternRange, EllipsisLoc,
1157                                         NumExpansions);
1158   }
1159 
1160   /// Build a new atomic type given its value type.
1161   ///
1162   /// By default, performs semantic analysis when building the atomic type.
1163   /// Subclasses may override this routine to provide different behavior.
1164   QualType RebuildAtomicType(QualType ValueType, SourceLocation KWLoc);
1165 
1166   /// Build a new pipe type given its value type.
1167   QualType RebuildPipeType(QualType ValueType, SourceLocation KWLoc,
1168                            bool isReadPipe);
1169 
1170   /// Build a new template name given a nested name specifier, a flag
1171   /// indicating whether the "template" keyword was provided, and the template
1172   /// that the template name refers to.
1173   ///
1174   /// By default, builds the new template name directly. Subclasses may override
1175   /// this routine to provide different behavior.
1176   TemplateName RebuildTemplateName(CXXScopeSpec &SS,
1177                                    bool TemplateKW,
1178                                    TemplateDecl *Template);
1179 
1180   /// Build a new template name given a nested name specifier and the
1181   /// name that is referred to as a template.
1182   ///
1183   /// By default, performs semantic analysis to determine whether the name can
1184   /// be resolved to a specific template, then builds the appropriate kind of
1185   /// template name. Subclasses may override this routine to provide different
1186   /// behavior.
1187   TemplateName RebuildTemplateName(CXXScopeSpec &SS,
1188                                    SourceLocation TemplateKWLoc,
1189                                    const IdentifierInfo &Name,
1190                                    SourceLocation NameLoc, QualType ObjectType,
1191                                    NamedDecl *FirstQualifierInScope,
1192                                    bool AllowInjectedClassName);
1193 
1194   /// Build a new template name given a nested name specifier and the
1195   /// overloaded operator name that is referred to as a template.
1196   ///
1197   /// By default, performs semantic analysis to determine whether the name can
1198   /// be resolved to a specific template, then builds the appropriate kind of
1199   /// template name. Subclasses may override this routine to provide different
1200   /// behavior.
1201   TemplateName RebuildTemplateName(CXXScopeSpec &SS,
1202                                    SourceLocation TemplateKWLoc,
1203                                    OverloadedOperatorKind Operator,
1204                                    SourceLocation NameLoc, QualType ObjectType,
1205                                    bool AllowInjectedClassName);
1206 
1207   /// Build a new template name given a template template parameter pack
1208   /// and the
1209   ///
1210   /// By default, performs semantic analysis to determine whether the name can
1211   /// be resolved to a specific template, then builds the appropriate kind of
1212   /// template name. Subclasses may override this routine to provide different
1213   /// behavior.
1214   TemplateName RebuildTemplateName(TemplateTemplateParmDecl *Param,
1215                                    const TemplateArgument &ArgPack) {
1216     return getSema().Context.getSubstTemplateTemplateParmPack(Param, ArgPack);
1217   }
1218 
1219   /// Build a new compound statement.
1220   ///
1221   /// By default, performs semantic analysis to build the new statement.
1222   /// Subclasses may override this routine to provide different behavior.
1223   StmtResult RebuildCompoundStmt(SourceLocation LBraceLoc,
1224                                        MultiStmtArg Statements,
1225                                        SourceLocation RBraceLoc,
1226                                        bool IsStmtExpr) {
1227     return getSema().ActOnCompoundStmt(LBraceLoc, RBraceLoc, Statements,
1228                                        IsStmtExpr);
1229   }
1230 
1231   /// Build a new case statement.
1232   ///
1233   /// By default, performs semantic analysis to build the new statement.
1234   /// Subclasses may override this routine to provide different behavior.
1235   StmtResult RebuildCaseStmt(SourceLocation CaseLoc,
1236                                    Expr *LHS,
1237                                    SourceLocation EllipsisLoc,
1238                                    Expr *RHS,
1239                                    SourceLocation ColonLoc) {
1240     return getSema().ActOnCaseStmt(CaseLoc, LHS, EllipsisLoc, RHS,
1241                                    ColonLoc);
1242   }
1243 
1244   /// Attach the body to a new case statement.
1245   ///
1246   /// By default, performs semantic analysis to build the new statement.
1247   /// Subclasses may override this routine to provide different behavior.
1248   StmtResult RebuildCaseStmtBody(Stmt *S, Stmt *Body) {
1249     getSema().ActOnCaseStmtBody(S, Body);
1250     return S;
1251   }
1252 
1253   /// Build a new default statement.
1254   ///
1255   /// By default, performs semantic analysis to build the new statement.
1256   /// Subclasses may override this routine to provide different behavior.
1257   StmtResult RebuildDefaultStmt(SourceLocation DefaultLoc,
1258                                       SourceLocation ColonLoc,
1259                                       Stmt *SubStmt) {
1260     return getSema().ActOnDefaultStmt(DefaultLoc, ColonLoc, SubStmt,
1261                                       /*CurScope=*/nullptr);
1262   }
1263 
1264   /// Build a new label statement.
1265   ///
1266   /// By default, performs semantic analysis to build the new statement.
1267   /// Subclasses may override this routine to provide different behavior.
1268   StmtResult RebuildLabelStmt(SourceLocation IdentLoc, LabelDecl *L,
1269                               SourceLocation ColonLoc, Stmt *SubStmt) {
1270     return SemaRef.ActOnLabelStmt(IdentLoc, L, ColonLoc, SubStmt);
1271   }
1272 
1273   /// Build a new label statement.
1274   ///
1275   /// By default, performs semantic analysis to build the new statement.
1276   /// Subclasses may override this routine to provide different behavior.
1277   StmtResult RebuildAttributedStmt(SourceLocation AttrLoc,
1278                                    ArrayRef<const Attr*> Attrs,
1279                                    Stmt *SubStmt) {
1280     return SemaRef.ActOnAttributedStmt(AttrLoc, Attrs, SubStmt);
1281   }
1282 
1283   /// Build a new "if" statement.
1284   ///
1285   /// By default, performs semantic analysis to build the new statement.
1286   /// Subclasses may override this routine to provide different behavior.
1287   StmtResult RebuildIfStmt(SourceLocation IfLoc, bool IsConstexpr,
1288                            Sema::ConditionResult Cond, Stmt *Init, Stmt *Then,
1289                            SourceLocation ElseLoc, Stmt *Else) {
1290     return getSema().ActOnIfStmt(IfLoc, IsConstexpr, Init, Cond, Then,
1291                                  ElseLoc, Else);
1292   }
1293 
1294   /// Start building a new switch statement.
1295   ///
1296   /// By default, performs semantic analysis to build the new statement.
1297   /// Subclasses may override this routine to provide different behavior.
1298   StmtResult RebuildSwitchStmtStart(SourceLocation SwitchLoc, Stmt *Init,
1299                                     Sema::ConditionResult Cond) {
1300     return getSema().ActOnStartOfSwitchStmt(SwitchLoc, Init, Cond);
1301   }
1302 
1303   /// Attach the body to the switch statement.
1304   ///
1305   /// By default, performs semantic analysis to build the new statement.
1306   /// Subclasses may override this routine to provide different behavior.
1307   StmtResult RebuildSwitchStmtBody(SourceLocation SwitchLoc,
1308                                    Stmt *Switch, Stmt *Body) {
1309     return getSema().ActOnFinishSwitchStmt(SwitchLoc, Switch, Body);
1310   }
1311 
1312   /// Build a new while statement.
1313   ///
1314   /// By default, performs semantic analysis to build the new statement.
1315   /// Subclasses may override this routine to provide different behavior.
1316   StmtResult RebuildWhileStmt(SourceLocation WhileLoc,
1317                               Sema::ConditionResult Cond, Stmt *Body) {
1318     return getSema().ActOnWhileStmt(WhileLoc, Cond, Body);
1319   }
1320 
1321   /// Build a new do-while statement.
1322   ///
1323   /// By default, performs semantic analysis to build the new statement.
1324   /// Subclasses may override this routine to provide different behavior.
1325   StmtResult RebuildDoStmt(SourceLocation DoLoc, Stmt *Body,
1326                            SourceLocation WhileLoc, SourceLocation LParenLoc,
1327                            Expr *Cond, SourceLocation RParenLoc) {
1328     return getSema().ActOnDoStmt(DoLoc, Body, WhileLoc, LParenLoc,
1329                                  Cond, RParenLoc);
1330   }
1331 
1332   /// Build a new for statement.
1333   ///
1334   /// By default, performs semantic analysis to build the new statement.
1335   /// Subclasses may override this routine to provide different behavior.
1336   StmtResult RebuildForStmt(SourceLocation ForLoc, SourceLocation LParenLoc,
1337                             Stmt *Init, Sema::ConditionResult Cond,
1338                             Sema::FullExprArg Inc, SourceLocation RParenLoc,
1339                             Stmt *Body) {
1340     return getSema().ActOnForStmt(ForLoc, LParenLoc, Init, Cond,
1341                                   Inc, RParenLoc, Body);
1342   }
1343 
1344   /// Build a new goto statement.
1345   ///
1346   /// By default, performs semantic analysis to build the new statement.
1347   /// Subclasses may override this routine to provide different behavior.
1348   StmtResult RebuildGotoStmt(SourceLocation GotoLoc, SourceLocation LabelLoc,
1349                              LabelDecl *Label) {
1350     return getSema().ActOnGotoStmt(GotoLoc, LabelLoc, Label);
1351   }
1352 
1353   /// Build a new indirect goto statement.
1354   ///
1355   /// By default, performs semantic analysis to build the new statement.
1356   /// Subclasses may override this routine to provide different behavior.
1357   StmtResult RebuildIndirectGotoStmt(SourceLocation GotoLoc,
1358                                      SourceLocation StarLoc,
1359                                      Expr *Target) {
1360     return getSema().ActOnIndirectGotoStmt(GotoLoc, StarLoc, Target);
1361   }
1362 
1363   /// Build a new return statement.
1364   ///
1365   /// By default, performs semantic analysis to build the new statement.
1366   /// Subclasses may override this routine to provide different behavior.
1367   StmtResult RebuildReturnStmt(SourceLocation ReturnLoc, Expr *Result) {
1368     return getSema().BuildReturnStmt(ReturnLoc, Result);
1369   }
1370 
1371   /// Build a new declaration statement.
1372   ///
1373   /// By default, performs semantic analysis to build the new statement.
1374   /// Subclasses may override this routine to provide different behavior.
1375   StmtResult RebuildDeclStmt(MutableArrayRef<Decl *> Decls,
1376                              SourceLocation StartLoc, SourceLocation EndLoc) {
1377     Sema::DeclGroupPtrTy DG = getSema().BuildDeclaratorGroup(Decls);
1378     return getSema().ActOnDeclStmt(DG, StartLoc, EndLoc);
1379   }
1380 
1381   /// Build a new inline asm statement.
1382   ///
1383   /// By default, performs semantic analysis to build the new statement.
1384   /// Subclasses may override this routine to provide different behavior.
1385   StmtResult RebuildGCCAsmStmt(SourceLocation AsmLoc, bool IsSimple,
1386                                bool IsVolatile, unsigned NumOutputs,
1387                                unsigned NumInputs, IdentifierInfo **Names,
1388                                MultiExprArg Constraints, MultiExprArg Exprs,
1389                                Expr *AsmString, MultiExprArg Clobbers,
1390                                unsigned NumLabels,
1391                                SourceLocation RParenLoc) {
1392     return getSema().ActOnGCCAsmStmt(AsmLoc, IsSimple, IsVolatile, NumOutputs,
1393                                      NumInputs, Names, Constraints, Exprs,
1394                                      AsmString, Clobbers, NumLabels, RParenLoc);
1395   }
1396 
1397   /// Build a new MS style inline asm statement.
1398   ///
1399   /// By default, performs semantic analysis to build the new statement.
1400   /// Subclasses may override this routine to provide different behavior.
1401   StmtResult RebuildMSAsmStmt(SourceLocation AsmLoc, SourceLocation LBraceLoc,
1402                               ArrayRef<Token> AsmToks,
1403                               StringRef AsmString,
1404                               unsigned NumOutputs, unsigned NumInputs,
1405                               ArrayRef<StringRef> Constraints,
1406                               ArrayRef<StringRef> Clobbers,
1407                               ArrayRef<Expr*> Exprs,
1408                               SourceLocation EndLoc) {
1409     return getSema().ActOnMSAsmStmt(AsmLoc, LBraceLoc, AsmToks, AsmString,
1410                                     NumOutputs, NumInputs,
1411                                     Constraints, Clobbers, Exprs, EndLoc);
1412   }
1413 
1414   /// Build a new co_return statement.
1415   ///
1416   /// By default, performs semantic analysis to build the new statement.
1417   /// Subclasses may override this routine to provide different behavior.
1418   StmtResult RebuildCoreturnStmt(SourceLocation CoreturnLoc, Expr *Result,
1419                                  bool IsImplicit) {
1420     return getSema().BuildCoreturnStmt(CoreturnLoc, Result, IsImplicit);
1421   }
1422 
1423   /// Build a new co_await expression.
1424   ///
1425   /// By default, performs semantic analysis to build the new expression.
1426   /// Subclasses may override this routine to provide different behavior.
1427   ExprResult RebuildCoawaitExpr(SourceLocation CoawaitLoc, Expr *Result,
1428                                 bool IsImplicit) {
1429     return getSema().BuildResolvedCoawaitExpr(CoawaitLoc, Result, IsImplicit);
1430   }
1431 
1432   /// Build a new co_await expression.
1433   ///
1434   /// By default, performs semantic analysis to build the new expression.
1435   /// Subclasses may override this routine to provide different behavior.
1436   ExprResult RebuildDependentCoawaitExpr(SourceLocation CoawaitLoc,
1437                                          Expr *Result,
1438                                          UnresolvedLookupExpr *Lookup) {
1439     return getSema().BuildUnresolvedCoawaitExpr(CoawaitLoc, Result, Lookup);
1440   }
1441 
1442   /// Build a new co_yield expression.
1443   ///
1444   /// By default, performs semantic analysis to build the new expression.
1445   /// Subclasses may override this routine to provide different behavior.
1446   ExprResult RebuildCoyieldExpr(SourceLocation CoyieldLoc, Expr *Result) {
1447     return getSema().BuildCoyieldExpr(CoyieldLoc, Result);
1448   }
1449 
1450   StmtResult RebuildCoroutineBodyStmt(CoroutineBodyStmt::CtorArgs Args) {
1451     return getSema().BuildCoroutineBodyStmt(Args);
1452   }
1453 
1454   /// Build a new Objective-C \@try statement.
1455   ///
1456   /// By default, performs semantic analysis to build the new statement.
1457   /// Subclasses may override this routine to provide different behavior.
1458   StmtResult RebuildObjCAtTryStmt(SourceLocation AtLoc,
1459                                         Stmt *TryBody,
1460                                         MultiStmtArg CatchStmts,
1461                                         Stmt *Finally) {
1462     return getSema().ActOnObjCAtTryStmt(AtLoc, TryBody, CatchStmts,
1463                                         Finally);
1464   }
1465 
1466   /// Rebuild an Objective-C exception declaration.
1467   ///
1468   /// By default, performs semantic analysis to build the new declaration.
1469   /// Subclasses may override this routine to provide different behavior.
1470   VarDecl *RebuildObjCExceptionDecl(VarDecl *ExceptionDecl,
1471                                     TypeSourceInfo *TInfo, QualType T) {
1472     return getSema().BuildObjCExceptionDecl(TInfo, T,
1473                                             ExceptionDecl->getInnerLocStart(),
1474                                             ExceptionDecl->getLocation(),
1475                                             ExceptionDecl->getIdentifier());
1476   }
1477 
1478   /// Build a new Objective-C \@catch statement.
1479   ///
1480   /// By default, performs semantic analysis to build the new statement.
1481   /// Subclasses may override this routine to provide different behavior.
1482   StmtResult RebuildObjCAtCatchStmt(SourceLocation AtLoc,
1483                                           SourceLocation RParenLoc,
1484                                           VarDecl *Var,
1485                                           Stmt *Body) {
1486     return getSema().ActOnObjCAtCatchStmt(AtLoc, RParenLoc,
1487                                           Var, Body);
1488   }
1489 
1490   /// Build a new Objective-C \@finally statement.
1491   ///
1492   /// By default, performs semantic analysis to build the new statement.
1493   /// Subclasses may override this routine to provide different behavior.
1494   StmtResult RebuildObjCAtFinallyStmt(SourceLocation AtLoc,
1495                                             Stmt *Body) {
1496     return getSema().ActOnObjCAtFinallyStmt(AtLoc, Body);
1497   }
1498 
1499   /// Build a new Objective-C \@throw statement.
1500   ///
1501   /// By default, performs semantic analysis to build the new statement.
1502   /// Subclasses may override this routine to provide different behavior.
1503   StmtResult RebuildObjCAtThrowStmt(SourceLocation AtLoc,
1504                                           Expr *Operand) {
1505     return getSema().BuildObjCAtThrowStmt(AtLoc, Operand);
1506   }
1507 
1508   /// Build a new OpenMP executable directive.
1509   ///
1510   /// By default, performs semantic analysis to build the new statement.
1511   /// Subclasses may override this routine to provide different behavior.
1512   StmtResult RebuildOMPExecutableDirective(OpenMPDirectiveKind Kind,
1513                                            DeclarationNameInfo DirName,
1514                                            OpenMPDirectiveKind CancelRegion,
1515                                            ArrayRef<OMPClause *> Clauses,
1516                                            Stmt *AStmt, SourceLocation StartLoc,
1517                                            SourceLocation EndLoc) {
1518     return getSema().ActOnOpenMPExecutableDirective(
1519         Kind, DirName, CancelRegion, Clauses, AStmt, StartLoc, EndLoc);
1520   }
1521 
1522   /// Build a new OpenMP 'if' clause.
1523   ///
1524   /// By default, performs semantic analysis to build the new OpenMP clause.
1525   /// Subclasses may override this routine to provide different behavior.
1526   OMPClause *RebuildOMPIfClause(OpenMPDirectiveKind NameModifier,
1527                                 Expr *Condition, SourceLocation StartLoc,
1528                                 SourceLocation LParenLoc,
1529                                 SourceLocation NameModifierLoc,
1530                                 SourceLocation ColonLoc,
1531                                 SourceLocation EndLoc) {
1532     return getSema().ActOnOpenMPIfClause(NameModifier, Condition, StartLoc,
1533                                          LParenLoc, NameModifierLoc, ColonLoc,
1534                                          EndLoc);
1535   }
1536 
1537   /// Build a new OpenMP 'final' clause.
1538   ///
1539   /// By default, performs semantic analysis to build the new OpenMP clause.
1540   /// Subclasses may override this routine to provide different behavior.
1541   OMPClause *RebuildOMPFinalClause(Expr *Condition, SourceLocation StartLoc,
1542                                    SourceLocation LParenLoc,
1543                                    SourceLocation EndLoc) {
1544     return getSema().ActOnOpenMPFinalClause(Condition, StartLoc, LParenLoc,
1545                                             EndLoc);
1546   }
1547 
1548   /// Build a new OpenMP 'num_threads' clause.
1549   ///
1550   /// By default, performs semantic analysis to build the new OpenMP clause.
1551   /// Subclasses may override this routine to provide different behavior.
1552   OMPClause *RebuildOMPNumThreadsClause(Expr *NumThreads,
1553                                         SourceLocation StartLoc,
1554                                         SourceLocation LParenLoc,
1555                                         SourceLocation EndLoc) {
1556     return getSema().ActOnOpenMPNumThreadsClause(NumThreads, StartLoc,
1557                                                  LParenLoc, EndLoc);
1558   }
1559 
1560   /// Build a new OpenMP 'safelen' clause.
1561   ///
1562   /// By default, performs semantic analysis to build the new OpenMP clause.
1563   /// Subclasses may override this routine to provide different behavior.
1564   OMPClause *RebuildOMPSafelenClause(Expr *Len, SourceLocation StartLoc,
1565                                      SourceLocation LParenLoc,
1566                                      SourceLocation EndLoc) {
1567     return getSema().ActOnOpenMPSafelenClause(Len, StartLoc, LParenLoc, EndLoc);
1568   }
1569 
1570   /// Build a new OpenMP 'simdlen' clause.
1571   ///
1572   /// By default, performs semantic analysis to build the new OpenMP clause.
1573   /// Subclasses may override this routine to provide different behavior.
1574   OMPClause *RebuildOMPSimdlenClause(Expr *Len, SourceLocation StartLoc,
1575                                      SourceLocation LParenLoc,
1576                                      SourceLocation EndLoc) {
1577     return getSema().ActOnOpenMPSimdlenClause(Len, StartLoc, LParenLoc, EndLoc);
1578   }
1579 
1580   /// Build a new OpenMP 'allocator' clause.
1581   ///
1582   /// By default, performs semantic analysis to build the new OpenMP clause.
1583   /// Subclasses may override this routine to provide different behavior.
1584   OMPClause *RebuildOMPAllocatorClause(Expr *A, SourceLocation StartLoc,
1585                                        SourceLocation LParenLoc,
1586                                        SourceLocation EndLoc) {
1587     return getSema().ActOnOpenMPAllocatorClause(A, StartLoc, LParenLoc, EndLoc);
1588   }
1589 
1590   /// Build a new OpenMP 'collapse' clause.
1591   ///
1592   /// By default, performs semantic analysis to build the new OpenMP clause.
1593   /// Subclasses may override this routine to provide different behavior.
1594   OMPClause *RebuildOMPCollapseClause(Expr *Num, SourceLocation StartLoc,
1595                                       SourceLocation LParenLoc,
1596                                       SourceLocation EndLoc) {
1597     return getSema().ActOnOpenMPCollapseClause(Num, StartLoc, LParenLoc,
1598                                                EndLoc);
1599   }
1600 
1601   /// Build a new OpenMP 'default' clause.
1602   ///
1603   /// By default, performs semantic analysis to build the new OpenMP clause.
1604   /// Subclasses may override this routine to provide different behavior.
1605   OMPClause *RebuildOMPDefaultClause(OpenMPDefaultClauseKind Kind,
1606                                      SourceLocation KindKwLoc,
1607                                      SourceLocation StartLoc,
1608                                      SourceLocation LParenLoc,
1609                                      SourceLocation EndLoc) {
1610     return getSema().ActOnOpenMPDefaultClause(Kind, KindKwLoc,
1611                                               StartLoc, LParenLoc, EndLoc);
1612   }
1613 
1614   /// Build a new OpenMP 'proc_bind' clause.
1615   ///
1616   /// By default, performs semantic analysis to build the new OpenMP clause.
1617   /// Subclasses may override this routine to provide different behavior.
1618   OMPClause *RebuildOMPProcBindClause(ProcBindKind Kind,
1619                                       SourceLocation KindKwLoc,
1620                                       SourceLocation StartLoc,
1621                                       SourceLocation LParenLoc,
1622                                       SourceLocation EndLoc) {
1623     return getSema().ActOnOpenMPProcBindClause(Kind, KindKwLoc,
1624                                                StartLoc, LParenLoc, EndLoc);
1625   }
1626 
1627   /// Build a new OpenMP 'schedule' clause.
1628   ///
1629   /// By default, performs semantic analysis to build the new OpenMP clause.
1630   /// Subclasses may override this routine to provide different behavior.
1631   OMPClause *RebuildOMPScheduleClause(
1632       OpenMPScheduleClauseModifier M1, OpenMPScheduleClauseModifier M2,
1633       OpenMPScheduleClauseKind Kind, Expr *ChunkSize, SourceLocation StartLoc,
1634       SourceLocation LParenLoc, SourceLocation M1Loc, SourceLocation M2Loc,
1635       SourceLocation KindLoc, SourceLocation CommaLoc, SourceLocation EndLoc) {
1636     return getSema().ActOnOpenMPScheduleClause(
1637         M1, M2, Kind, ChunkSize, StartLoc, LParenLoc, M1Loc, M2Loc, KindLoc,
1638         CommaLoc, EndLoc);
1639   }
1640 
1641   /// Build a new OpenMP 'ordered' clause.
1642   ///
1643   /// By default, performs semantic analysis to build the new OpenMP clause.
1644   /// Subclasses may override this routine to provide different behavior.
1645   OMPClause *RebuildOMPOrderedClause(SourceLocation StartLoc,
1646                                      SourceLocation EndLoc,
1647                                      SourceLocation LParenLoc, Expr *Num) {
1648     return getSema().ActOnOpenMPOrderedClause(StartLoc, EndLoc, LParenLoc, Num);
1649   }
1650 
1651   /// Build a new OpenMP 'private' clause.
1652   ///
1653   /// By default, performs semantic analysis to build the new OpenMP clause.
1654   /// Subclasses may override this routine to provide different behavior.
1655   OMPClause *RebuildOMPPrivateClause(ArrayRef<Expr *> VarList,
1656                                      SourceLocation StartLoc,
1657                                      SourceLocation LParenLoc,
1658                                      SourceLocation EndLoc) {
1659     return getSema().ActOnOpenMPPrivateClause(VarList, StartLoc, LParenLoc,
1660                                               EndLoc);
1661   }
1662 
1663   /// Build a new OpenMP 'firstprivate' clause.
1664   ///
1665   /// By default, performs semantic analysis to build the new OpenMP clause.
1666   /// Subclasses may override this routine to provide different behavior.
1667   OMPClause *RebuildOMPFirstprivateClause(ArrayRef<Expr *> VarList,
1668                                           SourceLocation StartLoc,
1669                                           SourceLocation LParenLoc,
1670                                           SourceLocation EndLoc) {
1671     return getSema().ActOnOpenMPFirstprivateClause(VarList, StartLoc, LParenLoc,
1672                                                    EndLoc);
1673   }
1674 
1675   /// Build a new OpenMP 'lastprivate' clause.
1676   ///
1677   /// By default, performs semantic analysis to build the new OpenMP clause.
1678   /// Subclasses may override this routine to provide different behavior.
1679   OMPClause *RebuildOMPLastprivateClause(ArrayRef<Expr *> VarList,
1680                                          OpenMPLastprivateModifier LPKind,
1681                                          SourceLocation LPKindLoc,
1682                                          SourceLocation ColonLoc,
1683                                          SourceLocation StartLoc,
1684                                          SourceLocation LParenLoc,
1685                                          SourceLocation EndLoc) {
1686     return getSema().ActOnOpenMPLastprivateClause(
1687         VarList, LPKind, LPKindLoc, ColonLoc, StartLoc, LParenLoc, EndLoc);
1688   }
1689 
1690   /// Build a new OpenMP 'shared' clause.
1691   ///
1692   /// By default, performs semantic analysis to build the new OpenMP clause.
1693   /// Subclasses may override this routine to provide different behavior.
1694   OMPClause *RebuildOMPSharedClause(ArrayRef<Expr *> VarList,
1695                                     SourceLocation StartLoc,
1696                                     SourceLocation LParenLoc,
1697                                     SourceLocation EndLoc) {
1698     return getSema().ActOnOpenMPSharedClause(VarList, StartLoc, LParenLoc,
1699                                              EndLoc);
1700   }
1701 
1702   /// Build a new OpenMP 'reduction' clause.
1703   ///
1704   /// By default, performs semantic analysis to build the new statement.
1705   /// Subclasses may override this routine to provide different behavior.
1706   OMPClause *RebuildOMPReductionClause(ArrayRef<Expr *> VarList,
1707                                        SourceLocation StartLoc,
1708                                        SourceLocation LParenLoc,
1709                                        SourceLocation ColonLoc,
1710                                        SourceLocation EndLoc,
1711                                        CXXScopeSpec &ReductionIdScopeSpec,
1712                                        const DeclarationNameInfo &ReductionId,
1713                                        ArrayRef<Expr *> UnresolvedReductions) {
1714     return getSema().ActOnOpenMPReductionClause(
1715         VarList, StartLoc, LParenLoc, ColonLoc, EndLoc, ReductionIdScopeSpec,
1716         ReductionId, UnresolvedReductions);
1717   }
1718 
1719   /// Build a new OpenMP 'task_reduction' clause.
1720   ///
1721   /// By default, performs semantic analysis to build the new statement.
1722   /// Subclasses may override this routine to provide different behavior.
1723   OMPClause *RebuildOMPTaskReductionClause(
1724       ArrayRef<Expr *> VarList, SourceLocation StartLoc,
1725       SourceLocation LParenLoc, SourceLocation ColonLoc, SourceLocation EndLoc,
1726       CXXScopeSpec &ReductionIdScopeSpec,
1727       const DeclarationNameInfo &ReductionId,
1728       ArrayRef<Expr *> UnresolvedReductions) {
1729     return getSema().ActOnOpenMPTaskReductionClause(
1730         VarList, StartLoc, LParenLoc, ColonLoc, EndLoc, ReductionIdScopeSpec,
1731         ReductionId, UnresolvedReductions);
1732   }
1733 
1734   /// Build a new OpenMP 'in_reduction' clause.
1735   ///
1736   /// By default, performs semantic analysis to build the new statement.
1737   /// Subclasses may override this routine to provide different behavior.
1738   OMPClause *
1739   RebuildOMPInReductionClause(ArrayRef<Expr *> VarList, SourceLocation StartLoc,
1740                               SourceLocation LParenLoc, SourceLocation ColonLoc,
1741                               SourceLocation EndLoc,
1742                               CXXScopeSpec &ReductionIdScopeSpec,
1743                               const DeclarationNameInfo &ReductionId,
1744                               ArrayRef<Expr *> UnresolvedReductions) {
1745     return getSema().ActOnOpenMPInReductionClause(
1746         VarList, StartLoc, LParenLoc, ColonLoc, EndLoc, ReductionIdScopeSpec,
1747         ReductionId, UnresolvedReductions);
1748   }
1749 
1750   /// Build a new OpenMP 'linear' clause.
1751   ///
1752   /// By default, performs semantic analysis to build the new OpenMP clause.
1753   /// Subclasses may override this routine to provide different behavior.
1754   OMPClause *RebuildOMPLinearClause(ArrayRef<Expr *> VarList, Expr *Step,
1755                                     SourceLocation StartLoc,
1756                                     SourceLocation LParenLoc,
1757                                     OpenMPLinearClauseKind Modifier,
1758                                     SourceLocation ModifierLoc,
1759                                     SourceLocation ColonLoc,
1760                                     SourceLocation EndLoc) {
1761     return getSema().ActOnOpenMPLinearClause(VarList, Step, StartLoc, LParenLoc,
1762                                              Modifier, ModifierLoc, ColonLoc,
1763                                              EndLoc);
1764   }
1765 
1766   /// Build a new OpenMP 'aligned' clause.
1767   ///
1768   /// By default, performs semantic analysis to build the new OpenMP clause.
1769   /// Subclasses may override this routine to provide different behavior.
1770   OMPClause *RebuildOMPAlignedClause(ArrayRef<Expr *> VarList, Expr *Alignment,
1771                                      SourceLocation StartLoc,
1772                                      SourceLocation LParenLoc,
1773                                      SourceLocation ColonLoc,
1774                                      SourceLocation EndLoc) {
1775     return getSema().ActOnOpenMPAlignedClause(VarList, Alignment, StartLoc,
1776                                               LParenLoc, ColonLoc, EndLoc);
1777   }
1778 
1779   /// Build a new OpenMP 'copyin' clause.
1780   ///
1781   /// By default, performs semantic analysis to build the new OpenMP clause.
1782   /// Subclasses may override this routine to provide different behavior.
1783   OMPClause *RebuildOMPCopyinClause(ArrayRef<Expr *> VarList,
1784                                     SourceLocation StartLoc,
1785                                     SourceLocation LParenLoc,
1786                                     SourceLocation EndLoc) {
1787     return getSema().ActOnOpenMPCopyinClause(VarList, StartLoc, LParenLoc,
1788                                              EndLoc);
1789   }
1790 
1791   /// Build a new OpenMP 'copyprivate' clause.
1792   ///
1793   /// By default, performs semantic analysis to build the new OpenMP clause.
1794   /// Subclasses may override this routine to provide different behavior.
1795   OMPClause *RebuildOMPCopyprivateClause(ArrayRef<Expr *> VarList,
1796                                          SourceLocation StartLoc,
1797                                          SourceLocation LParenLoc,
1798                                          SourceLocation EndLoc) {
1799     return getSema().ActOnOpenMPCopyprivateClause(VarList, StartLoc, LParenLoc,
1800                                                   EndLoc);
1801   }
1802 
1803   /// Build a new OpenMP 'flush' pseudo clause.
1804   ///
1805   /// By default, performs semantic analysis to build the new OpenMP clause.
1806   /// Subclasses may override this routine to provide different behavior.
1807   OMPClause *RebuildOMPFlushClause(ArrayRef<Expr *> VarList,
1808                                    SourceLocation StartLoc,
1809                                    SourceLocation LParenLoc,
1810                                    SourceLocation EndLoc) {
1811     return getSema().ActOnOpenMPFlushClause(VarList, StartLoc, LParenLoc,
1812                                             EndLoc);
1813   }
1814 
1815   /// Build a new OpenMP 'depend' pseudo clause.
1816   ///
1817   /// By default, performs semantic analysis to build the new OpenMP clause.
1818   /// Subclasses may override this routine to provide different behavior.
1819   OMPClause *
1820   RebuildOMPDependClause(OpenMPDependClauseKind DepKind, SourceLocation DepLoc,
1821                          SourceLocation ColonLoc, ArrayRef<Expr *> VarList,
1822                          SourceLocation StartLoc, SourceLocation LParenLoc,
1823                          SourceLocation EndLoc) {
1824     return getSema().ActOnOpenMPDependClause(DepKind, DepLoc, ColonLoc, VarList,
1825                                              StartLoc, LParenLoc, EndLoc);
1826   }
1827 
1828   /// Build a new OpenMP 'device' clause.
1829   ///
1830   /// By default, performs semantic analysis to build the new statement.
1831   /// Subclasses may override this routine to provide different behavior.
1832   OMPClause *RebuildOMPDeviceClause(Expr *Device, SourceLocation StartLoc,
1833                                     SourceLocation LParenLoc,
1834                                     SourceLocation EndLoc) {
1835     return getSema().ActOnOpenMPDeviceClause(Device, StartLoc, LParenLoc,
1836                                              EndLoc);
1837   }
1838 
1839   /// Build a new OpenMP 'map' clause.
1840   ///
1841   /// By default, performs semantic analysis to build the new OpenMP clause.
1842   /// Subclasses may override this routine to provide different behavior.
1843   OMPClause *RebuildOMPMapClause(
1844       ArrayRef<OpenMPMapModifierKind> MapTypeModifiers,
1845       ArrayRef<SourceLocation> MapTypeModifiersLoc,
1846       CXXScopeSpec MapperIdScopeSpec, DeclarationNameInfo MapperId,
1847       OpenMPMapClauseKind MapType, bool IsMapTypeImplicit,
1848       SourceLocation MapLoc, SourceLocation ColonLoc, ArrayRef<Expr *> VarList,
1849       const OMPVarListLocTy &Locs, ArrayRef<Expr *> UnresolvedMappers) {
1850     return getSema().ActOnOpenMPMapClause(MapTypeModifiers, MapTypeModifiersLoc,
1851                                           MapperIdScopeSpec, MapperId, MapType,
1852                                           IsMapTypeImplicit, MapLoc, ColonLoc,
1853                                           VarList, Locs, UnresolvedMappers);
1854   }
1855 
1856   /// Build a new OpenMP 'allocate' clause.
1857   ///
1858   /// By default, performs semantic analysis to build the new OpenMP clause.
1859   /// Subclasses may override this routine to provide different behavior.
1860   OMPClause *RebuildOMPAllocateClause(Expr *Allocate, ArrayRef<Expr *> VarList,
1861                                       SourceLocation StartLoc,
1862                                       SourceLocation LParenLoc,
1863                                       SourceLocation ColonLoc,
1864                                       SourceLocation EndLoc) {
1865     return getSema().ActOnOpenMPAllocateClause(Allocate, VarList, StartLoc,
1866                                                LParenLoc, ColonLoc, EndLoc);
1867   }
1868 
1869   /// Build a new OpenMP 'num_teams' clause.
1870   ///
1871   /// By default, performs semantic analysis to build the new statement.
1872   /// Subclasses may override this routine to provide different behavior.
1873   OMPClause *RebuildOMPNumTeamsClause(Expr *NumTeams, SourceLocation StartLoc,
1874                                       SourceLocation LParenLoc,
1875                                       SourceLocation EndLoc) {
1876     return getSema().ActOnOpenMPNumTeamsClause(NumTeams, StartLoc, LParenLoc,
1877                                                EndLoc);
1878   }
1879 
1880   /// Build a new OpenMP 'thread_limit' clause.
1881   ///
1882   /// By default, performs semantic analysis to build the new statement.
1883   /// Subclasses may override this routine to provide different behavior.
1884   OMPClause *RebuildOMPThreadLimitClause(Expr *ThreadLimit,
1885                                          SourceLocation StartLoc,
1886                                          SourceLocation LParenLoc,
1887                                          SourceLocation EndLoc) {
1888     return getSema().ActOnOpenMPThreadLimitClause(ThreadLimit, StartLoc,
1889                                                   LParenLoc, EndLoc);
1890   }
1891 
1892   /// Build a new OpenMP 'priority' clause.
1893   ///
1894   /// By default, performs semantic analysis to build the new statement.
1895   /// Subclasses may override this routine to provide different behavior.
1896   OMPClause *RebuildOMPPriorityClause(Expr *Priority, SourceLocation StartLoc,
1897                                       SourceLocation LParenLoc,
1898                                       SourceLocation EndLoc) {
1899     return getSema().ActOnOpenMPPriorityClause(Priority, StartLoc, LParenLoc,
1900                                                EndLoc);
1901   }
1902 
1903   /// Build a new OpenMP 'grainsize' clause.
1904   ///
1905   /// By default, performs semantic analysis to build the new statement.
1906   /// Subclasses may override this routine to provide different behavior.
1907   OMPClause *RebuildOMPGrainsizeClause(Expr *Grainsize, SourceLocation StartLoc,
1908                                        SourceLocation LParenLoc,
1909                                        SourceLocation EndLoc) {
1910     return getSema().ActOnOpenMPGrainsizeClause(Grainsize, StartLoc, LParenLoc,
1911                                                 EndLoc);
1912   }
1913 
1914   /// Build a new OpenMP 'num_tasks' clause.
1915   ///
1916   /// By default, performs semantic analysis to build the new statement.
1917   /// Subclasses may override this routine to provide different behavior.
1918   OMPClause *RebuildOMPNumTasksClause(Expr *NumTasks, SourceLocation StartLoc,
1919                                       SourceLocation LParenLoc,
1920                                       SourceLocation EndLoc) {
1921     return getSema().ActOnOpenMPNumTasksClause(NumTasks, StartLoc, LParenLoc,
1922                                                EndLoc);
1923   }
1924 
1925   /// Build a new OpenMP 'hint' clause.
1926   ///
1927   /// By default, performs semantic analysis to build the new statement.
1928   /// Subclasses may override this routine to provide different behavior.
1929   OMPClause *RebuildOMPHintClause(Expr *Hint, SourceLocation StartLoc,
1930                                   SourceLocation LParenLoc,
1931                                   SourceLocation EndLoc) {
1932     return getSema().ActOnOpenMPHintClause(Hint, StartLoc, LParenLoc, EndLoc);
1933   }
1934 
1935   /// Build a new OpenMP 'dist_schedule' clause.
1936   ///
1937   /// By default, performs semantic analysis to build the new OpenMP clause.
1938   /// Subclasses may override this routine to provide different behavior.
1939   OMPClause *
1940   RebuildOMPDistScheduleClause(OpenMPDistScheduleClauseKind Kind,
1941                                Expr *ChunkSize, SourceLocation StartLoc,
1942                                SourceLocation LParenLoc, SourceLocation KindLoc,
1943                                SourceLocation CommaLoc, SourceLocation EndLoc) {
1944     return getSema().ActOnOpenMPDistScheduleClause(
1945         Kind, ChunkSize, StartLoc, LParenLoc, KindLoc, CommaLoc, EndLoc);
1946   }
1947 
1948   /// Build a new OpenMP 'to' clause.
1949   ///
1950   /// By default, performs semantic analysis to build the new statement.
1951   /// Subclasses may override this routine to provide different behavior.
1952   OMPClause *RebuildOMPToClause(ArrayRef<Expr *> VarList,
1953                                 CXXScopeSpec &MapperIdScopeSpec,
1954                                 DeclarationNameInfo &MapperId,
1955                                 const OMPVarListLocTy &Locs,
1956                                 ArrayRef<Expr *> UnresolvedMappers) {
1957     return getSema().ActOnOpenMPToClause(VarList, MapperIdScopeSpec, MapperId,
1958                                          Locs, UnresolvedMappers);
1959   }
1960 
1961   /// Build a new OpenMP 'from' clause.
1962   ///
1963   /// By default, performs semantic analysis to build the new statement.
1964   /// Subclasses may override this routine to provide different behavior.
1965   OMPClause *RebuildOMPFromClause(ArrayRef<Expr *> VarList,
1966                                   CXXScopeSpec &MapperIdScopeSpec,
1967                                   DeclarationNameInfo &MapperId,
1968                                   const OMPVarListLocTy &Locs,
1969                                   ArrayRef<Expr *> UnresolvedMappers) {
1970     return getSema().ActOnOpenMPFromClause(VarList, MapperIdScopeSpec, MapperId,
1971                                            Locs, UnresolvedMappers);
1972   }
1973 
1974   /// Build a new OpenMP 'use_device_ptr' clause.
1975   ///
1976   /// By default, performs semantic analysis to build the new OpenMP clause.
1977   /// Subclasses may override this routine to provide different behavior.
1978   OMPClause *RebuildOMPUseDevicePtrClause(ArrayRef<Expr *> VarList,
1979                                           const OMPVarListLocTy &Locs) {
1980     return getSema().ActOnOpenMPUseDevicePtrClause(VarList, Locs);
1981   }
1982 
1983   /// Build a new OpenMP 'is_device_ptr' clause.
1984   ///
1985   /// By default, performs semantic analysis to build the new OpenMP clause.
1986   /// Subclasses may override this routine to provide different behavior.
1987   OMPClause *RebuildOMPIsDevicePtrClause(ArrayRef<Expr *> VarList,
1988                                          const OMPVarListLocTy &Locs) {
1989     return getSema().ActOnOpenMPIsDevicePtrClause(VarList, Locs);
1990   }
1991 
1992   /// Build a new OpenMP 'defaultmap' clause.
1993   ///
1994   /// By default, performs semantic analysis to build the new OpenMP clause.
1995   /// Subclasses may override this routine to provide different behavior.
1996   OMPClause *RebuildOMPDefaultmapClause(OpenMPDefaultmapClauseModifier M,
1997                                         OpenMPDefaultmapClauseKind Kind,
1998                                         SourceLocation StartLoc,
1999                                         SourceLocation LParenLoc,
2000                                         SourceLocation MLoc,
2001                                         SourceLocation KindLoc,
2002                                         SourceLocation EndLoc) {
2003     return getSema().ActOnOpenMPDefaultmapClause(M, Kind, StartLoc, LParenLoc,
2004                                                  MLoc, KindLoc, EndLoc);
2005   }
2006 
2007   /// Build a new OpenMP 'nontemporal' clause.
2008   ///
2009   /// By default, performs semantic analysis to build the new OpenMP clause.
2010   /// Subclasses may override this routine to provide different behavior.
2011   OMPClause *RebuildOMPNontemporalClause(ArrayRef<Expr *> VarList,
2012                                          SourceLocation StartLoc,
2013                                          SourceLocation LParenLoc,
2014                                          SourceLocation EndLoc) {
2015     return getSema().ActOnOpenMPNontemporalClause(VarList, StartLoc, LParenLoc,
2016                                                   EndLoc);
2017   }
2018 
2019   /// Rebuild the operand to an Objective-C \@synchronized statement.
2020   ///
2021   /// By default, performs semantic analysis to build the new statement.
2022   /// Subclasses may override this routine to provide different behavior.
2023   ExprResult RebuildObjCAtSynchronizedOperand(SourceLocation atLoc,
2024                                               Expr *object) {
2025     return getSema().ActOnObjCAtSynchronizedOperand(atLoc, object);
2026   }
2027 
2028   /// Build a new Objective-C \@synchronized statement.
2029   ///
2030   /// By default, performs semantic analysis to build the new statement.
2031   /// Subclasses may override this routine to provide different behavior.
2032   StmtResult RebuildObjCAtSynchronizedStmt(SourceLocation AtLoc,
2033                                            Expr *Object, Stmt *Body) {
2034     return getSema().ActOnObjCAtSynchronizedStmt(AtLoc, Object, Body);
2035   }
2036 
2037   /// Build a new Objective-C \@autoreleasepool statement.
2038   ///
2039   /// By default, performs semantic analysis to build the new statement.
2040   /// Subclasses may override this routine to provide different behavior.
2041   StmtResult RebuildObjCAutoreleasePoolStmt(SourceLocation AtLoc,
2042                                             Stmt *Body) {
2043     return getSema().ActOnObjCAutoreleasePoolStmt(AtLoc, Body);
2044   }
2045 
2046   /// Build a new Objective-C fast enumeration statement.
2047   ///
2048   /// By default, performs semantic analysis to build the new statement.
2049   /// Subclasses may override this routine to provide different behavior.
2050   StmtResult RebuildObjCForCollectionStmt(SourceLocation ForLoc,
2051                                           Stmt *Element,
2052                                           Expr *Collection,
2053                                           SourceLocation RParenLoc,
2054                                           Stmt *Body) {
2055     StmtResult ForEachStmt = getSema().ActOnObjCForCollectionStmt(ForLoc,
2056                                                 Element,
2057                                                 Collection,
2058                                                 RParenLoc);
2059     if (ForEachStmt.isInvalid())
2060       return StmtError();
2061 
2062     return getSema().FinishObjCForCollectionStmt(ForEachStmt.get(), Body);
2063   }
2064 
2065   /// Build a new C++ exception declaration.
2066   ///
2067   /// By default, performs semantic analysis to build the new decaration.
2068   /// Subclasses may override this routine to provide different behavior.
2069   VarDecl *RebuildExceptionDecl(VarDecl *ExceptionDecl,
2070                                 TypeSourceInfo *Declarator,
2071                                 SourceLocation StartLoc,
2072                                 SourceLocation IdLoc,
2073                                 IdentifierInfo *Id) {
2074     VarDecl *Var = getSema().BuildExceptionDeclaration(nullptr, Declarator,
2075                                                        StartLoc, IdLoc, Id);
2076     if (Var)
2077       getSema().CurContext->addDecl(Var);
2078     return Var;
2079   }
2080 
2081   /// Build a new C++ catch statement.
2082   ///
2083   /// By default, performs semantic analysis to build the new statement.
2084   /// Subclasses may override this routine to provide different behavior.
2085   StmtResult RebuildCXXCatchStmt(SourceLocation CatchLoc,
2086                                  VarDecl *ExceptionDecl,
2087                                  Stmt *Handler) {
2088     return Owned(new (getSema().Context) CXXCatchStmt(CatchLoc, ExceptionDecl,
2089                                                       Handler));
2090   }
2091 
2092   /// Build a new C++ try statement.
2093   ///
2094   /// By default, performs semantic analysis to build the new statement.
2095   /// Subclasses may override this routine to provide different behavior.
2096   StmtResult RebuildCXXTryStmt(SourceLocation TryLoc, Stmt *TryBlock,
2097                                ArrayRef<Stmt *> Handlers) {
2098     return getSema().ActOnCXXTryBlock(TryLoc, TryBlock, Handlers);
2099   }
2100 
2101   /// Build a new C++0x range-based for statement.
2102   ///
2103   /// By default, performs semantic analysis to build the new statement.
2104   /// Subclasses may override this routine to provide different behavior.
2105   StmtResult RebuildCXXForRangeStmt(SourceLocation ForLoc,
2106                                     SourceLocation CoawaitLoc, Stmt *Init,
2107                                     SourceLocation ColonLoc, Stmt *Range,
2108                                     Stmt *Begin, Stmt *End, Expr *Cond,
2109                                     Expr *Inc, Stmt *LoopVar,
2110                                     SourceLocation RParenLoc) {
2111     // If we've just learned that the range is actually an Objective-C
2112     // collection, treat this as an Objective-C fast enumeration loop.
2113     if (DeclStmt *RangeStmt = dyn_cast<DeclStmt>(Range)) {
2114       if (RangeStmt->isSingleDecl()) {
2115         if (VarDecl *RangeVar = dyn_cast<VarDecl>(RangeStmt->getSingleDecl())) {
2116           if (RangeVar->isInvalidDecl())
2117             return StmtError();
2118 
2119           Expr *RangeExpr = RangeVar->getInit();
2120           if (!RangeExpr->isTypeDependent() &&
2121               RangeExpr->getType()->isObjCObjectPointerType()) {
2122             // FIXME: Support init-statements in Objective-C++20 ranged for
2123             // statement.
2124             if (Init) {
2125               return SemaRef.Diag(Init->getBeginLoc(),
2126                                   diag::err_objc_for_range_init_stmt)
2127                          << Init->getSourceRange();
2128             }
2129             return getSema().ActOnObjCForCollectionStmt(ForLoc, LoopVar,
2130                                                         RangeExpr, RParenLoc);
2131           }
2132         }
2133       }
2134     }
2135 
2136     return getSema().BuildCXXForRangeStmt(ForLoc, CoawaitLoc, Init, ColonLoc,
2137                                           Range, Begin, End, Cond, Inc, LoopVar,
2138                                           RParenLoc, Sema::BFRK_Rebuild);
2139   }
2140 
2141   /// Build a new C++0x range-based for statement.
2142   ///
2143   /// By default, performs semantic analysis to build the new statement.
2144   /// Subclasses may override this routine to provide different behavior.
2145   StmtResult RebuildMSDependentExistsStmt(SourceLocation KeywordLoc,
2146                                           bool IsIfExists,
2147                                           NestedNameSpecifierLoc QualifierLoc,
2148                                           DeclarationNameInfo NameInfo,
2149                                           Stmt *Nested) {
2150     return getSema().BuildMSDependentExistsStmt(KeywordLoc, IsIfExists,
2151                                                 QualifierLoc, NameInfo, Nested);
2152   }
2153 
2154   /// Attach body to a C++0x range-based for statement.
2155   ///
2156   /// By default, performs semantic analysis to finish the new statement.
2157   /// Subclasses may override this routine to provide different behavior.
2158   StmtResult FinishCXXForRangeStmt(Stmt *ForRange, Stmt *Body) {
2159     return getSema().FinishCXXForRangeStmt(ForRange, Body);
2160   }
2161 
2162   StmtResult RebuildSEHTryStmt(bool IsCXXTry, SourceLocation TryLoc,
2163                                Stmt *TryBlock, Stmt *Handler) {
2164     return getSema().ActOnSEHTryBlock(IsCXXTry, TryLoc, TryBlock, Handler);
2165   }
2166 
2167   StmtResult RebuildSEHExceptStmt(SourceLocation Loc, Expr *FilterExpr,
2168                                   Stmt *Block) {
2169     return getSema().ActOnSEHExceptBlock(Loc, FilterExpr, Block);
2170   }
2171 
2172   StmtResult RebuildSEHFinallyStmt(SourceLocation Loc, Stmt *Block) {
2173     return SEHFinallyStmt::Create(getSema().getASTContext(), Loc, Block);
2174   }
2175 
2176   /// Build a new predefined expression.
2177   ///
2178   /// By default, performs semantic analysis to build the new expression.
2179   /// Subclasses may override this routine to provide different behavior.
2180   ExprResult RebuildPredefinedExpr(SourceLocation Loc,
2181                                    PredefinedExpr::IdentKind IK) {
2182     return getSema().BuildPredefinedExpr(Loc, IK);
2183   }
2184 
2185   /// Build a new expression that references a declaration.
2186   ///
2187   /// By default, performs semantic analysis to build the new expression.
2188   /// Subclasses may override this routine to provide different behavior.
2189   ExprResult RebuildDeclarationNameExpr(const CXXScopeSpec &SS,
2190                                         LookupResult &R,
2191                                         bool RequiresADL) {
2192     return getSema().BuildDeclarationNameExpr(SS, R, RequiresADL);
2193   }
2194 
2195 
2196   /// Build a new expression that references a declaration.
2197   ///
2198   /// By default, performs semantic analysis to build the new expression.
2199   /// Subclasses may override this routine to provide different behavior.
2200   ExprResult RebuildDeclRefExpr(NestedNameSpecifierLoc QualifierLoc,
2201                                 ValueDecl *VD,
2202                                 const DeclarationNameInfo &NameInfo,
2203                                 NamedDecl *Found,
2204                                 TemplateArgumentListInfo *TemplateArgs) {
2205     CXXScopeSpec SS;
2206     SS.Adopt(QualifierLoc);
2207     return getSema().BuildDeclarationNameExpr(SS, NameInfo, VD, Found,
2208                                               TemplateArgs);
2209   }
2210 
2211   /// Build a new expression in parentheses.
2212   ///
2213   /// By default, performs semantic analysis to build the new expression.
2214   /// Subclasses may override this routine to provide different behavior.
2215   ExprResult RebuildParenExpr(Expr *SubExpr, SourceLocation LParen,
2216                                     SourceLocation RParen) {
2217     return getSema().ActOnParenExpr(LParen, RParen, SubExpr);
2218   }
2219 
2220   /// Build a new pseudo-destructor expression.
2221   ///
2222   /// By default, performs semantic analysis to build the new expression.
2223   /// Subclasses may override this routine to provide different behavior.
2224   ExprResult RebuildCXXPseudoDestructorExpr(Expr *Base,
2225                                             SourceLocation OperatorLoc,
2226                                             bool isArrow,
2227                                             CXXScopeSpec &SS,
2228                                             TypeSourceInfo *ScopeType,
2229                                             SourceLocation CCLoc,
2230                                             SourceLocation TildeLoc,
2231                                         PseudoDestructorTypeStorage Destroyed);
2232 
2233   /// Build a new unary operator expression.
2234   ///
2235   /// By default, performs semantic analysis to build the new expression.
2236   /// Subclasses may override this routine to provide different behavior.
2237   ExprResult RebuildUnaryOperator(SourceLocation OpLoc,
2238                                         UnaryOperatorKind Opc,
2239                                         Expr *SubExpr) {
2240     return getSema().BuildUnaryOp(/*Scope=*/nullptr, OpLoc, Opc, SubExpr);
2241   }
2242 
2243   /// Build a new builtin offsetof expression.
2244   ///
2245   /// By default, performs semantic analysis to build the new expression.
2246   /// Subclasses may override this routine to provide different behavior.
2247   ExprResult RebuildOffsetOfExpr(SourceLocation OperatorLoc,
2248                                  TypeSourceInfo *Type,
2249                                  ArrayRef<Sema::OffsetOfComponent> Components,
2250                                  SourceLocation RParenLoc) {
2251     return getSema().BuildBuiltinOffsetOf(OperatorLoc, Type, Components,
2252                                           RParenLoc);
2253   }
2254 
2255   /// Build a new sizeof, alignof or vec_step expression with a
2256   /// type argument.
2257   ///
2258   /// By default, performs semantic analysis to build the new expression.
2259   /// Subclasses may override this routine to provide different behavior.
2260   ExprResult RebuildUnaryExprOrTypeTrait(TypeSourceInfo *TInfo,
2261                                          SourceLocation OpLoc,
2262                                          UnaryExprOrTypeTrait ExprKind,
2263                                          SourceRange R) {
2264     return getSema().CreateUnaryExprOrTypeTraitExpr(TInfo, OpLoc, ExprKind, R);
2265   }
2266 
2267   /// Build a new sizeof, alignof or vec step expression with an
2268   /// expression argument.
2269   ///
2270   /// By default, performs semantic analysis to build the new expression.
2271   /// Subclasses may override this routine to provide different behavior.
2272   ExprResult RebuildUnaryExprOrTypeTrait(Expr *SubExpr, SourceLocation OpLoc,
2273                                          UnaryExprOrTypeTrait ExprKind,
2274                                          SourceRange R) {
2275     ExprResult Result
2276       = getSema().CreateUnaryExprOrTypeTraitExpr(SubExpr, OpLoc, ExprKind);
2277     if (Result.isInvalid())
2278       return ExprError();
2279 
2280     return Result;
2281   }
2282 
2283   /// Build a new array subscript expression.
2284   ///
2285   /// By default, performs semantic analysis to build the new expression.
2286   /// Subclasses may override this routine to provide different behavior.
2287   ExprResult RebuildArraySubscriptExpr(Expr *LHS,
2288                                              SourceLocation LBracketLoc,
2289                                              Expr *RHS,
2290                                              SourceLocation RBracketLoc) {
2291     return getSema().ActOnArraySubscriptExpr(/*Scope=*/nullptr, LHS,
2292                                              LBracketLoc, RHS,
2293                                              RBracketLoc);
2294   }
2295 
2296   /// Build a new array section expression.
2297   ///
2298   /// By default, performs semantic analysis to build the new expression.
2299   /// Subclasses may override this routine to provide different behavior.
2300   ExprResult RebuildOMPArraySectionExpr(Expr *Base, SourceLocation LBracketLoc,
2301                                         Expr *LowerBound,
2302                                         SourceLocation ColonLoc, Expr *Length,
2303                                         SourceLocation RBracketLoc) {
2304     return getSema().ActOnOMPArraySectionExpr(Base, LBracketLoc, LowerBound,
2305                                               ColonLoc, Length, RBracketLoc);
2306   }
2307 
2308   /// Build a new call 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 RebuildCallExpr(Expr *Callee, SourceLocation LParenLoc,
2313                                    MultiExprArg Args,
2314                                    SourceLocation RParenLoc,
2315                                    Expr *ExecConfig = nullptr) {
2316     return getSema().BuildCallExpr(/*Scope=*/nullptr, Callee, LParenLoc, Args,
2317                                    RParenLoc, ExecConfig);
2318   }
2319 
2320   /// Build a new member access expression.
2321   ///
2322   /// By default, performs semantic analysis to build the new expression.
2323   /// Subclasses may override this routine to provide different behavior.
2324   ExprResult RebuildMemberExpr(Expr *Base, SourceLocation OpLoc,
2325                                bool isArrow,
2326                                NestedNameSpecifierLoc QualifierLoc,
2327                                SourceLocation TemplateKWLoc,
2328                                const DeclarationNameInfo &MemberNameInfo,
2329                                ValueDecl *Member,
2330                                NamedDecl *FoundDecl,
2331                         const TemplateArgumentListInfo *ExplicitTemplateArgs,
2332                                NamedDecl *FirstQualifierInScope) {
2333     ExprResult BaseResult = getSema().PerformMemberExprBaseConversion(Base,
2334                                                                       isArrow);
2335     if (!Member->getDeclName()) {
2336       // We have a reference to an unnamed field.  This is always the
2337       // base of an anonymous struct/union member access, i.e. the
2338       // field is always of record type.
2339       assert(Member->getType()->isRecordType() &&
2340              "unnamed member not of record type?");
2341 
2342       BaseResult =
2343         getSema().PerformObjectMemberConversion(BaseResult.get(),
2344                                                 QualifierLoc.getNestedNameSpecifier(),
2345                                                 FoundDecl, Member);
2346       if (BaseResult.isInvalid())
2347         return ExprError();
2348       Base = BaseResult.get();
2349 
2350       CXXScopeSpec EmptySS;
2351       return getSema().BuildFieldReferenceExpr(
2352           Base, isArrow, OpLoc, EmptySS, cast<FieldDecl>(Member),
2353           DeclAccessPair::make(FoundDecl, FoundDecl->getAccess()), MemberNameInfo);
2354     }
2355 
2356     CXXScopeSpec SS;
2357     SS.Adopt(QualifierLoc);
2358 
2359     Base = BaseResult.get();
2360     QualType BaseType = Base->getType();
2361 
2362     if (isArrow && !BaseType->isPointerType())
2363       return ExprError();
2364 
2365     // FIXME: this involves duplicating earlier analysis in a lot of
2366     // cases; we should avoid this when possible.
2367     LookupResult R(getSema(), MemberNameInfo, Sema::LookupMemberName);
2368     R.addDecl(FoundDecl);
2369     R.resolveKind();
2370 
2371     return getSema().BuildMemberReferenceExpr(Base, BaseType, OpLoc, isArrow,
2372                                               SS, TemplateKWLoc,
2373                                               FirstQualifierInScope,
2374                                               R, ExplicitTemplateArgs,
2375                                               /*S*/nullptr);
2376   }
2377 
2378   /// Build a new binary operator expression.
2379   ///
2380   /// By default, performs semantic analysis to build the new expression.
2381   /// Subclasses may override this routine to provide different behavior.
2382   ExprResult RebuildBinaryOperator(SourceLocation OpLoc,
2383                                          BinaryOperatorKind Opc,
2384                                          Expr *LHS, Expr *RHS) {
2385     return getSema().BuildBinOp(/*Scope=*/nullptr, OpLoc, Opc, LHS, RHS);
2386   }
2387 
2388   /// Build a new rewritten operator expression.
2389   ///
2390   /// By default, performs semantic analysis to build the new expression.
2391   /// Subclasses may override this routine to provide different behavior.
2392   ExprResult RebuildCXXRewrittenBinaryOperator(
2393       SourceLocation OpLoc, BinaryOperatorKind Opcode,
2394       const UnresolvedSetImpl &UnqualLookups, Expr *LHS, Expr *RHS) {
2395     return getSema().CreateOverloadedBinOp(OpLoc, Opcode, UnqualLookups, LHS,
2396                                            RHS, /*RequiresADL*/false);
2397   }
2398 
2399   /// Build a new conditional operator expression.
2400   ///
2401   /// By default, performs semantic analysis to build the new expression.
2402   /// Subclasses may override this routine to provide different behavior.
2403   ExprResult RebuildConditionalOperator(Expr *Cond,
2404                                         SourceLocation QuestionLoc,
2405                                         Expr *LHS,
2406                                         SourceLocation ColonLoc,
2407                                         Expr *RHS) {
2408     return getSema().ActOnConditionalOp(QuestionLoc, ColonLoc, Cond,
2409                                         LHS, RHS);
2410   }
2411 
2412   /// Build a new C-style cast expression.
2413   ///
2414   /// By default, performs semantic analysis to build the new expression.
2415   /// Subclasses may override this routine to provide different behavior.
2416   ExprResult RebuildCStyleCastExpr(SourceLocation LParenLoc,
2417                                          TypeSourceInfo *TInfo,
2418                                          SourceLocation RParenLoc,
2419                                          Expr *SubExpr) {
2420     return getSema().BuildCStyleCastExpr(LParenLoc, TInfo, RParenLoc,
2421                                          SubExpr);
2422   }
2423 
2424   /// Build a new compound literal expression.
2425   ///
2426   /// By default, performs semantic analysis to build the new expression.
2427   /// Subclasses may override this routine to provide different behavior.
2428   ExprResult RebuildCompoundLiteralExpr(SourceLocation LParenLoc,
2429                                               TypeSourceInfo *TInfo,
2430                                               SourceLocation RParenLoc,
2431                                               Expr *Init) {
2432     return getSema().BuildCompoundLiteralExpr(LParenLoc, TInfo, RParenLoc,
2433                                               Init);
2434   }
2435 
2436   /// Build a new extended vector element access expression.
2437   ///
2438   /// By default, performs semantic analysis to build the new expression.
2439   /// Subclasses may override this routine to provide different behavior.
2440   ExprResult RebuildExtVectorElementExpr(Expr *Base,
2441                                                SourceLocation OpLoc,
2442                                                SourceLocation AccessorLoc,
2443                                                IdentifierInfo &Accessor) {
2444 
2445     CXXScopeSpec SS;
2446     DeclarationNameInfo NameInfo(&Accessor, AccessorLoc);
2447     return getSema().BuildMemberReferenceExpr(Base, Base->getType(),
2448                                               OpLoc, /*IsArrow*/ false,
2449                                               SS, SourceLocation(),
2450                                               /*FirstQualifierInScope*/ nullptr,
2451                                               NameInfo,
2452                                               /* TemplateArgs */ nullptr,
2453                                               /*S*/ nullptr);
2454   }
2455 
2456   /// Build a new initializer list expression.
2457   ///
2458   /// By default, performs semantic analysis to build the new expression.
2459   /// Subclasses may override this routine to provide different behavior.
2460   ExprResult RebuildInitList(SourceLocation LBraceLoc,
2461                              MultiExprArg Inits,
2462                              SourceLocation RBraceLoc) {
2463     return SemaRef.BuildInitList(LBraceLoc, Inits, RBraceLoc);
2464   }
2465 
2466   /// Build a new designated initializer expression.
2467   ///
2468   /// By default, performs semantic analysis to build the new expression.
2469   /// Subclasses may override this routine to provide different behavior.
2470   ExprResult RebuildDesignatedInitExpr(Designation &Desig,
2471                                              MultiExprArg ArrayExprs,
2472                                              SourceLocation EqualOrColonLoc,
2473                                              bool GNUSyntax,
2474                                              Expr *Init) {
2475     ExprResult Result
2476       = SemaRef.ActOnDesignatedInitializer(Desig, EqualOrColonLoc, GNUSyntax,
2477                                            Init);
2478     if (Result.isInvalid())
2479       return ExprError();
2480 
2481     return Result;
2482   }
2483 
2484   /// Build a new value-initialized expression.
2485   ///
2486   /// By default, builds the implicit value initialization without performing
2487   /// any semantic analysis. Subclasses may override this routine to provide
2488   /// different behavior.
2489   ExprResult RebuildImplicitValueInitExpr(QualType T) {
2490     return new (SemaRef.Context) ImplicitValueInitExpr(T);
2491   }
2492 
2493   /// Build a new \c va_arg expression.
2494   ///
2495   /// By default, performs semantic analysis to build the new expression.
2496   /// Subclasses may override this routine to provide different behavior.
2497   ExprResult RebuildVAArgExpr(SourceLocation BuiltinLoc,
2498                                     Expr *SubExpr, TypeSourceInfo *TInfo,
2499                                     SourceLocation RParenLoc) {
2500     return getSema().BuildVAArgExpr(BuiltinLoc,
2501                                     SubExpr, TInfo,
2502                                     RParenLoc);
2503   }
2504 
2505   /// Build a new expression list in parentheses.
2506   ///
2507   /// By default, performs semantic analysis to build the new expression.
2508   /// Subclasses may override this routine to provide different behavior.
2509   ExprResult RebuildParenListExpr(SourceLocation LParenLoc,
2510                                   MultiExprArg SubExprs,
2511                                   SourceLocation RParenLoc) {
2512     return getSema().ActOnParenListExpr(LParenLoc, RParenLoc, SubExprs);
2513   }
2514 
2515   /// Build a new address-of-label expression.
2516   ///
2517   /// By default, performs semantic analysis, using the name of the label
2518   /// rather than attempting to map the label statement itself.
2519   /// Subclasses may override this routine to provide different behavior.
2520   ExprResult RebuildAddrLabelExpr(SourceLocation AmpAmpLoc,
2521                                   SourceLocation LabelLoc, LabelDecl *Label) {
2522     return getSema().ActOnAddrLabel(AmpAmpLoc, LabelLoc, Label);
2523   }
2524 
2525   /// Build a new GNU statement expression.
2526   ///
2527   /// By default, performs semantic analysis to build the new expression.
2528   /// Subclasses may override this routine to provide different behavior.
2529   ExprResult RebuildStmtExpr(SourceLocation LParenLoc, Stmt *SubStmt,
2530                              SourceLocation RParenLoc) {
2531     return getSema().ActOnStmtExpr(nullptr, LParenLoc, SubStmt, RParenLoc);
2532   }
2533 
2534   /// Build a new __builtin_choose_expr 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 RebuildChooseExpr(SourceLocation BuiltinLoc,
2539                                      Expr *Cond, Expr *LHS, Expr *RHS,
2540                                      SourceLocation RParenLoc) {
2541     return SemaRef.ActOnChooseExpr(BuiltinLoc,
2542                                    Cond, LHS, RHS,
2543                                    RParenLoc);
2544   }
2545 
2546   /// Build a new generic selection expression.
2547   ///
2548   /// By default, performs semantic analysis to build the new expression.
2549   /// Subclasses may override this routine to provide different behavior.
2550   ExprResult RebuildGenericSelectionExpr(SourceLocation KeyLoc,
2551                                          SourceLocation DefaultLoc,
2552                                          SourceLocation RParenLoc,
2553                                          Expr *ControllingExpr,
2554                                          ArrayRef<TypeSourceInfo *> Types,
2555                                          ArrayRef<Expr *> Exprs) {
2556     return getSema().CreateGenericSelectionExpr(KeyLoc, DefaultLoc, RParenLoc,
2557                                                 ControllingExpr, Types, Exprs);
2558   }
2559 
2560   /// Build a new overloaded operator call expression.
2561   ///
2562   /// By default, performs semantic analysis to build the new expression.
2563   /// The semantic analysis provides the behavior of template instantiation,
2564   /// copying with transformations that turn what looks like an overloaded
2565   /// operator call into a use of a builtin operator, performing
2566   /// argument-dependent lookup, etc. Subclasses may override this routine to
2567   /// provide different behavior.
2568   ExprResult RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op,
2569                                               SourceLocation OpLoc,
2570                                               Expr *Callee,
2571                                               Expr *First,
2572                                               Expr *Second);
2573 
2574   /// Build a new C++ "named" cast expression, such as static_cast or
2575   /// reinterpret_cast.
2576   ///
2577   /// By default, this routine dispatches to one of the more-specific routines
2578   /// for a particular named case, e.g., RebuildCXXStaticCastExpr().
2579   /// Subclasses may override this routine to provide different behavior.
2580   ExprResult RebuildCXXNamedCastExpr(SourceLocation OpLoc,
2581                                            Stmt::StmtClass Class,
2582                                            SourceLocation LAngleLoc,
2583                                            TypeSourceInfo *TInfo,
2584                                            SourceLocation RAngleLoc,
2585                                            SourceLocation LParenLoc,
2586                                            Expr *SubExpr,
2587                                            SourceLocation RParenLoc) {
2588     switch (Class) {
2589     case Stmt::CXXStaticCastExprClass:
2590       return getDerived().RebuildCXXStaticCastExpr(OpLoc, LAngleLoc, TInfo,
2591                                                    RAngleLoc, LParenLoc,
2592                                                    SubExpr, RParenLoc);
2593 
2594     case Stmt::CXXDynamicCastExprClass:
2595       return getDerived().RebuildCXXDynamicCastExpr(OpLoc, LAngleLoc, TInfo,
2596                                                     RAngleLoc, LParenLoc,
2597                                                     SubExpr, RParenLoc);
2598 
2599     case Stmt::CXXReinterpretCastExprClass:
2600       return getDerived().RebuildCXXReinterpretCastExpr(OpLoc, LAngleLoc, TInfo,
2601                                                         RAngleLoc, LParenLoc,
2602                                                         SubExpr,
2603                                                         RParenLoc);
2604 
2605     case Stmt::CXXConstCastExprClass:
2606       return getDerived().RebuildCXXConstCastExpr(OpLoc, LAngleLoc, TInfo,
2607                                                    RAngleLoc, LParenLoc,
2608                                                    SubExpr, RParenLoc);
2609 
2610     default:
2611       llvm_unreachable("Invalid C++ named cast");
2612     }
2613   }
2614 
2615   /// Build a new C++ static_cast expression.
2616   ///
2617   /// By default, performs semantic analysis to build the new expression.
2618   /// Subclasses may override this routine to provide different behavior.
2619   ExprResult RebuildCXXStaticCastExpr(SourceLocation OpLoc,
2620                                             SourceLocation LAngleLoc,
2621                                             TypeSourceInfo *TInfo,
2622                                             SourceLocation RAngleLoc,
2623                                             SourceLocation LParenLoc,
2624                                             Expr *SubExpr,
2625                                             SourceLocation RParenLoc) {
2626     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_static_cast,
2627                                        TInfo, SubExpr,
2628                                        SourceRange(LAngleLoc, RAngleLoc),
2629                                        SourceRange(LParenLoc, RParenLoc));
2630   }
2631 
2632   /// Build a new C++ dynamic_cast expression.
2633   ///
2634   /// By default, performs semantic analysis to build the new expression.
2635   /// Subclasses may override this routine to provide different behavior.
2636   ExprResult RebuildCXXDynamicCastExpr(SourceLocation OpLoc,
2637                                              SourceLocation LAngleLoc,
2638                                              TypeSourceInfo *TInfo,
2639                                              SourceLocation RAngleLoc,
2640                                              SourceLocation LParenLoc,
2641                                              Expr *SubExpr,
2642                                              SourceLocation RParenLoc) {
2643     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_dynamic_cast,
2644                                        TInfo, SubExpr,
2645                                        SourceRange(LAngleLoc, RAngleLoc),
2646                                        SourceRange(LParenLoc, RParenLoc));
2647   }
2648 
2649   /// Build a new C++ reinterpret_cast expression.
2650   ///
2651   /// By default, performs semantic analysis to build the new expression.
2652   /// Subclasses may override this routine to provide different behavior.
2653   ExprResult RebuildCXXReinterpretCastExpr(SourceLocation OpLoc,
2654                                                  SourceLocation LAngleLoc,
2655                                                  TypeSourceInfo *TInfo,
2656                                                  SourceLocation RAngleLoc,
2657                                                  SourceLocation LParenLoc,
2658                                                  Expr *SubExpr,
2659                                                  SourceLocation RParenLoc) {
2660     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_reinterpret_cast,
2661                                        TInfo, SubExpr,
2662                                        SourceRange(LAngleLoc, RAngleLoc),
2663                                        SourceRange(LParenLoc, RParenLoc));
2664   }
2665 
2666   /// Build a new C++ const_cast expression.
2667   ///
2668   /// By default, performs semantic analysis to build the new expression.
2669   /// Subclasses may override this routine to provide different behavior.
2670   ExprResult RebuildCXXConstCastExpr(SourceLocation OpLoc,
2671                                            SourceLocation LAngleLoc,
2672                                            TypeSourceInfo *TInfo,
2673                                            SourceLocation RAngleLoc,
2674                                            SourceLocation LParenLoc,
2675                                            Expr *SubExpr,
2676                                            SourceLocation RParenLoc) {
2677     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_const_cast,
2678                                        TInfo, SubExpr,
2679                                        SourceRange(LAngleLoc, RAngleLoc),
2680                                        SourceRange(LParenLoc, RParenLoc));
2681   }
2682 
2683   /// Build a new C++ functional-style cast expression.
2684   ///
2685   /// By default, performs semantic analysis to build the new expression.
2686   /// Subclasses may override this routine to provide different behavior.
2687   ExprResult RebuildCXXFunctionalCastExpr(TypeSourceInfo *TInfo,
2688                                           SourceLocation LParenLoc,
2689                                           Expr *Sub,
2690                                           SourceLocation RParenLoc,
2691                                           bool ListInitialization) {
2692     return getSema().BuildCXXTypeConstructExpr(TInfo, LParenLoc,
2693                                                MultiExprArg(&Sub, 1), RParenLoc,
2694                                                ListInitialization);
2695   }
2696 
2697   /// Build a new C++ __builtin_bit_cast expression.
2698   ///
2699   /// By default, performs semantic analysis to build the new expression.
2700   /// Subclasses may override this routine to provide different behavior.
2701   ExprResult RebuildBuiltinBitCastExpr(SourceLocation KWLoc,
2702                                        TypeSourceInfo *TSI, Expr *Sub,
2703                                        SourceLocation RParenLoc) {
2704     return getSema().BuildBuiltinBitCastExpr(KWLoc, TSI, Sub, RParenLoc);
2705   }
2706 
2707   /// Build a new C++ typeid(type) expression.
2708   ///
2709   /// By default, performs semantic analysis to build the new expression.
2710   /// Subclasses may override this routine to provide different behavior.
2711   ExprResult RebuildCXXTypeidExpr(QualType TypeInfoType,
2712                                         SourceLocation TypeidLoc,
2713                                         TypeSourceInfo *Operand,
2714                                         SourceLocation RParenLoc) {
2715     return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand,
2716                                     RParenLoc);
2717   }
2718 
2719 
2720   /// Build a new C++ typeid(expr) expression.
2721   ///
2722   /// By default, performs semantic analysis to build the new expression.
2723   /// Subclasses may override this routine to provide different behavior.
2724   ExprResult RebuildCXXTypeidExpr(QualType TypeInfoType,
2725                                         SourceLocation TypeidLoc,
2726                                         Expr *Operand,
2727                                         SourceLocation RParenLoc) {
2728     return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand,
2729                                     RParenLoc);
2730   }
2731 
2732   /// Build a new C++ __uuidof(type) expression.
2733   ///
2734   /// By default, performs semantic analysis to build the new expression.
2735   /// Subclasses may override this routine to provide different behavior.
2736   ExprResult RebuildCXXUuidofExpr(QualType TypeInfoType,
2737                                         SourceLocation TypeidLoc,
2738                                         TypeSourceInfo *Operand,
2739                                         SourceLocation RParenLoc) {
2740     return getSema().BuildCXXUuidof(TypeInfoType, TypeidLoc, Operand,
2741                                     RParenLoc);
2742   }
2743 
2744   /// Build a new C++ __uuidof(expr) expression.
2745   ///
2746   /// By default, performs semantic analysis to build the new expression.
2747   /// Subclasses may override this routine to provide different behavior.
2748   ExprResult RebuildCXXUuidofExpr(QualType TypeInfoType,
2749                                         SourceLocation TypeidLoc,
2750                                         Expr *Operand,
2751                                         SourceLocation RParenLoc) {
2752     return getSema().BuildCXXUuidof(TypeInfoType, TypeidLoc, Operand,
2753                                     RParenLoc);
2754   }
2755 
2756   /// Build a new C++ "this" expression.
2757   ///
2758   /// By default, builds a new "this" expression without performing any
2759   /// semantic analysis. Subclasses may override this routine to provide
2760   /// different behavior.
2761   ExprResult RebuildCXXThisExpr(SourceLocation ThisLoc,
2762                                 QualType ThisType,
2763                                 bool isImplicit) {
2764     return getSema().BuildCXXThisExpr(ThisLoc, ThisType, isImplicit);
2765   }
2766 
2767   /// Build a new C++ throw expression.
2768   ///
2769   /// By default, performs semantic analysis to build the new expression.
2770   /// Subclasses may override this routine to provide different behavior.
2771   ExprResult RebuildCXXThrowExpr(SourceLocation ThrowLoc, Expr *Sub,
2772                                  bool IsThrownVariableInScope) {
2773     return getSema().BuildCXXThrow(ThrowLoc, Sub, IsThrownVariableInScope);
2774   }
2775 
2776   /// Build a new C++ default-argument expression.
2777   ///
2778   /// By default, builds a new default-argument expression, which does not
2779   /// require any semantic analysis. Subclasses may override this routine to
2780   /// provide different behavior.
2781   ExprResult RebuildCXXDefaultArgExpr(SourceLocation Loc, ParmVarDecl *Param) {
2782     return CXXDefaultArgExpr::Create(getSema().Context, Loc, Param,
2783                                      getSema().CurContext);
2784   }
2785 
2786   /// Build a new C++11 default-initialization expression.
2787   ///
2788   /// By default, builds a new default field initialization expression, which
2789   /// does not require any semantic analysis. Subclasses may override this
2790   /// routine to provide different behavior.
2791   ExprResult RebuildCXXDefaultInitExpr(SourceLocation Loc,
2792                                        FieldDecl *Field) {
2793     return CXXDefaultInitExpr::Create(getSema().Context, Loc, Field,
2794                                       getSema().CurContext);
2795   }
2796 
2797   /// Build a new C++ zero-initialization expression.
2798   ///
2799   /// By default, performs semantic analysis to build the new expression.
2800   /// Subclasses may override this routine to provide different behavior.
2801   ExprResult RebuildCXXScalarValueInitExpr(TypeSourceInfo *TSInfo,
2802                                            SourceLocation LParenLoc,
2803                                            SourceLocation RParenLoc) {
2804     return getSema().BuildCXXTypeConstructExpr(
2805         TSInfo, LParenLoc, None, RParenLoc, /*ListInitialization=*/false);
2806   }
2807 
2808   /// Build a new C++ "new" expression.
2809   ///
2810   /// By default, performs semantic analysis to build the new expression.
2811   /// Subclasses may override this routine to provide different behavior.
2812   ExprResult RebuildCXXNewExpr(SourceLocation StartLoc,
2813                                bool UseGlobal,
2814                                SourceLocation PlacementLParen,
2815                                MultiExprArg PlacementArgs,
2816                                SourceLocation PlacementRParen,
2817                                SourceRange TypeIdParens,
2818                                QualType AllocatedType,
2819                                TypeSourceInfo *AllocatedTypeInfo,
2820                                Optional<Expr *> ArraySize,
2821                                SourceRange DirectInitRange,
2822                                Expr *Initializer) {
2823     return getSema().BuildCXXNew(StartLoc, UseGlobal,
2824                                  PlacementLParen,
2825                                  PlacementArgs,
2826                                  PlacementRParen,
2827                                  TypeIdParens,
2828                                  AllocatedType,
2829                                  AllocatedTypeInfo,
2830                                  ArraySize,
2831                                  DirectInitRange,
2832                                  Initializer);
2833   }
2834 
2835   /// Build a new C++ "delete" expression.
2836   ///
2837   /// By default, performs semantic analysis to build the new expression.
2838   /// Subclasses may override this routine to provide different behavior.
2839   ExprResult RebuildCXXDeleteExpr(SourceLocation StartLoc,
2840                                         bool IsGlobalDelete,
2841                                         bool IsArrayForm,
2842                                         Expr *Operand) {
2843     return getSema().ActOnCXXDelete(StartLoc, IsGlobalDelete, IsArrayForm,
2844                                     Operand);
2845   }
2846 
2847   /// Build a new type trait expression.
2848   ///
2849   /// By default, performs semantic analysis to build the new expression.
2850   /// Subclasses may override this routine to provide different behavior.
2851   ExprResult RebuildTypeTrait(TypeTrait Trait,
2852                               SourceLocation StartLoc,
2853                               ArrayRef<TypeSourceInfo *> Args,
2854                               SourceLocation RParenLoc) {
2855     return getSema().BuildTypeTrait(Trait, StartLoc, Args, RParenLoc);
2856   }
2857 
2858   /// Build a new array type trait expression.
2859   ///
2860   /// By default, performs semantic analysis to build the new expression.
2861   /// Subclasses may override this routine to provide different behavior.
2862   ExprResult RebuildArrayTypeTrait(ArrayTypeTrait Trait,
2863                                    SourceLocation StartLoc,
2864                                    TypeSourceInfo *TSInfo,
2865                                    Expr *DimExpr,
2866                                    SourceLocation RParenLoc) {
2867     return getSema().BuildArrayTypeTrait(Trait, StartLoc, TSInfo, DimExpr, RParenLoc);
2868   }
2869 
2870   /// Build a new expression trait expression.
2871   ///
2872   /// By default, performs semantic analysis to build the new expression.
2873   /// Subclasses may override this routine to provide different behavior.
2874   ExprResult RebuildExpressionTrait(ExpressionTrait Trait,
2875                                    SourceLocation StartLoc,
2876                                    Expr *Queried,
2877                                    SourceLocation RParenLoc) {
2878     return getSema().BuildExpressionTrait(Trait, StartLoc, Queried, RParenLoc);
2879   }
2880 
2881   /// Build a new (previously unresolved) declaration reference
2882   /// expression.
2883   ///
2884   /// By default, performs semantic analysis to build the new expression.
2885   /// Subclasses may override this routine to provide different behavior.
2886   ExprResult RebuildDependentScopeDeclRefExpr(
2887                                           NestedNameSpecifierLoc QualifierLoc,
2888                                           SourceLocation TemplateKWLoc,
2889                                        const DeclarationNameInfo &NameInfo,
2890                               const TemplateArgumentListInfo *TemplateArgs,
2891                                           bool IsAddressOfOperand,
2892                                           TypeSourceInfo **RecoveryTSI) {
2893     CXXScopeSpec SS;
2894     SS.Adopt(QualifierLoc);
2895 
2896     if (TemplateArgs || TemplateKWLoc.isValid())
2897       return getSema().BuildQualifiedTemplateIdExpr(SS, TemplateKWLoc, NameInfo,
2898                                                     TemplateArgs);
2899 
2900     return getSema().BuildQualifiedDeclarationNameExpr(
2901         SS, NameInfo, IsAddressOfOperand, /*S*/nullptr, RecoveryTSI);
2902   }
2903 
2904   /// Build a new template-id expression.
2905   ///
2906   /// By default, performs semantic analysis to build the new expression.
2907   /// Subclasses may override this routine to provide different behavior.
2908   ExprResult RebuildTemplateIdExpr(const CXXScopeSpec &SS,
2909                                    SourceLocation TemplateKWLoc,
2910                                    LookupResult &R,
2911                                    bool RequiresADL,
2912                               const TemplateArgumentListInfo *TemplateArgs) {
2913     return getSema().BuildTemplateIdExpr(SS, TemplateKWLoc, R, RequiresADL,
2914                                          TemplateArgs);
2915   }
2916 
2917   /// Build a new object-construction expression.
2918   ///
2919   /// By default, performs semantic analysis to build the new expression.
2920   /// Subclasses may override this routine to provide different behavior.
2921   ExprResult RebuildCXXConstructExpr(QualType T,
2922                                      SourceLocation Loc,
2923                                      CXXConstructorDecl *Constructor,
2924                                      bool IsElidable,
2925                                      MultiExprArg Args,
2926                                      bool HadMultipleCandidates,
2927                                      bool ListInitialization,
2928                                      bool StdInitListInitialization,
2929                                      bool RequiresZeroInit,
2930                              CXXConstructExpr::ConstructionKind ConstructKind,
2931                                      SourceRange ParenRange) {
2932     SmallVector<Expr*, 8> ConvertedArgs;
2933     if (getSema().CompleteConstructorCall(Constructor, Args, Loc,
2934                                           ConvertedArgs))
2935       return ExprError();
2936 
2937     return getSema().BuildCXXConstructExpr(Loc, T, Constructor,
2938                                            IsElidable,
2939                                            ConvertedArgs,
2940                                            HadMultipleCandidates,
2941                                            ListInitialization,
2942                                            StdInitListInitialization,
2943                                            RequiresZeroInit, ConstructKind,
2944                                            ParenRange);
2945   }
2946 
2947   /// Build a new implicit construction via inherited constructor
2948   /// expression.
2949   ExprResult RebuildCXXInheritedCtorInitExpr(QualType T, SourceLocation Loc,
2950                                              CXXConstructorDecl *Constructor,
2951                                              bool ConstructsVBase,
2952                                              bool InheritedFromVBase) {
2953     return new (getSema().Context) CXXInheritedCtorInitExpr(
2954         Loc, T, Constructor, ConstructsVBase, InheritedFromVBase);
2955   }
2956 
2957   /// Build a new object-construction 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 RebuildCXXTemporaryObjectExpr(TypeSourceInfo *TSInfo,
2962                                            SourceLocation LParenOrBraceLoc,
2963                                            MultiExprArg Args,
2964                                            SourceLocation RParenOrBraceLoc,
2965                                            bool ListInitialization) {
2966     return getSema().BuildCXXTypeConstructExpr(
2967         TSInfo, LParenOrBraceLoc, Args, RParenOrBraceLoc, ListInitialization);
2968   }
2969 
2970   /// Build a new object-construction expression.
2971   ///
2972   /// By default, performs semantic analysis to build the new expression.
2973   /// Subclasses may override this routine to provide different behavior.
2974   ExprResult RebuildCXXUnresolvedConstructExpr(TypeSourceInfo *TSInfo,
2975                                                SourceLocation LParenLoc,
2976                                                MultiExprArg Args,
2977                                                SourceLocation RParenLoc,
2978                                                bool ListInitialization) {
2979     return getSema().BuildCXXTypeConstructExpr(TSInfo, LParenLoc, Args,
2980                                                RParenLoc, ListInitialization);
2981   }
2982 
2983   /// Build a new member reference expression.
2984   ///
2985   /// By default, performs semantic analysis to build the new expression.
2986   /// Subclasses may override this routine to provide different behavior.
2987   ExprResult RebuildCXXDependentScopeMemberExpr(Expr *BaseE,
2988                                                 QualType BaseType,
2989                                                 bool IsArrow,
2990                                                 SourceLocation OperatorLoc,
2991                                           NestedNameSpecifierLoc QualifierLoc,
2992                                                 SourceLocation TemplateKWLoc,
2993                                             NamedDecl *FirstQualifierInScope,
2994                                    const DeclarationNameInfo &MemberNameInfo,
2995                               const TemplateArgumentListInfo *TemplateArgs) {
2996     CXXScopeSpec SS;
2997     SS.Adopt(QualifierLoc);
2998 
2999     return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType,
3000                                             OperatorLoc, IsArrow,
3001                                             SS, TemplateKWLoc,
3002                                             FirstQualifierInScope,
3003                                             MemberNameInfo,
3004                                             TemplateArgs, /*S*/nullptr);
3005   }
3006 
3007   /// Build a new member reference expression.
3008   ///
3009   /// By default, performs semantic analysis to build the new expression.
3010   /// Subclasses may override this routine to provide different behavior.
3011   ExprResult RebuildUnresolvedMemberExpr(Expr *BaseE, QualType BaseType,
3012                                          SourceLocation OperatorLoc,
3013                                          bool IsArrow,
3014                                          NestedNameSpecifierLoc QualifierLoc,
3015                                          SourceLocation TemplateKWLoc,
3016                                          NamedDecl *FirstQualifierInScope,
3017                                          LookupResult &R,
3018                                 const TemplateArgumentListInfo *TemplateArgs) {
3019     CXXScopeSpec SS;
3020     SS.Adopt(QualifierLoc);
3021 
3022     return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType,
3023                                             OperatorLoc, IsArrow,
3024                                             SS, TemplateKWLoc,
3025                                             FirstQualifierInScope,
3026                                             R, TemplateArgs, /*S*/nullptr);
3027   }
3028 
3029   /// Build a new noexcept expression.
3030   ///
3031   /// By default, performs semantic analysis to build the new expression.
3032   /// Subclasses may override this routine to provide different behavior.
3033   ExprResult RebuildCXXNoexceptExpr(SourceRange Range, Expr *Arg) {
3034     return SemaRef.BuildCXXNoexceptExpr(Range.getBegin(), Arg, Range.getEnd());
3035   }
3036 
3037   /// Build a new expression to compute the length of a parameter pack.
3038   ExprResult RebuildSizeOfPackExpr(SourceLocation OperatorLoc,
3039                                    NamedDecl *Pack,
3040                                    SourceLocation PackLoc,
3041                                    SourceLocation RParenLoc,
3042                                    Optional<unsigned> Length,
3043                                    ArrayRef<TemplateArgument> PartialArgs) {
3044     return SizeOfPackExpr::Create(SemaRef.Context, OperatorLoc, Pack, PackLoc,
3045                                   RParenLoc, Length, PartialArgs);
3046   }
3047 
3048   /// Build a new expression representing a call to a source location
3049   ///  builtin.
3050   ///
3051   /// By default, performs semantic analysis to build the new expression.
3052   /// Subclasses may override this routine to provide different behavior.
3053   ExprResult RebuildSourceLocExpr(SourceLocExpr::IdentKind Kind,
3054                                   SourceLocation BuiltinLoc,
3055                                   SourceLocation RPLoc,
3056                                   DeclContext *ParentContext) {
3057     return getSema().BuildSourceLocExpr(Kind, BuiltinLoc, RPLoc, ParentContext);
3058   }
3059 
3060   /// Build a new Objective-C boxed expression.
3061   ///
3062   /// By default, performs semantic analysis to build the new expression.
3063   /// Subclasses may override this routine to provide different behavior.
3064   ExprResult RebuildConceptSpecializationExpr(NestedNameSpecifierLoc NNS,
3065       SourceLocation TemplateKWLoc, DeclarationNameInfo ConceptNameInfo,
3066       NamedDecl *FoundDecl, ConceptDecl *NamedConcept,
3067       TemplateArgumentListInfo *TALI) {
3068     CXXScopeSpec SS;
3069     SS.Adopt(NNS);
3070     ExprResult Result = getSema().CheckConceptTemplateId(SS, TemplateKWLoc,
3071                                                          ConceptNameInfo,
3072                                                          FoundDecl,
3073                                                          NamedConcept, TALI);
3074     if (Result.isInvalid())
3075       return ExprError();
3076     return Result;
3077   }
3078 
3079   /// \brief Build a new requires expression.
3080   ///
3081   /// By default, performs semantic analysis to build the new expression.
3082   /// Subclasses may override this routine to provide different behavior.
3083   ExprResult RebuildRequiresExpr(SourceLocation RequiresKWLoc,
3084                                  RequiresExprBodyDecl *Body,
3085                                  ArrayRef<ParmVarDecl *> LocalParameters,
3086                                  ArrayRef<concepts::Requirement *> Requirements,
3087                                  SourceLocation ClosingBraceLoc) {
3088     return RequiresExpr::Create(SemaRef.Context, RequiresKWLoc, Body,
3089                                 LocalParameters, Requirements, ClosingBraceLoc);
3090   }
3091 
3092   concepts::TypeRequirement *
3093   RebuildTypeRequirement(
3094       concepts::Requirement::SubstitutionDiagnostic *SubstDiag) {
3095     return SemaRef.BuildTypeRequirement(SubstDiag);
3096   }
3097 
3098   concepts::TypeRequirement *RebuildTypeRequirement(TypeSourceInfo *T) {
3099     return SemaRef.BuildTypeRequirement(T);
3100   }
3101 
3102   concepts::ExprRequirement *
3103   RebuildExprRequirement(
3104       concepts::Requirement::SubstitutionDiagnostic *SubstDiag, bool IsSimple,
3105       SourceLocation NoexceptLoc,
3106       concepts::ExprRequirement::ReturnTypeRequirement Ret) {
3107     return SemaRef.BuildExprRequirement(SubstDiag, IsSimple, NoexceptLoc,
3108                                         std::move(Ret));
3109   }
3110 
3111   concepts::ExprRequirement *
3112   RebuildExprRequirement(Expr *E, bool IsSimple, SourceLocation NoexceptLoc,
3113                          concepts::ExprRequirement::ReturnTypeRequirement Ret) {
3114     return SemaRef.BuildExprRequirement(E, IsSimple, NoexceptLoc,
3115                                         std::move(Ret));
3116   }
3117 
3118   concepts::NestedRequirement *
3119   RebuildNestedRequirement(
3120       concepts::Requirement::SubstitutionDiagnostic *SubstDiag) {
3121     return SemaRef.BuildNestedRequirement(SubstDiag);
3122   }
3123 
3124   concepts::NestedRequirement *RebuildNestedRequirement(Expr *Constraint) {
3125     return SemaRef.BuildNestedRequirement(Constraint);
3126   }
3127 
3128   /// \brief Build a new Objective-C boxed 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 RebuildObjCBoxedExpr(SourceRange SR, Expr *ValueExpr) {
3133     return getSema().BuildObjCBoxedExpr(SR, ValueExpr);
3134   }
3135 
3136   /// Build a new Objective-C array literal.
3137   ///
3138   /// By default, performs semantic analysis to build the new expression.
3139   /// Subclasses may override this routine to provide different behavior.
3140   ExprResult RebuildObjCArrayLiteral(SourceRange Range,
3141                                      Expr **Elements, unsigned NumElements) {
3142     return getSema().BuildObjCArrayLiteral(Range,
3143                                            MultiExprArg(Elements, NumElements));
3144   }
3145 
3146   ExprResult RebuildObjCSubscriptRefExpr(SourceLocation RB,
3147                                          Expr *Base, Expr *Key,
3148                                          ObjCMethodDecl *getterMethod,
3149                                          ObjCMethodDecl *setterMethod) {
3150     return  getSema().BuildObjCSubscriptExpression(RB, Base, Key,
3151                                                    getterMethod, setterMethod);
3152   }
3153 
3154   /// Build a new Objective-C dictionary literal.
3155   ///
3156   /// By default, performs semantic analysis to build the new expression.
3157   /// Subclasses may override this routine to provide different behavior.
3158   ExprResult RebuildObjCDictionaryLiteral(SourceRange Range,
3159                               MutableArrayRef<ObjCDictionaryElement> Elements) {
3160     return getSema().BuildObjCDictionaryLiteral(Range, Elements);
3161   }
3162 
3163   /// Build a new Objective-C \@encode expression.
3164   ///
3165   /// By default, performs semantic analysis to build the new expression.
3166   /// Subclasses may override this routine to provide different behavior.
3167   ExprResult RebuildObjCEncodeExpr(SourceLocation AtLoc,
3168                                          TypeSourceInfo *EncodeTypeInfo,
3169                                          SourceLocation RParenLoc) {
3170     return SemaRef.BuildObjCEncodeExpression(AtLoc, EncodeTypeInfo, RParenLoc);
3171   }
3172 
3173   /// Build a new Objective-C class message.
3174   ExprResult RebuildObjCMessageExpr(TypeSourceInfo *ReceiverTypeInfo,
3175                                           Selector Sel,
3176                                           ArrayRef<SourceLocation> SelectorLocs,
3177                                           ObjCMethodDecl *Method,
3178                                           SourceLocation LBracLoc,
3179                                           MultiExprArg Args,
3180                                           SourceLocation RBracLoc) {
3181     return SemaRef.BuildClassMessage(ReceiverTypeInfo,
3182                                      ReceiverTypeInfo->getType(),
3183                                      /*SuperLoc=*/SourceLocation(),
3184                                      Sel, Method, LBracLoc, SelectorLocs,
3185                                      RBracLoc, Args);
3186   }
3187 
3188   /// Build a new Objective-C instance message.
3189   ExprResult RebuildObjCMessageExpr(Expr *Receiver,
3190                                           Selector Sel,
3191                                           ArrayRef<SourceLocation> SelectorLocs,
3192                                           ObjCMethodDecl *Method,
3193                                           SourceLocation LBracLoc,
3194                                           MultiExprArg Args,
3195                                           SourceLocation RBracLoc) {
3196     return SemaRef.BuildInstanceMessage(Receiver,
3197                                         Receiver->getType(),
3198                                         /*SuperLoc=*/SourceLocation(),
3199                                         Sel, Method, LBracLoc, SelectorLocs,
3200                                         RBracLoc, Args);
3201   }
3202 
3203   /// Build a new Objective-C instance/class message to 'super'.
3204   ExprResult RebuildObjCMessageExpr(SourceLocation SuperLoc,
3205                                     Selector Sel,
3206                                     ArrayRef<SourceLocation> SelectorLocs,
3207                                     QualType SuperType,
3208                                     ObjCMethodDecl *Method,
3209                                     SourceLocation LBracLoc,
3210                                     MultiExprArg Args,
3211                                     SourceLocation RBracLoc) {
3212     return Method->isInstanceMethod() ? SemaRef.BuildInstanceMessage(nullptr,
3213                                           SuperType,
3214                                           SuperLoc,
3215                                           Sel, Method, LBracLoc, SelectorLocs,
3216                                           RBracLoc, Args)
3217                                       : SemaRef.BuildClassMessage(nullptr,
3218                                           SuperType,
3219                                           SuperLoc,
3220                                           Sel, Method, LBracLoc, SelectorLocs,
3221                                           RBracLoc, Args);
3222 
3223 
3224   }
3225 
3226   /// Build a new Objective-C ivar reference expression.
3227   ///
3228   /// By default, performs semantic analysis to build the new expression.
3229   /// Subclasses may override this routine to provide different behavior.
3230   ExprResult RebuildObjCIvarRefExpr(Expr *BaseArg, ObjCIvarDecl *Ivar,
3231                                           SourceLocation IvarLoc,
3232                                           bool IsArrow, bool IsFreeIvar) {
3233     CXXScopeSpec SS;
3234     DeclarationNameInfo NameInfo(Ivar->getDeclName(), IvarLoc);
3235     ExprResult Result = getSema().BuildMemberReferenceExpr(
3236         BaseArg, BaseArg->getType(),
3237         /*FIXME:*/ IvarLoc, IsArrow, SS, SourceLocation(),
3238         /*FirstQualifierInScope=*/nullptr, NameInfo,
3239         /*TemplateArgs=*/nullptr,
3240         /*S=*/nullptr);
3241     if (IsFreeIvar && Result.isUsable())
3242       cast<ObjCIvarRefExpr>(Result.get())->setIsFreeIvar(IsFreeIvar);
3243     return Result;
3244   }
3245 
3246   /// Build a new Objective-C property reference expression.
3247   ///
3248   /// By default, performs semantic analysis to build the new expression.
3249   /// Subclasses may override this routine to provide different behavior.
3250   ExprResult RebuildObjCPropertyRefExpr(Expr *BaseArg,
3251                                         ObjCPropertyDecl *Property,
3252                                         SourceLocation PropertyLoc) {
3253     CXXScopeSpec SS;
3254     DeclarationNameInfo NameInfo(Property->getDeclName(), PropertyLoc);
3255     return getSema().BuildMemberReferenceExpr(BaseArg, BaseArg->getType(),
3256                                               /*FIXME:*/PropertyLoc,
3257                                               /*IsArrow=*/false,
3258                                               SS, SourceLocation(),
3259                                               /*FirstQualifierInScope=*/nullptr,
3260                                               NameInfo,
3261                                               /*TemplateArgs=*/nullptr,
3262                                               /*S=*/nullptr);
3263   }
3264 
3265   /// Build a new Objective-C property reference expression.
3266   ///
3267   /// By default, performs semantic analysis to build the new expression.
3268   /// Subclasses may override this routine to provide different behavior.
3269   ExprResult RebuildObjCPropertyRefExpr(Expr *Base, QualType T,
3270                                         ObjCMethodDecl *Getter,
3271                                         ObjCMethodDecl *Setter,
3272                                         SourceLocation PropertyLoc) {
3273     // Since these expressions can only be value-dependent, we do not
3274     // need to perform semantic analysis again.
3275     return Owned(
3276       new (getSema().Context) ObjCPropertyRefExpr(Getter, Setter, T,
3277                                                   VK_LValue, OK_ObjCProperty,
3278                                                   PropertyLoc, Base));
3279   }
3280 
3281   /// Build a new Objective-C "isa" expression.
3282   ///
3283   /// By default, performs semantic analysis to build the new expression.
3284   /// Subclasses may override this routine to provide different behavior.
3285   ExprResult RebuildObjCIsaExpr(Expr *BaseArg, SourceLocation IsaLoc,
3286                                 SourceLocation OpLoc, bool IsArrow) {
3287     CXXScopeSpec SS;
3288     DeclarationNameInfo NameInfo(&getSema().Context.Idents.get("isa"), IsaLoc);
3289     return getSema().BuildMemberReferenceExpr(BaseArg, BaseArg->getType(),
3290                                               OpLoc, IsArrow,
3291                                               SS, SourceLocation(),
3292                                               /*FirstQualifierInScope=*/nullptr,
3293                                               NameInfo,
3294                                               /*TemplateArgs=*/nullptr,
3295                                               /*S=*/nullptr);
3296   }
3297 
3298   /// Build a new shuffle vector expression.
3299   ///
3300   /// By default, performs semantic analysis to build the new expression.
3301   /// Subclasses may override this routine to provide different behavior.
3302   ExprResult RebuildShuffleVectorExpr(SourceLocation BuiltinLoc,
3303                                       MultiExprArg SubExprs,
3304                                       SourceLocation RParenLoc) {
3305     // Find the declaration for __builtin_shufflevector
3306     const IdentifierInfo &Name
3307       = SemaRef.Context.Idents.get("__builtin_shufflevector");
3308     TranslationUnitDecl *TUDecl = SemaRef.Context.getTranslationUnitDecl();
3309     DeclContext::lookup_result Lookup = TUDecl->lookup(DeclarationName(&Name));
3310     assert(!Lookup.empty() && "No __builtin_shufflevector?");
3311 
3312     // Build a reference to the __builtin_shufflevector builtin
3313     FunctionDecl *Builtin = cast<FunctionDecl>(Lookup.front());
3314     Expr *Callee = new (SemaRef.Context)
3315         DeclRefExpr(SemaRef.Context, Builtin, false,
3316                     SemaRef.Context.BuiltinFnTy, VK_RValue, BuiltinLoc);
3317     QualType CalleePtrTy = SemaRef.Context.getPointerType(Builtin->getType());
3318     Callee = SemaRef.ImpCastExprToType(Callee, CalleePtrTy,
3319                                        CK_BuiltinFnToFnPtr).get();
3320 
3321     // Build the CallExpr
3322     ExprResult TheCall = CallExpr::Create(
3323         SemaRef.Context, Callee, SubExprs, Builtin->getCallResultType(),
3324         Expr::getValueKindForType(Builtin->getReturnType()), RParenLoc);
3325 
3326     // Type-check the __builtin_shufflevector expression.
3327     return SemaRef.SemaBuiltinShuffleVector(cast<CallExpr>(TheCall.get()));
3328   }
3329 
3330   /// Build a new convert vector expression.
3331   ExprResult RebuildConvertVectorExpr(SourceLocation BuiltinLoc,
3332                                       Expr *SrcExpr, TypeSourceInfo *DstTInfo,
3333                                       SourceLocation RParenLoc) {
3334     return SemaRef.SemaConvertVectorExpr(SrcExpr, DstTInfo,
3335                                          BuiltinLoc, RParenLoc);
3336   }
3337 
3338   /// Build a new template argument pack expansion.
3339   ///
3340   /// By default, performs semantic analysis to build a new pack expansion
3341   /// for a template argument. Subclasses may override this routine to provide
3342   /// different behavior.
3343   TemplateArgumentLoc RebuildPackExpansion(TemplateArgumentLoc Pattern,
3344                                            SourceLocation EllipsisLoc,
3345                                            Optional<unsigned> NumExpansions) {
3346     switch (Pattern.getArgument().getKind()) {
3347     case TemplateArgument::Expression: {
3348       ExprResult Result
3349         = getSema().CheckPackExpansion(Pattern.getSourceExpression(),
3350                                        EllipsisLoc, NumExpansions);
3351       if (Result.isInvalid())
3352         return TemplateArgumentLoc();
3353 
3354       return TemplateArgumentLoc(Result.get(), Result.get());
3355     }
3356 
3357     case TemplateArgument::Template:
3358       return TemplateArgumentLoc(TemplateArgument(
3359                                           Pattern.getArgument().getAsTemplate(),
3360                                                   NumExpansions),
3361                                  Pattern.getTemplateQualifierLoc(),
3362                                  Pattern.getTemplateNameLoc(),
3363                                  EllipsisLoc);
3364 
3365     case TemplateArgument::Null:
3366     case TemplateArgument::Integral:
3367     case TemplateArgument::Declaration:
3368     case TemplateArgument::Pack:
3369     case TemplateArgument::TemplateExpansion:
3370     case TemplateArgument::NullPtr:
3371       llvm_unreachable("Pack expansion pattern has no parameter packs");
3372 
3373     case TemplateArgument::Type:
3374       if (TypeSourceInfo *Expansion
3375             = getSema().CheckPackExpansion(Pattern.getTypeSourceInfo(),
3376                                            EllipsisLoc,
3377                                            NumExpansions))
3378         return TemplateArgumentLoc(TemplateArgument(Expansion->getType()),
3379                                    Expansion);
3380       break;
3381     }
3382 
3383     return TemplateArgumentLoc();
3384   }
3385 
3386   /// Build a new expression pack expansion.
3387   ///
3388   /// By default, performs semantic analysis to build a new pack expansion
3389   /// for an expression. Subclasses may override this routine to provide
3390   /// different behavior.
3391   ExprResult RebuildPackExpansion(Expr *Pattern, SourceLocation EllipsisLoc,
3392                                   Optional<unsigned> NumExpansions) {
3393     return getSema().CheckPackExpansion(Pattern, EllipsisLoc, NumExpansions);
3394   }
3395 
3396   /// Build a new C++1z fold-expression.
3397   ///
3398   /// By default, performs semantic analysis in order to build a new fold
3399   /// expression.
3400   ExprResult RebuildCXXFoldExpr(SourceLocation LParenLoc, Expr *LHS,
3401                                 BinaryOperatorKind Operator,
3402                                 SourceLocation EllipsisLoc, Expr *RHS,
3403                                 SourceLocation RParenLoc,
3404                                 Optional<unsigned> NumExpansions) {
3405     return getSema().BuildCXXFoldExpr(LParenLoc, LHS, Operator, EllipsisLoc,
3406                                       RHS, RParenLoc, NumExpansions);
3407   }
3408 
3409   /// Build an empty C++1z fold-expression with the given operator.
3410   ///
3411   /// By default, produces the fallback value for the fold-expression, or
3412   /// produce an error if there is no fallback value.
3413   ExprResult RebuildEmptyCXXFoldExpr(SourceLocation EllipsisLoc,
3414                                      BinaryOperatorKind Operator) {
3415     return getSema().BuildEmptyCXXFoldExpr(EllipsisLoc, Operator);
3416   }
3417 
3418   /// Build a new atomic operation expression.
3419   ///
3420   /// By default, performs semantic analysis to build the new expression.
3421   /// Subclasses may override this routine to provide different behavior.
3422   ExprResult RebuildAtomicExpr(SourceLocation BuiltinLoc, MultiExprArg SubExprs,
3423                                AtomicExpr::AtomicOp Op,
3424                                SourceLocation RParenLoc) {
3425     // Use this for all of the locations, since we don't know the difference
3426     // between the call and the expr at this point.
3427     SourceRange Range{BuiltinLoc, RParenLoc};
3428     return getSema().BuildAtomicExpr(Range, Range, RParenLoc, SubExprs, Op,
3429                                      Sema::AtomicArgumentOrder::AST);
3430   }
3431 
3432 private:
3433   TypeLoc TransformTypeInObjectScope(TypeLoc TL,
3434                                      QualType ObjectType,
3435                                      NamedDecl *FirstQualifierInScope,
3436                                      CXXScopeSpec &SS);
3437 
3438   TypeSourceInfo *TransformTypeInObjectScope(TypeSourceInfo *TSInfo,
3439                                              QualType ObjectType,
3440                                              NamedDecl *FirstQualifierInScope,
3441                                              CXXScopeSpec &SS);
3442 
3443   TypeSourceInfo *TransformTSIInObjectScope(TypeLoc TL, QualType ObjectType,
3444                                             NamedDecl *FirstQualifierInScope,
3445                                             CXXScopeSpec &SS);
3446 
3447   QualType TransformDependentNameType(TypeLocBuilder &TLB,
3448                                       DependentNameTypeLoc TL,
3449                                       bool DeducibleTSTContext);
3450 };
3451 
3452 template <typename Derived>
3453 StmtResult TreeTransform<Derived>::TransformStmt(Stmt *S, StmtDiscardKind SDK) {
3454   if (!S)
3455     return S;
3456 
3457   switch (S->getStmtClass()) {
3458   case Stmt::NoStmtClass: break;
3459 
3460   // Transform individual statement nodes
3461   // Pass SDK into statements that can produce a value
3462 #define STMT(Node, Parent)                                              \
3463   case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(S));
3464 #define VALUESTMT(Node, Parent)                                         \
3465   case Stmt::Node##Class:                                               \
3466     return getDerived().Transform##Node(cast<Node>(S), SDK);
3467 #define ABSTRACT_STMT(Node)
3468 #define EXPR(Node, Parent)
3469 #include "clang/AST/StmtNodes.inc"
3470 
3471   // Transform expressions by calling TransformExpr.
3472 #define STMT(Node, Parent)
3473 #define ABSTRACT_STMT(Stmt)
3474 #define EXPR(Node, Parent) case Stmt::Node##Class:
3475 #include "clang/AST/StmtNodes.inc"
3476     {
3477       ExprResult E = getDerived().TransformExpr(cast<Expr>(S));
3478 
3479       if (SDK == SDK_StmtExprResult)
3480         E = getSema().ActOnStmtExprResult(E);
3481       return getSema().ActOnExprStmt(E, SDK == SDK_Discarded);
3482     }
3483   }
3484 
3485   return S;
3486 }
3487 
3488 template<typename Derived>
3489 OMPClause *TreeTransform<Derived>::TransformOMPClause(OMPClause *S) {
3490   if (!S)
3491     return S;
3492 
3493   switch (S->getClauseKind()) {
3494   default: break;
3495   // Transform individual clause nodes
3496 #define OPENMP_CLAUSE(Name, Class)                                             \
3497   case OMPC_ ## Name :                                                         \
3498     return getDerived().Transform ## Class(cast<Class>(S));
3499 #include "clang/Basic/OpenMPKinds.def"
3500   }
3501 
3502   return S;
3503 }
3504 
3505 
3506 template<typename Derived>
3507 ExprResult TreeTransform<Derived>::TransformExpr(Expr *E) {
3508   if (!E)
3509     return E;
3510 
3511   switch (E->getStmtClass()) {
3512     case Stmt::NoStmtClass: break;
3513 #define STMT(Node, Parent) case Stmt::Node##Class: break;
3514 #define ABSTRACT_STMT(Stmt)
3515 #define EXPR(Node, Parent)                                              \
3516     case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(E));
3517 #include "clang/AST/StmtNodes.inc"
3518   }
3519 
3520   return E;
3521 }
3522 
3523 template<typename Derived>
3524 ExprResult TreeTransform<Derived>::TransformInitializer(Expr *Init,
3525                                                         bool NotCopyInit) {
3526   // Initializers are instantiated like expressions, except that various outer
3527   // layers are stripped.
3528   if (!Init)
3529     return Init;
3530 
3531   if (auto *FE = dyn_cast<FullExpr>(Init))
3532     Init = FE->getSubExpr();
3533 
3534   if (auto *AIL = dyn_cast<ArrayInitLoopExpr>(Init))
3535     Init = AIL->getCommonExpr();
3536 
3537   if (MaterializeTemporaryExpr *MTE = dyn_cast<MaterializeTemporaryExpr>(Init))
3538     Init = MTE->getSubExpr();
3539 
3540   while (CXXBindTemporaryExpr *Binder = dyn_cast<CXXBindTemporaryExpr>(Init))
3541     Init = Binder->getSubExpr();
3542 
3543   if (ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(Init))
3544     Init = ICE->getSubExprAsWritten();
3545 
3546   if (CXXStdInitializerListExpr *ILE =
3547           dyn_cast<CXXStdInitializerListExpr>(Init))
3548     return TransformInitializer(ILE->getSubExpr(), NotCopyInit);
3549 
3550   // If this is copy-initialization, we only need to reconstruct
3551   // InitListExprs. Other forms of copy-initialization will be a no-op if
3552   // the initializer is already the right type.
3553   CXXConstructExpr *Construct = dyn_cast<CXXConstructExpr>(Init);
3554   if (!NotCopyInit && !(Construct && Construct->isListInitialization()))
3555     return getDerived().TransformExpr(Init);
3556 
3557   // Revert value-initialization back to empty parens.
3558   if (CXXScalarValueInitExpr *VIE = dyn_cast<CXXScalarValueInitExpr>(Init)) {
3559     SourceRange Parens = VIE->getSourceRange();
3560     return getDerived().RebuildParenListExpr(Parens.getBegin(), None,
3561                                              Parens.getEnd());
3562   }
3563 
3564   // FIXME: We shouldn't build ImplicitValueInitExprs for direct-initialization.
3565   if (isa<ImplicitValueInitExpr>(Init))
3566     return getDerived().RebuildParenListExpr(SourceLocation(), None,
3567                                              SourceLocation());
3568 
3569   // Revert initialization by constructor back to a parenthesized or braced list
3570   // of expressions. Any other form of initializer can just be reused directly.
3571   if (!Construct || isa<CXXTemporaryObjectExpr>(Construct))
3572     return getDerived().TransformExpr(Init);
3573 
3574   // If the initialization implicitly converted an initializer list to a
3575   // std::initializer_list object, unwrap the std::initializer_list too.
3576   if (Construct && Construct->isStdInitListInitialization())
3577     return TransformInitializer(Construct->getArg(0), NotCopyInit);
3578 
3579   // Enter a list-init context if this was list initialization.
3580   EnterExpressionEvaluationContext Context(
3581       getSema(), EnterExpressionEvaluationContext::InitList,
3582       Construct->isListInitialization());
3583 
3584   SmallVector<Expr*, 8> NewArgs;
3585   bool ArgChanged = false;
3586   if (getDerived().TransformExprs(Construct->getArgs(), Construct->getNumArgs(),
3587                                   /*IsCall*/true, NewArgs, &ArgChanged))
3588     return ExprError();
3589 
3590   // If this was list initialization, revert to syntactic list form.
3591   if (Construct->isListInitialization())
3592     return getDerived().RebuildInitList(Construct->getBeginLoc(), NewArgs,
3593                                         Construct->getEndLoc());
3594 
3595   // Build a ParenListExpr to represent anything else.
3596   SourceRange Parens = Construct->getParenOrBraceRange();
3597   if (Parens.isInvalid()) {
3598     // This was a variable declaration's initialization for which no initializer
3599     // was specified.
3600     assert(NewArgs.empty() &&
3601            "no parens or braces but have direct init with arguments?");
3602     return ExprEmpty();
3603   }
3604   return getDerived().RebuildParenListExpr(Parens.getBegin(), NewArgs,
3605                                            Parens.getEnd());
3606 }
3607 
3608 template<typename Derived>
3609 bool TreeTransform<Derived>::TransformExprs(Expr *const *Inputs,
3610                                             unsigned NumInputs,
3611                                             bool IsCall,
3612                                       SmallVectorImpl<Expr *> &Outputs,
3613                                             bool *ArgChanged) {
3614   for (unsigned I = 0; I != NumInputs; ++I) {
3615     // If requested, drop call arguments that need to be dropped.
3616     if (IsCall && getDerived().DropCallArgument(Inputs[I])) {
3617       if (ArgChanged)
3618         *ArgChanged = true;
3619 
3620       break;
3621     }
3622 
3623     if (PackExpansionExpr *Expansion = dyn_cast<PackExpansionExpr>(Inputs[I])) {
3624       Expr *Pattern = Expansion->getPattern();
3625 
3626       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
3627       getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
3628       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
3629 
3630       // Determine whether the set of unexpanded parameter packs can and should
3631       // be expanded.
3632       bool Expand = true;
3633       bool RetainExpansion = false;
3634       Optional<unsigned> OrigNumExpansions = Expansion->getNumExpansions();
3635       Optional<unsigned> NumExpansions = OrigNumExpansions;
3636       if (getDerived().TryExpandParameterPacks(Expansion->getEllipsisLoc(),
3637                                                Pattern->getSourceRange(),
3638                                                Unexpanded,
3639                                                Expand, RetainExpansion,
3640                                                NumExpansions))
3641         return true;
3642 
3643       if (!Expand) {
3644         // The transform has determined that we should perform a simple
3645         // transformation on the pack expansion, producing another pack
3646         // expansion.
3647         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
3648         ExprResult OutPattern = getDerived().TransformExpr(Pattern);
3649         if (OutPattern.isInvalid())
3650           return true;
3651 
3652         ExprResult Out = getDerived().RebuildPackExpansion(OutPattern.get(),
3653                                                 Expansion->getEllipsisLoc(),
3654                                                            NumExpansions);
3655         if (Out.isInvalid())
3656           return true;
3657 
3658         if (ArgChanged)
3659           *ArgChanged = true;
3660         Outputs.push_back(Out.get());
3661         continue;
3662       }
3663 
3664       // Record right away that the argument was changed.  This needs
3665       // to happen even if the array expands to nothing.
3666       if (ArgChanged) *ArgChanged = true;
3667 
3668       // The transform has determined that we should perform an elementwise
3669       // expansion of the pattern. Do so.
3670       for (unsigned I = 0; I != *NumExpansions; ++I) {
3671         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
3672         ExprResult Out = getDerived().TransformExpr(Pattern);
3673         if (Out.isInvalid())
3674           return true;
3675 
3676         if (Out.get()->containsUnexpandedParameterPack()) {
3677           Out = getDerived().RebuildPackExpansion(
3678               Out.get(), Expansion->getEllipsisLoc(), OrigNumExpansions);
3679           if (Out.isInvalid())
3680             return true;
3681         }
3682 
3683         Outputs.push_back(Out.get());
3684       }
3685 
3686       // If we're supposed to retain a pack expansion, do so by temporarily
3687       // forgetting the partially-substituted parameter pack.
3688       if (RetainExpansion) {
3689         ForgetPartiallySubstitutedPackRAII Forget(getDerived());
3690 
3691         ExprResult Out = getDerived().TransformExpr(Pattern);
3692         if (Out.isInvalid())
3693           return true;
3694 
3695         Out = getDerived().RebuildPackExpansion(
3696             Out.get(), Expansion->getEllipsisLoc(), OrigNumExpansions);
3697         if (Out.isInvalid())
3698           return true;
3699 
3700         Outputs.push_back(Out.get());
3701       }
3702 
3703       continue;
3704     }
3705 
3706     ExprResult Result =
3707       IsCall ? getDerived().TransformInitializer(Inputs[I], /*DirectInit*/false)
3708              : getDerived().TransformExpr(Inputs[I]);
3709     if (Result.isInvalid())
3710       return true;
3711 
3712     if (Result.get() != Inputs[I] && ArgChanged)
3713       *ArgChanged = true;
3714 
3715     Outputs.push_back(Result.get());
3716   }
3717 
3718   return false;
3719 }
3720 
3721 template <typename Derived>
3722 Sema::ConditionResult TreeTransform<Derived>::TransformCondition(
3723     SourceLocation Loc, VarDecl *Var, Expr *Expr, Sema::ConditionKind Kind) {
3724   if (Var) {
3725     VarDecl *ConditionVar = cast_or_null<VarDecl>(
3726         getDerived().TransformDefinition(Var->getLocation(), Var));
3727 
3728     if (!ConditionVar)
3729       return Sema::ConditionError();
3730 
3731     return getSema().ActOnConditionVariable(ConditionVar, Loc, Kind);
3732   }
3733 
3734   if (Expr) {
3735     ExprResult CondExpr = getDerived().TransformExpr(Expr);
3736 
3737     if (CondExpr.isInvalid())
3738       return Sema::ConditionError();
3739 
3740     return getSema().ActOnCondition(nullptr, Loc, CondExpr.get(), Kind);
3741   }
3742 
3743   return Sema::ConditionResult();
3744 }
3745 
3746 template<typename Derived>
3747 NestedNameSpecifierLoc
3748 TreeTransform<Derived>::TransformNestedNameSpecifierLoc(
3749                                                     NestedNameSpecifierLoc NNS,
3750                                                      QualType ObjectType,
3751                                              NamedDecl *FirstQualifierInScope) {
3752   SmallVector<NestedNameSpecifierLoc, 4> Qualifiers;
3753   for (NestedNameSpecifierLoc Qualifier = NNS; Qualifier;
3754        Qualifier = Qualifier.getPrefix())
3755     Qualifiers.push_back(Qualifier);
3756 
3757   CXXScopeSpec SS;
3758   while (!Qualifiers.empty()) {
3759     NestedNameSpecifierLoc Q = Qualifiers.pop_back_val();
3760     NestedNameSpecifier *QNNS = Q.getNestedNameSpecifier();
3761 
3762     switch (QNNS->getKind()) {
3763     case NestedNameSpecifier::Identifier: {
3764       Sema::NestedNameSpecInfo IdInfo(QNNS->getAsIdentifier(),
3765                           Q.getLocalBeginLoc(), Q.getLocalEndLoc(), ObjectType);
3766       if (SemaRef.BuildCXXNestedNameSpecifier(/*Scope=*/nullptr, IdInfo, false,
3767                                               SS, FirstQualifierInScope, false))
3768         return NestedNameSpecifierLoc();
3769     }
3770       break;
3771 
3772     case NestedNameSpecifier::Namespace: {
3773       NamespaceDecl *NS
3774         = cast_or_null<NamespaceDecl>(
3775                                     getDerived().TransformDecl(
3776                                                           Q.getLocalBeginLoc(),
3777                                                        QNNS->getAsNamespace()));
3778       SS.Extend(SemaRef.Context, NS, Q.getLocalBeginLoc(), Q.getLocalEndLoc());
3779       break;
3780     }
3781 
3782     case NestedNameSpecifier::NamespaceAlias: {
3783       NamespaceAliasDecl *Alias
3784         = cast_or_null<NamespaceAliasDecl>(
3785                       getDerived().TransformDecl(Q.getLocalBeginLoc(),
3786                                                  QNNS->getAsNamespaceAlias()));
3787       SS.Extend(SemaRef.Context, Alias, Q.getLocalBeginLoc(),
3788                 Q.getLocalEndLoc());
3789       break;
3790     }
3791 
3792     case NestedNameSpecifier::Global:
3793       // There is no meaningful transformation that one could perform on the
3794       // global scope.
3795       SS.MakeGlobal(SemaRef.Context, Q.getBeginLoc());
3796       break;
3797 
3798     case NestedNameSpecifier::Super: {
3799       CXXRecordDecl *RD =
3800           cast_or_null<CXXRecordDecl>(getDerived().TransformDecl(
3801               SourceLocation(), QNNS->getAsRecordDecl()));
3802       SS.MakeSuper(SemaRef.Context, RD, Q.getBeginLoc(), Q.getEndLoc());
3803       break;
3804     }
3805 
3806     case NestedNameSpecifier::TypeSpecWithTemplate:
3807     case NestedNameSpecifier::TypeSpec: {
3808       TypeLoc TL = TransformTypeInObjectScope(Q.getTypeLoc(), ObjectType,
3809                                               FirstQualifierInScope, SS);
3810 
3811       if (!TL)
3812         return NestedNameSpecifierLoc();
3813 
3814       if (TL.getType()->isDependentType() || TL.getType()->isRecordType() ||
3815           (SemaRef.getLangOpts().CPlusPlus11 &&
3816            TL.getType()->isEnumeralType())) {
3817         assert(!TL.getType().hasLocalQualifiers() &&
3818                "Can't get cv-qualifiers here");
3819         if (TL.getType()->isEnumeralType())
3820           SemaRef.Diag(TL.getBeginLoc(),
3821                        diag::warn_cxx98_compat_enum_nested_name_spec);
3822         SS.Extend(SemaRef.Context, /*FIXME:*/SourceLocation(), TL,
3823                   Q.getLocalEndLoc());
3824         break;
3825       }
3826       // If the nested-name-specifier is an invalid type def, don't emit an
3827       // error because a previous error should have already been emitted.
3828       TypedefTypeLoc TTL = TL.getAs<TypedefTypeLoc>();
3829       if (!TTL || !TTL.getTypedefNameDecl()->isInvalidDecl()) {
3830         SemaRef.Diag(TL.getBeginLoc(), diag::err_nested_name_spec_non_tag)
3831           << TL.getType() << SS.getRange();
3832       }
3833       return NestedNameSpecifierLoc();
3834     }
3835     }
3836 
3837     // The qualifier-in-scope and object type only apply to the leftmost entity.
3838     FirstQualifierInScope = nullptr;
3839     ObjectType = QualType();
3840   }
3841 
3842   // Don't rebuild the nested-name-specifier if we don't have to.
3843   if (SS.getScopeRep() == NNS.getNestedNameSpecifier() &&
3844       !getDerived().AlwaysRebuild())
3845     return NNS;
3846 
3847   // If we can re-use the source-location data from the original
3848   // nested-name-specifier, do so.
3849   if (SS.location_size() == NNS.getDataLength() &&
3850       memcmp(SS.location_data(), NNS.getOpaqueData(), SS.location_size()) == 0)
3851     return NestedNameSpecifierLoc(SS.getScopeRep(), NNS.getOpaqueData());
3852 
3853   // Allocate new nested-name-specifier location information.
3854   return SS.getWithLocInContext(SemaRef.Context);
3855 }
3856 
3857 template<typename Derived>
3858 DeclarationNameInfo
3859 TreeTransform<Derived>
3860 ::TransformDeclarationNameInfo(const DeclarationNameInfo &NameInfo) {
3861   DeclarationName Name = NameInfo.getName();
3862   if (!Name)
3863     return DeclarationNameInfo();
3864 
3865   switch (Name.getNameKind()) {
3866   case DeclarationName::Identifier:
3867   case DeclarationName::ObjCZeroArgSelector:
3868   case DeclarationName::ObjCOneArgSelector:
3869   case DeclarationName::ObjCMultiArgSelector:
3870   case DeclarationName::CXXOperatorName:
3871   case DeclarationName::CXXLiteralOperatorName:
3872   case DeclarationName::CXXUsingDirective:
3873     return NameInfo;
3874 
3875   case DeclarationName::CXXDeductionGuideName: {
3876     TemplateDecl *OldTemplate = Name.getCXXDeductionGuideTemplate();
3877     TemplateDecl *NewTemplate = cast_or_null<TemplateDecl>(
3878         getDerived().TransformDecl(NameInfo.getLoc(), OldTemplate));
3879     if (!NewTemplate)
3880       return DeclarationNameInfo();
3881 
3882     DeclarationNameInfo NewNameInfo(NameInfo);
3883     NewNameInfo.setName(
3884         SemaRef.Context.DeclarationNames.getCXXDeductionGuideName(NewTemplate));
3885     return NewNameInfo;
3886   }
3887 
3888   case DeclarationName::CXXConstructorName:
3889   case DeclarationName::CXXDestructorName:
3890   case DeclarationName::CXXConversionFunctionName: {
3891     TypeSourceInfo *NewTInfo;
3892     CanQualType NewCanTy;
3893     if (TypeSourceInfo *OldTInfo = NameInfo.getNamedTypeInfo()) {
3894       NewTInfo = getDerived().TransformType(OldTInfo);
3895       if (!NewTInfo)
3896         return DeclarationNameInfo();
3897       NewCanTy = SemaRef.Context.getCanonicalType(NewTInfo->getType());
3898     }
3899     else {
3900       NewTInfo = nullptr;
3901       TemporaryBase Rebase(*this, NameInfo.getLoc(), Name);
3902       QualType NewT = getDerived().TransformType(Name.getCXXNameType());
3903       if (NewT.isNull())
3904         return DeclarationNameInfo();
3905       NewCanTy = SemaRef.Context.getCanonicalType(NewT);
3906     }
3907 
3908     DeclarationName NewName
3909       = SemaRef.Context.DeclarationNames.getCXXSpecialName(Name.getNameKind(),
3910                                                            NewCanTy);
3911     DeclarationNameInfo NewNameInfo(NameInfo);
3912     NewNameInfo.setName(NewName);
3913     NewNameInfo.setNamedTypeInfo(NewTInfo);
3914     return NewNameInfo;
3915   }
3916   }
3917 
3918   llvm_unreachable("Unknown name kind.");
3919 }
3920 
3921 template<typename Derived>
3922 TemplateName
3923 TreeTransform<Derived>::TransformTemplateName(CXXScopeSpec &SS,
3924                                               TemplateName Name,
3925                                               SourceLocation NameLoc,
3926                                               QualType ObjectType,
3927                                               NamedDecl *FirstQualifierInScope,
3928                                               bool AllowInjectedClassName) {
3929   if (QualifiedTemplateName *QTN = Name.getAsQualifiedTemplateName()) {
3930     TemplateDecl *Template = QTN->getTemplateDecl();
3931     assert(Template && "qualified template name must refer to a template");
3932 
3933     TemplateDecl *TransTemplate
3934       = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc,
3935                                                               Template));
3936     if (!TransTemplate)
3937       return TemplateName();
3938 
3939     if (!getDerived().AlwaysRebuild() &&
3940         SS.getScopeRep() == QTN->getQualifier() &&
3941         TransTemplate == Template)
3942       return Name;
3943 
3944     return getDerived().RebuildTemplateName(SS, QTN->hasTemplateKeyword(),
3945                                             TransTemplate);
3946   }
3947 
3948   if (DependentTemplateName *DTN = Name.getAsDependentTemplateName()) {
3949     if (SS.getScopeRep()) {
3950       // These apply to the scope specifier, not the template.
3951       ObjectType = QualType();
3952       FirstQualifierInScope = nullptr;
3953     }
3954 
3955     if (!getDerived().AlwaysRebuild() &&
3956         SS.getScopeRep() == DTN->getQualifier() &&
3957         ObjectType.isNull())
3958       return Name;
3959 
3960     // FIXME: Preserve the location of the "template" keyword.
3961     SourceLocation TemplateKWLoc = NameLoc;
3962 
3963     if (DTN->isIdentifier()) {
3964       return getDerived().RebuildTemplateName(SS,
3965                                               TemplateKWLoc,
3966                                               *DTN->getIdentifier(),
3967                                               NameLoc,
3968                                               ObjectType,
3969                                               FirstQualifierInScope,
3970                                               AllowInjectedClassName);
3971     }
3972 
3973     return getDerived().RebuildTemplateName(SS, TemplateKWLoc,
3974                                             DTN->getOperator(), NameLoc,
3975                                             ObjectType, AllowInjectedClassName);
3976   }
3977 
3978   if (TemplateDecl *Template = Name.getAsTemplateDecl()) {
3979     TemplateDecl *TransTemplate
3980       = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc,
3981                                                               Template));
3982     if (!TransTemplate)
3983       return TemplateName();
3984 
3985     if (!getDerived().AlwaysRebuild() &&
3986         TransTemplate == Template)
3987       return Name;
3988 
3989     return TemplateName(TransTemplate);
3990   }
3991 
3992   if (SubstTemplateTemplateParmPackStorage *SubstPack
3993       = Name.getAsSubstTemplateTemplateParmPack()) {
3994     TemplateTemplateParmDecl *TransParam
3995     = cast_or_null<TemplateTemplateParmDecl>(
3996             getDerived().TransformDecl(NameLoc, SubstPack->getParameterPack()));
3997     if (!TransParam)
3998       return TemplateName();
3999 
4000     if (!getDerived().AlwaysRebuild() &&
4001         TransParam == SubstPack->getParameterPack())
4002       return Name;
4003 
4004     return getDerived().RebuildTemplateName(TransParam,
4005                                             SubstPack->getArgumentPack());
4006   }
4007 
4008   // These should be getting filtered out before they reach the AST.
4009   llvm_unreachable("overloaded function decl survived to here");
4010 }
4011 
4012 template<typename Derived>
4013 void TreeTransform<Derived>::InventTemplateArgumentLoc(
4014                                          const TemplateArgument &Arg,
4015                                          TemplateArgumentLoc &Output) {
4016   SourceLocation Loc = getDerived().getBaseLocation();
4017   switch (Arg.getKind()) {
4018   case TemplateArgument::Null:
4019     llvm_unreachable("null template argument in TreeTransform");
4020     break;
4021 
4022   case TemplateArgument::Type:
4023     Output = TemplateArgumentLoc(Arg,
4024                SemaRef.Context.getTrivialTypeSourceInfo(Arg.getAsType(), Loc));
4025 
4026     break;
4027 
4028   case TemplateArgument::Template:
4029   case TemplateArgument::TemplateExpansion: {
4030     NestedNameSpecifierLocBuilder Builder;
4031     TemplateName Template = Arg.getAsTemplateOrTemplatePattern();
4032     if (DependentTemplateName *DTN = Template.getAsDependentTemplateName())
4033       Builder.MakeTrivial(SemaRef.Context, DTN->getQualifier(), Loc);
4034     else if (QualifiedTemplateName *QTN = Template.getAsQualifiedTemplateName())
4035       Builder.MakeTrivial(SemaRef.Context, QTN->getQualifier(), Loc);
4036 
4037     if (Arg.getKind() == TemplateArgument::Template)
4038       Output = TemplateArgumentLoc(Arg,
4039                                    Builder.getWithLocInContext(SemaRef.Context),
4040                                    Loc);
4041     else
4042       Output = TemplateArgumentLoc(Arg,
4043                                    Builder.getWithLocInContext(SemaRef.Context),
4044                                    Loc, Loc);
4045 
4046     break;
4047   }
4048 
4049   case TemplateArgument::Expression:
4050     Output = TemplateArgumentLoc(Arg, Arg.getAsExpr());
4051     break;
4052 
4053   case TemplateArgument::Declaration:
4054   case TemplateArgument::Integral:
4055   case TemplateArgument::Pack:
4056   case TemplateArgument::NullPtr:
4057     Output = TemplateArgumentLoc(Arg, TemplateArgumentLocInfo());
4058     break;
4059   }
4060 }
4061 
4062 template<typename Derived>
4063 bool TreeTransform<Derived>::TransformTemplateArgument(
4064                                          const TemplateArgumentLoc &Input,
4065                                          TemplateArgumentLoc &Output, bool Uneval) {
4066   const TemplateArgument &Arg = Input.getArgument();
4067   switch (Arg.getKind()) {
4068   case TemplateArgument::Null:
4069   case TemplateArgument::Integral:
4070   case TemplateArgument::Pack:
4071   case TemplateArgument::Declaration:
4072   case TemplateArgument::NullPtr:
4073     llvm_unreachable("Unexpected TemplateArgument");
4074 
4075   case TemplateArgument::Type: {
4076     TypeSourceInfo *DI = Input.getTypeSourceInfo();
4077     if (!DI)
4078       DI = InventTypeSourceInfo(Input.getArgument().getAsType());
4079 
4080     DI = getDerived().TransformType(DI);
4081     if (!DI) return true;
4082 
4083     Output = TemplateArgumentLoc(TemplateArgument(DI->getType()), DI);
4084     return false;
4085   }
4086 
4087   case TemplateArgument::Template: {
4088     NestedNameSpecifierLoc QualifierLoc = Input.getTemplateQualifierLoc();
4089     if (QualifierLoc) {
4090       QualifierLoc = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc);
4091       if (!QualifierLoc)
4092         return true;
4093     }
4094 
4095     CXXScopeSpec SS;
4096     SS.Adopt(QualifierLoc);
4097     TemplateName Template
4098       = getDerived().TransformTemplateName(SS, Arg.getAsTemplate(),
4099                                            Input.getTemplateNameLoc());
4100     if (Template.isNull())
4101       return true;
4102 
4103     Output = TemplateArgumentLoc(TemplateArgument(Template), QualifierLoc,
4104                                  Input.getTemplateNameLoc());
4105     return false;
4106   }
4107 
4108   case TemplateArgument::TemplateExpansion:
4109     llvm_unreachable("Caller should expand pack expansions");
4110 
4111   case TemplateArgument::Expression: {
4112     // Template argument expressions are constant expressions.
4113     EnterExpressionEvaluationContext Unevaluated(
4114         getSema(),
4115         Uneval ? Sema::ExpressionEvaluationContext::Unevaluated
4116                : Sema::ExpressionEvaluationContext::ConstantEvaluated,
4117         /*LambdaContextDecl=*/nullptr, /*ExprContext=*/
4118         Sema::ExpressionEvaluationContextRecord::EK_TemplateArgument);
4119 
4120     Expr *InputExpr = Input.getSourceExpression();
4121     if (!InputExpr) InputExpr = Input.getArgument().getAsExpr();
4122 
4123     ExprResult E = getDerived().TransformExpr(InputExpr);
4124     E = SemaRef.ActOnConstantExpression(E);
4125     if (E.isInvalid()) return true;
4126     Output = TemplateArgumentLoc(TemplateArgument(E.get()), E.get());
4127     return false;
4128   }
4129   }
4130 
4131   // Work around bogus GCC warning
4132   return true;
4133 }
4134 
4135 /// Iterator adaptor that invents template argument location information
4136 /// for each of the template arguments in its underlying iterator.
4137 template<typename Derived, typename InputIterator>
4138 class TemplateArgumentLocInventIterator {
4139   TreeTransform<Derived> &Self;
4140   InputIterator Iter;
4141 
4142 public:
4143   typedef TemplateArgumentLoc value_type;
4144   typedef TemplateArgumentLoc reference;
4145   typedef typename std::iterator_traits<InputIterator>::difference_type
4146     difference_type;
4147   typedef std::input_iterator_tag iterator_category;
4148 
4149   class pointer {
4150     TemplateArgumentLoc Arg;
4151 
4152   public:
4153     explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { }
4154 
4155     const TemplateArgumentLoc *operator->() const { return &Arg; }
4156   };
4157 
4158   TemplateArgumentLocInventIterator() { }
4159 
4160   explicit TemplateArgumentLocInventIterator(TreeTransform<Derived> &Self,
4161                                              InputIterator Iter)
4162     : Self(Self), Iter(Iter) { }
4163 
4164   TemplateArgumentLocInventIterator &operator++() {
4165     ++Iter;
4166     return *this;
4167   }
4168 
4169   TemplateArgumentLocInventIterator operator++(int) {
4170     TemplateArgumentLocInventIterator Old(*this);
4171     ++(*this);
4172     return Old;
4173   }
4174 
4175   reference operator*() const {
4176     TemplateArgumentLoc Result;
4177     Self.InventTemplateArgumentLoc(*Iter, Result);
4178     return Result;
4179   }
4180 
4181   pointer operator->() const { return pointer(**this); }
4182 
4183   friend bool operator==(const TemplateArgumentLocInventIterator &X,
4184                          const TemplateArgumentLocInventIterator &Y) {
4185     return X.Iter == Y.Iter;
4186   }
4187 
4188   friend bool operator!=(const TemplateArgumentLocInventIterator &X,
4189                          const TemplateArgumentLocInventIterator &Y) {
4190     return X.Iter != Y.Iter;
4191   }
4192 };
4193 
4194 template<typename Derived>
4195 template<typename InputIterator>
4196 bool TreeTransform<Derived>::TransformTemplateArguments(
4197     InputIterator First, InputIterator Last, TemplateArgumentListInfo &Outputs,
4198     bool Uneval) {
4199   for (; First != Last; ++First) {
4200     TemplateArgumentLoc Out;
4201     TemplateArgumentLoc In = *First;
4202 
4203     if (In.getArgument().getKind() == TemplateArgument::Pack) {
4204       // Unpack argument packs, which we translate them into separate
4205       // arguments.
4206       // FIXME: We could do much better if we could guarantee that the
4207       // TemplateArgumentLocInfo for the pack expansion would be usable for
4208       // all of the template arguments in the argument pack.
4209       typedef TemplateArgumentLocInventIterator<Derived,
4210                                                 TemplateArgument::pack_iterator>
4211         PackLocIterator;
4212       if (TransformTemplateArguments(PackLocIterator(*this,
4213                                                  In.getArgument().pack_begin()),
4214                                      PackLocIterator(*this,
4215                                                    In.getArgument().pack_end()),
4216                                      Outputs, Uneval))
4217         return true;
4218 
4219       continue;
4220     }
4221 
4222     if (In.getArgument().isPackExpansion()) {
4223       // We have a pack expansion, for which we will be substituting into
4224       // the pattern.
4225       SourceLocation Ellipsis;
4226       Optional<unsigned> OrigNumExpansions;
4227       TemplateArgumentLoc Pattern
4228         = getSema().getTemplateArgumentPackExpansionPattern(
4229               In, Ellipsis, OrigNumExpansions);
4230 
4231       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
4232       getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
4233       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
4234 
4235       // Determine whether the set of unexpanded parameter packs can and should
4236       // be expanded.
4237       bool Expand = true;
4238       bool RetainExpansion = false;
4239       Optional<unsigned> NumExpansions = OrigNumExpansions;
4240       if (getDerived().TryExpandParameterPacks(Ellipsis,
4241                                                Pattern.getSourceRange(),
4242                                                Unexpanded,
4243                                                Expand,
4244                                                RetainExpansion,
4245                                                NumExpansions))
4246         return true;
4247 
4248       if (!Expand) {
4249         // The transform has determined that we should perform a simple
4250         // transformation on the pack expansion, producing another pack
4251         // expansion.
4252         TemplateArgumentLoc OutPattern;
4253         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
4254         if (getDerived().TransformTemplateArgument(Pattern, OutPattern, Uneval))
4255           return true;
4256 
4257         Out = getDerived().RebuildPackExpansion(OutPattern, Ellipsis,
4258                                                 NumExpansions);
4259         if (Out.getArgument().isNull())
4260           return true;
4261 
4262         Outputs.addArgument(Out);
4263         continue;
4264       }
4265 
4266       // The transform has determined that we should perform an elementwise
4267       // expansion of the pattern. Do so.
4268       for (unsigned I = 0; I != *NumExpansions; ++I) {
4269         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
4270 
4271         if (getDerived().TransformTemplateArgument(Pattern, Out, Uneval))
4272           return true;
4273 
4274         if (Out.getArgument().containsUnexpandedParameterPack()) {
4275           Out = getDerived().RebuildPackExpansion(Out, Ellipsis,
4276                                                   OrigNumExpansions);
4277           if (Out.getArgument().isNull())
4278             return true;
4279         }
4280 
4281         Outputs.addArgument(Out);
4282       }
4283 
4284       // If we're supposed to retain a pack expansion, do so by temporarily
4285       // forgetting the partially-substituted parameter pack.
4286       if (RetainExpansion) {
4287         ForgetPartiallySubstitutedPackRAII Forget(getDerived());
4288 
4289         if (getDerived().TransformTemplateArgument(Pattern, Out, Uneval))
4290           return true;
4291 
4292         Out = getDerived().RebuildPackExpansion(Out, Ellipsis,
4293                                                 OrigNumExpansions);
4294         if (Out.getArgument().isNull())
4295           return true;
4296 
4297         Outputs.addArgument(Out);
4298       }
4299 
4300       continue;
4301     }
4302 
4303     // The simple case:
4304     if (getDerived().TransformTemplateArgument(In, Out, Uneval))
4305       return true;
4306 
4307     Outputs.addArgument(Out);
4308   }
4309 
4310   return false;
4311 
4312 }
4313 
4314 //===----------------------------------------------------------------------===//
4315 // Type transformation
4316 //===----------------------------------------------------------------------===//
4317 
4318 template<typename Derived>
4319 QualType TreeTransform<Derived>::TransformType(QualType T) {
4320   if (getDerived().AlreadyTransformed(T))
4321     return T;
4322 
4323   // Temporary workaround.  All of these transformations should
4324   // eventually turn into transformations on TypeLocs.
4325   TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(T,
4326                                                 getDerived().getBaseLocation());
4327 
4328   TypeSourceInfo *NewDI = getDerived().TransformType(DI);
4329 
4330   if (!NewDI)
4331     return QualType();
4332 
4333   return NewDI->getType();
4334 }
4335 
4336 template<typename Derived>
4337 TypeSourceInfo *TreeTransform<Derived>::TransformType(TypeSourceInfo *DI) {
4338   // Refine the base location to the type's location.
4339   TemporaryBase Rebase(*this, DI->getTypeLoc().getBeginLoc(),
4340                        getDerived().getBaseEntity());
4341   if (getDerived().AlreadyTransformed(DI->getType()))
4342     return DI;
4343 
4344   TypeLocBuilder TLB;
4345 
4346   TypeLoc TL = DI->getTypeLoc();
4347   TLB.reserve(TL.getFullDataSize());
4348 
4349   QualType Result = getDerived().TransformType(TLB, TL);
4350   if (Result.isNull())
4351     return nullptr;
4352 
4353   return TLB.getTypeSourceInfo(SemaRef.Context, Result);
4354 }
4355 
4356 template<typename Derived>
4357 QualType
4358 TreeTransform<Derived>::TransformType(TypeLocBuilder &TLB, TypeLoc T) {
4359   switch (T.getTypeLocClass()) {
4360 #define ABSTRACT_TYPELOC(CLASS, PARENT)
4361 #define TYPELOC(CLASS, PARENT)                                                 \
4362   case TypeLoc::CLASS:                                                         \
4363     return getDerived().Transform##CLASS##Type(TLB,                            \
4364                                                T.castAs<CLASS##TypeLoc>());
4365 #include "clang/AST/TypeLocNodes.def"
4366   }
4367 
4368   llvm_unreachable("unhandled type loc!");
4369 }
4370 
4371 template<typename Derived>
4372 QualType TreeTransform<Derived>::TransformTypeWithDeducedTST(QualType T) {
4373   if (!isa<DependentNameType>(T))
4374     return TransformType(T);
4375 
4376   if (getDerived().AlreadyTransformed(T))
4377     return T;
4378   TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(T,
4379                                                 getDerived().getBaseLocation());
4380   TypeSourceInfo *NewDI = getDerived().TransformTypeWithDeducedTST(DI);
4381   return NewDI ? NewDI->getType() : QualType();
4382 }
4383 
4384 template<typename Derived>
4385 TypeSourceInfo *
4386 TreeTransform<Derived>::TransformTypeWithDeducedTST(TypeSourceInfo *DI) {
4387   if (!isa<DependentNameType>(DI->getType()))
4388     return TransformType(DI);
4389 
4390   // Refine the base location to the type's location.
4391   TemporaryBase Rebase(*this, DI->getTypeLoc().getBeginLoc(),
4392                        getDerived().getBaseEntity());
4393   if (getDerived().AlreadyTransformed(DI->getType()))
4394     return DI;
4395 
4396   TypeLocBuilder TLB;
4397 
4398   TypeLoc TL = DI->getTypeLoc();
4399   TLB.reserve(TL.getFullDataSize());
4400 
4401   auto QTL = TL.getAs<QualifiedTypeLoc>();
4402   if (QTL)
4403     TL = QTL.getUnqualifiedLoc();
4404 
4405   auto DNTL = TL.castAs<DependentNameTypeLoc>();
4406 
4407   QualType Result = getDerived().TransformDependentNameType(
4408       TLB, DNTL, /*DeducedTSTContext*/true);
4409   if (Result.isNull())
4410     return nullptr;
4411 
4412   if (QTL) {
4413     Result = getDerived().RebuildQualifiedType(Result, QTL);
4414     if (Result.isNull())
4415       return nullptr;
4416     TLB.TypeWasModifiedSafely(Result);
4417   }
4418 
4419   return TLB.getTypeSourceInfo(SemaRef.Context, Result);
4420 }
4421 
4422 template<typename Derived>
4423 QualType
4424 TreeTransform<Derived>::TransformQualifiedType(TypeLocBuilder &TLB,
4425                                                QualifiedTypeLoc T) {
4426   QualType Result = getDerived().TransformType(TLB, T.getUnqualifiedLoc());
4427   if (Result.isNull())
4428     return QualType();
4429 
4430   Result = getDerived().RebuildQualifiedType(Result, T);
4431 
4432   if (Result.isNull())
4433     return QualType();
4434 
4435   // RebuildQualifiedType might have updated the type, but not in a way
4436   // that invalidates the TypeLoc. (There's no location information for
4437   // qualifiers.)
4438   TLB.TypeWasModifiedSafely(Result);
4439 
4440   return Result;
4441 }
4442 
4443 template <typename Derived>
4444 QualType TreeTransform<Derived>::RebuildQualifiedType(QualType T,
4445                                                       QualifiedTypeLoc TL) {
4446 
4447   SourceLocation Loc = TL.getBeginLoc();
4448   Qualifiers Quals = TL.getType().getLocalQualifiers();
4449 
4450   if (((T.getAddressSpace() != LangAS::Default &&
4451         Quals.getAddressSpace() != LangAS::Default)) &&
4452       T.getAddressSpace() != Quals.getAddressSpace()) {
4453     SemaRef.Diag(Loc, diag::err_address_space_mismatch_templ_inst)
4454         << TL.getType() << T;
4455     return QualType();
4456   }
4457 
4458   // C++ [dcl.fct]p7:
4459   //   [When] adding cv-qualifications on top of the function type [...] the
4460   //   cv-qualifiers are ignored.
4461   if (T->isFunctionType()) {
4462     T = SemaRef.getASTContext().getAddrSpaceQualType(T,
4463                                                      Quals.getAddressSpace());
4464     return T;
4465   }
4466 
4467   // C++ [dcl.ref]p1:
4468   //   when the cv-qualifiers are introduced through the use of a typedef-name
4469   //   or decltype-specifier [...] the cv-qualifiers are ignored.
4470   // Note that [dcl.ref]p1 lists all cases in which cv-qualifiers can be
4471   // applied to a reference type.
4472   if (T->isReferenceType()) {
4473     // The only qualifier that applies to a reference type is restrict.
4474     if (!Quals.hasRestrict())
4475       return T;
4476     Quals = Qualifiers::fromCVRMask(Qualifiers::Restrict);
4477   }
4478 
4479   // Suppress Objective-C lifetime qualifiers if they don't make sense for the
4480   // resulting type.
4481   if (Quals.hasObjCLifetime()) {
4482     if (!T->isObjCLifetimeType() && !T->isDependentType())
4483       Quals.removeObjCLifetime();
4484     else if (T.getObjCLifetime()) {
4485       // Objective-C ARC:
4486       //   A lifetime qualifier applied to a substituted template parameter
4487       //   overrides the lifetime qualifier from the template argument.
4488       const AutoType *AutoTy;
4489       if (const SubstTemplateTypeParmType *SubstTypeParam
4490                                 = dyn_cast<SubstTemplateTypeParmType>(T)) {
4491         QualType Replacement = SubstTypeParam->getReplacementType();
4492         Qualifiers Qs = Replacement.getQualifiers();
4493         Qs.removeObjCLifetime();
4494         Replacement = SemaRef.Context.getQualifiedType(
4495             Replacement.getUnqualifiedType(), Qs);
4496         T = SemaRef.Context.getSubstTemplateTypeParmType(
4497             SubstTypeParam->getReplacedParameter(), Replacement);
4498       } else if ((AutoTy = dyn_cast<AutoType>(T)) && AutoTy->isDeduced()) {
4499         // 'auto' types behave the same way as template parameters.
4500         QualType Deduced = AutoTy->getDeducedType();
4501         Qualifiers Qs = Deduced.getQualifiers();
4502         Qs.removeObjCLifetime();
4503         Deduced =
4504             SemaRef.Context.getQualifiedType(Deduced.getUnqualifiedType(), Qs);
4505         T = SemaRef.Context.getAutoType(Deduced, AutoTy->getKeyword(),
4506                                         AutoTy->isDependentType(),
4507                                         /*isPack=*/false,
4508                                         AutoTy->getTypeConstraintConcept(),
4509                                         AutoTy->getTypeConstraintArguments());
4510       } else {
4511         // Otherwise, complain about the addition of a qualifier to an
4512         // already-qualified type.
4513         // FIXME: Why is this check not in Sema::BuildQualifiedType?
4514         SemaRef.Diag(Loc, diag::err_attr_objc_ownership_redundant) << T;
4515         Quals.removeObjCLifetime();
4516       }
4517     }
4518   }
4519 
4520   return SemaRef.BuildQualifiedType(T, Loc, Quals);
4521 }
4522 
4523 template<typename Derived>
4524 TypeLoc
4525 TreeTransform<Derived>::TransformTypeInObjectScope(TypeLoc TL,
4526                                                    QualType ObjectType,
4527                                                    NamedDecl *UnqualLookup,
4528                                                    CXXScopeSpec &SS) {
4529   if (getDerived().AlreadyTransformed(TL.getType()))
4530     return TL;
4531 
4532   TypeSourceInfo *TSI =
4533       TransformTSIInObjectScope(TL, ObjectType, UnqualLookup, SS);
4534   if (TSI)
4535     return TSI->getTypeLoc();
4536   return TypeLoc();
4537 }
4538 
4539 template<typename Derived>
4540 TypeSourceInfo *
4541 TreeTransform<Derived>::TransformTypeInObjectScope(TypeSourceInfo *TSInfo,
4542                                                    QualType ObjectType,
4543                                                    NamedDecl *UnqualLookup,
4544                                                    CXXScopeSpec &SS) {
4545   if (getDerived().AlreadyTransformed(TSInfo->getType()))
4546     return TSInfo;
4547 
4548   return TransformTSIInObjectScope(TSInfo->getTypeLoc(), ObjectType,
4549                                    UnqualLookup, SS);
4550 }
4551 
4552 template <typename Derived>
4553 TypeSourceInfo *TreeTransform<Derived>::TransformTSIInObjectScope(
4554     TypeLoc TL, QualType ObjectType, NamedDecl *UnqualLookup,
4555     CXXScopeSpec &SS) {
4556   QualType T = TL.getType();
4557   assert(!getDerived().AlreadyTransformed(T));
4558 
4559   TypeLocBuilder TLB;
4560   QualType Result;
4561 
4562   if (isa<TemplateSpecializationType>(T)) {
4563     TemplateSpecializationTypeLoc SpecTL =
4564         TL.castAs<TemplateSpecializationTypeLoc>();
4565 
4566     TemplateName Template = getDerived().TransformTemplateName(
4567         SS, SpecTL.getTypePtr()->getTemplateName(), SpecTL.getTemplateNameLoc(),
4568         ObjectType, UnqualLookup, /*AllowInjectedClassName*/true);
4569     if (Template.isNull())
4570       return nullptr;
4571 
4572     Result = getDerived().TransformTemplateSpecializationType(TLB, SpecTL,
4573                                                               Template);
4574   } else if (isa<DependentTemplateSpecializationType>(T)) {
4575     DependentTemplateSpecializationTypeLoc SpecTL =
4576         TL.castAs<DependentTemplateSpecializationTypeLoc>();
4577 
4578     TemplateName Template
4579       = getDerived().RebuildTemplateName(SS,
4580                                          SpecTL.getTemplateKeywordLoc(),
4581                                          *SpecTL.getTypePtr()->getIdentifier(),
4582                                          SpecTL.getTemplateNameLoc(),
4583                                          ObjectType, UnqualLookup,
4584                                          /*AllowInjectedClassName*/true);
4585     if (Template.isNull())
4586       return nullptr;
4587 
4588     Result = getDerived().TransformDependentTemplateSpecializationType(TLB,
4589                                                                        SpecTL,
4590                                                                        Template,
4591                                                                        SS);
4592   } else {
4593     // Nothing special needs to be done for these.
4594     Result = getDerived().TransformType(TLB, TL);
4595   }
4596 
4597   if (Result.isNull())
4598     return nullptr;
4599 
4600   return TLB.getTypeSourceInfo(SemaRef.Context, Result);
4601 }
4602 
4603 template <class TyLoc> static inline
4604 QualType TransformTypeSpecType(TypeLocBuilder &TLB, TyLoc T) {
4605   TyLoc NewT = TLB.push<TyLoc>(T.getType());
4606   NewT.setNameLoc(T.getNameLoc());
4607   return T.getType();
4608 }
4609 
4610 template<typename Derived>
4611 QualType TreeTransform<Derived>::TransformBuiltinType(TypeLocBuilder &TLB,
4612                                                       BuiltinTypeLoc T) {
4613   BuiltinTypeLoc NewT = TLB.push<BuiltinTypeLoc>(T.getType());
4614   NewT.setBuiltinLoc(T.getBuiltinLoc());
4615   if (T.needsExtraLocalData())
4616     NewT.getWrittenBuiltinSpecs() = T.getWrittenBuiltinSpecs();
4617   return T.getType();
4618 }
4619 
4620 template<typename Derived>
4621 QualType TreeTransform<Derived>::TransformComplexType(TypeLocBuilder &TLB,
4622                                                       ComplexTypeLoc T) {
4623   // FIXME: recurse?
4624   return TransformTypeSpecType(TLB, T);
4625 }
4626 
4627 template <typename Derived>
4628 QualType TreeTransform<Derived>::TransformAdjustedType(TypeLocBuilder &TLB,
4629                                                        AdjustedTypeLoc TL) {
4630   // Adjustments applied during transformation are handled elsewhere.
4631   return getDerived().TransformType(TLB, TL.getOriginalLoc());
4632 }
4633 
4634 template<typename Derived>
4635 QualType TreeTransform<Derived>::TransformDecayedType(TypeLocBuilder &TLB,
4636                                                       DecayedTypeLoc TL) {
4637   QualType OriginalType = getDerived().TransformType(TLB, TL.getOriginalLoc());
4638   if (OriginalType.isNull())
4639     return QualType();
4640 
4641   QualType Result = TL.getType();
4642   if (getDerived().AlwaysRebuild() ||
4643       OriginalType != TL.getOriginalLoc().getType())
4644     Result = SemaRef.Context.getDecayedType(OriginalType);
4645   TLB.push<DecayedTypeLoc>(Result);
4646   // Nothing to set for DecayedTypeLoc.
4647   return Result;
4648 }
4649 
4650 template<typename Derived>
4651 QualType TreeTransform<Derived>::TransformPointerType(TypeLocBuilder &TLB,
4652                                                       PointerTypeLoc TL) {
4653   QualType PointeeType
4654     = getDerived().TransformType(TLB, TL.getPointeeLoc());
4655   if (PointeeType.isNull())
4656     return QualType();
4657 
4658   QualType Result = TL.getType();
4659   if (PointeeType->getAs<ObjCObjectType>()) {
4660     // A dependent pointer type 'T *' has is being transformed such
4661     // that an Objective-C class type is being replaced for 'T'. The
4662     // resulting pointer type is an ObjCObjectPointerType, not a
4663     // PointerType.
4664     Result = SemaRef.Context.getObjCObjectPointerType(PointeeType);
4665 
4666     ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result);
4667     NewT.setStarLoc(TL.getStarLoc());
4668     return Result;
4669   }
4670 
4671   if (getDerived().AlwaysRebuild() ||
4672       PointeeType != TL.getPointeeLoc().getType()) {
4673     Result = getDerived().RebuildPointerType(PointeeType, TL.getSigilLoc());
4674     if (Result.isNull())
4675       return QualType();
4676   }
4677 
4678   // Objective-C ARC can add lifetime qualifiers to the type that we're
4679   // pointing to.
4680   TLB.TypeWasModifiedSafely(Result->getPointeeType());
4681 
4682   PointerTypeLoc NewT = TLB.push<PointerTypeLoc>(Result);
4683   NewT.setSigilLoc(TL.getSigilLoc());
4684   return Result;
4685 }
4686 
4687 template<typename Derived>
4688 QualType
4689 TreeTransform<Derived>::TransformBlockPointerType(TypeLocBuilder &TLB,
4690                                                   BlockPointerTypeLoc TL) {
4691   QualType PointeeType
4692     = getDerived().TransformType(TLB, TL.getPointeeLoc());
4693   if (PointeeType.isNull())
4694     return QualType();
4695 
4696   QualType Result = TL.getType();
4697   if (getDerived().AlwaysRebuild() ||
4698       PointeeType != TL.getPointeeLoc().getType()) {
4699     Result = getDerived().RebuildBlockPointerType(PointeeType,
4700                                                   TL.getSigilLoc());
4701     if (Result.isNull())
4702       return QualType();
4703   }
4704 
4705   BlockPointerTypeLoc NewT = TLB.push<BlockPointerTypeLoc>(Result);
4706   NewT.setSigilLoc(TL.getSigilLoc());
4707   return Result;
4708 }
4709 
4710 /// Transforms a reference type.  Note that somewhat paradoxically we
4711 /// don't care whether the type itself is an l-value type or an r-value
4712 /// type;  we only care if the type was *written* as an l-value type
4713 /// or an r-value type.
4714 template<typename Derived>
4715 QualType
4716 TreeTransform<Derived>::TransformReferenceType(TypeLocBuilder &TLB,
4717                                                ReferenceTypeLoc TL) {
4718   const ReferenceType *T = TL.getTypePtr();
4719 
4720   // Note that this works with the pointee-as-written.
4721   QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
4722   if (PointeeType.isNull())
4723     return QualType();
4724 
4725   QualType Result = TL.getType();
4726   if (getDerived().AlwaysRebuild() ||
4727       PointeeType != T->getPointeeTypeAsWritten()) {
4728     Result = getDerived().RebuildReferenceType(PointeeType,
4729                                                T->isSpelledAsLValue(),
4730                                                TL.getSigilLoc());
4731     if (Result.isNull())
4732       return QualType();
4733   }
4734 
4735   // Objective-C ARC can add lifetime qualifiers to the type that we're
4736   // referring to.
4737   TLB.TypeWasModifiedSafely(
4738       Result->castAs<ReferenceType>()->getPointeeTypeAsWritten());
4739 
4740   // r-value references can be rebuilt as l-value references.
4741   ReferenceTypeLoc NewTL;
4742   if (isa<LValueReferenceType>(Result))
4743     NewTL = TLB.push<LValueReferenceTypeLoc>(Result);
4744   else
4745     NewTL = TLB.push<RValueReferenceTypeLoc>(Result);
4746   NewTL.setSigilLoc(TL.getSigilLoc());
4747 
4748   return Result;
4749 }
4750 
4751 template<typename Derived>
4752 QualType
4753 TreeTransform<Derived>::TransformLValueReferenceType(TypeLocBuilder &TLB,
4754                                                  LValueReferenceTypeLoc TL) {
4755   return TransformReferenceType(TLB, TL);
4756 }
4757 
4758 template<typename Derived>
4759 QualType
4760 TreeTransform<Derived>::TransformRValueReferenceType(TypeLocBuilder &TLB,
4761                                                  RValueReferenceTypeLoc TL) {
4762   return TransformReferenceType(TLB, TL);
4763 }
4764 
4765 template<typename Derived>
4766 QualType
4767 TreeTransform<Derived>::TransformMemberPointerType(TypeLocBuilder &TLB,
4768                                                    MemberPointerTypeLoc TL) {
4769   QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
4770   if (PointeeType.isNull())
4771     return QualType();
4772 
4773   TypeSourceInfo* OldClsTInfo = TL.getClassTInfo();
4774   TypeSourceInfo *NewClsTInfo = nullptr;
4775   if (OldClsTInfo) {
4776     NewClsTInfo = getDerived().TransformType(OldClsTInfo);
4777     if (!NewClsTInfo)
4778       return QualType();
4779   }
4780 
4781   const MemberPointerType *T = TL.getTypePtr();
4782   QualType OldClsType = QualType(T->getClass(), 0);
4783   QualType NewClsType;
4784   if (NewClsTInfo)
4785     NewClsType = NewClsTInfo->getType();
4786   else {
4787     NewClsType = getDerived().TransformType(OldClsType);
4788     if (NewClsType.isNull())
4789       return QualType();
4790   }
4791 
4792   QualType Result = TL.getType();
4793   if (getDerived().AlwaysRebuild() ||
4794       PointeeType != T->getPointeeType() ||
4795       NewClsType != OldClsType) {
4796     Result = getDerived().RebuildMemberPointerType(PointeeType, NewClsType,
4797                                                    TL.getStarLoc());
4798     if (Result.isNull())
4799       return QualType();
4800   }
4801 
4802   // If we had to adjust the pointee type when building a member pointer, make
4803   // sure to push TypeLoc info for it.
4804   const MemberPointerType *MPT = Result->getAs<MemberPointerType>();
4805   if (MPT && PointeeType != MPT->getPointeeType()) {
4806     assert(isa<AdjustedType>(MPT->getPointeeType()));
4807     TLB.push<AdjustedTypeLoc>(MPT->getPointeeType());
4808   }
4809 
4810   MemberPointerTypeLoc NewTL = TLB.push<MemberPointerTypeLoc>(Result);
4811   NewTL.setSigilLoc(TL.getSigilLoc());
4812   NewTL.setClassTInfo(NewClsTInfo);
4813 
4814   return Result;
4815 }
4816 
4817 template<typename Derived>
4818 QualType
4819 TreeTransform<Derived>::TransformConstantArrayType(TypeLocBuilder &TLB,
4820                                                    ConstantArrayTypeLoc TL) {
4821   const ConstantArrayType *T = TL.getTypePtr();
4822   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
4823   if (ElementType.isNull())
4824     return QualType();
4825 
4826   // Prefer the expression from the TypeLoc;  the other may have been uniqued.
4827   Expr *OldSize = TL.getSizeExpr();
4828   if (!OldSize)
4829     OldSize = const_cast<Expr*>(T->getSizeExpr());
4830   Expr *NewSize = nullptr;
4831   if (OldSize) {
4832     EnterExpressionEvaluationContext Unevaluated(
4833         SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
4834     NewSize = getDerived().TransformExpr(OldSize).template getAs<Expr>();
4835     NewSize = SemaRef.ActOnConstantExpression(NewSize).get();
4836   }
4837 
4838   QualType Result = TL.getType();
4839   if (getDerived().AlwaysRebuild() ||
4840       ElementType != T->getElementType() ||
4841       (T->getSizeExpr() && NewSize != OldSize)) {
4842     Result = getDerived().RebuildConstantArrayType(ElementType,
4843                                                    T->getSizeModifier(),
4844                                                    T->getSize(), NewSize,
4845                                              T->getIndexTypeCVRQualifiers(),
4846                                                    TL.getBracketsRange());
4847     if (Result.isNull())
4848       return QualType();
4849   }
4850 
4851   // We might have either a ConstantArrayType or a VariableArrayType now:
4852   // a ConstantArrayType is allowed to have an element type which is a
4853   // VariableArrayType if the type is dependent.  Fortunately, all array
4854   // types have the same location layout.
4855   ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result);
4856   NewTL.setLBracketLoc(TL.getLBracketLoc());
4857   NewTL.setRBracketLoc(TL.getRBracketLoc());
4858   NewTL.setSizeExpr(NewSize);
4859 
4860   return Result;
4861 }
4862 
4863 template<typename Derived>
4864 QualType TreeTransform<Derived>::TransformIncompleteArrayType(
4865                                               TypeLocBuilder &TLB,
4866                                               IncompleteArrayTypeLoc TL) {
4867   const IncompleteArrayType *T = TL.getTypePtr();
4868   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
4869   if (ElementType.isNull())
4870     return QualType();
4871 
4872   QualType Result = TL.getType();
4873   if (getDerived().AlwaysRebuild() ||
4874       ElementType != T->getElementType()) {
4875     Result = getDerived().RebuildIncompleteArrayType(ElementType,
4876                                                      T->getSizeModifier(),
4877                                            T->getIndexTypeCVRQualifiers(),
4878                                                      TL.getBracketsRange());
4879     if (Result.isNull())
4880       return QualType();
4881   }
4882 
4883   IncompleteArrayTypeLoc NewTL = TLB.push<IncompleteArrayTypeLoc>(Result);
4884   NewTL.setLBracketLoc(TL.getLBracketLoc());
4885   NewTL.setRBracketLoc(TL.getRBracketLoc());
4886   NewTL.setSizeExpr(nullptr);
4887 
4888   return Result;
4889 }
4890 
4891 template<typename Derived>
4892 QualType
4893 TreeTransform<Derived>::TransformVariableArrayType(TypeLocBuilder &TLB,
4894                                                    VariableArrayTypeLoc TL) {
4895   const VariableArrayType *T = TL.getTypePtr();
4896   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
4897   if (ElementType.isNull())
4898     return QualType();
4899 
4900   ExprResult SizeResult;
4901   {
4902     EnterExpressionEvaluationContext Context(
4903         SemaRef, Sema::ExpressionEvaluationContext::PotentiallyEvaluated);
4904     SizeResult = getDerived().TransformExpr(T->getSizeExpr());
4905   }
4906   if (SizeResult.isInvalid())
4907     return QualType();
4908   SizeResult =
4909       SemaRef.ActOnFinishFullExpr(SizeResult.get(), /*DiscardedValue*/ false);
4910   if (SizeResult.isInvalid())
4911     return QualType();
4912 
4913   Expr *Size = SizeResult.get();
4914 
4915   QualType Result = TL.getType();
4916   if (getDerived().AlwaysRebuild() ||
4917       ElementType != T->getElementType() ||
4918       Size != T->getSizeExpr()) {
4919     Result = getDerived().RebuildVariableArrayType(ElementType,
4920                                                    T->getSizeModifier(),
4921                                                    Size,
4922                                              T->getIndexTypeCVRQualifiers(),
4923                                                    TL.getBracketsRange());
4924     if (Result.isNull())
4925       return QualType();
4926   }
4927 
4928   // We might have constant size array now, but fortunately it has the same
4929   // location layout.
4930   ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result);
4931   NewTL.setLBracketLoc(TL.getLBracketLoc());
4932   NewTL.setRBracketLoc(TL.getRBracketLoc());
4933   NewTL.setSizeExpr(Size);
4934 
4935   return Result;
4936 }
4937 
4938 template<typename Derived>
4939 QualType
4940 TreeTransform<Derived>::TransformDependentSizedArrayType(TypeLocBuilder &TLB,
4941                                              DependentSizedArrayTypeLoc TL) {
4942   const DependentSizedArrayType *T = TL.getTypePtr();
4943   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
4944   if (ElementType.isNull())
4945     return QualType();
4946 
4947   // Array bounds are constant expressions.
4948   EnterExpressionEvaluationContext Unevaluated(
4949       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
4950 
4951   // Prefer the expression from the TypeLoc;  the other may have been uniqued.
4952   Expr *origSize = TL.getSizeExpr();
4953   if (!origSize) origSize = T->getSizeExpr();
4954 
4955   ExprResult sizeResult
4956     = getDerived().TransformExpr(origSize);
4957   sizeResult = SemaRef.ActOnConstantExpression(sizeResult);
4958   if (sizeResult.isInvalid())
4959     return QualType();
4960 
4961   Expr *size = sizeResult.get();
4962 
4963   QualType Result = TL.getType();
4964   if (getDerived().AlwaysRebuild() ||
4965       ElementType != T->getElementType() ||
4966       size != origSize) {
4967     Result = getDerived().RebuildDependentSizedArrayType(ElementType,
4968                                                          T->getSizeModifier(),
4969                                                          size,
4970                                                 T->getIndexTypeCVRQualifiers(),
4971                                                         TL.getBracketsRange());
4972     if (Result.isNull())
4973       return QualType();
4974   }
4975 
4976   // We might have any sort of array type now, but fortunately they
4977   // all have the same location layout.
4978   ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result);
4979   NewTL.setLBracketLoc(TL.getLBracketLoc());
4980   NewTL.setRBracketLoc(TL.getRBracketLoc());
4981   NewTL.setSizeExpr(size);
4982 
4983   return Result;
4984 }
4985 
4986 template <typename Derived>
4987 QualType TreeTransform<Derived>::TransformDependentVectorType(
4988     TypeLocBuilder &TLB, DependentVectorTypeLoc TL) {
4989   const DependentVectorType *T = TL.getTypePtr();
4990   QualType ElementType = getDerived().TransformType(T->getElementType());
4991   if (ElementType.isNull())
4992     return QualType();
4993 
4994   EnterExpressionEvaluationContext Unevaluated(
4995       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
4996 
4997   ExprResult Size = getDerived().TransformExpr(T->getSizeExpr());
4998   Size = SemaRef.ActOnConstantExpression(Size);
4999   if (Size.isInvalid())
5000     return QualType();
5001 
5002   QualType Result = TL.getType();
5003   if (getDerived().AlwaysRebuild() || ElementType != T->getElementType() ||
5004       Size.get() != T->getSizeExpr()) {
5005     Result = getDerived().RebuildDependentVectorType(
5006         ElementType, Size.get(), T->getAttributeLoc(), T->getVectorKind());
5007     if (Result.isNull())
5008       return QualType();
5009   }
5010 
5011   // Result might be dependent or not.
5012   if (isa<DependentVectorType>(Result)) {
5013     DependentVectorTypeLoc NewTL =
5014         TLB.push<DependentVectorTypeLoc>(Result);
5015     NewTL.setNameLoc(TL.getNameLoc());
5016   } else {
5017     VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result);
5018     NewTL.setNameLoc(TL.getNameLoc());
5019   }
5020 
5021   return Result;
5022 }
5023 
5024 template<typename Derived>
5025 QualType TreeTransform<Derived>::TransformDependentSizedExtVectorType(
5026                                       TypeLocBuilder &TLB,
5027                                       DependentSizedExtVectorTypeLoc TL) {
5028   const DependentSizedExtVectorType *T = TL.getTypePtr();
5029 
5030   // FIXME: ext vector locs should be nested
5031   QualType ElementType = getDerived().TransformType(T->getElementType());
5032   if (ElementType.isNull())
5033     return QualType();
5034 
5035   // Vector sizes are constant expressions.
5036   EnterExpressionEvaluationContext Unevaluated(
5037       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
5038 
5039   ExprResult Size = getDerived().TransformExpr(T->getSizeExpr());
5040   Size = SemaRef.ActOnConstantExpression(Size);
5041   if (Size.isInvalid())
5042     return QualType();
5043 
5044   QualType Result = TL.getType();
5045   if (getDerived().AlwaysRebuild() ||
5046       ElementType != T->getElementType() ||
5047       Size.get() != T->getSizeExpr()) {
5048     Result = getDerived().RebuildDependentSizedExtVectorType(ElementType,
5049                                                              Size.get(),
5050                                                          T->getAttributeLoc());
5051     if (Result.isNull())
5052       return QualType();
5053   }
5054 
5055   // Result might be dependent or not.
5056   if (isa<DependentSizedExtVectorType>(Result)) {
5057     DependentSizedExtVectorTypeLoc NewTL
5058       = TLB.push<DependentSizedExtVectorTypeLoc>(Result);
5059     NewTL.setNameLoc(TL.getNameLoc());
5060   } else {
5061     ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result);
5062     NewTL.setNameLoc(TL.getNameLoc());
5063   }
5064 
5065   return Result;
5066 }
5067 
5068 template <typename Derived>
5069 QualType TreeTransform<Derived>::TransformDependentAddressSpaceType(
5070     TypeLocBuilder &TLB, DependentAddressSpaceTypeLoc TL) {
5071   const DependentAddressSpaceType *T = TL.getTypePtr();
5072 
5073   QualType pointeeType = getDerived().TransformType(T->getPointeeType());
5074 
5075   if (pointeeType.isNull())
5076     return QualType();
5077 
5078   // Address spaces are constant expressions.
5079   EnterExpressionEvaluationContext Unevaluated(
5080       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
5081 
5082   ExprResult AddrSpace = getDerived().TransformExpr(T->getAddrSpaceExpr());
5083   AddrSpace = SemaRef.ActOnConstantExpression(AddrSpace);
5084   if (AddrSpace.isInvalid())
5085     return QualType();
5086 
5087   QualType Result = TL.getType();
5088   if (getDerived().AlwaysRebuild() || pointeeType != T->getPointeeType() ||
5089       AddrSpace.get() != T->getAddrSpaceExpr()) {
5090     Result = getDerived().RebuildDependentAddressSpaceType(
5091         pointeeType, AddrSpace.get(), T->getAttributeLoc());
5092     if (Result.isNull())
5093       return QualType();
5094   }
5095 
5096   // Result might be dependent or not.
5097   if (isa<DependentAddressSpaceType>(Result)) {
5098     DependentAddressSpaceTypeLoc NewTL =
5099         TLB.push<DependentAddressSpaceTypeLoc>(Result);
5100 
5101     NewTL.setAttrOperandParensRange(TL.getAttrOperandParensRange());
5102     NewTL.setAttrExprOperand(TL.getAttrExprOperand());
5103     NewTL.setAttrNameLoc(TL.getAttrNameLoc());
5104 
5105   } else {
5106     TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(
5107         Result, getDerived().getBaseLocation());
5108     TransformType(TLB, DI->getTypeLoc());
5109   }
5110 
5111   return Result;
5112 }
5113 
5114 template <typename Derived>
5115 QualType TreeTransform<Derived>::TransformVectorType(TypeLocBuilder &TLB,
5116                                                      VectorTypeLoc TL) {
5117   const VectorType *T = TL.getTypePtr();
5118   QualType ElementType = getDerived().TransformType(T->getElementType());
5119   if (ElementType.isNull())
5120     return QualType();
5121 
5122   QualType Result = TL.getType();
5123   if (getDerived().AlwaysRebuild() ||
5124       ElementType != T->getElementType()) {
5125     Result = getDerived().RebuildVectorType(ElementType, T->getNumElements(),
5126                                             T->getVectorKind());
5127     if (Result.isNull())
5128       return QualType();
5129   }
5130 
5131   VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result);
5132   NewTL.setNameLoc(TL.getNameLoc());
5133 
5134   return Result;
5135 }
5136 
5137 template<typename Derived>
5138 QualType TreeTransform<Derived>::TransformExtVectorType(TypeLocBuilder &TLB,
5139                                                         ExtVectorTypeLoc TL) {
5140   const VectorType *T = TL.getTypePtr();
5141   QualType ElementType = getDerived().TransformType(T->getElementType());
5142   if (ElementType.isNull())
5143     return QualType();
5144 
5145   QualType Result = TL.getType();
5146   if (getDerived().AlwaysRebuild() ||
5147       ElementType != T->getElementType()) {
5148     Result = getDerived().RebuildExtVectorType(ElementType,
5149                                                T->getNumElements(),
5150                                                /*FIXME*/ SourceLocation());
5151     if (Result.isNull())
5152       return QualType();
5153   }
5154 
5155   ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result);
5156   NewTL.setNameLoc(TL.getNameLoc());
5157 
5158   return Result;
5159 }
5160 
5161 template <typename Derived>
5162 ParmVarDecl *TreeTransform<Derived>::TransformFunctionTypeParam(
5163     ParmVarDecl *OldParm, int indexAdjustment, Optional<unsigned> NumExpansions,
5164     bool ExpectParameterPack) {
5165   TypeSourceInfo *OldDI = OldParm->getTypeSourceInfo();
5166   TypeSourceInfo *NewDI = nullptr;
5167 
5168   if (NumExpansions && isa<PackExpansionType>(OldDI->getType())) {
5169     // If we're substituting into a pack expansion type and we know the
5170     // length we want to expand to, just substitute for the pattern.
5171     TypeLoc OldTL = OldDI->getTypeLoc();
5172     PackExpansionTypeLoc OldExpansionTL = OldTL.castAs<PackExpansionTypeLoc>();
5173 
5174     TypeLocBuilder TLB;
5175     TypeLoc NewTL = OldDI->getTypeLoc();
5176     TLB.reserve(NewTL.getFullDataSize());
5177 
5178     QualType Result = getDerived().TransformType(TLB,
5179                                                OldExpansionTL.getPatternLoc());
5180     if (Result.isNull())
5181       return nullptr;
5182 
5183     Result = RebuildPackExpansionType(Result,
5184                                 OldExpansionTL.getPatternLoc().getSourceRange(),
5185                                       OldExpansionTL.getEllipsisLoc(),
5186                                       NumExpansions);
5187     if (Result.isNull())
5188       return nullptr;
5189 
5190     PackExpansionTypeLoc NewExpansionTL
5191       = TLB.push<PackExpansionTypeLoc>(Result);
5192     NewExpansionTL.setEllipsisLoc(OldExpansionTL.getEllipsisLoc());
5193     NewDI = TLB.getTypeSourceInfo(SemaRef.Context, Result);
5194   } else
5195     NewDI = getDerived().TransformType(OldDI);
5196   if (!NewDI)
5197     return nullptr;
5198 
5199   if (NewDI == OldDI && indexAdjustment == 0)
5200     return OldParm;
5201 
5202   ParmVarDecl *newParm = ParmVarDecl::Create(SemaRef.Context,
5203                                              OldParm->getDeclContext(),
5204                                              OldParm->getInnerLocStart(),
5205                                              OldParm->getLocation(),
5206                                              OldParm->getIdentifier(),
5207                                              NewDI->getType(),
5208                                              NewDI,
5209                                              OldParm->getStorageClass(),
5210                                              /* DefArg */ nullptr);
5211   newParm->setScopeInfo(OldParm->getFunctionScopeDepth(),
5212                         OldParm->getFunctionScopeIndex() + indexAdjustment);
5213   return newParm;
5214 }
5215 
5216 template <typename Derived>
5217 bool TreeTransform<Derived>::TransformFunctionTypeParams(
5218     SourceLocation Loc, ArrayRef<ParmVarDecl *> Params,
5219     const QualType *ParamTypes,
5220     const FunctionProtoType::ExtParameterInfo *ParamInfos,
5221     SmallVectorImpl<QualType> &OutParamTypes,
5222     SmallVectorImpl<ParmVarDecl *> *PVars,
5223     Sema::ExtParameterInfoBuilder &PInfos) {
5224   int indexAdjustment = 0;
5225 
5226   unsigned NumParams = Params.size();
5227   for (unsigned i = 0; i != NumParams; ++i) {
5228     if (ParmVarDecl *OldParm = Params[i]) {
5229       assert(OldParm->getFunctionScopeIndex() == i);
5230 
5231       Optional<unsigned> NumExpansions;
5232       ParmVarDecl *NewParm = nullptr;
5233       if (OldParm->isParameterPack()) {
5234         // We have a function parameter pack that may need to be expanded.
5235         SmallVector<UnexpandedParameterPack, 2> Unexpanded;
5236 
5237         // Find the parameter packs that could be expanded.
5238         TypeLoc TL = OldParm->getTypeSourceInfo()->getTypeLoc();
5239         PackExpansionTypeLoc ExpansionTL = TL.castAs<PackExpansionTypeLoc>();
5240         TypeLoc Pattern = ExpansionTL.getPatternLoc();
5241         SemaRef.collectUnexpandedParameterPacks(Pattern, Unexpanded);
5242 
5243         // Determine whether we should expand the parameter packs.
5244         bool ShouldExpand = false;
5245         bool RetainExpansion = false;
5246         Optional<unsigned> OrigNumExpansions;
5247         if (Unexpanded.size() > 0) {
5248           OrigNumExpansions = ExpansionTL.getTypePtr()->getNumExpansions();
5249           NumExpansions = OrigNumExpansions;
5250           if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(),
5251                                                    Pattern.getSourceRange(),
5252                                                    Unexpanded,
5253                                                    ShouldExpand,
5254                                                    RetainExpansion,
5255                                                    NumExpansions)) {
5256             return true;
5257           }
5258         } else {
5259 #ifndef NDEBUG
5260           const AutoType *AT =
5261               Pattern.getType().getTypePtr()->getContainedAutoType();
5262           assert((AT && (!AT->isDeduced() || AT->getDeducedType().isNull())) &&
5263                  "Could not find parameter packs or undeduced auto type!");
5264 #endif
5265         }
5266 
5267         if (ShouldExpand) {
5268           // Expand the function parameter pack into multiple, separate
5269           // parameters.
5270           getDerived().ExpandingFunctionParameterPack(OldParm);
5271           for (unsigned I = 0; I != *NumExpansions; ++I) {
5272             Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
5273             ParmVarDecl *NewParm
5274               = getDerived().TransformFunctionTypeParam(OldParm,
5275                                                         indexAdjustment++,
5276                                                         OrigNumExpansions,
5277                                                 /*ExpectParameterPack=*/false);
5278             if (!NewParm)
5279               return true;
5280 
5281             if (ParamInfos)
5282               PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5283             OutParamTypes.push_back(NewParm->getType());
5284             if (PVars)
5285               PVars->push_back(NewParm);
5286           }
5287 
5288           // If we're supposed to retain a pack expansion, do so by temporarily
5289           // forgetting the partially-substituted parameter pack.
5290           if (RetainExpansion) {
5291             ForgetPartiallySubstitutedPackRAII Forget(getDerived());
5292             ParmVarDecl *NewParm
5293               = getDerived().TransformFunctionTypeParam(OldParm,
5294                                                         indexAdjustment++,
5295                                                         OrigNumExpansions,
5296                                                 /*ExpectParameterPack=*/false);
5297             if (!NewParm)
5298               return true;
5299 
5300             if (ParamInfos)
5301               PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5302             OutParamTypes.push_back(NewParm->getType());
5303             if (PVars)
5304               PVars->push_back(NewParm);
5305           }
5306 
5307           // The next parameter should have the same adjustment as the
5308           // last thing we pushed, but we post-incremented indexAdjustment
5309           // on every push.  Also, if we push nothing, the adjustment should
5310           // go down by one.
5311           indexAdjustment--;
5312 
5313           // We're done with the pack expansion.
5314           continue;
5315         }
5316 
5317         // We'll substitute the parameter now without expanding the pack
5318         // expansion.
5319         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
5320         NewParm = getDerived().TransformFunctionTypeParam(OldParm,
5321                                                           indexAdjustment,
5322                                                           NumExpansions,
5323                                                   /*ExpectParameterPack=*/true);
5324         assert(NewParm->isParameterPack() &&
5325                "Parameter pack no longer a parameter pack after "
5326                "transformation.");
5327       } else {
5328         NewParm = getDerived().TransformFunctionTypeParam(
5329             OldParm, indexAdjustment, None, /*ExpectParameterPack=*/ false);
5330       }
5331 
5332       if (!NewParm)
5333         return true;
5334 
5335       if (ParamInfos)
5336         PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5337       OutParamTypes.push_back(NewParm->getType());
5338       if (PVars)
5339         PVars->push_back(NewParm);
5340       continue;
5341     }
5342 
5343     // Deal with the possibility that we don't have a parameter
5344     // declaration for this parameter.
5345     QualType OldType = ParamTypes[i];
5346     bool IsPackExpansion = false;
5347     Optional<unsigned> NumExpansions;
5348     QualType NewType;
5349     if (const PackExpansionType *Expansion
5350                                        = dyn_cast<PackExpansionType>(OldType)) {
5351       // We have a function parameter pack that may need to be expanded.
5352       QualType Pattern = Expansion->getPattern();
5353       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
5354       getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
5355 
5356       // Determine whether we should expand the parameter packs.
5357       bool ShouldExpand = false;
5358       bool RetainExpansion = false;
5359       if (getDerived().TryExpandParameterPacks(Loc, SourceRange(),
5360                                                Unexpanded,
5361                                                ShouldExpand,
5362                                                RetainExpansion,
5363                                                NumExpansions)) {
5364         return true;
5365       }
5366 
5367       if (ShouldExpand) {
5368         // Expand the function parameter pack into multiple, separate
5369         // parameters.
5370         for (unsigned I = 0; I != *NumExpansions; ++I) {
5371           Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
5372           QualType NewType = getDerived().TransformType(Pattern);
5373           if (NewType.isNull())
5374             return true;
5375 
5376           if (NewType->containsUnexpandedParameterPack()) {
5377             NewType =
5378                 getSema().getASTContext().getPackExpansionType(NewType, None);
5379 
5380             if (NewType.isNull())
5381               return true;
5382           }
5383 
5384           if (ParamInfos)
5385             PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5386           OutParamTypes.push_back(NewType);
5387           if (PVars)
5388             PVars->push_back(nullptr);
5389         }
5390 
5391         // We're done with the pack expansion.
5392         continue;
5393       }
5394 
5395       // If we're supposed to retain a pack expansion, do so by temporarily
5396       // forgetting the partially-substituted parameter pack.
5397       if (RetainExpansion) {
5398         ForgetPartiallySubstitutedPackRAII Forget(getDerived());
5399         QualType NewType = getDerived().TransformType(Pattern);
5400         if (NewType.isNull())
5401           return true;
5402 
5403         if (ParamInfos)
5404           PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5405         OutParamTypes.push_back(NewType);
5406         if (PVars)
5407           PVars->push_back(nullptr);
5408       }
5409 
5410       // We'll substitute the parameter now without expanding the pack
5411       // expansion.
5412       OldType = Expansion->getPattern();
5413       IsPackExpansion = true;
5414       Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
5415       NewType = getDerived().TransformType(OldType);
5416     } else {
5417       NewType = getDerived().TransformType(OldType);
5418     }
5419 
5420     if (NewType.isNull())
5421       return true;
5422 
5423     if (IsPackExpansion)
5424       NewType = getSema().Context.getPackExpansionType(NewType,
5425                                                        NumExpansions);
5426 
5427     if (ParamInfos)
5428       PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5429     OutParamTypes.push_back(NewType);
5430     if (PVars)
5431       PVars->push_back(nullptr);
5432   }
5433 
5434 #ifndef NDEBUG
5435   if (PVars) {
5436     for (unsigned i = 0, e = PVars->size(); i != e; ++i)
5437       if (ParmVarDecl *parm = (*PVars)[i])
5438         assert(parm->getFunctionScopeIndex() == i);
5439   }
5440 #endif
5441 
5442   return false;
5443 }
5444 
5445 template<typename Derived>
5446 QualType
5447 TreeTransform<Derived>::TransformFunctionProtoType(TypeLocBuilder &TLB,
5448                                                    FunctionProtoTypeLoc TL) {
5449   SmallVector<QualType, 4> ExceptionStorage;
5450   TreeTransform *This = this; // Work around gcc.gnu.org/PR56135.
5451   return getDerived().TransformFunctionProtoType(
5452       TLB, TL, nullptr, Qualifiers(),
5453       [&](FunctionProtoType::ExceptionSpecInfo &ESI, bool &Changed) {
5454         return This->TransformExceptionSpec(TL.getBeginLoc(), ESI,
5455                                             ExceptionStorage, Changed);
5456       });
5457 }
5458 
5459 template<typename Derived> template<typename Fn>
5460 QualType TreeTransform<Derived>::TransformFunctionProtoType(
5461     TypeLocBuilder &TLB, FunctionProtoTypeLoc TL, CXXRecordDecl *ThisContext,
5462     Qualifiers ThisTypeQuals, Fn TransformExceptionSpec) {
5463 
5464   // Transform the parameters and return type.
5465   //
5466   // We are required to instantiate the params and return type in source order.
5467   // When the function has a trailing return type, we instantiate the
5468   // parameters before the return type,  since the return type can then refer
5469   // to the parameters themselves (via decltype, sizeof, etc.).
5470   //
5471   SmallVector<QualType, 4> ParamTypes;
5472   SmallVector<ParmVarDecl*, 4> ParamDecls;
5473   Sema::ExtParameterInfoBuilder ExtParamInfos;
5474   const FunctionProtoType *T = TL.getTypePtr();
5475 
5476   QualType ResultType;
5477 
5478   if (T->hasTrailingReturn()) {
5479     if (getDerived().TransformFunctionTypeParams(
5480             TL.getBeginLoc(), TL.getParams(),
5481             TL.getTypePtr()->param_type_begin(),
5482             T->getExtParameterInfosOrNull(),
5483             ParamTypes, &ParamDecls, ExtParamInfos))
5484       return QualType();
5485 
5486     {
5487       // C++11 [expr.prim.general]p3:
5488       //   If a declaration declares a member function or member function
5489       //   template of a class X, the expression this is a prvalue of type
5490       //   "pointer to cv-qualifier-seq X" between the optional cv-qualifer-seq
5491       //   and the end of the function-definition, member-declarator, or
5492       //   declarator.
5493       Sema::CXXThisScopeRAII ThisScope(SemaRef, ThisContext, ThisTypeQuals);
5494 
5495       ResultType = getDerived().TransformType(TLB, TL.getReturnLoc());
5496       if (ResultType.isNull())
5497         return QualType();
5498     }
5499   }
5500   else {
5501     ResultType = getDerived().TransformType(TLB, TL.getReturnLoc());
5502     if (ResultType.isNull())
5503       return QualType();
5504 
5505     if (getDerived().TransformFunctionTypeParams(
5506             TL.getBeginLoc(), TL.getParams(),
5507             TL.getTypePtr()->param_type_begin(),
5508             T->getExtParameterInfosOrNull(),
5509             ParamTypes, &ParamDecls, ExtParamInfos))
5510       return QualType();
5511   }
5512 
5513   FunctionProtoType::ExtProtoInfo EPI = T->getExtProtoInfo();
5514 
5515   bool EPIChanged = false;
5516   if (TransformExceptionSpec(EPI.ExceptionSpec, EPIChanged))
5517     return QualType();
5518 
5519   // Handle extended parameter information.
5520   if (auto NewExtParamInfos =
5521         ExtParamInfos.getPointerOrNull(ParamTypes.size())) {
5522     if (!EPI.ExtParameterInfos ||
5523         llvm::makeArrayRef(EPI.ExtParameterInfos, TL.getNumParams())
5524           != llvm::makeArrayRef(NewExtParamInfos, ParamTypes.size())) {
5525       EPIChanged = true;
5526     }
5527     EPI.ExtParameterInfos = NewExtParamInfos;
5528   } else if (EPI.ExtParameterInfos) {
5529     EPIChanged = true;
5530     EPI.ExtParameterInfos = nullptr;
5531   }
5532 
5533   QualType Result = TL.getType();
5534   if (getDerived().AlwaysRebuild() || ResultType != T->getReturnType() ||
5535       T->getParamTypes() != llvm::makeArrayRef(ParamTypes) || EPIChanged) {
5536     Result = getDerived().RebuildFunctionProtoType(ResultType, ParamTypes, EPI);
5537     if (Result.isNull())
5538       return QualType();
5539   }
5540 
5541   FunctionProtoTypeLoc NewTL = TLB.push<FunctionProtoTypeLoc>(Result);
5542   NewTL.setLocalRangeBegin(TL.getLocalRangeBegin());
5543   NewTL.setLParenLoc(TL.getLParenLoc());
5544   NewTL.setRParenLoc(TL.getRParenLoc());
5545   NewTL.setExceptionSpecRange(TL.getExceptionSpecRange());
5546   NewTL.setLocalRangeEnd(TL.getLocalRangeEnd());
5547   for (unsigned i = 0, e = NewTL.getNumParams(); i != e; ++i)
5548     NewTL.setParam(i, ParamDecls[i]);
5549 
5550   return Result;
5551 }
5552 
5553 template<typename Derived>
5554 bool TreeTransform<Derived>::TransformExceptionSpec(
5555     SourceLocation Loc, FunctionProtoType::ExceptionSpecInfo &ESI,
5556     SmallVectorImpl<QualType> &Exceptions, bool &Changed) {
5557   assert(ESI.Type != EST_Uninstantiated && ESI.Type != EST_Unevaluated);
5558 
5559   // Instantiate a dynamic noexcept expression, if any.
5560   if (isComputedNoexcept(ESI.Type)) {
5561     EnterExpressionEvaluationContext Unevaluated(
5562         getSema(), Sema::ExpressionEvaluationContext::ConstantEvaluated);
5563     ExprResult NoexceptExpr = getDerived().TransformExpr(ESI.NoexceptExpr);
5564     if (NoexceptExpr.isInvalid())
5565       return true;
5566 
5567     ExceptionSpecificationType EST = ESI.Type;
5568     NoexceptExpr =
5569         getSema().ActOnNoexceptSpec(Loc, NoexceptExpr.get(), EST);
5570     if (NoexceptExpr.isInvalid())
5571       return true;
5572 
5573     if (ESI.NoexceptExpr != NoexceptExpr.get() || EST != ESI.Type)
5574       Changed = true;
5575     ESI.NoexceptExpr = NoexceptExpr.get();
5576     ESI.Type = EST;
5577   }
5578 
5579   if (ESI.Type != EST_Dynamic)
5580     return false;
5581 
5582   // Instantiate a dynamic exception specification's type.
5583   for (QualType T : ESI.Exceptions) {
5584     if (const PackExpansionType *PackExpansion =
5585             T->getAs<PackExpansionType>()) {
5586       Changed = true;
5587 
5588       // We have a pack expansion. Instantiate it.
5589       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
5590       SemaRef.collectUnexpandedParameterPacks(PackExpansion->getPattern(),
5591                                               Unexpanded);
5592       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
5593 
5594       // Determine whether the set of unexpanded parameter packs can and
5595       // should
5596       // be expanded.
5597       bool Expand = false;
5598       bool RetainExpansion = false;
5599       Optional<unsigned> NumExpansions = PackExpansion->getNumExpansions();
5600       // FIXME: Track the location of the ellipsis (and track source location
5601       // information for the types in the exception specification in general).
5602       if (getDerived().TryExpandParameterPacks(
5603               Loc, SourceRange(), Unexpanded, Expand,
5604               RetainExpansion, NumExpansions))
5605         return true;
5606 
5607       if (!Expand) {
5608         // We can't expand this pack expansion into separate arguments yet;
5609         // just substitute into the pattern and create a new pack expansion
5610         // type.
5611         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
5612         QualType U = getDerived().TransformType(PackExpansion->getPattern());
5613         if (U.isNull())
5614           return true;
5615 
5616         U = SemaRef.Context.getPackExpansionType(U, NumExpansions);
5617         Exceptions.push_back(U);
5618         continue;
5619       }
5620 
5621       // Substitute into the pack expansion pattern for each slice of the
5622       // pack.
5623       for (unsigned ArgIdx = 0; ArgIdx != *NumExpansions; ++ArgIdx) {
5624         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), ArgIdx);
5625 
5626         QualType U = getDerived().TransformType(PackExpansion->getPattern());
5627         if (U.isNull() || SemaRef.CheckSpecifiedExceptionType(U, Loc))
5628           return true;
5629 
5630         Exceptions.push_back(U);
5631       }
5632     } else {
5633       QualType U = getDerived().TransformType(T);
5634       if (U.isNull() || SemaRef.CheckSpecifiedExceptionType(U, Loc))
5635         return true;
5636       if (T != U)
5637         Changed = true;
5638 
5639       Exceptions.push_back(U);
5640     }
5641   }
5642 
5643   ESI.Exceptions = Exceptions;
5644   if (ESI.Exceptions.empty())
5645     ESI.Type = EST_DynamicNone;
5646   return false;
5647 }
5648 
5649 template<typename Derived>
5650 QualType TreeTransform<Derived>::TransformFunctionNoProtoType(
5651                                                  TypeLocBuilder &TLB,
5652                                                  FunctionNoProtoTypeLoc TL) {
5653   const FunctionNoProtoType *T = TL.getTypePtr();
5654   QualType ResultType = getDerived().TransformType(TLB, TL.getReturnLoc());
5655   if (ResultType.isNull())
5656     return QualType();
5657 
5658   QualType Result = TL.getType();
5659   if (getDerived().AlwaysRebuild() || ResultType != T->getReturnType())
5660     Result = getDerived().RebuildFunctionNoProtoType(ResultType);
5661 
5662   FunctionNoProtoTypeLoc NewTL = TLB.push<FunctionNoProtoTypeLoc>(Result);
5663   NewTL.setLocalRangeBegin(TL.getLocalRangeBegin());
5664   NewTL.setLParenLoc(TL.getLParenLoc());
5665   NewTL.setRParenLoc(TL.getRParenLoc());
5666   NewTL.setLocalRangeEnd(TL.getLocalRangeEnd());
5667 
5668   return Result;
5669 }
5670 
5671 template<typename Derived> QualType
5672 TreeTransform<Derived>::TransformUnresolvedUsingType(TypeLocBuilder &TLB,
5673                                                  UnresolvedUsingTypeLoc TL) {
5674   const UnresolvedUsingType *T = TL.getTypePtr();
5675   Decl *D = getDerived().TransformDecl(TL.getNameLoc(), T->getDecl());
5676   if (!D)
5677     return QualType();
5678 
5679   QualType Result = TL.getType();
5680   if (getDerived().AlwaysRebuild() || D != T->getDecl()) {
5681     Result = getDerived().RebuildUnresolvedUsingType(TL.getNameLoc(), D);
5682     if (Result.isNull())
5683       return QualType();
5684   }
5685 
5686   // We might get an arbitrary type spec type back.  We should at
5687   // least always get a type spec type, though.
5688   TypeSpecTypeLoc NewTL = TLB.pushTypeSpec(Result);
5689   NewTL.setNameLoc(TL.getNameLoc());
5690 
5691   return Result;
5692 }
5693 
5694 template<typename Derived>
5695 QualType TreeTransform<Derived>::TransformTypedefType(TypeLocBuilder &TLB,
5696                                                       TypedefTypeLoc TL) {
5697   const TypedefType *T = TL.getTypePtr();
5698   TypedefNameDecl *Typedef
5699     = cast_or_null<TypedefNameDecl>(getDerived().TransformDecl(TL.getNameLoc(),
5700                                                                T->getDecl()));
5701   if (!Typedef)
5702     return QualType();
5703 
5704   QualType Result = TL.getType();
5705   if (getDerived().AlwaysRebuild() ||
5706       Typedef != T->getDecl()) {
5707     Result = getDerived().RebuildTypedefType(Typedef);
5708     if (Result.isNull())
5709       return QualType();
5710   }
5711 
5712   TypedefTypeLoc NewTL = TLB.push<TypedefTypeLoc>(Result);
5713   NewTL.setNameLoc(TL.getNameLoc());
5714 
5715   return Result;
5716 }
5717 
5718 template<typename Derived>
5719 QualType TreeTransform<Derived>::TransformTypeOfExprType(TypeLocBuilder &TLB,
5720                                                       TypeOfExprTypeLoc TL) {
5721   // typeof expressions are not potentially evaluated contexts
5722   EnterExpressionEvaluationContext Unevaluated(
5723       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated,
5724       Sema::ReuseLambdaContextDecl);
5725 
5726   ExprResult E = getDerived().TransformExpr(TL.getUnderlyingExpr());
5727   if (E.isInvalid())
5728     return QualType();
5729 
5730   E = SemaRef.HandleExprEvaluationContextForTypeof(E.get());
5731   if (E.isInvalid())
5732     return QualType();
5733 
5734   QualType Result = TL.getType();
5735   if (getDerived().AlwaysRebuild() ||
5736       E.get() != TL.getUnderlyingExpr()) {
5737     Result = getDerived().RebuildTypeOfExprType(E.get(), TL.getTypeofLoc());
5738     if (Result.isNull())
5739       return QualType();
5740   }
5741   else E.get();
5742 
5743   TypeOfExprTypeLoc NewTL = TLB.push<TypeOfExprTypeLoc>(Result);
5744   NewTL.setTypeofLoc(TL.getTypeofLoc());
5745   NewTL.setLParenLoc(TL.getLParenLoc());
5746   NewTL.setRParenLoc(TL.getRParenLoc());
5747 
5748   return Result;
5749 }
5750 
5751 template<typename Derived>
5752 QualType TreeTransform<Derived>::TransformTypeOfType(TypeLocBuilder &TLB,
5753                                                      TypeOfTypeLoc TL) {
5754   TypeSourceInfo* Old_Under_TI = TL.getUnderlyingTInfo();
5755   TypeSourceInfo* New_Under_TI = getDerived().TransformType(Old_Under_TI);
5756   if (!New_Under_TI)
5757     return QualType();
5758 
5759   QualType Result = TL.getType();
5760   if (getDerived().AlwaysRebuild() || New_Under_TI != Old_Under_TI) {
5761     Result = getDerived().RebuildTypeOfType(New_Under_TI->getType());
5762     if (Result.isNull())
5763       return QualType();
5764   }
5765 
5766   TypeOfTypeLoc NewTL = TLB.push<TypeOfTypeLoc>(Result);
5767   NewTL.setTypeofLoc(TL.getTypeofLoc());
5768   NewTL.setLParenLoc(TL.getLParenLoc());
5769   NewTL.setRParenLoc(TL.getRParenLoc());
5770   NewTL.setUnderlyingTInfo(New_Under_TI);
5771 
5772   return Result;
5773 }
5774 
5775 template<typename Derived>
5776 QualType TreeTransform<Derived>::TransformDecltypeType(TypeLocBuilder &TLB,
5777                                                        DecltypeTypeLoc TL) {
5778   const DecltypeType *T = TL.getTypePtr();
5779 
5780   // decltype expressions are not potentially evaluated contexts
5781   EnterExpressionEvaluationContext Unevaluated(
5782       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, nullptr,
5783       Sema::ExpressionEvaluationContextRecord::EK_Decltype);
5784 
5785   ExprResult E = getDerived().TransformExpr(T->getUnderlyingExpr());
5786   if (E.isInvalid())
5787     return QualType();
5788 
5789   E = getSema().ActOnDecltypeExpression(E.get());
5790   if (E.isInvalid())
5791     return QualType();
5792 
5793   QualType Result = TL.getType();
5794   if (getDerived().AlwaysRebuild() ||
5795       E.get() != T->getUnderlyingExpr()) {
5796     Result = getDerived().RebuildDecltypeType(E.get(), TL.getNameLoc());
5797     if (Result.isNull())
5798       return QualType();
5799   }
5800   else E.get();
5801 
5802   DecltypeTypeLoc NewTL = TLB.push<DecltypeTypeLoc>(Result);
5803   NewTL.setNameLoc(TL.getNameLoc());
5804 
5805   return Result;
5806 }
5807 
5808 template<typename Derived>
5809 QualType TreeTransform<Derived>::TransformUnaryTransformType(
5810                                                             TypeLocBuilder &TLB,
5811                                                      UnaryTransformTypeLoc TL) {
5812   QualType Result = TL.getType();
5813   if (Result->isDependentType()) {
5814     const UnaryTransformType *T = TL.getTypePtr();
5815     QualType NewBase =
5816       getDerived().TransformType(TL.getUnderlyingTInfo())->getType();
5817     Result = getDerived().RebuildUnaryTransformType(NewBase,
5818                                                     T->getUTTKind(),
5819                                                     TL.getKWLoc());
5820     if (Result.isNull())
5821       return QualType();
5822   }
5823 
5824   UnaryTransformTypeLoc NewTL = TLB.push<UnaryTransformTypeLoc>(Result);
5825   NewTL.setKWLoc(TL.getKWLoc());
5826   NewTL.setParensRange(TL.getParensRange());
5827   NewTL.setUnderlyingTInfo(TL.getUnderlyingTInfo());
5828   return Result;
5829 }
5830 
5831 template<typename Derived>
5832 QualType TreeTransform<Derived>::TransformDeducedTemplateSpecializationType(
5833     TypeLocBuilder &TLB, DeducedTemplateSpecializationTypeLoc TL) {
5834   const DeducedTemplateSpecializationType *T = TL.getTypePtr();
5835 
5836   CXXScopeSpec SS;
5837   TemplateName TemplateName = getDerived().TransformTemplateName(
5838       SS, T->getTemplateName(), TL.getTemplateNameLoc());
5839   if (TemplateName.isNull())
5840     return QualType();
5841 
5842   QualType OldDeduced = T->getDeducedType();
5843   QualType NewDeduced;
5844   if (!OldDeduced.isNull()) {
5845     NewDeduced = getDerived().TransformType(OldDeduced);
5846     if (NewDeduced.isNull())
5847       return QualType();
5848   }
5849 
5850   QualType Result = getDerived().RebuildDeducedTemplateSpecializationType(
5851       TemplateName, NewDeduced);
5852   if (Result.isNull())
5853     return QualType();
5854 
5855   DeducedTemplateSpecializationTypeLoc NewTL =
5856       TLB.push<DeducedTemplateSpecializationTypeLoc>(Result);
5857   NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
5858 
5859   return Result;
5860 }
5861 
5862 template<typename Derived>
5863 QualType TreeTransform<Derived>::TransformRecordType(TypeLocBuilder &TLB,
5864                                                      RecordTypeLoc TL) {
5865   const RecordType *T = TL.getTypePtr();
5866   RecordDecl *Record
5867     = cast_or_null<RecordDecl>(getDerived().TransformDecl(TL.getNameLoc(),
5868                                                           T->getDecl()));
5869   if (!Record)
5870     return QualType();
5871 
5872   QualType Result = TL.getType();
5873   if (getDerived().AlwaysRebuild() ||
5874       Record != T->getDecl()) {
5875     Result = getDerived().RebuildRecordType(Record);
5876     if (Result.isNull())
5877       return QualType();
5878   }
5879 
5880   RecordTypeLoc NewTL = TLB.push<RecordTypeLoc>(Result);
5881   NewTL.setNameLoc(TL.getNameLoc());
5882 
5883   return Result;
5884 }
5885 
5886 template<typename Derived>
5887 QualType TreeTransform<Derived>::TransformEnumType(TypeLocBuilder &TLB,
5888                                                    EnumTypeLoc TL) {
5889   const EnumType *T = TL.getTypePtr();
5890   EnumDecl *Enum
5891     = cast_or_null<EnumDecl>(getDerived().TransformDecl(TL.getNameLoc(),
5892                                                         T->getDecl()));
5893   if (!Enum)
5894     return QualType();
5895 
5896   QualType Result = TL.getType();
5897   if (getDerived().AlwaysRebuild() ||
5898       Enum != T->getDecl()) {
5899     Result = getDerived().RebuildEnumType(Enum);
5900     if (Result.isNull())
5901       return QualType();
5902   }
5903 
5904   EnumTypeLoc NewTL = TLB.push<EnumTypeLoc>(Result);
5905   NewTL.setNameLoc(TL.getNameLoc());
5906 
5907   return Result;
5908 }
5909 
5910 template<typename Derived>
5911 QualType TreeTransform<Derived>::TransformInjectedClassNameType(
5912                                          TypeLocBuilder &TLB,
5913                                          InjectedClassNameTypeLoc TL) {
5914   Decl *D = getDerived().TransformDecl(TL.getNameLoc(),
5915                                        TL.getTypePtr()->getDecl());
5916   if (!D) return QualType();
5917 
5918   QualType T = SemaRef.Context.getTypeDeclType(cast<TypeDecl>(D));
5919   TLB.pushTypeSpec(T).setNameLoc(TL.getNameLoc());
5920   return T;
5921 }
5922 
5923 template<typename Derived>
5924 QualType TreeTransform<Derived>::TransformTemplateTypeParmType(
5925                                                 TypeLocBuilder &TLB,
5926                                                 TemplateTypeParmTypeLoc TL) {
5927   return TransformTypeSpecType(TLB, TL);
5928 }
5929 
5930 template<typename Derived>
5931 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmType(
5932                                          TypeLocBuilder &TLB,
5933                                          SubstTemplateTypeParmTypeLoc TL) {
5934   const SubstTemplateTypeParmType *T = TL.getTypePtr();
5935 
5936   // Substitute into the replacement type, which itself might involve something
5937   // that needs to be transformed. This only tends to occur with default
5938   // template arguments of template template parameters.
5939   TemporaryBase Rebase(*this, TL.getNameLoc(), DeclarationName());
5940   QualType Replacement = getDerived().TransformType(T->getReplacementType());
5941   if (Replacement.isNull())
5942     return QualType();
5943 
5944   // Always canonicalize the replacement type.
5945   Replacement = SemaRef.Context.getCanonicalType(Replacement);
5946   QualType Result
5947     = SemaRef.Context.getSubstTemplateTypeParmType(T->getReplacedParameter(),
5948                                                    Replacement);
5949 
5950   // Propagate type-source information.
5951   SubstTemplateTypeParmTypeLoc NewTL
5952     = TLB.push<SubstTemplateTypeParmTypeLoc>(Result);
5953   NewTL.setNameLoc(TL.getNameLoc());
5954   return Result;
5955 
5956 }
5957 
5958 template<typename Derived>
5959 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmPackType(
5960                                           TypeLocBuilder &TLB,
5961                                           SubstTemplateTypeParmPackTypeLoc TL) {
5962   return TransformTypeSpecType(TLB, TL);
5963 }
5964 
5965 template<typename Derived>
5966 QualType TreeTransform<Derived>::TransformTemplateSpecializationType(
5967                                                         TypeLocBuilder &TLB,
5968                                            TemplateSpecializationTypeLoc TL) {
5969   const TemplateSpecializationType *T = TL.getTypePtr();
5970 
5971   // The nested-name-specifier never matters in a TemplateSpecializationType,
5972   // because we can't have a dependent nested-name-specifier anyway.
5973   CXXScopeSpec SS;
5974   TemplateName Template
5975     = getDerived().TransformTemplateName(SS, T->getTemplateName(),
5976                                          TL.getTemplateNameLoc());
5977   if (Template.isNull())
5978     return QualType();
5979 
5980   return getDerived().TransformTemplateSpecializationType(TLB, TL, Template);
5981 }
5982 
5983 template<typename Derived>
5984 QualType TreeTransform<Derived>::TransformAtomicType(TypeLocBuilder &TLB,
5985                                                      AtomicTypeLoc TL) {
5986   QualType ValueType = getDerived().TransformType(TLB, TL.getValueLoc());
5987   if (ValueType.isNull())
5988     return QualType();
5989 
5990   QualType Result = TL.getType();
5991   if (getDerived().AlwaysRebuild() ||
5992       ValueType != TL.getValueLoc().getType()) {
5993     Result = getDerived().RebuildAtomicType(ValueType, TL.getKWLoc());
5994     if (Result.isNull())
5995       return QualType();
5996   }
5997 
5998   AtomicTypeLoc NewTL = TLB.push<AtomicTypeLoc>(Result);
5999   NewTL.setKWLoc(TL.getKWLoc());
6000   NewTL.setLParenLoc(TL.getLParenLoc());
6001   NewTL.setRParenLoc(TL.getRParenLoc());
6002 
6003   return Result;
6004 }
6005 
6006 template <typename Derived>
6007 QualType TreeTransform<Derived>::TransformPipeType(TypeLocBuilder &TLB,
6008                                                    PipeTypeLoc TL) {
6009   QualType ValueType = getDerived().TransformType(TLB, TL.getValueLoc());
6010   if (ValueType.isNull())
6011     return QualType();
6012 
6013   QualType Result = TL.getType();
6014   if (getDerived().AlwaysRebuild() || ValueType != TL.getValueLoc().getType()) {
6015     const PipeType *PT = Result->castAs<PipeType>();
6016     bool isReadPipe = PT->isReadOnly();
6017     Result = getDerived().RebuildPipeType(ValueType, TL.getKWLoc(), isReadPipe);
6018     if (Result.isNull())
6019       return QualType();
6020   }
6021 
6022   PipeTypeLoc NewTL = TLB.push<PipeTypeLoc>(Result);
6023   NewTL.setKWLoc(TL.getKWLoc());
6024 
6025   return Result;
6026 }
6027 
6028   /// Simple iterator that traverses the template arguments in a
6029   /// container that provides a \c getArgLoc() member function.
6030   ///
6031   /// This iterator is intended to be used with the iterator form of
6032   /// \c TreeTransform<Derived>::TransformTemplateArguments().
6033   template<typename ArgLocContainer>
6034   class TemplateArgumentLocContainerIterator {
6035     ArgLocContainer *Container;
6036     unsigned Index;
6037 
6038   public:
6039     typedef TemplateArgumentLoc value_type;
6040     typedef TemplateArgumentLoc reference;
6041     typedef int difference_type;
6042     typedef std::input_iterator_tag iterator_category;
6043 
6044     class pointer {
6045       TemplateArgumentLoc Arg;
6046 
6047     public:
6048       explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { }
6049 
6050       const TemplateArgumentLoc *operator->() const {
6051         return &Arg;
6052       }
6053     };
6054 
6055 
6056     TemplateArgumentLocContainerIterator() {}
6057 
6058     TemplateArgumentLocContainerIterator(ArgLocContainer &Container,
6059                                  unsigned Index)
6060       : Container(&Container), Index(Index) { }
6061 
6062     TemplateArgumentLocContainerIterator &operator++() {
6063       ++Index;
6064       return *this;
6065     }
6066 
6067     TemplateArgumentLocContainerIterator operator++(int) {
6068       TemplateArgumentLocContainerIterator Old(*this);
6069       ++(*this);
6070       return Old;
6071     }
6072 
6073     TemplateArgumentLoc operator*() const {
6074       return Container->getArgLoc(Index);
6075     }
6076 
6077     pointer operator->() const {
6078       return pointer(Container->getArgLoc(Index));
6079     }
6080 
6081     friend bool operator==(const TemplateArgumentLocContainerIterator &X,
6082                            const TemplateArgumentLocContainerIterator &Y) {
6083       return X.Container == Y.Container && X.Index == Y.Index;
6084     }
6085 
6086     friend bool operator!=(const TemplateArgumentLocContainerIterator &X,
6087                            const TemplateArgumentLocContainerIterator &Y) {
6088       return !(X == Y);
6089     }
6090   };
6091 
6092 template<typename Derived>
6093 QualType TreeTransform<Derived>::TransformAutoType(TypeLocBuilder &TLB,
6094                                                    AutoTypeLoc TL) {
6095   const AutoType *T = TL.getTypePtr();
6096   QualType OldDeduced = T->getDeducedType();
6097   QualType NewDeduced;
6098   if (!OldDeduced.isNull()) {
6099     NewDeduced = getDerived().TransformType(OldDeduced);
6100     if (NewDeduced.isNull())
6101       return QualType();
6102   }
6103 
6104   ConceptDecl *NewCD = nullptr;
6105   TemplateArgumentListInfo NewTemplateArgs;
6106   NestedNameSpecifierLoc NewNestedNameSpec;
6107   if (TL.getTypePtr()->isConstrained()) {
6108     NewCD = cast_or_null<ConceptDecl>(
6109         getDerived().TransformDecl(
6110             TL.getConceptNameLoc(),
6111             TL.getTypePtr()->getTypeConstraintConcept()));
6112 
6113     NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
6114     NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
6115     typedef TemplateArgumentLocContainerIterator<AutoTypeLoc> ArgIterator;
6116     if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
6117                                                 ArgIterator(TL,
6118                                                             TL.getNumArgs()),
6119                                                 NewTemplateArgs))
6120       return QualType();
6121 
6122     if (TL.getNestedNameSpecifierLoc()) {
6123       NewNestedNameSpec
6124         = getDerived().TransformNestedNameSpecifierLoc(
6125             TL.getNestedNameSpecifierLoc());
6126       if (!NewNestedNameSpec)
6127         return QualType();
6128     }
6129   }
6130 
6131   QualType Result = TL.getType();
6132   if (getDerived().AlwaysRebuild() || NewDeduced != OldDeduced ||
6133       T->isDependentType()) {
6134     llvm::SmallVector<TemplateArgument, 4> NewArgList;
6135     NewArgList.reserve(NewArgList.size());
6136     for (const auto &ArgLoc : NewTemplateArgs.arguments())
6137       NewArgList.push_back(ArgLoc.getArgument());
6138     Result = getDerived().RebuildAutoType(NewDeduced, T->getKeyword(), NewCD,
6139                                           NewArgList);
6140     if (Result.isNull())
6141       return QualType();
6142   }
6143 
6144   AutoTypeLoc NewTL = TLB.push<AutoTypeLoc>(Result);
6145   NewTL.setNameLoc(TL.getNameLoc());
6146   NewTL.setNestedNameSpecifierLoc(NewNestedNameSpec);
6147   NewTL.setTemplateKWLoc(TL.getTemplateKWLoc());
6148   NewTL.setConceptNameLoc(TL.getConceptNameLoc());
6149   NewTL.setFoundDecl(TL.getFoundDecl());
6150   NewTL.setLAngleLoc(TL.getLAngleLoc());
6151   NewTL.setRAngleLoc(TL.getRAngleLoc());
6152   for (unsigned I = 0; I < TL.getNumArgs(); ++I)
6153     NewTL.setArgLocInfo(I, NewTemplateArgs.arguments()[I].getLocInfo());
6154 
6155   return Result;
6156 }
6157 
6158 template <typename Derived>
6159 QualType TreeTransform<Derived>::TransformTemplateSpecializationType(
6160                                                         TypeLocBuilder &TLB,
6161                                            TemplateSpecializationTypeLoc TL,
6162                                                       TemplateName Template) {
6163   TemplateArgumentListInfo NewTemplateArgs;
6164   NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
6165   NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
6166   typedef TemplateArgumentLocContainerIterator<TemplateSpecializationTypeLoc>
6167     ArgIterator;
6168   if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
6169                                               ArgIterator(TL, TL.getNumArgs()),
6170                                               NewTemplateArgs))
6171     return QualType();
6172 
6173   // FIXME: maybe don't rebuild if all the template arguments are the same.
6174 
6175   QualType Result =
6176     getDerived().RebuildTemplateSpecializationType(Template,
6177                                                    TL.getTemplateNameLoc(),
6178                                                    NewTemplateArgs);
6179 
6180   if (!Result.isNull()) {
6181     // Specializations of template template parameters are represented as
6182     // TemplateSpecializationTypes, and substitution of type alias templates
6183     // within a dependent context can transform them into
6184     // DependentTemplateSpecializationTypes.
6185     if (isa<DependentTemplateSpecializationType>(Result)) {
6186       DependentTemplateSpecializationTypeLoc NewTL
6187         = TLB.push<DependentTemplateSpecializationTypeLoc>(Result);
6188       NewTL.setElaboratedKeywordLoc(SourceLocation());
6189       NewTL.setQualifierLoc(NestedNameSpecifierLoc());
6190       NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6191       NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6192       NewTL.setLAngleLoc(TL.getLAngleLoc());
6193       NewTL.setRAngleLoc(TL.getRAngleLoc());
6194       for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
6195         NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
6196       return Result;
6197     }
6198 
6199     TemplateSpecializationTypeLoc NewTL
6200       = TLB.push<TemplateSpecializationTypeLoc>(Result);
6201     NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6202     NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6203     NewTL.setLAngleLoc(TL.getLAngleLoc());
6204     NewTL.setRAngleLoc(TL.getRAngleLoc());
6205     for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
6206       NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
6207   }
6208 
6209   return Result;
6210 }
6211 
6212 template <typename Derived>
6213 QualType TreeTransform<Derived>::TransformDependentTemplateSpecializationType(
6214                                      TypeLocBuilder &TLB,
6215                                      DependentTemplateSpecializationTypeLoc TL,
6216                                      TemplateName Template,
6217                                      CXXScopeSpec &SS) {
6218   TemplateArgumentListInfo NewTemplateArgs;
6219   NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
6220   NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
6221   typedef TemplateArgumentLocContainerIterator<
6222             DependentTemplateSpecializationTypeLoc> ArgIterator;
6223   if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
6224                                               ArgIterator(TL, TL.getNumArgs()),
6225                                               NewTemplateArgs))
6226     return QualType();
6227 
6228   // FIXME: maybe don't rebuild if all the template arguments are the same.
6229 
6230   if (DependentTemplateName *DTN = Template.getAsDependentTemplateName()) {
6231     QualType Result
6232       = getSema().Context.getDependentTemplateSpecializationType(
6233                                                 TL.getTypePtr()->getKeyword(),
6234                                                          DTN->getQualifier(),
6235                                                          DTN->getIdentifier(),
6236                                                                NewTemplateArgs);
6237 
6238     DependentTemplateSpecializationTypeLoc NewTL
6239       = TLB.push<DependentTemplateSpecializationTypeLoc>(Result);
6240     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6241     NewTL.setQualifierLoc(SS.getWithLocInContext(SemaRef.Context));
6242     NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6243     NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6244     NewTL.setLAngleLoc(TL.getLAngleLoc());
6245     NewTL.setRAngleLoc(TL.getRAngleLoc());
6246     for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
6247       NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
6248     return Result;
6249   }
6250 
6251   QualType Result
6252     = getDerived().RebuildTemplateSpecializationType(Template,
6253                                                      TL.getTemplateNameLoc(),
6254                                                      NewTemplateArgs);
6255 
6256   if (!Result.isNull()) {
6257     /// FIXME: Wrap this in an elaborated-type-specifier?
6258     TemplateSpecializationTypeLoc NewTL
6259       = TLB.push<TemplateSpecializationTypeLoc>(Result);
6260     NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6261     NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6262     NewTL.setLAngleLoc(TL.getLAngleLoc());
6263     NewTL.setRAngleLoc(TL.getRAngleLoc());
6264     for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
6265       NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
6266   }
6267 
6268   return Result;
6269 }
6270 
6271 template<typename Derived>
6272 QualType
6273 TreeTransform<Derived>::TransformElaboratedType(TypeLocBuilder &TLB,
6274                                                 ElaboratedTypeLoc TL) {
6275   const ElaboratedType *T = TL.getTypePtr();
6276 
6277   NestedNameSpecifierLoc QualifierLoc;
6278   // NOTE: the qualifier in an ElaboratedType is optional.
6279   if (TL.getQualifierLoc()) {
6280     QualifierLoc
6281       = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc());
6282     if (!QualifierLoc)
6283       return QualType();
6284   }
6285 
6286   QualType NamedT = getDerived().TransformType(TLB, TL.getNamedTypeLoc());
6287   if (NamedT.isNull())
6288     return QualType();
6289 
6290   // C++0x [dcl.type.elab]p2:
6291   //   If the identifier resolves to a typedef-name or the simple-template-id
6292   //   resolves to an alias template specialization, the
6293   //   elaborated-type-specifier is ill-formed.
6294   if (T->getKeyword() != ETK_None && T->getKeyword() != ETK_Typename) {
6295     if (const TemplateSpecializationType *TST =
6296           NamedT->getAs<TemplateSpecializationType>()) {
6297       TemplateName Template = TST->getTemplateName();
6298       if (TypeAliasTemplateDecl *TAT = dyn_cast_or_null<TypeAliasTemplateDecl>(
6299               Template.getAsTemplateDecl())) {
6300         SemaRef.Diag(TL.getNamedTypeLoc().getBeginLoc(),
6301                      diag::err_tag_reference_non_tag)
6302             << TAT << Sema::NTK_TypeAliasTemplate
6303             << ElaboratedType::getTagTypeKindForKeyword(T->getKeyword());
6304         SemaRef.Diag(TAT->getLocation(), diag::note_declared_at);
6305       }
6306     }
6307   }
6308 
6309   QualType Result = TL.getType();
6310   if (getDerived().AlwaysRebuild() ||
6311       QualifierLoc != TL.getQualifierLoc() ||
6312       NamedT != T->getNamedType()) {
6313     Result = getDerived().RebuildElaboratedType(TL.getElaboratedKeywordLoc(),
6314                                                 T->getKeyword(),
6315                                                 QualifierLoc, NamedT);
6316     if (Result.isNull())
6317       return QualType();
6318   }
6319 
6320   ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
6321   NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6322   NewTL.setQualifierLoc(QualifierLoc);
6323   return Result;
6324 }
6325 
6326 template<typename Derived>
6327 QualType TreeTransform<Derived>::TransformAttributedType(
6328                                                 TypeLocBuilder &TLB,
6329                                                 AttributedTypeLoc TL) {
6330   const AttributedType *oldType = TL.getTypePtr();
6331   QualType modifiedType = getDerived().TransformType(TLB, TL.getModifiedLoc());
6332   if (modifiedType.isNull())
6333     return QualType();
6334 
6335   // oldAttr can be null if we started with a QualType rather than a TypeLoc.
6336   const Attr *oldAttr = TL.getAttr();
6337   const Attr *newAttr = oldAttr ? getDerived().TransformAttr(oldAttr) : nullptr;
6338   if (oldAttr && !newAttr)
6339     return QualType();
6340 
6341   QualType result = TL.getType();
6342 
6343   // FIXME: dependent operand expressions?
6344   if (getDerived().AlwaysRebuild() ||
6345       modifiedType != oldType->getModifiedType()) {
6346     // TODO: this is really lame; we should really be rebuilding the
6347     // equivalent type from first principles.
6348     QualType equivalentType
6349       = getDerived().TransformType(oldType->getEquivalentType());
6350     if (equivalentType.isNull())
6351       return QualType();
6352 
6353     // Check whether we can add nullability; it is only represented as
6354     // type sugar, and therefore cannot be diagnosed in any other way.
6355     if (auto nullability = oldType->getImmediateNullability()) {
6356       if (!modifiedType->canHaveNullability()) {
6357         SemaRef.Diag(TL.getAttr()->getLocation(),
6358                      diag::err_nullability_nonpointer)
6359             << DiagNullabilityKind(*nullability, false) << modifiedType;
6360         return QualType();
6361       }
6362     }
6363 
6364     result = SemaRef.Context.getAttributedType(TL.getAttrKind(),
6365                                                modifiedType,
6366                                                equivalentType);
6367   }
6368 
6369   AttributedTypeLoc newTL = TLB.push<AttributedTypeLoc>(result);
6370   newTL.setAttr(newAttr);
6371   return result;
6372 }
6373 
6374 template<typename Derived>
6375 QualType
6376 TreeTransform<Derived>::TransformParenType(TypeLocBuilder &TLB,
6377                                            ParenTypeLoc TL) {
6378   QualType Inner = getDerived().TransformType(TLB, TL.getInnerLoc());
6379   if (Inner.isNull())
6380     return QualType();
6381 
6382   QualType Result = TL.getType();
6383   if (getDerived().AlwaysRebuild() ||
6384       Inner != TL.getInnerLoc().getType()) {
6385     Result = getDerived().RebuildParenType(Inner);
6386     if (Result.isNull())
6387       return QualType();
6388   }
6389 
6390   ParenTypeLoc NewTL = TLB.push<ParenTypeLoc>(Result);
6391   NewTL.setLParenLoc(TL.getLParenLoc());
6392   NewTL.setRParenLoc(TL.getRParenLoc());
6393   return Result;
6394 }
6395 
6396 template <typename Derived>
6397 QualType
6398 TreeTransform<Derived>::TransformMacroQualifiedType(TypeLocBuilder &TLB,
6399                                                     MacroQualifiedTypeLoc TL) {
6400   QualType Inner = getDerived().TransformType(TLB, TL.getInnerLoc());
6401   if (Inner.isNull())
6402     return QualType();
6403 
6404   QualType Result = TL.getType();
6405   if (getDerived().AlwaysRebuild() || Inner != TL.getInnerLoc().getType()) {
6406     Result =
6407         getDerived().RebuildMacroQualifiedType(Inner, TL.getMacroIdentifier());
6408     if (Result.isNull())
6409       return QualType();
6410   }
6411 
6412   MacroQualifiedTypeLoc NewTL = TLB.push<MacroQualifiedTypeLoc>(Result);
6413   NewTL.setExpansionLoc(TL.getExpansionLoc());
6414   return Result;
6415 }
6416 
6417 template<typename Derived>
6418 QualType TreeTransform<Derived>::TransformDependentNameType(
6419     TypeLocBuilder &TLB, DependentNameTypeLoc TL) {
6420   return TransformDependentNameType(TLB, TL, false);
6421 }
6422 
6423 template<typename Derived>
6424 QualType TreeTransform<Derived>::TransformDependentNameType(
6425     TypeLocBuilder &TLB, DependentNameTypeLoc TL, bool DeducedTSTContext) {
6426   const DependentNameType *T = TL.getTypePtr();
6427 
6428   NestedNameSpecifierLoc QualifierLoc
6429     = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc());
6430   if (!QualifierLoc)
6431     return QualType();
6432 
6433   QualType Result
6434     = getDerived().RebuildDependentNameType(T->getKeyword(),
6435                                             TL.getElaboratedKeywordLoc(),
6436                                             QualifierLoc,
6437                                             T->getIdentifier(),
6438                                             TL.getNameLoc(),
6439                                             DeducedTSTContext);
6440   if (Result.isNull())
6441     return QualType();
6442 
6443   if (const ElaboratedType* ElabT = Result->getAs<ElaboratedType>()) {
6444     QualType NamedT = ElabT->getNamedType();
6445     TLB.pushTypeSpec(NamedT).setNameLoc(TL.getNameLoc());
6446 
6447     ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
6448     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6449     NewTL.setQualifierLoc(QualifierLoc);
6450   } else {
6451     DependentNameTypeLoc NewTL = TLB.push<DependentNameTypeLoc>(Result);
6452     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6453     NewTL.setQualifierLoc(QualifierLoc);
6454     NewTL.setNameLoc(TL.getNameLoc());
6455   }
6456   return Result;
6457 }
6458 
6459 template<typename Derived>
6460 QualType TreeTransform<Derived>::
6461           TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB,
6462                                  DependentTemplateSpecializationTypeLoc TL) {
6463   NestedNameSpecifierLoc QualifierLoc;
6464   if (TL.getQualifierLoc()) {
6465     QualifierLoc
6466       = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc());
6467     if (!QualifierLoc)
6468       return QualType();
6469   }
6470 
6471   return getDerived()
6472            .TransformDependentTemplateSpecializationType(TLB, TL, QualifierLoc);
6473 }
6474 
6475 template<typename Derived>
6476 QualType TreeTransform<Derived>::
6477 TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB,
6478                                    DependentTemplateSpecializationTypeLoc TL,
6479                                        NestedNameSpecifierLoc QualifierLoc) {
6480   const DependentTemplateSpecializationType *T = TL.getTypePtr();
6481 
6482   TemplateArgumentListInfo NewTemplateArgs;
6483   NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
6484   NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
6485 
6486   typedef TemplateArgumentLocContainerIterator<
6487   DependentTemplateSpecializationTypeLoc> ArgIterator;
6488   if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
6489                                               ArgIterator(TL, TL.getNumArgs()),
6490                                               NewTemplateArgs))
6491     return QualType();
6492 
6493   QualType Result = getDerived().RebuildDependentTemplateSpecializationType(
6494       T->getKeyword(), QualifierLoc, TL.getTemplateKeywordLoc(),
6495       T->getIdentifier(), TL.getTemplateNameLoc(), NewTemplateArgs,
6496       /*AllowInjectedClassName*/ false);
6497   if (Result.isNull())
6498     return QualType();
6499 
6500   if (const ElaboratedType *ElabT = dyn_cast<ElaboratedType>(Result)) {
6501     QualType NamedT = ElabT->getNamedType();
6502 
6503     // Copy information relevant to the template specialization.
6504     TemplateSpecializationTypeLoc NamedTL
6505       = TLB.push<TemplateSpecializationTypeLoc>(NamedT);
6506     NamedTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6507     NamedTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6508     NamedTL.setLAngleLoc(TL.getLAngleLoc());
6509     NamedTL.setRAngleLoc(TL.getRAngleLoc());
6510     for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I)
6511       NamedTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo());
6512 
6513     // Copy information relevant to the elaborated type.
6514     ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
6515     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6516     NewTL.setQualifierLoc(QualifierLoc);
6517   } else if (isa<DependentTemplateSpecializationType>(Result)) {
6518     DependentTemplateSpecializationTypeLoc SpecTL
6519       = TLB.push<DependentTemplateSpecializationTypeLoc>(Result);
6520     SpecTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6521     SpecTL.setQualifierLoc(QualifierLoc);
6522     SpecTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6523     SpecTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6524     SpecTL.setLAngleLoc(TL.getLAngleLoc());
6525     SpecTL.setRAngleLoc(TL.getRAngleLoc());
6526     for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I)
6527       SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo());
6528   } else {
6529     TemplateSpecializationTypeLoc SpecTL
6530       = TLB.push<TemplateSpecializationTypeLoc>(Result);
6531     SpecTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6532     SpecTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6533     SpecTL.setLAngleLoc(TL.getLAngleLoc());
6534     SpecTL.setRAngleLoc(TL.getRAngleLoc());
6535     for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I)
6536       SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo());
6537   }
6538   return Result;
6539 }
6540 
6541 template<typename Derived>
6542 QualType TreeTransform<Derived>::TransformPackExpansionType(TypeLocBuilder &TLB,
6543                                                       PackExpansionTypeLoc TL) {
6544   QualType Pattern
6545     = getDerived().TransformType(TLB, TL.getPatternLoc());
6546   if (Pattern.isNull())
6547     return QualType();
6548 
6549   QualType Result = TL.getType();
6550   if (getDerived().AlwaysRebuild() ||
6551       Pattern != TL.getPatternLoc().getType()) {
6552     Result = getDerived().RebuildPackExpansionType(Pattern,
6553                                            TL.getPatternLoc().getSourceRange(),
6554                                                    TL.getEllipsisLoc(),
6555                                            TL.getTypePtr()->getNumExpansions());
6556     if (Result.isNull())
6557       return QualType();
6558   }
6559 
6560   PackExpansionTypeLoc NewT = TLB.push<PackExpansionTypeLoc>(Result);
6561   NewT.setEllipsisLoc(TL.getEllipsisLoc());
6562   return Result;
6563 }
6564 
6565 template<typename Derived>
6566 QualType
6567 TreeTransform<Derived>::TransformObjCInterfaceType(TypeLocBuilder &TLB,
6568                                                    ObjCInterfaceTypeLoc TL) {
6569   // ObjCInterfaceType is never dependent.
6570   TLB.pushFullCopy(TL);
6571   return TL.getType();
6572 }
6573 
6574 template<typename Derived>
6575 QualType
6576 TreeTransform<Derived>::TransformObjCTypeParamType(TypeLocBuilder &TLB,
6577                                                    ObjCTypeParamTypeLoc TL) {
6578   const ObjCTypeParamType *T = TL.getTypePtr();
6579   ObjCTypeParamDecl *OTP = cast_or_null<ObjCTypeParamDecl>(
6580       getDerived().TransformDecl(T->getDecl()->getLocation(), T->getDecl()));
6581   if (!OTP)
6582     return QualType();
6583 
6584   QualType Result = TL.getType();
6585   if (getDerived().AlwaysRebuild() ||
6586       OTP != T->getDecl()) {
6587     Result = getDerived().RebuildObjCTypeParamType(OTP,
6588                  TL.getProtocolLAngleLoc(),
6589                  llvm::makeArrayRef(TL.getTypePtr()->qual_begin(),
6590                                     TL.getNumProtocols()),
6591                  TL.getProtocolLocs(),
6592                  TL.getProtocolRAngleLoc());
6593     if (Result.isNull())
6594       return QualType();
6595   }
6596 
6597   ObjCTypeParamTypeLoc NewTL = TLB.push<ObjCTypeParamTypeLoc>(Result);
6598   if (TL.getNumProtocols()) {
6599     NewTL.setProtocolLAngleLoc(TL.getProtocolLAngleLoc());
6600     for (unsigned i = 0, n = TL.getNumProtocols(); i != n; ++i)
6601       NewTL.setProtocolLoc(i, TL.getProtocolLoc(i));
6602     NewTL.setProtocolRAngleLoc(TL.getProtocolRAngleLoc());
6603   }
6604   return Result;
6605 }
6606 
6607 template<typename Derived>
6608 QualType
6609 TreeTransform<Derived>::TransformObjCObjectType(TypeLocBuilder &TLB,
6610                                                 ObjCObjectTypeLoc TL) {
6611   // Transform base type.
6612   QualType BaseType = getDerived().TransformType(TLB, TL.getBaseLoc());
6613   if (BaseType.isNull())
6614     return QualType();
6615 
6616   bool AnyChanged = BaseType != TL.getBaseLoc().getType();
6617 
6618   // Transform type arguments.
6619   SmallVector<TypeSourceInfo *, 4> NewTypeArgInfos;
6620   for (unsigned i = 0, n = TL.getNumTypeArgs(); i != n; ++i) {
6621     TypeSourceInfo *TypeArgInfo = TL.getTypeArgTInfo(i);
6622     TypeLoc TypeArgLoc = TypeArgInfo->getTypeLoc();
6623     QualType TypeArg = TypeArgInfo->getType();
6624     if (auto PackExpansionLoc = TypeArgLoc.getAs<PackExpansionTypeLoc>()) {
6625       AnyChanged = true;
6626 
6627       // We have a pack expansion. Instantiate it.
6628       const auto *PackExpansion = PackExpansionLoc.getType()
6629                                     ->castAs<PackExpansionType>();
6630       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
6631       SemaRef.collectUnexpandedParameterPacks(PackExpansion->getPattern(),
6632                                               Unexpanded);
6633       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
6634 
6635       // Determine whether the set of unexpanded parameter packs can
6636       // and should be expanded.
6637       TypeLoc PatternLoc = PackExpansionLoc.getPatternLoc();
6638       bool Expand = false;
6639       bool RetainExpansion = false;
6640       Optional<unsigned> NumExpansions = PackExpansion->getNumExpansions();
6641       if (getDerived().TryExpandParameterPacks(
6642             PackExpansionLoc.getEllipsisLoc(), PatternLoc.getSourceRange(),
6643             Unexpanded, Expand, RetainExpansion, NumExpansions))
6644         return QualType();
6645 
6646       if (!Expand) {
6647         // We can't expand this pack expansion into separate arguments yet;
6648         // just substitute into the pattern and create a new pack expansion
6649         // type.
6650         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
6651 
6652         TypeLocBuilder TypeArgBuilder;
6653         TypeArgBuilder.reserve(PatternLoc.getFullDataSize());
6654         QualType NewPatternType = getDerived().TransformType(TypeArgBuilder,
6655                                                              PatternLoc);
6656         if (NewPatternType.isNull())
6657           return QualType();
6658 
6659         QualType NewExpansionType = SemaRef.Context.getPackExpansionType(
6660                                       NewPatternType, NumExpansions);
6661         auto NewExpansionLoc = TLB.push<PackExpansionTypeLoc>(NewExpansionType);
6662         NewExpansionLoc.setEllipsisLoc(PackExpansionLoc.getEllipsisLoc());
6663         NewTypeArgInfos.push_back(
6664           TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewExpansionType));
6665         continue;
6666       }
6667 
6668       // Substitute into the pack expansion pattern for each slice of the
6669       // pack.
6670       for (unsigned ArgIdx = 0; ArgIdx != *NumExpansions; ++ArgIdx) {
6671         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), ArgIdx);
6672 
6673         TypeLocBuilder TypeArgBuilder;
6674         TypeArgBuilder.reserve(PatternLoc.getFullDataSize());
6675 
6676         QualType NewTypeArg = getDerived().TransformType(TypeArgBuilder,
6677                                                          PatternLoc);
6678         if (NewTypeArg.isNull())
6679           return QualType();
6680 
6681         NewTypeArgInfos.push_back(
6682           TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewTypeArg));
6683       }
6684 
6685       continue;
6686     }
6687 
6688     TypeLocBuilder TypeArgBuilder;
6689     TypeArgBuilder.reserve(TypeArgLoc.getFullDataSize());
6690     QualType NewTypeArg = getDerived().TransformType(TypeArgBuilder, TypeArgLoc);
6691     if (NewTypeArg.isNull())
6692       return QualType();
6693 
6694     // If nothing changed, just keep the old TypeSourceInfo.
6695     if (NewTypeArg == TypeArg) {
6696       NewTypeArgInfos.push_back(TypeArgInfo);
6697       continue;
6698     }
6699 
6700     NewTypeArgInfos.push_back(
6701       TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewTypeArg));
6702     AnyChanged = true;
6703   }
6704 
6705   QualType Result = TL.getType();
6706   if (getDerived().AlwaysRebuild() || AnyChanged) {
6707     // Rebuild the type.
6708     Result = getDerived().RebuildObjCObjectType(
6709         BaseType, TL.getBeginLoc(), TL.getTypeArgsLAngleLoc(), NewTypeArgInfos,
6710         TL.getTypeArgsRAngleLoc(), TL.getProtocolLAngleLoc(),
6711         llvm::makeArrayRef(TL.getTypePtr()->qual_begin(), TL.getNumProtocols()),
6712         TL.getProtocolLocs(), TL.getProtocolRAngleLoc());
6713 
6714     if (Result.isNull())
6715       return QualType();
6716   }
6717 
6718   ObjCObjectTypeLoc NewT = TLB.push<ObjCObjectTypeLoc>(Result);
6719   NewT.setHasBaseTypeAsWritten(true);
6720   NewT.setTypeArgsLAngleLoc(TL.getTypeArgsLAngleLoc());
6721   for (unsigned i = 0, n = TL.getNumTypeArgs(); i != n; ++i)
6722     NewT.setTypeArgTInfo(i, NewTypeArgInfos[i]);
6723   NewT.setTypeArgsRAngleLoc(TL.getTypeArgsRAngleLoc());
6724   NewT.setProtocolLAngleLoc(TL.getProtocolLAngleLoc());
6725   for (unsigned i = 0, n = TL.getNumProtocols(); i != n; ++i)
6726     NewT.setProtocolLoc(i, TL.getProtocolLoc(i));
6727   NewT.setProtocolRAngleLoc(TL.getProtocolRAngleLoc());
6728   return Result;
6729 }
6730 
6731 template<typename Derived>
6732 QualType
6733 TreeTransform<Derived>::TransformObjCObjectPointerType(TypeLocBuilder &TLB,
6734                                                ObjCObjectPointerTypeLoc TL) {
6735   QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
6736   if (PointeeType.isNull())
6737     return QualType();
6738 
6739   QualType Result = TL.getType();
6740   if (getDerived().AlwaysRebuild() ||
6741       PointeeType != TL.getPointeeLoc().getType()) {
6742     Result = getDerived().RebuildObjCObjectPointerType(PointeeType,
6743                                                        TL.getStarLoc());
6744     if (Result.isNull())
6745       return QualType();
6746   }
6747 
6748   ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result);
6749   NewT.setStarLoc(TL.getStarLoc());
6750   return Result;
6751 }
6752 
6753 //===----------------------------------------------------------------------===//
6754 // Statement transformation
6755 //===----------------------------------------------------------------------===//
6756 template<typename Derived>
6757 StmtResult
6758 TreeTransform<Derived>::TransformNullStmt(NullStmt *S) {
6759   return S;
6760 }
6761 
6762 template<typename Derived>
6763 StmtResult
6764 TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S) {
6765   return getDerived().TransformCompoundStmt(S, false);
6766 }
6767 
6768 template<typename Derived>
6769 StmtResult
6770 TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S,
6771                                               bool IsStmtExpr) {
6772   Sema::CompoundScopeRAII CompoundScope(getSema());
6773 
6774   const Stmt *ExprResult = S->getStmtExprResult();
6775   bool SubStmtInvalid = false;
6776   bool SubStmtChanged = false;
6777   SmallVector<Stmt*, 8> Statements;
6778   for (auto *B : S->body()) {
6779     StmtResult Result = getDerived().TransformStmt(
6780         B, IsStmtExpr && B == ExprResult ? SDK_StmtExprResult : SDK_Discarded);
6781 
6782     if (Result.isInvalid()) {
6783       // Immediately fail if this was a DeclStmt, since it's very
6784       // likely that this will cause problems for future statements.
6785       if (isa<DeclStmt>(B))
6786         return StmtError();
6787 
6788       // Otherwise, just keep processing substatements and fail later.
6789       SubStmtInvalid = true;
6790       continue;
6791     }
6792 
6793     SubStmtChanged = SubStmtChanged || Result.get() != B;
6794     Statements.push_back(Result.getAs<Stmt>());
6795   }
6796 
6797   if (SubStmtInvalid)
6798     return StmtError();
6799 
6800   if (!getDerived().AlwaysRebuild() &&
6801       !SubStmtChanged)
6802     return S;
6803 
6804   return getDerived().RebuildCompoundStmt(S->getLBracLoc(),
6805                                           Statements,
6806                                           S->getRBracLoc(),
6807                                           IsStmtExpr);
6808 }
6809 
6810 template<typename Derived>
6811 StmtResult
6812 TreeTransform<Derived>::TransformCaseStmt(CaseStmt *S) {
6813   ExprResult LHS, RHS;
6814   {
6815     EnterExpressionEvaluationContext Unevaluated(
6816         SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
6817 
6818     // Transform the left-hand case value.
6819     LHS = getDerived().TransformExpr(S->getLHS());
6820     LHS = SemaRef.ActOnCaseExpr(S->getCaseLoc(), LHS);
6821     if (LHS.isInvalid())
6822       return StmtError();
6823 
6824     // Transform the right-hand case value (for the GNU case-range extension).
6825     RHS = getDerived().TransformExpr(S->getRHS());
6826     RHS = SemaRef.ActOnCaseExpr(S->getCaseLoc(), RHS);
6827     if (RHS.isInvalid())
6828       return StmtError();
6829   }
6830 
6831   // Build the case statement.
6832   // Case statements are always rebuilt so that they will attached to their
6833   // transformed switch statement.
6834   StmtResult Case = getDerived().RebuildCaseStmt(S->getCaseLoc(),
6835                                                        LHS.get(),
6836                                                        S->getEllipsisLoc(),
6837                                                        RHS.get(),
6838                                                        S->getColonLoc());
6839   if (Case.isInvalid())
6840     return StmtError();
6841 
6842   // Transform the statement following the case
6843   StmtResult SubStmt =
6844       getDerived().TransformStmt(S->getSubStmt());
6845   if (SubStmt.isInvalid())
6846     return StmtError();
6847 
6848   // Attach the body to the case statement
6849   return getDerived().RebuildCaseStmtBody(Case.get(), SubStmt.get());
6850 }
6851 
6852 template <typename Derived>
6853 StmtResult TreeTransform<Derived>::TransformDefaultStmt(DefaultStmt *S) {
6854   // Transform the statement following the default case
6855   StmtResult SubStmt =
6856       getDerived().TransformStmt(S->getSubStmt());
6857   if (SubStmt.isInvalid())
6858     return StmtError();
6859 
6860   // Default statements are always rebuilt
6861   return getDerived().RebuildDefaultStmt(S->getDefaultLoc(), S->getColonLoc(),
6862                                          SubStmt.get());
6863 }
6864 
6865 template<typename Derived>
6866 StmtResult
6867 TreeTransform<Derived>::TransformLabelStmt(LabelStmt *S, StmtDiscardKind SDK) {
6868   StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt(), SDK);
6869   if (SubStmt.isInvalid())
6870     return StmtError();
6871 
6872   Decl *LD = getDerived().TransformDecl(S->getDecl()->getLocation(),
6873                                         S->getDecl());
6874   if (!LD)
6875     return StmtError();
6876 
6877   // If we're transforming "in-place" (we're not creating new local
6878   // declarations), assume we're replacing the old label statement
6879   // and clear out the reference to it.
6880   if (LD == S->getDecl())
6881     S->getDecl()->setStmt(nullptr);
6882 
6883   // FIXME: Pass the real colon location in.
6884   return getDerived().RebuildLabelStmt(S->getIdentLoc(),
6885                                        cast<LabelDecl>(LD), SourceLocation(),
6886                                        SubStmt.get());
6887 }
6888 
6889 template <typename Derived>
6890 const Attr *TreeTransform<Derived>::TransformAttr(const Attr *R) {
6891   if (!R)
6892     return R;
6893 
6894   switch (R->getKind()) {
6895 // Transform attributes with a pragma spelling by calling TransformXXXAttr.
6896 #define ATTR(X)
6897 #define PRAGMA_SPELLING_ATTR(X)                                                \
6898   case attr::X:                                                                \
6899     return getDerived().Transform##X##Attr(cast<X##Attr>(R));
6900 #include "clang/Basic/AttrList.inc"
6901   default:
6902     return R;
6903   }
6904 }
6905 
6906 template <typename Derived>
6907 StmtResult
6908 TreeTransform<Derived>::TransformAttributedStmt(AttributedStmt *S,
6909                                                 StmtDiscardKind SDK) {
6910   bool AttrsChanged = false;
6911   SmallVector<const Attr *, 1> Attrs;
6912 
6913   // Visit attributes and keep track if any are transformed.
6914   for (const auto *I : S->getAttrs()) {
6915     const Attr *R = getDerived().TransformAttr(I);
6916     AttrsChanged |= (I != R);
6917     Attrs.push_back(R);
6918   }
6919 
6920   StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt(), SDK);
6921   if (SubStmt.isInvalid())
6922     return StmtError();
6923 
6924   if (SubStmt.get() == S->getSubStmt() && !AttrsChanged)
6925     return S;
6926 
6927   return getDerived().RebuildAttributedStmt(S->getAttrLoc(), Attrs,
6928                                             SubStmt.get());
6929 }
6930 
6931 template<typename Derived>
6932 StmtResult
6933 TreeTransform<Derived>::TransformIfStmt(IfStmt *S) {
6934   // Transform the initialization statement
6935   StmtResult Init = getDerived().TransformStmt(S->getInit());
6936   if (Init.isInvalid())
6937     return StmtError();
6938 
6939   // Transform the condition
6940   Sema::ConditionResult Cond = getDerived().TransformCondition(
6941       S->getIfLoc(), S->getConditionVariable(), S->getCond(),
6942       S->isConstexpr() ? Sema::ConditionKind::ConstexprIf
6943                        : Sema::ConditionKind::Boolean);
6944   if (Cond.isInvalid())
6945     return StmtError();
6946 
6947   // If this is a constexpr if, determine which arm we should instantiate.
6948   llvm::Optional<bool> ConstexprConditionValue;
6949   if (S->isConstexpr())
6950     ConstexprConditionValue = Cond.getKnownValue();
6951 
6952   // Transform the "then" branch.
6953   StmtResult Then;
6954   if (!ConstexprConditionValue || *ConstexprConditionValue) {
6955     Then = getDerived().TransformStmt(S->getThen());
6956     if (Then.isInvalid())
6957       return StmtError();
6958   } else {
6959     Then = new (getSema().Context) NullStmt(S->getThen()->getBeginLoc());
6960   }
6961 
6962   // Transform the "else" branch.
6963   StmtResult Else;
6964   if (!ConstexprConditionValue || !*ConstexprConditionValue) {
6965     Else = getDerived().TransformStmt(S->getElse());
6966     if (Else.isInvalid())
6967       return StmtError();
6968   }
6969 
6970   if (!getDerived().AlwaysRebuild() &&
6971       Init.get() == S->getInit() &&
6972       Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) &&
6973       Then.get() == S->getThen() &&
6974       Else.get() == S->getElse())
6975     return S;
6976 
6977   return getDerived().RebuildIfStmt(S->getIfLoc(), S->isConstexpr(), Cond,
6978                                     Init.get(), Then.get(), S->getElseLoc(),
6979                                     Else.get());
6980 }
6981 
6982 template<typename Derived>
6983 StmtResult
6984 TreeTransform<Derived>::TransformSwitchStmt(SwitchStmt *S) {
6985   // Transform the initialization statement
6986   StmtResult Init = getDerived().TransformStmt(S->getInit());
6987   if (Init.isInvalid())
6988     return StmtError();
6989 
6990   // Transform the condition.
6991   Sema::ConditionResult Cond = getDerived().TransformCondition(
6992       S->getSwitchLoc(), S->getConditionVariable(), S->getCond(),
6993       Sema::ConditionKind::Switch);
6994   if (Cond.isInvalid())
6995     return StmtError();
6996 
6997   // Rebuild the switch statement.
6998   StmtResult Switch
6999     = getDerived().RebuildSwitchStmtStart(S->getSwitchLoc(), Init.get(), Cond);
7000   if (Switch.isInvalid())
7001     return StmtError();
7002 
7003   // Transform the body of the switch statement.
7004   StmtResult Body = getDerived().TransformStmt(S->getBody());
7005   if (Body.isInvalid())
7006     return StmtError();
7007 
7008   // Complete the switch statement.
7009   return getDerived().RebuildSwitchStmtBody(S->getSwitchLoc(), Switch.get(),
7010                                             Body.get());
7011 }
7012 
7013 template<typename Derived>
7014 StmtResult
7015 TreeTransform<Derived>::TransformWhileStmt(WhileStmt *S) {
7016   // Transform the condition
7017   Sema::ConditionResult Cond = getDerived().TransformCondition(
7018       S->getWhileLoc(), S->getConditionVariable(), S->getCond(),
7019       Sema::ConditionKind::Boolean);
7020   if (Cond.isInvalid())
7021     return StmtError();
7022 
7023   // Transform the body
7024   StmtResult Body = getDerived().TransformStmt(S->getBody());
7025   if (Body.isInvalid())
7026     return StmtError();
7027 
7028   if (!getDerived().AlwaysRebuild() &&
7029       Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) &&
7030       Body.get() == S->getBody())
7031     return Owned(S);
7032 
7033   return getDerived().RebuildWhileStmt(S->getWhileLoc(), Cond, Body.get());
7034 }
7035 
7036 template<typename Derived>
7037 StmtResult
7038 TreeTransform<Derived>::TransformDoStmt(DoStmt *S) {
7039   // Transform the body
7040   StmtResult Body = getDerived().TransformStmt(S->getBody());
7041   if (Body.isInvalid())
7042     return StmtError();
7043 
7044   // Transform the condition
7045   ExprResult Cond = getDerived().TransformExpr(S->getCond());
7046   if (Cond.isInvalid())
7047     return StmtError();
7048 
7049   if (!getDerived().AlwaysRebuild() &&
7050       Cond.get() == S->getCond() &&
7051       Body.get() == S->getBody())
7052     return S;
7053 
7054   return getDerived().RebuildDoStmt(S->getDoLoc(), Body.get(), S->getWhileLoc(),
7055                                     /*FIXME:*/S->getWhileLoc(), Cond.get(),
7056                                     S->getRParenLoc());
7057 }
7058 
7059 template<typename Derived>
7060 StmtResult
7061 TreeTransform<Derived>::TransformForStmt(ForStmt *S) {
7062   if (getSema().getLangOpts().OpenMP)
7063     getSema().startOpenMPLoop();
7064 
7065   // Transform the initialization statement
7066   StmtResult Init = getDerived().TransformStmt(S->getInit());
7067   if (Init.isInvalid())
7068     return StmtError();
7069 
7070   // In OpenMP loop region loop control variable must be captured and be
7071   // private. Perform analysis of first part (if any).
7072   if (getSema().getLangOpts().OpenMP && Init.isUsable())
7073     getSema().ActOnOpenMPLoopInitialization(S->getForLoc(), Init.get());
7074 
7075   // Transform the condition
7076   Sema::ConditionResult Cond = getDerived().TransformCondition(
7077       S->getForLoc(), S->getConditionVariable(), S->getCond(),
7078       Sema::ConditionKind::Boolean);
7079   if (Cond.isInvalid())
7080     return StmtError();
7081 
7082   // Transform the increment
7083   ExprResult Inc = getDerived().TransformExpr(S->getInc());
7084   if (Inc.isInvalid())
7085     return StmtError();
7086 
7087   Sema::FullExprArg FullInc(getSema().MakeFullDiscardedValueExpr(Inc.get()));
7088   if (S->getInc() && !FullInc.get())
7089     return StmtError();
7090 
7091   // Transform the body
7092   StmtResult Body = getDerived().TransformStmt(S->getBody());
7093   if (Body.isInvalid())
7094     return StmtError();
7095 
7096   if (!getDerived().AlwaysRebuild() &&
7097       Init.get() == S->getInit() &&
7098       Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) &&
7099       Inc.get() == S->getInc() &&
7100       Body.get() == S->getBody())
7101     return S;
7102 
7103   return getDerived().RebuildForStmt(S->getForLoc(), S->getLParenLoc(),
7104                                      Init.get(), Cond, FullInc,
7105                                      S->getRParenLoc(), Body.get());
7106 }
7107 
7108 template<typename Derived>
7109 StmtResult
7110 TreeTransform<Derived>::TransformGotoStmt(GotoStmt *S) {
7111   Decl *LD = getDerived().TransformDecl(S->getLabel()->getLocation(),
7112                                         S->getLabel());
7113   if (!LD)
7114     return StmtError();
7115 
7116   // Goto statements must always be rebuilt, to resolve the label.
7117   return getDerived().RebuildGotoStmt(S->getGotoLoc(), S->getLabelLoc(),
7118                                       cast<LabelDecl>(LD));
7119 }
7120 
7121 template<typename Derived>
7122 StmtResult
7123 TreeTransform<Derived>::TransformIndirectGotoStmt(IndirectGotoStmt *S) {
7124   ExprResult Target = getDerived().TransformExpr(S->getTarget());
7125   if (Target.isInvalid())
7126     return StmtError();
7127   Target = SemaRef.MaybeCreateExprWithCleanups(Target.get());
7128 
7129   if (!getDerived().AlwaysRebuild() &&
7130       Target.get() == S->getTarget())
7131     return S;
7132 
7133   return getDerived().RebuildIndirectGotoStmt(S->getGotoLoc(), S->getStarLoc(),
7134                                               Target.get());
7135 }
7136 
7137 template<typename Derived>
7138 StmtResult
7139 TreeTransform<Derived>::TransformContinueStmt(ContinueStmt *S) {
7140   return S;
7141 }
7142 
7143 template<typename Derived>
7144 StmtResult
7145 TreeTransform<Derived>::TransformBreakStmt(BreakStmt *S) {
7146   return S;
7147 }
7148 
7149 template<typename Derived>
7150 StmtResult
7151 TreeTransform<Derived>::TransformReturnStmt(ReturnStmt *S) {
7152   ExprResult Result = getDerived().TransformInitializer(S->getRetValue(),
7153                                                         /*NotCopyInit*/false);
7154   if (Result.isInvalid())
7155     return StmtError();
7156 
7157   // FIXME: We always rebuild the return statement because there is no way
7158   // to tell whether the return type of the function has changed.
7159   return getDerived().RebuildReturnStmt(S->getReturnLoc(), Result.get());
7160 }
7161 
7162 template<typename Derived>
7163 StmtResult
7164 TreeTransform<Derived>::TransformDeclStmt(DeclStmt *S) {
7165   bool DeclChanged = false;
7166   SmallVector<Decl *, 4> Decls;
7167   for (auto *D : S->decls()) {
7168     Decl *Transformed = getDerived().TransformDefinition(D->getLocation(), D);
7169     if (!Transformed)
7170       return StmtError();
7171 
7172     if (Transformed != D)
7173       DeclChanged = true;
7174 
7175     Decls.push_back(Transformed);
7176   }
7177 
7178   if (!getDerived().AlwaysRebuild() && !DeclChanged)
7179     return S;
7180 
7181   return getDerived().RebuildDeclStmt(Decls, S->getBeginLoc(), S->getEndLoc());
7182 }
7183 
7184 template<typename Derived>
7185 StmtResult
7186 TreeTransform<Derived>::TransformGCCAsmStmt(GCCAsmStmt *S) {
7187 
7188   SmallVector<Expr*, 8> Constraints;
7189   SmallVector<Expr*, 8> Exprs;
7190   SmallVector<IdentifierInfo *, 4> Names;
7191 
7192   ExprResult AsmString;
7193   SmallVector<Expr*, 8> Clobbers;
7194 
7195   bool ExprsChanged = false;
7196 
7197   // Go through the outputs.
7198   for (unsigned I = 0, E = S->getNumOutputs(); I != E; ++I) {
7199     Names.push_back(S->getOutputIdentifier(I));
7200 
7201     // No need to transform the constraint literal.
7202     Constraints.push_back(S->getOutputConstraintLiteral(I));
7203 
7204     // Transform the output expr.
7205     Expr *OutputExpr = S->getOutputExpr(I);
7206     ExprResult Result = getDerived().TransformExpr(OutputExpr);
7207     if (Result.isInvalid())
7208       return StmtError();
7209 
7210     ExprsChanged |= Result.get() != OutputExpr;
7211 
7212     Exprs.push_back(Result.get());
7213   }
7214 
7215   // Go through the inputs.
7216   for (unsigned I = 0, E = S->getNumInputs(); I != E; ++I) {
7217     Names.push_back(S->getInputIdentifier(I));
7218 
7219     // No need to transform the constraint literal.
7220     Constraints.push_back(S->getInputConstraintLiteral(I));
7221 
7222     // Transform the input expr.
7223     Expr *InputExpr = S->getInputExpr(I);
7224     ExprResult Result = getDerived().TransformExpr(InputExpr);
7225     if (Result.isInvalid())
7226       return StmtError();
7227 
7228     ExprsChanged |= Result.get() != InputExpr;
7229 
7230     Exprs.push_back(Result.get());
7231   }
7232 
7233   // Go through the Labels.
7234   for (unsigned I = 0, E = S->getNumLabels(); I != E; ++I) {
7235     Names.push_back(S->getLabelIdentifier(I));
7236 
7237     ExprResult Result = getDerived().TransformExpr(S->getLabelExpr(I));
7238     if (Result.isInvalid())
7239       return StmtError();
7240     ExprsChanged |= Result.get() != S->getLabelExpr(I);
7241     Exprs.push_back(Result.get());
7242   }
7243   if (!getDerived().AlwaysRebuild() && !ExprsChanged)
7244     return S;
7245 
7246   // Go through the clobbers.
7247   for (unsigned I = 0, E = S->getNumClobbers(); I != E; ++I)
7248     Clobbers.push_back(S->getClobberStringLiteral(I));
7249 
7250   // No need to transform the asm string literal.
7251   AsmString = S->getAsmString();
7252   return getDerived().RebuildGCCAsmStmt(S->getAsmLoc(), S->isSimple(),
7253                                         S->isVolatile(), S->getNumOutputs(),
7254                                         S->getNumInputs(), Names.data(),
7255                                         Constraints, Exprs, AsmString.get(),
7256                                         Clobbers, S->getNumLabels(),
7257                                         S->getRParenLoc());
7258 }
7259 
7260 template<typename Derived>
7261 StmtResult
7262 TreeTransform<Derived>::TransformMSAsmStmt(MSAsmStmt *S) {
7263   ArrayRef<Token> AsmToks =
7264     llvm::makeArrayRef(S->getAsmToks(), S->getNumAsmToks());
7265 
7266   bool HadError = false, HadChange = false;
7267 
7268   ArrayRef<Expr*> SrcExprs = S->getAllExprs();
7269   SmallVector<Expr*, 8> TransformedExprs;
7270   TransformedExprs.reserve(SrcExprs.size());
7271   for (unsigned i = 0, e = SrcExprs.size(); i != e; ++i) {
7272     ExprResult Result = getDerived().TransformExpr(SrcExprs[i]);
7273     if (!Result.isUsable()) {
7274       HadError = true;
7275     } else {
7276       HadChange |= (Result.get() != SrcExprs[i]);
7277       TransformedExprs.push_back(Result.get());
7278     }
7279   }
7280 
7281   if (HadError) return StmtError();
7282   if (!HadChange && !getDerived().AlwaysRebuild())
7283     return Owned(S);
7284 
7285   return getDerived().RebuildMSAsmStmt(S->getAsmLoc(), S->getLBraceLoc(),
7286                                        AsmToks, S->getAsmString(),
7287                                        S->getNumOutputs(), S->getNumInputs(),
7288                                        S->getAllConstraints(), S->getClobbers(),
7289                                        TransformedExprs, S->getEndLoc());
7290 }
7291 
7292 // C++ Coroutines TS
7293 
7294 template<typename Derived>
7295 StmtResult
7296 TreeTransform<Derived>::TransformCoroutineBodyStmt(CoroutineBodyStmt *S) {
7297   auto *ScopeInfo = SemaRef.getCurFunction();
7298   auto *FD = cast<FunctionDecl>(SemaRef.CurContext);
7299   assert(FD && ScopeInfo && !ScopeInfo->CoroutinePromise &&
7300          ScopeInfo->NeedsCoroutineSuspends &&
7301          ScopeInfo->CoroutineSuspends.first == nullptr &&
7302          ScopeInfo->CoroutineSuspends.second == nullptr &&
7303          "expected clean scope info");
7304 
7305   // Set that we have (possibly-invalid) suspend points before we do anything
7306   // that may fail.
7307   ScopeInfo->setNeedsCoroutineSuspends(false);
7308 
7309   // We re-build the coroutine promise object (and the coroutine parameters its
7310   // type and constructor depend on) based on the types used in our current
7311   // function. We must do so, and set it on the current FunctionScopeInfo,
7312   // before attempting to transform the other parts of the coroutine body
7313   // statement, such as the implicit suspend statements (because those
7314   // statements reference the FunctionScopeInfo::CoroutinePromise).
7315   if (!SemaRef.buildCoroutineParameterMoves(FD->getLocation()))
7316     return StmtError();
7317   auto *Promise = SemaRef.buildCoroutinePromise(FD->getLocation());
7318   if (!Promise)
7319     return StmtError();
7320   getDerived().transformedLocalDecl(S->getPromiseDecl(), {Promise});
7321   ScopeInfo->CoroutinePromise = Promise;
7322 
7323   // Transform the implicit coroutine statements constructed using dependent
7324   // types during the previous parse: initial and final suspensions, the return
7325   // object, and others. We also transform the coroutine function's body.
7326   StmtResult InitSuspend = getDerived().TransformStmt(S->getInitSuspendStmt());
7327   if (InitSuspend.isInvalid())
7328     return StmtError();
7329   StmtResult FinalSuspend =
7330       getDerived().TransformStmt(S->getFinalSuspendStmt());
7331   if (FinalSuspend.isInvalid())
7332     return StmtError();
7333   ScopeInfo->setCoroutineSuspends(InitSuspend.get(), FinalSuspend.get());
7334   assert(isa<Expr>(InitSuspend.get()) && isa<Expr>(FinalSuspend.get()));
7335 
7336   StmtResult BodyRes = getDerived().TransformStmt(S->getBody());
7337   if (BodyRes.isInvalid())
7338     return StmtError();
7339 
7340   CoroutineStmtBuilder Builder(SemaRef, *FD, *ScopeInfo, BodyRes.get());
7341   if (Builder.isInvalid())
7342     return StmtError();
7343 
7344   Expr *ReturnObject = S->getReturnValueInit();
7345   assert(ReturnObject && "the return object is expected to be valid");
7346   ExprResult Res = getDerived().TransformInitializer(ReturnObject,
7347                                                      /*NoCopyInit*/ false);
7348   if (Res.isInvalid())
7349     return StmtError();
7350   Builder.ReturnValue = Res.get();
7351 
7352   // If during the previous parse the coroutine still had a dependent promise
7353   // statement, we may need to build some implicit coroutine statements
7354   // (such as exception and fallthrough handlers) for the first time.
7355   if (S->hasDependentPromiseType()) {
7356     // We can only build these statements, however, if the current promise type
7357     // is not dependent.
7358     if (!Promise->getType()->isDependentType()) {
7359       assert(!S->getFallthroughHandler() && !S->getExceptionHandler() &&
7360              !S->getReturnStmtOnAllocFailure() && !S->getDeallocate() &&
7361              "these nodes should not have been built yet");
7362       if (!Builder.buildDependentStatements())
7363         return StmtError();
7364     }
7365   } else {
7366     if (auto *OnFallthrough = S->getFallthroughHandler()) {
7367       StmtResult Res = getDerived().TransformStmt(OnFallthrough);
7368       if (Res.isInvalid())
7369         return StmtError();
7370       Builder.OnFallthrough = Res.get();
7371     }
7372 
7373     if (auto *OnException = S->getExceptionHandler()) {
7374       StmtResult Res = getDerived().TransformStmt(OnException);
7375       if (Res.isInvalid())
7376         return StmtError();
7377       Builder.OnException = Res.get();
7378     }
7379 
7380     if (auto *OnAllocFailure = S->getReturnStmtOnAllocFailure()) {
7381       StmtResult Res = getDerived().TransformStmt(OnAllocFailure);
7382       if (Res.isInvalid())
7383         return StmtError();
7384       Builder.ReturnStmtOnAllocFailure = Res.get();
7385     }
7386 
7387     // Transform any additional statements we may have already built
7388     assert(S->getAllocate() && S->getDeallocate() &&
7389            "allocation and deallocation calls must already be built");
7390     ExprResult AllocRes = getDerived().TransformExpr(S->getAllocate());
7391     if (AllocRes.isInvalid())
7392       return StmtError();
7393     Builder.Allocate = AllocRes.get();
7394 
7395     ExprResult DeallocRes = getDerived().TransformExpr(S->getDeallocate());
7396     if (DeallocRes.isInvalid())
7397       return StmtError();
7398     Builder.Deallocate = DeallocRes.get();
7399 
7400     assert(S->getResultDecl() && "ResultDecl must already be built");
7401     StmtResult ResultDecl = getDerived().TransformStmt(S->getResultDecl());
7402     if (ResultDecl.isInvalid())
7403       return StmtError();
7404     Builder.ResultDecl = ResultDecl.get();
7405 
7406     if (auto *ReturnStmt = S->getReturnStmt()) {
7407       StmtResult Res = getDerived().TransformStmt(ReturnStmt);
7408       if (Res.isInvalid())
7409         return StmtError();
7410       Builder.ReturnStmt = Res.get();
7411     }
7412   }
7413 
7414   return getDerived().RebuildCoroutineBodyStmt(Builder);
7415 }
7416 
7417 template<typename Derived>
7418 StmtResult
7419 TreeTransform<Derived>::TransformCoreturnStmt(CoreturnStmt *S) {
7420   ExprResult Result = getDerived().TransformInitializer(S->getOperand(),
7421                                                         /*NotCopyInit*/false);
7422   if (Result.isInvalid())
7423     return StmtError();
7424 
7425   // Always rebuild; we don't know if this needs to be injected into a new
7426   // context or if the promise type has changed.
7427   return getDerived().RebuildCoreturnStmt(S->getKeywordLoc(), Result.get(),
7428                                           S->isImplicit());
7429 }
7430 
7431 template<typename Derived>
7432 ExprResult
7433 TreeTransform<Derived>::TransformCoawaitExpr(CoawaitExpr *E) {
7434   ExprResult Result = getDerived().TransformInitializer(E->getOperand(),
7435                                                         /*NotCopyInit*/false);
7436   if (Result.isInvalid())
7437     return ExprError();
7438 
7439   // Always rebuild; we don't know if this needs to be injected into a new
7440   // context or if the promise type has changed.
7441   return getDerived().RebuildCoawaitExpr(E->getKeywordLoc(), Result.get(),
7442                                          E->isImplicit());
7443 }
7444 
7445 template <typename Derived>
7446 ExprResult
7447 TreeTransform<Derived>::TransformDependentCoawaitExpr(DependentCoawaitExpr *E) {
7448   ExprResult OperandResult = getDerived().TransformInitializer(E->getOperand(),
7449                                                         /*NotCopyInit*/ false);
7450   if (OperandResult.isInvalid())
7451     return ExprError();
7452 
7453   ExprResult LookupResult = getDerived().TransformUnresolvedLookupExpr(
7454           E->getOperatorCoawaitLookup());
7455 
7456   if (LookupResult.isInvalid())
7457     return ExprError();
7458 
7459   // Always rebuild; we don't know if this needs to be injected into a new
7460   // context or if the promise type has changed.
7461   return getDerived().RebuildDependentCoawaitExpr(
7462       E->getKeywordLoc(), OperandResult.get(),
7463       cast<UnresolvedLookupExpr>(LookupResult.get()));
7464 }
7465 
7466 template<typename Derived>
7467 ExprResult
7468 TreeTransform<Derived>::TransformCoyieldExpr(CoyieldExpr *E) {
7469   ExprResult Result = getDerived().TransformInitializer(E->getOperand(),
7470                                                         /*NotCopyInit*/false);
7471   if (Result.isInvalid())
7472     return ExprError();
7473 
7474   // Always rebuild; we don't know if this needs to be injected into a new
7475   // context or if the promise type has changed.
7476   return getDerived().RebuildCoyieldExpr(E->getKeywordLoc(), Result.get());
7477 }
7478 
7479 // Objective-C Statements.
7480 
7481 template<typename Derived>
7482 StmtResult
7483 TreeTransform<Derived>::TransformObjCAtTryStmt(ObjCAtTryStmt *S) {
7484   // Transform the body of the @try.
7485   StmtResult TryBody = getDerived().TransformStmt(S->getTryBody());
7486   if (TryBody.isInvalid())
7487     return StmtError();
7488 
7489   // Transform the @catch statements (if present).
7490   bool AnyCatchChanged = false;
7491   SmallVector<Stmt*, 8> CatchStmts;
7492   for (unsigned I = 0, N = S->getNumCatchStmts(); I != N; ++I) {
7493     StmtResult Catch = getDerived().TransformStmt(S->getCatchStmt(I));
7494     if (Catch.isInvalid())
7495       return StmtError();
7496     if (Catch.get() != S->getCatchStmt(I))
7497       AnyCatchChanged = true;
7498     CatchStmts.push_back(Catch.get());
7499   }
7500 
7501   // Transform the @finally statement (if present).
7502   StmtResult Finally;
7503   if (S->getFinallyStmt()) {
7504     Finally = getDerived().TransformStmt(S->getFinallyStmt());
7505     if (Finally.isInvalid())
7506       return StmtError();
7507   }
7508 
7509   // If nothing changed, just retain this statement.
7510   if (!getDerived().AlwaysRebuild() &&
7511       TryBody.get() == S->getTryBody() &&
7512       !AnyCatchChanged &&
7513       Finally.get() == S->getFinallyStmt())
7514     return S;
7515 
7516   // Build a new statement.
7517   return getDerived().RebuildObjCAtTryStmt(S->getAtTryLoc(), TryBody.get(),
7518                                            CatchStmts, Finally.get());
7519 }
7520 
7521 template<typename Derived>
7522 StmtResult
7523 TreeTransform<Derived>::TransformObjCAtCatchStmt(ObjCAtCatchStmt *S) {
7524   // Transform the @catch parameter, if there is one.
7525   VarDecl *Var = nullptr;
7526   if (VarDecl *FromVar = S->getCatchParamDecl()) {
7527     TypeSourceInfo *TSInfo = nullptr;
7528     if (FromVar->getTypeSourceInfo()) {
7529       TSInfo = getDerived().TransformType(FromVar->getTypeSourceInfo());
7530       if (!TSInfo)
7531         return StmtError();
7532     }
7533 
7534     QualType T;
7535     if (TSInfo)
7536       T = TSInfo->getType();
7537     else {
7538       T = getDerived().TransformType(FromVar->getType());
7539       if (T.isNull())
7540         return StmtError();
7541     }
7542 
7543     Var = getDerived().RebuildObjCExceptionDecl(FromVar, TSInfo, T);
7544     if (!Var)
7545       return StmtError();
7546   }
7547 
7548   StmtResult Body = getDerived().TransformStmt(S->getCatchBody());
7549   if (Body.isInvalid())
7550     return StmtError();
7551 
7552   return getDerived().RebuildObjCAtCatchStmt(S->getAtCatchLoc(),
7553                                              S->getRParenLoc(),
7554                                              Var, Body.get());
7555 }
7556 
7557 template<typename Derived>
7558 StmtResult
7559 TreeTransform<Derived>::TransformObjCAtFinallyStmt(ObjCAtFinallyStmt *S) {
7560   // Transform the body.
7561   StmtResult Body = getDerived().TransformStmt(S->getFinallyBody());
7562   if (Body.isInvalid())
7563     return StmtError();
7564 
7565   // If nothing changed, just retain this statement.
7566   if (!getDerived().AlwaysRebuild() &&
7567       Body.get() == S->getFinallyBody())
7568     return S;
7569 
7570   // Build a new statement.
7571   return getDerived().RebuildObjCAtFinallyStmt(S->getAtFinallyLoc(),
7572                                                Body.get());
7573 }
7574 
7575 template<typename Derived>
7576 StmtResult
7577 TreeTransform<Derived>::TransformObjCAtThrowStmt(ObjCAtThrowStmt *S) {
7578   ExprResult Operand;
7579   if (S->getThrowExpr()) {
7580     Operand = getDerived().TransformExpr(S->getThrowExpr());
7581     if (Operand.isInvalid())
7582       return StmtError();
7583   }
7584 
7585   if (!getDerived().AlwaysRebuild() &&
7586       Operand.get() == S->getThrowExpr())
7587     return S;
7588 
7589   return getDerived().RebuildObjCAtThrowStmt(S->getThrowLoc(), Operand.get());
7590 }
7591 
7592 template<typename Derived>
7593 StmtResult
7594 TreeTransform<Derived>::TransformObjCAtSynchronizedStmt(
7595                                                   ObjCAtSynchronizedStmt *S) {
7596   // Transform the object we are locking.
7597   ExprResult Object = getDerived().TransformExpr(S->getSynchExpr());
7598   if (Object.isInvalid())
7599     return StmtError();
7600   Object =
7601     getDerived().RebuildObjCAtSynchronizedOperand(S->getAtSynchronizedLoc(),
7602                                                   Object.get());
7603   if (Object.isInvalid())
7604     return StmtError();
7605 
7606   // Transform the body.
7607   StmtResult Body = getDerived().TransformStmt(S->getSynchBody());
7608   if (Body.isInvalid())
7609     return StmtError();
7610 
7611   // If nothing change, just retain the current statement.
7612   if (!getDerived().AlwaysRebuild() &&
7613       Object.get() == S->getSynchExpr() &&
7614       Body.get() == S->getSynchBody())
7615     return S;
7616 
7617   // Build a new statement.
7618   return getDerived().RebuildObjCAtSynchronizedStmt(S->getAtSynchronizedLoc(),
7619                                                     Object.get(), Body.get());
7620 }
7621 
7622 template<typename Derived>
7623 StmtResult
7624 TreeTransform<Derived>::TransformObjCAutoreleasePoolStmt(
7625                                               ObjCAutoreleasePoolStmt *S) {
7626   // Transform the body.
7627   StmtResult Body = getDerived().TransformStmt(S->getSubStmt());
7628   if (Body.isInvalid())
7629     return StmtError();
7630 
7631   // If nothing changed, just retain this statement.
7632   if (!getDerived().AlwaysRebuild() &&
7633       Body.get() == S->getSubStmt())
7634     return S;
7635 
7636   // Build a new statement.
7637   return getDerived().RebuildObjCAutoreleasePoolStmt(
7638                         S->getAtLoc(), Body.get());
7639 }
7640 
7641 template<typename Derived>
7642 StmtResult
7643 TreeTransform<Derived>::TransformObjCForCollectionStmt(
7644                                                   ObjCForCollectionStmt *S) {
7645   // Transform the element statement.
7646   StmtResult Element =
7647       getDerived().TransformStmt(S->getElement(), SDK_NotDiscarded);
7648   if (Element.isInvalid())
7649     return StmtError();
7650 
7651   // Transform the collection expression.
7652   ExprResult Collection = getDerived().TransformExpr(S->getCollection());
7653   if (Collection.isInvalid())
7654     return StmtError();
7655 
7656   // Transform the body.
7657   StmtResult Body = getDerived().TransformStmt(S->getBody());
7658   if (Body.isInvalid())
7659     return StmtError();
7660 
7661   // If nothing changed, just retain this statement.
7662   if (!getDerived().AlwaysRebuild() &&
7663       Element.get() == S->getElement() &&
7664       Collection.get() == S->getCollection() &&
7665       Body.get() == S->getBody())
7666     return S;
7667 
7668   // Build a new statement.
7669   return getDerived().RebuildObjCForCollectionStmt(S->getForLoc(),
7670                                                    Element.get(),
7671                                                    Collection.get(),
7672                                                    S->getRParenLoc(),
7673                                                    Body.get());
7674 }
7675 
7676 template <typename Derived>
7677 StmtResult TreeTransform<Derived>::TransformCXXCatchStmt(CXXCatchStmt *S) {
7678   // Transform the exception declaration, if any.
7679   VarDecl *Var = nullptr;
7680   if (VarDecl *ExceptionDecl = S->getExceptionDecl()) {
7681     TypeSourceInfo *T =
7682         getDerived().TransformType(ExceptionDecl->getTypeSourceInfo());
7683     if (!T)
7684       return StmtError();
7685 
7686     Var = getDerived().RebuildExceptionDecl(
7687         ExceptionDecl, T, ExceptionDecl->getInnerLocStart(),
7688         ExceptionDecl->getLocation(), ExceptionDecl->getIdentifier());
7689     if (!Var || Var->isInvalidDecl())
7690       return StmtError();
7691   }
7692 
7693   // Transform the actual exception handler.
7694   StmtResult Handler = getDerived().TransformStmt(S->getHandlerBlock());
7695   if (Handler.isInvalid())
7696     return StmtError();
7697 
7698   if (!getDerived().AlwaysRebuild() && !Var &&
7699       Handler.get() == S->getHandlerBlock())
7700     return S;
7701 
7702   return getDerived().RebuildCXXCatchStmt(S->getCatchLoc(), Var, Handler.get());
7703 }
7704 
7705 template <typename Derived>
7706 StmtResult TreeTransform<Derived>::TransformCXXTryStmt(CXXTryStmt *S) {
7707   // Transform the try block itself.
7708   StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock());
7709   if (TryBlock.isInvalid())
7710     return StmtError();
7711 
7712   // Transform the handlers.
7713   bool HandlerChanged = false;
7714   SmallVector<Stmt *, 8> Handlers;
7715   for (unsigned I = 0, N = S->getNumHandlers(); I != N; ++I) {
7716     StmtResult Handler = getDerived().TransformCXXCatchStmt(S->getHandler(I));
7717     if (Handler.isInvalid())
7718       return StmtError();
7719 
7720     HandlerChanged = HandlerChanged || Handler.get() != S->getHandler(I);
7721     Handlers.push_back(Handler.getAs<Stmt>());
7722   }
7723 
7724   if (!getDerived().AlwaysRebuild() && TryBlock.get() == S->getTryBlock() &&
7725       !HandlerChanged)
7726     return S;
7727 
7728   return getDerived().RebuildCXXTryStmt(S->getTryLoc(), TryBlock.get(),
7729                                         Handlers);
7730 }
7731 
7732 template<typename Derived>
7733 StmtResult
7734 TreeTransform<Derived>::TransformCXXForRangeStmt(CXXForRangeStmt *S) {
7735   StmtResult Init =
7736       S->getInit() ? getDerived().TransformStmt(S->getInit()) : StmtResult();
7737   if (Init.isInvalid())
7738     return StmtError();
7739 
7740   StmtResult Range = getDerived().TransformStmt(S->getRangeStmt());
7741   if (Range.isInvalid())
7742     return StmtError();
7743 
7744   StmtResult Begin = getDerived().TransformStmt(S->getBeginStmt());
7745   if (Begin.isInvalid())
7746     return StmtError();
7747   StmtResult End = getDerived().TransformStmt(S->getEndStmt());
7748   if (End.isInvalid())
7749     return StmtError();
7750 
7751   ExprResult Cond = getDerived().TransformExpr(S->getCond());
7752   if (Cond.isInvalid())
7753     return StmtError();
7754   if (Cond.get())
7755     Cond = SemaRef.CheckBooleanCondition(S->getColonLoc(), Cond.get());
7756   if (Cond.isInvalid())
7757     return StmtError();
7758   if (Cond.get())
7759     Cond = SemaRef.MaybeCreateExprWithCleanups(Cond.get());
7760 
7761   ExprResult Inc = getDerived().TransformExpr(S->getInc());
7762   if (Inc.isInvalid())
7763     return StmtError();
7764   if (Inc.get())
7765     Inc = SemaRef.MaybeCreateExprWithCleanups(Inc.get());
7766 
7767   StmtResult LoopVar = getDerived().TransformStmt(S->getLoopVarStmt());
7768   if (LoopVar.isInvalid())
7769     return StmtError();
7770 
7771   StmtResult NewStmt = S;
7772   if (getDerived().AlwaysRebuild() ||
7773       Init.get() != S->getInit() ||
7774       Range.get() != S->getRangeStmt() ||
7775       Begin.get() != S->getBeginStmt() ||
7776       End.get() != S->getEndStmt() ||
7777       Cond.get() != S->getCond() ||
7778       Inc.get() != S->getInc() ||
7779       LoopVar.get() != S->getLoopVarStmt()) {
7780     NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(),
7781                                                   S->getCoawaitLoc(), Init.get(),
7782                                                   S->getColonLoc(), Range.get(),
7783                                                   Begin.get(), End.get(),
7784                                                   Cond.get(),
7785                                                   Inc.get(), LoopVar.get(),
7786                                                   S->getRParenLoc());
7787     if (NewStmt.isInvalid())
7788       return StmtError();
7789   }
7790 
7791   StmtResult Body = getDerived().TransformStmt(S->getBody());
7792   if (Body.isInvalid())
7793     return StmtError();
7794 
7795   // Body has changed but we didn't rebuild the for-range statement. Rebuild
7796   // it now so we have a new statement to attach the body to.
7797   if (Body.get() != S->getBody() && NewStmt.get() == S) {
7798     NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(),
7799                                                   S->getCoawaitLoc(), Init.get(),
7800                                                   S->getColonLoc(), Range.get(),
7801                                                   Begin.get(), End.get(),
7802                                                   Cond.get(),
7803                                                   Inc.get(), LoopVar.get(),
7804                                                   S->getRParenLoc());
7805     if (NewStmt.isInvalid())
7806       return StmtError();
7807   }
7808 
7809   if (NewStmt.get() == S)
7810     return S;
7811 
7812   return FinishCXXForRangeStmt(NewStmt.get(), Body.get());
7813 }
7814 
7815 template<typename Derived>
7816 StmtResult
7817 TreeTransform<Derived>::TransformMSDependentExistsStmt(
7818                                                     MSDependentExistsStmt *S) {
7819   // Transform the nested-name-specifier, if any.
7820   NestedNameSpecifierLoc QualifierLoc;
7821   if (S->getQualifierLoc()) {
7822     QualifierLoc
7823       = getDerived().TransformNestedNameSpecifierLoc(S->getQualifierLoc());
7824     if (!QualifierLoc)
7825       return StmtError();
7826   }
7827 
7828   // Transform the declaration name.
7829   DeclarationNameInfo NameInfo = S->getNameInfo();
7830   if (NameInfo.getName()) {
7831     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
7832     if (!NameInfo.getName())
7833       return StmtError();
7834   }
7835 
7836   // Check whether anything changed.
7837   if (!getDerived().AlwaysRebuild() &&
7838       QualifierLoc == S->getQualifierLoc() &&
7839       NameInfo.getName() == S->getNameInfo().getName())
7840     return S;
7841 
7842   // Determine whether this name exists, if we can.
7843   CXXScopeSpec SS;
7844   SS.Adopt(QualifierLoc);
7845   bool Dependent = false;
7846   switch (getSema().CheckMicrosoftIfExistsSymbol(/*S=*/nullptr, SS, NameInfo)) {
7847   case Sema::IER_Exists:
7848     if (S->isIfExists())
7849       break;
7850 
7851     return new (getSema().Context) NullStmt(S->getKeywordLoc());
7852 
7853   case Sema::IER_DoesNotExist:
7854     if (S->isIfNotExists())
7855       break;
7856 
7857     return new (getSema().Context) NullStmt(S->getKeywordLoc());
7858 
7859   case Sema::IER_Dependent:
7860     Dependent = true;
7861     break;
7862 
7863   case Sema::IER_Error:
7864     return StmtError();
7865   }
7866 
7867   // We need to continue with the instantiation, so do so now.
7868   StmtResult SubStmt = getDerived().TransformCompoundStmt(S->getSubStmt());
7869   if (SubStmt.isInvalid())
7870     return StmtError();
7871 
7872   // If we have resolved the name, just transform to the substatement.
7873   if (!Dependent)
7874     return SubStmt;
7875 
7876   // The name is still dependent, so build a dependent expression again.
7877   return getDerived().RebuildMSDependentExistsStmt(S->getKeywordLoc(),
7878                                                    S->isIfExists(),
7879                                                    QualifierLoc,
7880                                                    NameInfo,
7881                                                    SubStmt.get());
7882 }
7883 
7884 template<typename Derived>
7885 ExprResult
7886 TreeTransform<Derived>::TransformMSPropertyRefExpr(MSPropertyRefExpr *E) {
7887   NestedNameSpecifierLoc QualifierLoc;
7888   if (E->getQualifierLoc()) {
7889     QualifierLoc
7890     = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
7891     if (!QualifierLoc)
7892       return ExprError();
7893   }
7894 
7895   MSPropertyDecl *PD = cast_or_null<MSPropertyDecl>(
7896     getDerived().TransformDecl(E->getMemberLoc(), E->getPropertyDecl()));
7897   if (!PD)
7898     return ExprError();
7899 
7900   ExprResult Base = getDerived().TransformExpr(E->getBaseExpr());
7901   if (Base.isInvalid())
7902     return ExprError();
7903 
7904   return new (SemaRef.getASTContext())
7905       MSPropertyRefExpr(Base.get(), PD, E->isArrow(),
7906                         SemaRef.getASTContext().PseudoObjectTy, VK_LValue,
7907                         QualifierLoc, E->getMemberLoc());
7908 }
7909 
7910 template <typename Derived>
7911 ExprResult TreeTransform<Derived>::TransformMSPropertySubscriptExpr(
7912     MSPropertySubscriptExpr *E) {
7913   auto BaseRes = getDerived().TransformExpr(E->getBase());
7914   if (BaseRes.isInvalid())
7915     return ExprError();
7916   auto IdxRes = getDerived().TransformExpr(E->getIdx());
7917   if (IdxRes.isInvalid())
7918     return ExprError();
7919 
7920   if (!getDerived().AlwaysRebuild() &&
7921       BaseRes.get() == E->getBase() &&
7922       IdxRes.get() == E->getIdx())
7923     return E;
7924 
7925   return getDerived().RebuildArraySubscriptExpr(
7926       BaseRes.get(), SourceLocation(), IdxRes.get(), E->getRBracketLoc());
7927 }
7928 
7929 template <typename Derived>
7930 StmtResult TreeTransform<Derived>::TransformSEHTryStmt(SEHTryStmt *S) {
7931   StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock());
7932   if (TryBlock.isInvalid())
7933     return StmtError();
7934 
7935   StmtResult Handler = getDerived().TransformSEHHandler(S->getHandler());
7936   if (Handler.isInvalid())
7937     return StmtError();
7938 
7939   if (!getDerived().AlwaysRebuild() && TryBlock.get() == S->getTryBlock() &&
7940       Handler.get() == S->getHandler())
7941     return S;
7942 
7943   return getDerived().RebuildSEHTryStmt(S->getIsCXXTry(), S->getTryLoc(),
7944                                         TryBlock.get(), Handler.get());
7945 }
7946 
7947 template <typename Derived>
7948 StmtResult TreeTransform<Derived>::TransformSEHFinallyStmt(SEHFinallyStmt *S) {
7949   StmtResult Block = getDerived().TransformCompoundStmt(S->getBlock());
7950   if (Block.isInvalid())
7951     return StmtError();
7952 
7953   return getDerived().RebuildSEHFinallyStmt(S->getFinallyLoc(), Block.get());
7954 }
7955 
7956 template <typename Derived>
7957 StmtResult TreeTransform<Derived>::TransformSEHExceptStmt(SEHExceptStmt *S) {
7958   ExprResult FilterExpr = getDerived().TransformExpr(S->getFilterExpr());
7959   if (FilterExpr.isInvalid())
7960     return StmtError();
7961 
7962   StmtResult Block = getDerived().TransformCompoundStmt(S->getBlock());
7963   if (Block.isInvalid())
7964     return StmtError();
7965 
7966   return getDerived().RebuildSEHExceptStmt(S->getExceptLoc(), FilterExpr.get(),
7967                                            Block.get());
7968 }
7969 
7970 template <typename Derived>
7971 StmtResult TreeTransform<Derived>::TransformSEHHandler(Stmt *Handler) {
7972   if (isa<SEHFinallyStmt>(Handler))
7973     return getDerived().TransformSEHFinallyStmt(cast<SEHFinallyStmt>(Handler));
7974   else
7975     return getDerived().TransformSEHExceptStmt(cast<SEHExceptStmt>(Handler));
7976 }
7977 
7978 template<typename Derived>
7979 StmtResult
7980 TreeTransform<Derived>::TransformSEHLeaveStmt(SEHLeaveStmt *S) {
7981   return S;
7982 }
7983 
7984 //===----------------------------------------------------------------------===//
7985 // OpenMP directive transformation
7986 //===----------------------------------------------------------------------===//
7987 template <typename Derived>
7988 StmtResult TreeTransform<Derived>::TransformOMPExecutableDirective(
7989     OMPExecutableDirective *D) {
7990 
7991   // Transform the clauses
7992   llvm::SmallVector<OMPClause *, 16> TClauses;
7993   ArrayRef<OMPClause *> Clauses = D->clauses();
7994   TClauses.reserve(Clauses.size());
7995   for (ArrayRef<OMPClause *>::iterator I = Clauses.begin(), E = Clauses.end();
7996        I != E; ++I) {
7997     if (*I) {
7998       getDerived().getSema().StartOpenMPClause((*I)->getClauseKind());
7999       OMPClause *Clause = getDerived().TransformOMPClause(*I);
8000       getDerived().getSema().EndOpenMPClause();
8001       if (Clause)
8002         TClauses.push_back(Clause);
8003     } else {
8004       TClauses.push_back(nullptr);
8005     }
8006   }
8007   StmtResult AssociatedStmt;
8008   if (D->hasAssociatedStmt() && D->getAssociatedStmt()) {
8009     getDerived().getSema().ActOnOpenMPRegionStart(D->getDirectiveKind(),
8010                                                   /*CurScope=*/nullptr);
8011     StmtResult Body;
8012     {
8013       Sema::CompoundScopeRAII CompoundScope(getSema());
8014       Stmt *CS = D->getInnermostCapturedStmt()->getCapturedStmt();
8015       Body = getDerived().TransformStmt(CS);
8016     }
8017     AssociatedStmt =
8018         getDerived().getSema().ActOnOpenMPRegionEnd(Body, TClauses);
8019     if (AssociatedStmt.isInvalid()) {
8020       return StmtError();
8021     }
8022   }
8023   if (TClauses.size() != Clauses.size()) {
8024     return StmtError();
8025   }
8026 
8027   // Transform directive name for 'omp critical' directive.
8028   DeclarationNameInfo DirName;
8029   if (D->getDirectiveKind() == OMPD_critical) {
8030     DirName = cast<OMPCriticalDirective>(D)->getDirectiveName();
8031     DirName = getDerived().TransformDeclarationNameInfo(DirName);
8032   }
8033   OpenMPDirectiveKind CancelRegion = OMPD_unknown;
8034   if (D->getDirectiveKind() == OMPD_cancellation_point) {
8035     CancelRegion = cast<OMPCancellationPointDirective>(D)->getCancelRegion();
8036   } else if (D->getDirectiveKind() == OMPD_cancel) {
8037     CancelRegion = cast<OMPCancelDirective>(D)->getCancelRegion();
8038   }
8039 
8040   return getDerived().RebuildOMPExecutableDirective(
8041       D->getDirectiveKind(), DirName, CancelRegion, TClauses,
8042       AssociatedStmt.get(), D->getBeginLoc(), D->getEndLoc());
8043 }
8044 
8045 template <typename Derived>
8046 StmtResult
8047 TreeTransform<Derived>::TransformOMPParallelDirective(OMPParallelDirective *D) {
8048   DeclarationNameInfo DirName;
8049   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel, DirName, nullptr,
8050                                              D->getBeginLoc());
8051   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8052   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8053   return Res;
8054 }
8055 
8056 template <typename Derived>
8057 StmtResult
8058 TreeTransform<Derived>::TransformOMPSimdDirective(OMPSimdDirective *D) {
8059   DeclarationNameInfo DirName;
8060   getDerived().getSema().StartOpenMPDSABlock(OMPD_simd, DirName, nullptr,
8061                                              D->getBeginLoc());
8062   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8063   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8064   return Res;
8065 }
8066 
8067 template <typename Derived>
8068 StmtResult
8069 TreeTransform<Derived>::TransformOMPForDirective(OMPForDirective *D) {
8070   DeclarationNameInfo DirName;
8071   getDerived().getSema().StartOpenMPDSABlock(OMPD_for, DirName, nullptr,
8072                                              D->getBeginLoc());
8073   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8074   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8075   return Res;
8076 }
8077 
8078 template <typename Derived>
8079 StmtResult
8080 TreeTransform<Derived>::TransformOMPForSimdDirective(OMPForSimdDirective *D) {
8081   DeclarationNameInfo DirName;
8082   getDerived().getSema().StartOpenMPDSABlock(OMPD_for_simd, DirName, nullptr,
8083                                              D->getBeginLoc());
8084   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8085   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8086   return Res;
8087 }
8088 
8089 template <typename Derived>
8090 StmtResult
8091 TreeTransform<Derived>::TransformOMPSectionsDirective(OMPSectionsDirective *D) {
8092   DeclarationNameInfo DirName;
8093   getDerived().getSema().StartOpenMPDSABlock(OMPD_sections, DirName, nullptr,
8094                                              D->getBeginLoc());
8095   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8096   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8097   return Res;
8098 }
8099 
8100 template <typename Derived>
8101 StmtResult
8102 TreeTransform<Derived>::TransformOMPSectionDirective(OMPSectionDirective *D) {
8103   DeclarationNameInfo DirName;
8104   getDerived().getSema().StartOpenMPDSABlock(OMPD_section, DirName, nullptr,
8105                                              D->getBeginLoc());
8106   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8107   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8108   return Res;
8109 }
8110 
8111 template <typename Derived>
8112 StmtResult
8113 TreeTransform<Derived>::TransformOMPSingleDirective(OMPSingleDirective *D) {
8114   DeclarationNameInfo DirName;
8115   getDerived().getSema().StartOpenMPDSABlock(OMPD_single, DirName, nullptr,
8116                                              D->getBeginLoc());
8117   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8118   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8119   return Res;
8120 }
8121 
8122 template <typename Derived>
8123 StmtResult
8124 TreeTransform<Derived>::TransformOMPMasterDirective(OMPMasterDirective *D) {
8125   DeclarationNameInfo DirName;
8126   getDerived().getSema().StartOpenMPDSABlock(OMPD_master, DirName, nullptr,
8127                                              D->getBeginLoc());
8128   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8129   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8130   return Res;
8131 }
8132 
8133 template <typename Derived>
8134 StmtResult
8135 TreeTransform<Derived>::TransformOMPCriticalDirective(OMPCriticalDirective *D) {
8136   getDerived().getSema().StartOpenMPDSABlock(
8137       OMPD_critical, D->getDirectiveName(), nullptr, D->getBeginLoc());
8138   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8139   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8140   return Res;
8141 }
8142 
8143 template <typename Derived>
8144 StmtResult TreeTransform<Derived>::TransformOMPParallelForDirective(
8145     OMPParallelForDirective *D) {
8146   DeclarationNameInfo DirName;
8147   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_for, DirName,
8148                                              nullptr, D->getBeginLoc());
8149   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8150   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8151   return Res;
8152 }
8153 
8154 template <typename Derived>
8155 StmtResult TreeTransform<Derived>::TransformOMPParallelForSimdDirective(
8156     OMPParallelForSimdDirective *D) {
8157   DeclarationNameInfo DirName;
8158   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_for_simd, DirName,
8159                                              nullptr, D->getBeginLoc());
8160   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8161   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8162   return Res;
8163 }
8164 
8165 template <typename Derived>
8166 StmtResult TreeTransform<Derived>::TransformOMPParallelMasterDirective(
8167     OMPParallelMasterDirective *D) {
8168   DeclarationNameInfo DirName;
8169   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_master, DirName,
8170                                              nullptr, D->getBeginLoc());
8171   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8172   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8173   return Res;
8174 }
8175 
8176 template <typename Derived>
8177 StmtResult TreeTransform<Derived>::TransformOMPParallelSectionsDirective(
8178     OMPParallelSectionsDirective *D) {
8179   DeclarationNameInfo DirName;
8180   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_sections, DirName,
8181                                              nullptr, D->getBeginLoc());
8182   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8183   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8184   return Res;
8185 }
8186 
8187 template <typename Derived>
8188 StmtResult
8189 TreeTransform<Derived>::TransformOMPTaskDirective(OMPTaskDirective *D) {
8190   DeclarationNameInfo DirName;
8191   getDerived().getSema().StartOpenMPDSABlock(OMPD_task, DirName, nullptr,
8192                                              D->getBeginLoc());
8193   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8194   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8195   return Res;
8196 }
8197 
8198 template <typename Derived>
8199 StmtResult TreeTransform<Derived>::TransformOMPTaskyieldDirective(
8200     OMPTaskyieldDirective *D) {
8201   DeclarationNameInfo DirName;
8202   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskyield, DirName, nullptr,
8203                                              D->getBeginLoc());
8204   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8205   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8206   return Res;
8207 }
8208 
8209 template <typename Derived>
8210 StmtResult
8211 TreeTransform<Derived>::TransformOMPBarrierDirective(OMPBarrierDirective *D) {
8212   DeclarationNameInfo DirName;
8213   getDerived().getSema().StartOpenMPDSABlock(OMPD_barrier, DirName, nullptr,
8214                                              D->getBeginLoc());
8215   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8216   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8217   return Res;
8218 }
8219 
8220 template <typename Derived>
8221 StmtResult
8222 TreeTransform<Derived>::TransformOMPTaskwaitDirective(OMPTaskwaitDirective *D) {
8223   DeclarationNameInfo DirName;
8224   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskwait, DirName, nullptr,
8225                                              D->getBeginLoc());
8226   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8227   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8228   return Res;
8229 }
8230 
8231 template <typename Derived>
8232 StmtResult TreeTransform<Derived>::TransformOMPTaskgroupDirective(
8233     OMPTaskgroupDirective *D) {
8234   DeclarationNameInfo DirName;
8235   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskgroup, DirName, nullptr,
8236                                              D->getBeginLoc());
8237   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8238   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8239   return Res;
8240 }
8241 
8242 template <typename Derived>
8243 StmtResult
8244 TreeTransform<Derived>::TransformOMPFlushDirective(OMPFlushDirective *D) {
8245   DeclarationNameInfo DirName;
8246   getDerived().getSema().StartOpenMPDSABlock(OMPD_flush, DirName, nullptr,
8247                                              D->getBeginLoc());
8248   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8249   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8250   return Res;
8251 }
8252 
8253 template <typename Derived>
8254 StmtResult
8255 TreeTransform<Derived>::TransformOMPOrderedDirective(OMPOrderedDirective *D) {
8256   DeclarationNameInfo DirName;
8257   getDerived().getSema().StartOpenMPDSABlock(OMPD_ordered, DirName, nullptr,
8258                                              D->getBeginLoc());
8259   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8260   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8261   return Res;
8262 }
8263 
8264 template <typename Derived>
8265 StmtResult
8266 TreeTransform<Derived>::TransformOMPAtomicDirective(OMPAtomicDirective *D) {
8267   DeclarationNameInfo DirName;
8268   getDerived().getSema().StartOpenMPDSABlock(OMPD_atomic, DirName, nullptr,
8269                                              D->getBeginLoc());
8270   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8271   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8272   return Res;
8273 }
8274 
8275 template <typename Derived>
8276 StmtResult
8277 TreeTransform<Derived>::TransformOMPTargetDirective(OMPTargetDirective *D) {
8278   DeclarationNameInfo DirName;
8279   getDerived().getSema().StartOpenMPDSABlock(OMPD_target, DirName, nullptr,
8280                                              D->getBeginLoc());
8281   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8282   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8283   return Res;
8284 }
8285 
8286 template <typename Derived>
8287 StmtResult TreeTransform<Derived>::TransformOMPTargetDataDirective(
8288     OMPTargetDataDirective *D) {
8289   DeclarationNameInfo DirName;
8290   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_data, DirName, nullptr,
8291                                              D->getBeginLoc());
8292   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8293   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8294   return Res;
8295 }
8296 
8297 template <typename Derived>
8298 StmtResult TreeTransform<Derived>::TransformOMPTargetEnterDataDirective(
8299     OMPTargetEnterDataDirective *D) {
8300   DeclarationNameInfo DirName;
8301   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_enter_data, DirName,
8302                                              nullptr, D->getBeginLoc());
8303   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8304   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8305   return Res;
8306 }
8307 
8308 template <typename Derived>
8309 StmtResult TreeTransform<Derived>::TransformOMPTargetExitDataDirective(
8310     OMPTargetExitDataDirective *D) {
8311   DeclarationNameInfo DirName;
8312   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_exit_data, DirName,
8313                                              nullptr, D->getBeginLoc());
8314   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8315   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8316   return Res;
8317 }
8318 
8319 template <typename Derived>
8320 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelDirective(
8321     OMPTargetParallelDirective *D) {
8322   DeclarationNameInfo DirName;
8323   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel, DirName,
8324                                              nullptr, D->getBeginLoc());
8325   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8326   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8327   return Res;
8328 }
8329 
8330 template <typename Derived>
8331 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelForDirective(
8332     OMPTargetParallelForDirective *D) {
8333   DeclarationNameInfo DirName;
8334   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel_for, DirName,
8335                                              nullptr, D->getBeginLoc());
8336   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8337   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8338   return Res;
8339 }
8340 
8341 template <typename Derived>
8342 StmtResult TreeTransform<Derived>::TransformOMPTargetUpdateDirective(
8343     OMPTargetUpdateDirective *D) {
8344   DeclarationNameInfo DirName;
8345   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_update, DirName,
8346                                              nullptr, D->getBeginLoc());
8347   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8348   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8349   return Res;
8350 }
8351 
8352 template <typename Derived>
8353 StmtResult
8354 TreeTransform<Derived>::TransformOMPTeamsDirective(OMPTeamsDirective *D) {
8355   DeclarationNameInfo DirName;
8356   getDerived().getSema().StartOpenMPDSABlock(OMPD_teams, DirName, nullptr,
8357                                              D->getBeginLoc());
8358   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8359   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8360   return Res;
8361 }
8362 
8363 template <typename Derived>
8364 StmtResult TreeTransform<Derived>::TransformOMPCancellationPointDirective(
8365     OMPCancellationPointDirective *D) {
8366   DeclarationNameInfo DirName;
8367   getDerived().getSema().StartOpenMPDSABlock(OMPD_cancellation_point, DirName,
8368                                              nullptr, D->getBeginLoc());
8369   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8370   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8371   return Res;
8372 }
8373 
8374 template <typename Derived>
8375 StmtResult
8376 TreeTransform<Derived>::TransformOMPCancelDirective(OMPCancelDirective *D) {
8377   DeclarationNameInfo DirName;
8378   getDerived().getSema().StartOpenMPDSABlock(OMPD_cancel, DirName, nullptr,
8379                                              D->getBeginLoc());
8380   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8381   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8382   return Res;
8383 }
8384 
8385 template <typename Derived>
8386 StmtResult
8387 TreeTransform<Derived>::TransformOMPTaskLoopDirective(OMPTaskLoopDirective *D) {
8388   DeclarationNameInfo DirName;
8389   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskloop, DirName, nullptr,
8390                                              D->getBeginLoc());
8391   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8392   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8393   return Res;
8394 }
8395 
8396 template <typename Derived>
8397 StmtResult TreeTransform<Derived>::TransformOMPTaskLoopSimdDirective(
8398     OMPTaskLoopSimdDirective *D) {
8399   DeclarationNameInfo DirName;
8400   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskloop_simd, DirName,
8401                                              nullptr, D->getBeginLoc());
8402   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8403   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8404   return Res;
8405 }
8406 
8407 template <typename Derived>
8408 StmtResult TreeTransform<Derived>::TransformOMPMasterTaskLoopDirective(
8409     OMPMasterTaskLoopDirective *D) {
8410   DeclarationNameInfo DirName;
8411   getDerived().getSema().StartOpenMPDSABlock(OMPD_master_taskloop, DirName,
8412                                              nullptr, D->getBeginLoc());
8413   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8414   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8415   return Res;
8416 }
8417 
8418 template <typename Derived>
8419 StmtResult TreeTransform<Derived>::TransformOMPMasterTaskLoopSimdDirective(
8420     OMPMasterTaskLoopSimdDirective *D) {
8421   DeclarationNameInfo DirName;
8422   getDerived().getSema().StartOpenMPDSABlock(OMPD_master_taskloop_simd, DirName,
8423                                              nullptr, D->getBeginLoc());
8424   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8425   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8426   return Res;
8427 }
8428 
8429 template <typename Derived>
8430 StmtResult TreeTransform<Derived>::TransformOMPParallelMasterTaskLoopDirective(
8431     OMPParallelMasterTaskLoopDirective *D) {
8432   DeclarationNameInfo DirName;
8433   getDerived().getSema().StartOpenMPDSABlock(
8434       OMPD_parallel_master_taskloop, DirName, nullptr, D->getBeginLoc());
8435   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8436   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8437   return Res;
8438 }
8439 
8440 template <typename Derived>
8441 StmtResult
8442 TreeTransform<Derived>::TransformOMPParallelMasterTaskLoopSimdDirective(
8443     OMPParallelMasterTaskLoopSimdDirective *D) {
8444   DeclarationNameInfo DirName;
8445   getDerived().getSema().StartOpenMPDSABlock(
8446       OMPD_parallel_master_taskloop_simd, DirName, nullptr, D->getBeginLoc());
8447   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8448   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8449   return Res;
8450 }
8451 
8452 template <typename Derived>
8453 StmtResult TreeTransform<Derived>::TransformOMPDistributeDirective(
8454     OMPDistributeDirective *D) {
8455   DeclarationNameInfo DirName;
8456   getDerived().getSema().StartOpenMPDSABlock(OMPD_distribute, DirName, nullptr,
8457                                              D->getBeginLoc());
8458   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8459   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8460   return Res;
8461 }
8462 
8463 template <typename Derived>
8464 StmtResult TreeTransform<Derived>::TransformOMPDistributeParallelForDirective(
8465     OMPDistributeParallelForDirective *D) {
8466   DeclarationNameInfo DirName;
8467   getDerived().getSema().StartOpenMPDSABlock(
8468       OMPD_distribute_parallel_for, DirName, nullptr, D->getBeginLoc());
8469   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8470   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8471   return Res;
8472 }
8473 
8474 template <typename Derived>
8475 StmtResult
8476 TreeTransform<Derived>::TransformOMPDistributeParallelForSimdDirective(
8477     OMPDistributeParallelForSimdDirective *D) {
8478   DeclarationNameInfo DirName;
8479   getDerived().getSema().StartOpenMPDSABlock(
8480       OMPD_distribute_parallel_for_simd, DirName, nullptr, D->getBeginLoc());
8481   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8482   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8483   return Res;
8484 }
8485 
8486 template <typename Derived>
8487 StmtResult TreeTransform<Derived>::TransformOMPDistributeSimdDirective(
8488     OMPDistributeSimdDirective *D) {
8489   DeclarationNameInfo DirName;
8490   getDerived().getSema().StartOpenMPDSABlock(OMPD_distribute_simd, DirName,
8491                                              nullptr, D->getBeginLoc());
8492   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8493   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8494   return Res;
8495 }
8496 
8497 template <typename Derived>
8498 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelForSimdDirective(
8499     OMPTargetParallelForSimdDirective *D) {
8500   DeclarationNameInfo DirName;
8501   getDerived().getSema().StartOpenMPDSABlock(
8502       OMPD_target_parallel_for_simd, DirName, nullptr, D->getBeginLoc());
8503   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8504   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8505   return Res;
8506 }
8507 
8508 template <typename Derived>
8509 StmtResult TreeTransform<Derived>::TransformOMPTargetSimdDirective(
8510     OMPTargetSimdDirective *D) {
8511   DeclarationNameInfo DirName;
8512   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_simd, DirName, nullptr,
8513                                              D->getBeginLoc());
8514   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8515   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8516   return Res;
8517 }
8518 
8519 template <typename Derived>
8520 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeDirective(
8521     OMPTeamsDistributeDirective *D) {
8522   DeclarationNameInfo DirName;
8523   getDerived().getSema().StartOpenMPDSABlock(OMPD_teams_distribute, DirName,
8524                                              nullptr, D->getBeginLoc());
8525   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8526   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8527   return Res;
8528 }
8529 
8530 template <typename Derived>
8531 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeSimdDirective(
8532     OMPTeamsDistributeSimdDirective *D) {
8533   DeclarationNameInfo DirName;
8534   getDerived().getSema().StartOpenMPDSABlock(
8535       OMPD_teams_distribute_simd, DirName, nullptr, D->getBeginLoc());
8536   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8537   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8538   return Res;
8539 }
8540 
8541 template <typename Derived>
8542 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeParallelForSimdDirective(
8543     OMPTeamsDistributeParallelForSimdDirective *D) {
8544   DeclarationNameInfo DirName;
8545   getDerived().getSema().StartOpenMPDSABlock(
8546       OMPD_teams_distribute_parallel_for_simd, DirName, nullptr,
8547       D->getBeginLoc());
8548   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8549   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8550   return Res;
8551 }
8552 
8553 template <typename Derived>
8554 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeParallelForDirective(
8555     OMPTeamsDistributeParallelForDirective *D) {
8556   DeclarationNameInfo DirName;
8557   getDerived().getSema().StartOpenMPDSABlock(
8558       OMPD_teams_distribute_parallel_for, DirName, nullptr, D->getBeginLoc());
8559   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8560   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8561   return Res;
8562 }
8563 
8564 template <typename Derived>
8565 StmtResult TreeTransform<Derived>::TransformOMPTargetTeamsDirective(
8566     OMPTargetTeamsDirective *D) {
8567   DeclarationNameInfo DirName;
8568   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_teams, DirName,
8569                                              nullptr, D->getBeginLoc());
8570   auto Res = getDerived().TransformOMPExecutableDirective(D);
8571   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8572   return Res;
8573 }
8574 
8575 template <typename Derived>
8576 StmtResult TreeTransform<Derived>::TransformOMPTargetTeamsDistributeDirective(
8577     OMPTargetTeamsDistributeDirective *D) {
8578   DeclarationNameInfo DirName;
8579   getDerived().getSema().StartOpenMPDSABlock(
8580       OMPD_target_teams_distribute, DirName, nullptr, D->getBeginLoc());
8581   auto Res = getDerived().TransformOMPExecutableDirective(D);
8582   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8583   return Res;
8584 }
8585 
8586 template <typename Derived>
8587 StmtResult
8588 TreeTransform<Derived>::TransformOMPTargetTeamsDistributeParallelForDirective(
8589     OMPTargetTeamsDistributeParallelForDirective *D) {
8590   DeclarationNameInfo DirName;
8591   getDerived().getSema().StartOpenMPDSABlock(
8592       OMPD_target_teams_distribute_parallel_for, DirName, nullptr,
8593       D->getBeginLoc());
8594   auto Res = getDerived().TransformOMPExecutableDirective(D);
8595   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8596   return Res;
8597 }
8598 
8599 template <typename Derived>
8600 StmtResult TreeTransform<Derived>::
8601     TransformOMPTargetTeamsDistributeParallelForSimdDirective(
8602         OMPTargetTeamsDistributeParallelForSimdDirective *D) {
8603   DeclarationNameInfo DirName;
8604   getDerived().getSema().StartOpenMPDSABlock(
8605       OMPD_target_teams_distribute_parallel_for_simd, DirName, nullptr,
8606       D->getBeginLoc());
8607   auto Res = getDerived().TransformOMPExecutableDirective(D);
8608   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8609   return Res;
8610 }
8611 
8612 template <typename Derived>
8613 StmtResult
8614 TreeTransform<Derived>::TransformOMPTargetTeamsDistributeSimdDirective(
8615     OMPTargetTeamsDistributeSimdDirective *D) {
8616   DeclarationNameInfo DirName;
8617   getDerived().getSema().StartOpenMPDSABlock(
8618       OMPD_target_teams_distribute_simd, DirName, nullptr, D->getBeginLoc());
8619   auto Res = getDerived().TransformOMPExecutableDirective(D);
8620   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8621   return Res;
8622 }
8623 
8624 
8625 //===----------------------------------------------------------------------===//
8626 // OpenMP clause transformation
8627 //===----------------------------------------------------------------------===//
8628 template <typename Derived>
8629 OMPClause *TreeTransform<Derived>::TransformOMPIfClause(OMPIfClause *C) {
8630   ExprResult Cond = getDerived().TransformExpr(C->getCondition());
8631   if (Cond.isInvalid())
8632     return nullptr;
8633   return getDerived().RebuildOMPIfClause(
8634       C->getNameModifier(), Cond.get(), C->getBeginLoc(), C->getLParenLoc(),
8635       C->getNameModifierLoc(), C->getColonLoc(), C->getEndLoc());
8636 }
8637 
8638 template <typename Derived>
8639 OMPClause *TreeTransform<Derived>::TransformOMPFinalClause(OMPFinalClause *C) {
8640   ExprResult Cond = getDerived().TransformExpr(C->getCondition());
8641   if (Cond.isInvalid())
8642     return nullptr;
8643   return getDerived().RebuildOMPFinalClause(Cond.get(), C->getBeginLoc(),
8644                                             C->getLParenLoc(), C->getEndLoc());
8645 }
8646 
8647 template <typename Derived>
8648 OMPClause *
8649 TreeTransform<Derived>::TransformOMPNumThreadsClause(OMPNumThreadsClause *C) {
8650   ExprResult NumThreads = getDerived().TransformExpr(C->getNumThreads());
8651   if (NumThreads.isInvalid())
8652     return nullptr;
8653   return getDerived().RebuildOMPNumThreadsClause(
8654       NumThreads.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
8655 }
8656 
8657 template <typename Derived>
8658 OMPClause *
8659 TreeTransform<Derived>::TransformOMPSafelenClause(OMPSafelenClause *C) {
8660   ExprResult E = getDerived().TransformExpr(C->getSafelen());
8661   if (E.isInvalid())
8662     return nullptr;
8663   return getDerived().RebuildOMPSafelenClause(
8664       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
8665 }
8666 
8667 template <typename Derived>
8668 OMPClause *
8669 TreeTransform<Derived>::TransformOMPAllocatorClause(OMPAllocatorClause *C) {
8670   ExprResult E = getDerived().TransformExpr(C->getAllocator());
8671   if (E.isInvalid())
8672     return nullptr;
8673   return getDerived().RebuildOMPAllocatorClause(
8674       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
8675 }
8676 
8677 template <typename Derived>
8678 OMPClause *
8679 TreeTransform<Derived>::TransformOMPSimdlenClause(OMPSimdlenClause *C) {
8680   ExprResult E = getDerived().TransformExpr(C->getSimdlen());
8681   if (E.isInvalid())
8682     return nullptr;
8683   return getDerived().RebuildOMPSimdlenClause(
8684       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
8685 }
8686 
8687 template <typename Derived>
8688 OMPClause *
8689 TreeTransform<Derived>::TransformOMPCollapseClause(OMPCollapseClause *C) {
8690   ExprResult E = getDerived().TransformExpr(C->getNumForLoops());
8691   if (E.isInvalid())
8692     return nullptr;
8693   return getDerived().RebuildOMPCollapseClause(
8694       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
8695 }
8696 
8697 template <typename Derived>
8698 OMPClause *
8699 TreeTransform<Derived>::TransformOMPDefaultClause(OMPDefaultClause *C) {
8700   return getDerived().RebuildOMPDefaultClause(
8701       C->getDefaultKind(), C->getDefaultKindKwLoc(), C->getBeginLoc(),
8702       C->getLParenLoc(), C->getEndLoc());
8703 }
8704 
8705 template <typename Derived>
8706 OMPClause *
8707 TreeTransform<Derived>::TransformOMPProcBindClause(OMPProcBindClause *C) {
8708   return getDerived().RebuildOMPProcBindClause(
8709       C->getProcBindKind(), C->getProcBindKindKwLoc(), C->getBeginLoc(),
8710       C->getLParenLoc(), C->getEndLoc());
8711 }
8712 
8713 template <typename Derived>
8714 OMPClause *
8715 TreeTransform<Derived>::TransformOMPScheduleClause(OMPScheduleClause *C) {
8716   ExprResult E = getDerived().TransformExpr(C->getChunkSize());
8717   if (E.isInvalid())
8718     return nullptr;
8719   return getDerived().RebuildOMPScheduleClause(
8720       C->getFirstScheduleModifier(), C->getSecondScheduleModifier(),
8721       C->getScheduleKind(), E.get(), C->getBeginLoc(), C->getLParenLoc(),
8722       C->getFirstScheduleModifierLoc(), C->getSecondScheduleModifierLoc(),
8723       C->getScheduleKindLoc(), C->getCommaLoc(), C->getEndLoc());
8724 }
8725 
8726 template <typename Derived>
8727 OMPClause *
8728 TreeTransform<Derived>::TransformOMPOrderedClause(OMPOrderedClause *C) {
8729   ExprResult E;
8730   if (auto *Num = C->getNumForLoops()) {
8731     E = getDerived().TransformExpr(Num);
8732     if (E.isInvalid())
8733       return nullptr;
8734   }
8735   return getDerived().RebuildOMPOrderedClause(C->getBeginLoc(), C->getEndLoc(),
8736                                               C->getLParenLoc(), E.get());
8737 }
8738 
8739 template <typename Derived>
8740 OMPClause *
8741 TreeTransform<Derived>::TransformOMPNowaitClause(OMPNowaitClause *C) {
8742   // No need to rebuild this clause, no template-dependent parameters.
8743   return C;
8744 }
8745 
8746 template <typename Derived>
8747 OMPClause *
8748 TreeTransform<Derived>::TransformOMPUntiedClause(OMPUntiedClause *C) {
8749   // No need to rebuild this clause, no template-dependent parameters.
8750   return C;
8751 }
8752 
8753 template <typename Derived>
8754 OMPClause *
8755 TreeTransform<Derived>::TransformOMPMergeableClause(OMPMergeableClause *C) {
8756   // No need to rebuild this clause, no template-dependent parameters.
8757   return C;
8758 }
8759 
8760 template <typename Derived>
8761 OMPClause *TreeTransform<Derived>::TransformOMPReadClause(OMPReadClause *C) {
8762   // No need to rebuild this clause, no template-dependent parameters.
8763   return C;
8764 }
8765 
8766 template <typename Derived>
8767 OMPClause *TreeTransform<Derived>::TransformOMPWriteClause(OMPWriteClause *C) {
8768   // No need to rebuild this clause, no template-dependent parameters.
8769   return C;
8770 }
8771 
8772 template <typename Derived>
8773 OMPClause *
8774 TreeTransform<Derived>::TransformOMPUpdateClause(OMPUpdateClause *C) {
8775   // No need to rebuild this clause, no template-dependent parameters.
8776   return C;
8777 }
8778 
8779 template <typename Derived>
8780 OMPClause *
8781 TreeTransform<Derived>::TransformOMPCaptureClause(OMPCaptureClause *C) {
8782   // No need to rebuild this clause, no template-dependent parameters.
8783   return C;
8784 }
8785 
8786 template <typename Derived>
8787 OMPClause *
8788 TreeTransform<Derived>::TransformOMPSeqCstClause(OMPSeqCstClause *C) {
8789   // No need to rebuild this clause, no template-dependent parameters.
8790   return C;
8791 }
8792 
8793 template <typename Derived>
8794 OMPClause *
8795 TreeTransform<Derived>::TransformOMPThreadsClause(OMPThreadsClause *C) {
8796   // No need to rebuild this clause, no template-dependent parameters.
8797   return C;
8798 }
8799 
8800 template <typename Derived>
8801 OMPClause *TreeTransform<Derived>::TransformOMPSIMDClause(OMPSIMDClause *C) {
8802   // No need to rebuild this clause, no template-dependent parameters.
8803   return C;
8804 }
8805 
8806 template <typename Derived>
8807 OMPClause *
8808 TreeTransform<Derived>::TransformOMPNogroupClause(OMPNogroupClause *C) {
8809   // No need to rebuild this clause, no template-dependent parameters.
8810   return C;
8811 }
8812 
8813 template <typename Derived>
8814 OMPClause *TreeTransform<Derived>::TransformOMPUnifiedAddressClause(
8815     OMPUnifiedAddressClause *C) {
8816   llvm_unreachable("unified_address clause cannot appear in dependent context");
8817 }
8818 
8819 template <typename Derived>
8820 OMPClause *TreeTransform<Derived>::TransformOMPUnifiedSharedMemoryClause(
8821     OMPUnifiedSharedMemoryClause *C) {
8822   llvm_unreachable(
8823       "unified_shared_memory clause cannot appear in dependent context");
8824 }
8825 
8826 template <typename Derived>
8827 OMPClause *TreeTransform<Derived>::TransformOMPReverseOffloadClause(
8828     OMPReverseOffloadClause *C) {
8829   llvm_unreachable("reverse_offload clause cannot appear in dependent context");
8830 }
8831 
8832 template <typename Derived>
8833 OMPClause *TreeTransform<Derived>::TransformOMPDynamicAllocatorsClause(
8834     OMPDynamicAllocatorsClause *C) {
8835   llvm_unreachable(
8836       "dynamic_allocators clause cannot appear in dependent context");
8837 }
8838 
8839 template <typename Derived>
8840 OMPClause *TreeTransform<Derived>::TransformOMPAtomicDefaultMemOrderClause(
8841     OMPAtomicDefaultMemOrderClause *C) {
8842   llvm_unreachable(
8843       "atomic_default_mem_order clause cannot appear in dependent context");
8844 }
8845 
8846 template <typename Derived>
8847 OMPClause *
8848 TreeTransform<Derived>::TransformOMPPrivateClause(OMPPrivateClause *C) {
8849   llvm::SmallVector<Expr *, 16> Vars;
8850   Vars.reserve(C->varlist_size());
8851   for (auto *VE : C->varlists()) {
8852     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8853     if (EVar.isInvalid())
8854       return nullptr;
8855     Vars.push_back(EVar.get());
8856   }
8857   return getDerived().RebuildOMPPrivateClause(
8858       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
8859 }
8860 
8861 template <typename Derived>
8862 OMPClause *TreeTransform<Derived>::TransformOMPFirstprivateClause(
8863     OMPFirstprivateClause *C) {
8864   llvm::SmallVector<Expr *, 16> Vars;
8865   Vars.reserve(C->varlist_size());
8866   for (auto *VE : C->varlists()) {
8867     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8868     if (EVar.isInvalid())
8869       return nullptr;
8870     Vars.push_back(EVar.get());
8871   }
8872   return getDerived().RebuildOMPFirstprivateClause(
8873       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
8874 }
8875 
8876 template <typename Derived>
8877 OMPClause *
8878 TreeTransform<Derived>::TransformOMPLastprivateClause(OMPLastprivateClause *C) {
8879   llvm::SmallVector<Expr *, 16> Vars;
8880   Vars.reserve(C->varlist_size());
8881   for (auto *VE : C->varlists()) {
8882     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8883     if (EVar.isInvalid())
8884       return nullptr;
8885     Vars.push_back(EVar.get());
8886   }
8887   return getDerived().RebuildOMPLastprivateClause(
8888       Vars, C->getKind(), C->getKindLoc(), C->getColonLoc(), C->getBeginLoc(),
8889       C->getLParenLoc(), C->getEndLoc());
8890 }
8891 
8892 template <typename Derived>
8893 OMPClause *
8894 TreeTransform<Derived>::TransformOMPSharedClause(OMPSharedClause *C) {
8895   llvm::SmallVector<Expr *, 16> Vars;
8896   Vars.reserve(C->varlist_size());
8897   for (auto *VE : C->varlists()) {
8898     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8899     if (EVar.isInvalid())
8900       return nullptr;
8901     Vars.push_back(EVar.get());
8902   }
8903   return getDerived().RebuildOMPSharedClause(Vars, C->getBeginLoc(),
8904                                              C->getLParenLoc(), C->getEndLoc());
8905 }
8906 
8907 template <typename Derived>
8908 OMPClause *
8909 TreeTransform<Derived>::TransformOMPReductionClause(OMPReductionClause *C) {
8910   llvm::SmallVector<Expr *, 16> Vars;
8911   Vars.reserve(C->varlist_size());
8912   for (auto *VE : C->varlists()) {
8913     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8914     if (EVar.isInvalid())
8915       return nullptr;
8916     Vars.push_back(EVar.get());
8917   }
8918   CXXScopeSpec ReductionIdScopeSpec;
8919   ReductionIdScopeSpec.Adopt(C->getQualifierLoc());
8920 
8921   DeclarationNameInfo NameInfo = C->getNameInfo();
8922   if (NameInfo.getName()) {
8923     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
8924     if (!NameInfo.getName())
8925       return nullptr;
8926   }
8927   // Build a list of all UDR decls with the same names ranged by the Scopes.
8928   // The Scope boundary is a duplication of the previous decl.
8929   llvm::SmallVector<Expr *, 16> UnresolvedReductions;
8930   for (auto *E : C->reduction_ops()) {
8931     // Transform all the decls.
8932     if (E) {
8933       auto *ULE = cast<UnresolvedLookupExpr>(E);
8934       UnresolvedSet<8> Decls;
8935       for (auto *D : ULE->decls()) {
8936         NamedDecl *InstD =
8937             cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D));
8938         Decls.addDecl(InstD, InstD->getAccess());
8939       }
8940       UnresolvedReductions.push_back(
8941        UnresolvedLookupExpr::Create(
8942           SemaRef.Context, /*NamingClass=*/nullptr,
8943           ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context),
8944           NameInfo, /*ADL=*/true, ULE->isOverloaded(),
8945           Decls.begin(), Decls.end()));
8946     } else
8947       UnresolvedReductions.push_back(nullptr);
8948   }
8949   return getDerived().RebuildOMPReductionClause(
8950       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(),
8951       C->getEndLoc(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions);
8952 }
8953 
8954 template <typename Derived>
8955 OMPClause *TreeTransform<Derived>::TransformOMPTaskReductionClause(
8956     OMPTaskReductionClause *C) {
8957   llvm::SmallVector<Expr *, 16> Vars;
8958   Vars.reserve(C->varlist_size());
8959   for (auto *VE : C->varlists()) {
8960     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8961     if (EVar.isInvalid())
8962       return nullptr;
8963     Vars.push_back(EVar.get());
8964   }
8965   CXXScopeSpec ReductionIdScopeSpec;
8966   ReductionIdScopeSpec.Adopt(C->getQualifierLoc());
8967 
8968   DeclarationNameInfo NameInfo = C->getNameInfo();
8969   if (NameInfo.getName()) {
8970     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
8971     if (!NameInfo.getName())
8972       return nullptr;
8973   }
8974   // Build a list of all UDR decls with the same names ranged by the Scopes.
8975   // The Scope boundary is a duplication of the previous decl.
8976   llvm::SmallVector<Expr *, 16> UnresolvedReductions;
8977   for (auto *E : C->reduction_ops()) {
8978     // Transform all the decls.
8979     if (E) {
8980       auto *ULE = cast<UnresolvedLookupExpr>(E);
8981       UnresolvedSet<8> Decls;
8982       for (auto *D : ULE->decls()) {
8983         NamedDecl *InstD =
8984             cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D));
8985         Decls.addDecl(InstD, InstD->getAccess());
8986       }
8987       UnresolvedReductions.push_back(UnresolvedLookupExpr::Create(
8988           SemaRef.Context, /*NamingClass=*/nullptr,
8989           ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), NameInfo,
8990           /*ADL=*/true, ULE->isOverloaded(), Decls.begin(), Decls.end()));
8991     } else
8992       UnresolvedReductions.push_back(nullptr);
8993   }
8994   return getDerived().RebuildOMPTaskReductionClause(
8995       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(),
8996       C->getEndLoc(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions);
8997 }
8998 
8999 template <typename Derived>
9000 OMPClause *
9001 TreeTransform<Derived>::TransformOMPInReductionClause(OMPInReductionClause *C) {
9002   llvm::SmallVector<Expr *, 16> Vars;
9003   Vars.reserve(C->varlist_size());
9004   for (auto *VE : C->varlists()) {
9005     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9006     if (EVar.isInvalid())
9007       return nullptr;
9008     Vars.push_back(EVar.get());
9009   }
9010   CXXScopeSpec ReductionIdScopeSpec;
9011   ReductionIdScopeSpec.Adopt(C->getQualifierLoc());
9012 
9013   DeclarationNameInfo NameInfo = C->getNameInfo();
9014   if (NameInfo.getName()) {
9015     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
9016     if (!NameInfo.getName())
9017       return nullptr;
9018   }
9019   // Build a list of all UDR decls with the same names ranged by the Scopes.
9020   // The Scope boundary is a duplication of the previous decl.
9021   llvm::SmallVector<Expr *, 16> UnresolvedReductions;
9022   for (auto *E : C->reduction_ops()) {
9023     // Transform all the decls.
9024     if (E) {
9025       auto *ULE = cast<UnresolvedLookupExpr>(E);
9026       UnresolvedSet<8> Decls;
9027       for (auto *D : ULE->decls()) {
9028         NamedDecl *InstD =
9029             cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D));
9030         Decls.addDecl(InstD, InstD->getAccess());
9031       }
9032       UnresolvedReductions.push_back(UnresolvedLookupExpr::Create(
9033           SemaRef.Context, /*NamingClass=*/nullptr,
9034           ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), NameInfo,
9035           /*ADL=*/true, ULE->isOverloaded(), Decls.begin(), Decls.end()));
9036     } else
9037       UnresolvedReductions.push_back(nullptr);
9038   }
9039   return getDerived().RebuildOMPInReductionClause(
9040       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(),
9041       C->getEndLoc(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions);
9042 }
9043 
9044 template <typename Derived>
9045 OMPClause *
9046 TreeTransform<Derived>::TransformOMPLinearClause(OMPLinearClause *C) {
9047   llvm::SmallVector<Expr *, 16> Vars;
9048   Vars.reserve(C->varlist_size());
9049   for (auto *VE : C->varlists()) {
9050     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9051     if (EVar.isInvalid())
9052       return nullptr;
9053     Vars.push_back(EVar.get());
9054   }
9055   ExprResult Step = getDerived().TransformExpr(C->getStep());
9056   if (Step.isInvalid())
9057     return nullptr;
9058   return getDerived().RebuildOMPLinearClause(
9059       Vars, Step.get(), C->getBeginLoc(), C->getLParenLoc(), C->getModifier(),
9060       C->getModifierLoc(), C->getColonLoc(), C->getEndLoc());
9061 }
9062 
9063 template <typename Derived>
9064 OMPClause *
9065 TreeTransform<Derived>::TransformOMPAlignedClause(OMPAlignedClause *C) {
9066   llvm::SmallVector<Expr *, 16> Vars;
9067   Vars.reserve(C->varlist_size());
9068   for (auto *VE : C->varlists()) {
9069     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9070     if (EVar.isInvalid())
9071       return nullptr;
9072     Vars.push_back(EVar.get());
9073   }
9074   ExprResult Alignment = getDerived().TransformExpr(C->getAlignment());
9075   if (Alignment.isInvalid())
9076     return nullptr;
9077   return getDerived().RebuildOMPAlignedClause(
9078       Vars, Alignment.get(), C->getBeginLoc(), C->getLParenLoc(),
9079       C->getColonLoc(), C->getEndLoc());
9080 }
9081 
9082 template <typename Derived>
9083 OMPClause *
9084 TreeTransform<Derived>::TransformOMPCopyinClause(OMPCopyinClause *C) {
9085   llvm::SmallVector<Expr *, 16> Vars;
9086   Vars.reserve(C->varlist_size());
9087   for (auto *VE : C->varlists()) {
9088     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9089     if (EVar.isInvalid())
9090       return nullptr;
9091     Vars.push_back(EVar.get());
9092   }
9093   return getDerived().RebuildOMPCopyinClause(Vars, C->getBeginLoc(),
9094                                              C->getLParenLoc(), C->getEndLoc());
9095 }
9096 
9097 template <typename Derived>
9098 OMPClause *
9099 TreeTransform<Derived>::TransformOMPCopyprivateClause(OMPCopyprivateClause *C) {
9100   llvm::SmallVector<Expr *, 16> Vars;
9101   Vars.reserve(C->varlist_size());
9102   for (auto *VE : C->varlists()) {
9103     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9104     if (EVar.isInvalid())
9105       return nullptr;
9106     Vars.push_back(EVar.get());
9107   }
9108   return getDerived().RebuildOMPCopyprivateClause(
9109       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9110 }
9111 
9112 template <typename Derived>
9113 OMPClause *TreeTransform<Derived>::TransformOMPFlushClause(OMPFlushClause *C) {
9114   llvm::SmallVector<Expr *, 16> Vars;
9115   Vars.reserve(C->varlist_size());
9116   for (auto *VE : C->varlists()) {
9117     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9118     if (EVar.isInvalid())
9119       return nullptr;
9120     Vars.push_back(EVar.get());
9121   }
9122   return getDerived().RebuildOMPFlushClause(Vars, C->getBeginLoc(),
9123                                             C->getLParenLoc(), C->getEndLoc());
9124 }
9125 
9126 template <typename Derived>
9127 OMPClause *
9128 TreeTransform<Derived>::TransformOMPDependClause(OMPDependClause *C) {
9129   llvm::SmallVector<Expr *, 16> Vars;
9130   Vars.reserve(C->varlist_size());
9131   for (auto *VE : C->varlists()) {
9132     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9133     if (EVar.isInvalid())
9134       return nullptr;
9135     Vars.push_back(EVar.get());
9136   }
9137   return getDerived().RebuildOMPDependClause(
9138       C->getDependencyKind(), C->getDependencyLoc(), C->getColonLoc(), Vars,
9139       C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9140 }
9141 
9142 template <typename Derived>
9143 OMPClause *
9144 TreeTransform<Derived>::TransformOMPDeviceClause(OMPDeviceClause *C) {
9145   ExprResult E = getDerived().TransformExpr(C->getDevice());
9146   if (E.isInvalid())
9147     return nullptr;
9148   return getDerived().RebuildOMPDeviceClause(E.get(), C->getBeginLoc(),
9149                                              C->getLParenLoc(), C->getEndLoc());
9150 }
9151 
9152 template <typename Derived, class T>
9153 bool transformOMPMappableExprListClause(
9154     TreeTransform<Derived> &TT, OMPMappableExprListClause<T> *C,
9155     llvm::SmallVectorImpl<Expr *> &Vars, CXXScopeSpec &MapperIdScopeSpec,
9156     DeclarationNameInfo &MapperIdInfo,
9157     llvm::SmallVectorImpl<Expr *> &UnresolvedMappers) {
9158   // Transform expressions in the list.
9159   Vars.reserve(C->varlist_size());
9160   for (auto *VE : C->varlists()) {
9161     ExprResult EVar = TT.getDerived().TransformExpr(cast<Expr>(VE));
9162     if (EVar.isInvalid())
9163       return true;
9164     Vars.push_back(EVar.get());
9165   }
9166   // Transform mapper scope specifier and identifier.
9167   NestedNameSpecifierLoc QualifierLoc;
9168   if (C->getMapperQualifierLoc()) {
9169     QualifierLoc = TT.getDerived().TransformNestedNameSpecifierLoc(
9170         C->getMapperQualifierLoc());
9171     if (!QualifierLoc)
9172       return true;
9173   }
9174   MapperIdScopeSpec.Adopt(QualifierLoc);
9175   MapperIdInfo = C->getMapperIdInfo();
9176   if (MapperIdInfo.getName()) {
9177     MapperIdInfo = TT.getDerived().TransformDeclarationNameInfo(MapperIdInfo);
9178     if (!MapperIdInfo.getName())
9179       return true;
9180   }
9181   // Build a list of all candidate OMPDeclareMapperDecls, which is provided by
9182   // the previous user-defined mapper lookup in dependent environment.
9183   for (auto *E : C->mapperlists()) {
9184     // Transform all the decls.
9185     if (E) {
9186       auto *ULE = cast<UnresolvedLookupExpr>(E);
9187       UnresolvedSet<8> Decls;
9188       for (auto *D : ULE->decls()) {
9189         NamedDecl *InstD =
9190             cast<NamedDecl>(TT.getDerived().TransformDecl(E->getExprLoc(), D));
9191         Decls.addDecl(InstD, InstD->getAccess());
9192       }
9193       UnresolvedMappers.push_back(UnresolvedLookupExpr::Create(
9194           TT.getSema().Context, /*NamingClass=*/nullptr,
9195           MapperIdScopeSpec.getWithLocInContext(TT.getSema().Context),
9196           MapperIdInfo, /*ADL=*/true, ULE->isOverloaded(), Decls.begin(),
9197           Decls.end()));
9198     } else {
9199       UnresolvedMappers.push_back(nullptr);
9200     }
9201   }
9202   return false;
9203 }
9204 
9205 template <typename Derived>
9206 OMPClause *TreeTransform<Derived>::TransformOMPMapClause(OMPMapClause *C) {
9207   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9208   llvm::SmallVector<Expr *, 16> Vars;
9209   CXXScopeSpec MapperIdScopeSpec;
9210   DeclarationNameInfo MapperIdInfo;
9211   llvm::SmallVector<Expr *, 16> UnresolvedMappers;
9212   if (transformOMPMappableExprListClause<Derived, OMPMapClause>(
9213           *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers))
9214     return nullptr;
9215   return getDerived().RebuildOMPMapClause(
9216       C->getMapTypeModifiers(), C->getMapTypeModifiersLoc(), MapperIdScopeSpec,
9217       MapperIdInfo, C->getMapType(), C->isImplicitMapType(), C->getMapLoc(),
9218       C->getColonLoc(), Vars, Locs, UnresolvedMappers);
9219 }
9220 
9221 template <typename Derived>
9222 OMPClause *
9223 TreeTransform<Derived>::TransformOMPAllocateClause(OMPAllocateClause *C) {
9224   Expr *Allocator = C->getAllocator();
9225   if (Allocator) {
9226     ExprResult AllocatorRes = getDerived().TransformExpr(Allocator);
9227     if (AllocatorRes.isInvalid())
9228       return nullptr;
9229     Allocator = AllocatorRes.get();
9230   }
9231   llvm::SmallVector<Expr *, 16> Vars;
9232   Vars.reserve(C->varlist_size());
9233   for (auto *VE : C->varlists()) {
9234     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9235     if (EVar.isInvalid())
9236       return nullptr;
9237     Vars.push_back(EVar.get());
9238   }
9239   return getDerived().RebuildOMPAllocateClause(
9240       Allocator, Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(),
9241       C->getEndLoc());
9242 }
9243 
9244 template <typename Derived>
9245 OMPClause *
9246 TreeTransform<Derived>::TransformOMPNumTeamsClause(OMPNumTeamsClause *C) {
9247   ExprResult E = getDerived().TransformExpr(C->getNumTeams());
9248   if (E.isInvalid())
9249     return nullptr;
9250   return getDerived().RebuildOMPNumTeamsClause(
9251       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9252 }
9253 
9254 template <typename Derived>
9255 OMPClause *
9256 TreeTransform<Derived>::TransformOMPThreadLimitClause(OMPThreadLimitClause *C) {
9257   ExprResult E = getDerived().TransformExpr(C->getThreadLimit());
9258   if (E.isInvalid())
9259     return nullptr;
9260   return getDerived().RebuildOMPThreadLimitClause(
9261       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9262 }
9263 
9264 template <typename Derived>
9265 OMPClause *
9266 TreeTransform<Derived>::TransformOMPPriorityClause(OMPPriorityClause *C) {
9267   ExprResult E = getDerived().TransformExpr(C->getPriority());
9268   if (E.isInvalid())
9269     return nullptr;
9270   return getDerived().RebuildOMPPriorityClause(
9271       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9272 }
9273 
9274 template <typename Derived>
9275 OMPClause *
9276 TreeTransform<Derived>::TransformOMPGrainsizeClause(OMPGrainsizeClause *C) {
9277   ExprResult E = getDerived().TransformExpr(C->getGrainsize());
9278   if (E.isInvalid())
9279     return nullptr;
9280   return getDerived().RebuildOMPGrainsizeClause(
9281       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9282 }
9283 
9284 template <typename Derived>
9285 OMPClause *
9286 TreeTransform<Derived>::TransformOMPNumTasksClause(OMPNumTasksClause *C) {
9287   ExprResult E = getDerived().TransformExpr(C->getNumTasks());
9288   if (E.isInvalid())
9289     return nullptr;
9290   return getDerived().RebuildOMPNumTasksClause(
9291       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9292 }
9293 
9294 template <typename Derived>
9295 OMPClause *TreeTransform<Derived>::TransformOMPHintClause(OMPHintClause *C) {
9296   ExprResult E = getDerived().TransformExpr(C->getHint());
9297   if (E.isInvalid())
9298     return nullptr;
9299   return getDerived().RebuildOMPHintClause(E.get(), C->getBeginLoc(),
9300                                            C->getLParenLoc(), C->getEndLoc());
9301 }
9302 
9303 template <typename Derived>
9304 OMPClause *TreeTransform<Derived>::TransformOMPDistScheduleClause(
9305     OMPDistScheduleClause *C) {
9306   ExprResult E = getDerived().TransformExpr(C->getChunkSize());
9307   if (E.isInvalid())
9308     return nullptr;
9309   return getDerived().RebuildOMPDistScheduleClause(
9310       C->getDistScheduleKind(), E.get(), C->getBeginLoc(), C->getLParenLoc(),
9311       C->getDistScheduleKindLoc(), C->getCommaLoc(), C->getEndLoc());
9312 }
9313 
9314 template <typename Derived>
9315 OMPClause *
9316 TreeTransform<Derived>::TransformOMPDefaultmapClause(OMPDefaultmapClause *C) {
9317   // Rebuild Defaultmap Clause since we need to invoke the checking of
9318   // defaultmap(none:variable-category) after template initialization.
9319   return getDerived().RebuildOMPDefaultmapClause(C->getDefaultmapModifier(),
9320                                                  C->getDefaultmapKind(),
9321                                                  C->getBeginLoc(),
9322                                                  C->getLParenLoc(),
9323                                                  C->getDefaultmapModifierLoc(),
9324                                                  C->getDefaultmapKindLoc(),
9325                                                  C->getEndLoc());
9326 }
9327 
9328 template <typename Derived>
9329 OMPClause *TreeTransform<Derived>::TransformOMPToClause(OMPToClause *C) {
9330   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9331   llvm::SmallVector<Expr *, 16> Vars;
9332   CXXScopeSpec MapperIdScopeSpec;
9333   DeclarationNameInfo MapperIdInfo;
9334   llvm::SmallVector<Expr *, 16> UnresolvedMappers;
9335   if (transformOMPMappableExprListClause<Derived, OMPToClause>(
9336           *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers))
9337     return nullptr;
9338   return getDerived().RebuildOMPToClause(Vars, MapperIdScopeSpec, MapperIdInfo,
9339                                          Locs, UnresolvedMappers);
9340 }
9341 
9342 template <typename Derived>
9343 OMPClause *TreeTransform<Derived>::TransformOMPFromClause(OMPFromClause *C) {
9344   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9345   llvm::SmallVector<Expr *, 16> Vars;
9346   CXXScopeSpec MapperIdScopeSpec;
9347   DeclarationNameInfo MapperIdInfo;
9348   llvm::SmallVector<Expr *, 16> UnresolvedMappers;
9349   if (transformOMPMappableExprListClause<Derived, OMPFromClause>(
9350           *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers))
9351     return nullptr;
9352   return getDerived().RebuildOMPFromClause(
9353       Vars, MapperIdScopeSpec, MapperIdInfo, Locs, UnresolvedMappers);
9354 }
9355 
9356 template <typename Derived>
9357 OMPClause *TreeTransform<Derived>::TransformOMPUseDevicePtrClause(
9358     OMPUseDevicePtrClause *C) {
9359   llvm::SmallVector<Expr *, 16> Vars;
9360   Vars.reserve(C->varlist_size());
9361   for (auto *VE : C->varlists()) {
9362     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9363     if (EVar.isInvalid())
9364       return nullptr;
9365     Vars.push_back(EVar.get());
9366   }
9367   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9368   return getDerived().RebuildOMPUseDevicePtrClause(Vars, Locs);
9369 }
9370 
9371 template <typename Derived>
9372 OMPClause *
9373 TreeTransform<Derived>::TransformOMPIsDevicePtrClause(OMPIsDevicePtrClause *C) {
9374   llvm::SmallVector<Expr *, 16> Vars;
9375   Vars.reserve(C->varlist_size());
9376   for (auto *VE : C->varlists()) {
9377     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9378     if (EVar.isInvalid())
9379       return nullptr;
9380     Vars.push_back(EVar.get());
9381   }
9382   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9383   return getDerived().RebuildOMPIsDevicePtrClause(Vars, Locs);
9384 }
9385 
9386 template <typename Derived>
9387 OMPClause *
9388 TreeTransform<Derived>::TransformOMPNontemporalClause(OMPNontemporalClause *C) {
9389   llvm::SmallVector<Expr *, 16> Vars;
9390   Vars.reserve(C->varlist_size());
9391   for (auto *VE : C->varlists()) {
9392     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9393     if (EVar.isInvalid())
9394       return nullptr;
9395     Vars.push_back(EVar.get());
9396   }
9397   return getDerived().RebuildOMPNontemporalClause(
9398       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9399 }
9400 
9401 //===----------------------------------------------------------------------===//
9402 // Expression transformation
9403 //===----------------------------------------------------------------------===//
9404 template<typename Derived>
9405 ExprResult
9406 TreeTransform<Derived>::TransformConstantExpr(ConstantExpr *E) {
9407   return TransformExpr(E->getSubExpr());
9408 }
9409 
9410 template<typename Derived>
9411 ExprResult
9412 TreeTransform<Derived>::TransformPredefinedExpr(PredefinedExpr *E) {
9413   if (!E->isTypeDependent())
9414     return E;
9415 
9416   return getDerived().RebuildPredefinedExpr(E->getLocation(),
9417                                             E->getIdentKind());
9418 }
9419 
9420 template<typename Derived>
9421 ExprResult
9422 TreeTransform<Derived>::TransformDeclRefExpr(DeclRefExpr *E) {
9423   NestedNameSpecifierLoc QualifierLoc;
9424   if (E->getQualifierLoc()) {
9425     QualifierLoc
9426       = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
9427     if (!QualifierLoc)
9428       return ExprError();
9429   }
9430 
9431   ValueDecl *ND
9432     = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getLocation(),
9433                                                          E->getDecl()));
9434   if (!ND)
9435     return ExprError();
9436 
9437   NamedDecl *Found = ND;
9438   if (E->getFoundDecl() != E->getDecl()) {
9439     Found = cast_or_null<NamedDecl>(
9440         getDerived().TransformDecl(E->getLocation(), E->getFoundDecl()));
9441     if (!Found)
9442       return ExprError();
9443   }
9444 
9445   DeclarationNameInfo NameInfo = E->getNameInfo();
9446   if (NameInfo.getName()) {
9447     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
9448     if (!NameInfo.getName())
9449       return ExprError();
9450   }
9451 
9452   if (!getDerived().AlwaysRebuild() &&
9453       QualifierLoc == E->getQualifierLoc() &&
9454       ND == E->getDecl() &&
9455       Found == E->getFoundDecl() &&
9456       NameInfo.getName() == E->getDecl()->getDeclName() &&
9457       !E->hasExplicitTemplateArgs()) {
9458 
9459     // Mark it referenced in the new context regardless.
9460     // FIXME: this is a bit instantiation-specific.
9461     SemaRef.MarkDeclRefReferenced(E);
9462 
9463     return E;
9464   }
9465 
9466   TemplateArgumentListInfo TransArgs, *TemplateArgs = nullptr;
9467   if (E->hasExplicitTemplateArgs()) {
9468     TemplateArgs = &TransArgs;
9469     TransArgs.setLAngleLoc(E->getLAngleLoc());
9470     TransArgs.setRAngleLoc(E->getRAngleLoc());
9471     if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
9472                                                 E->getNumTemplateArgs(),
9473                                                 TransArgs))
9474       return ExprError();
9475   }
9476 
9477   return getDerived().RebuildDeclRefExpr(QualifierLoc, ND, NameInfo,
9478                                          Found, TemplateArgs);
9479 }
9480 
9481 template<typename Derived>
9482 ExprResult
9483 TreeTransform<Derived>::TransformIntegerLiteral(IntegerLiteral *E) {
9484   return E;
9485 }
9486 
9487 template <typename Derived>
9488 ExprResult TreeTransform<Derived>::TransformFixedPointLiteral(
9489     FixedPointLiteral *E) {
9490   return E;
9491 }
9492 
9493 template<typename Derived>
9494 ExprResult
9495 TreeTransform<Derived>::TransformFloatingLiteral(FloatingLiteral *E) {
9496   return E;
9497 }
9498 
9499 template<typename Derived>
9500 ExprResult
9501 TreeTransform<Derived>::TransformImaginaryLiteral(ImaginaryLiteral *E) {
9502   return E;
9503 }
9504 
9505 template<typename Derived>
9506 ExprResult
9507 TreeTransform<Derived>::TransformStringLiteral(StringLiteral *E) {
9508   return E;
9509 }
9510 
9511 template<typename Derived>
9512 ExprResult
9513 TreeTransform<Derived>::TransformCharacterLiteral(CharacterLiteral *E) {
9514   return E;
9515 }
9516 
9517 template<typename Derived>
9518 ExprResult
9519 TreeTransform<Derived>::TransformUserDefinedLiteral(UserDefinedLiteral *E) {
9520   if (FunctionDecl *FD = E->getDirectCallee())
9521     SemaRef.MarkFunctionReferenced(E->getBeginLoc(), FD);
9522   return SemaRef.MaybeBindToTemporary(E);
9523 }
9524 
9525 template<typename Derived>
9526 ExprResult
9527 TreeTransform<Derived>::TransformGenericSelectionExpr(GenericSelectionExpr *E) {
9528   ExprResult ControllingExpr =
9529     getDerived().TransformExpr(E->getControllingExpr());
9530   if (ControllingExpr.isInvalid())
9531     return ExprError();
9532 
9533   SmallVector<Expr *, 4> AssocExprs;
9534   SmallVector<TypeSourceInfo *, 4> AssocTypes;
9535   for (const GenericSelectionExpr::Association Assoc : E->associations()) {
9536     TypeSourceInfo *TSI = Assoc.getTypeSourceInfo();
9537     if (TSI) {
9538       TypeSourceInfo *AssocType = getDerived().TransformType(TSI);
9539       if (!AssocType)
9540         return ExprError();
9541       AssocTypes.push_back(AssocType);
9542     } else {
9543       AssocTypes.push_back(nullptr);
9544     }
9545 
9546     ExprResult AssocExpr =
9547         getDerived().TransformExpr(Assoc.getAssociationExpr());
9548     if (AssocExpr.isInvalid())
9549       return ExprError();
9550     AssocExprs.push_back(AssocExpr.get());
9551   }
9552 
9553   return getDerived().RebuildGenericSelectionExpr(E->getGenericLoc(),
9554                                                   E->getDefaultLoc(),
9555                                                   E->getRParenLoc(),
9556                                                   ControllingExpr.get(),
9557                                                   AssocTypes,
9558                                                   AssocExprs);
9559 }
9560 
9561 template<typename Derived>
9562 ExprResult
9563 TreeTransform<Derived>::TransformParenExpr(ParenExpr *E) {
9564   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
9565   if (SubExpr.isInvalid())
9566     return ExprError();
9567 
9568   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr())
9569     return E;
9570 
9571   return getDerived().RebuildParenExpr(SubExpr.get(), E->getLParen(),
9572                                        E->getRParen());
9573 }
9574 
9575 /// The operand of a unary address-of operator has special rules: it's
9576 /// allowed to refer to a non-static member of a class even if there's no 'this'
9577 /// object available.
9578 template<typename Derived>
9579 ExprResult
9580 TreeTransform<Derived>::TransformAddressOfOperand(Expr *E) {
9581   if (DependentScopeDeclRefExpr *DRE = dyn_cast<DependentScopeDeclRefExpr>(E))
9582     return getDerived().TransformDependentScopeDeclRefExpr(DRE, true, nullptr);
9583   else
9584     return getDerived().TransformExpr(E);
9585 }
9586 
9587 template<typename Derived>
9588 ExprResult
9589 TreeTransform<Derived>::TransformUnaryOperator(UnaryOperator *E) {
9590   ExprResult SubExpr;
9591   if (E->getOpcode() == UO_AddrOf)
9592     SubExpr = TransformAddressOfOperand(E->getSubExpr());
9593   else
9594     SubExpr = TransformExpr(E->getSubExpr());
9595   if (SubExpr.isInvalid())
9596     return ExprError();
9597 
9598   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr())
9599     return E;
9600 
9601   return getDerived().RebuildUnaryOperator(E->getOperatorLoc(),
9602                                            E->getOpcode(),
9603                                            SubExpr.get());
9604 }
9605 
9606 template<typename Derived>
9607 ExprResult
9608 TreeTransform<Derived>::TransformOffsetOfExpr(OffsetOfExpr *E) {
9609   // Transform the type.
9610   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo());
9611   if (!Type)
9612     return ExprError();
9613 
9614   // Transform all of the components into components similar to what the
9615   // parser uses.
9616   // FIXME: It would be slightly more efficient in the non-dependent case to
9617   // just map FieldDecls, rather than requiring the rebuilder to look for
9618   // the fields again. However, __builtin_offsetof is rare enough in
9619   // template code that we don't care.
9620   bool ExprChanged = false;
9621   typedef Sema::OffsetOfComponent Component;
9622   SmallVector<Component, 4> Components;
9623   for (unsigned I = 0, N = E->getNumComponents(); I != N; ++I) {
9624     const OffsetOfNode &ON = E->getComponent(I);
9625     Component Comp;
9626     Comp.isBrackets = true;
9627     Comp.LocStart = ON.getSourceRange().getBegin();
9628     Comp.LocEnd = ON.getSourceRange().getEnd();
9629     switch (ON.getKind()) {
9630     case OffsetOfNode::Array: {
9631       Expr *FromIndex = E->getIndexExpr(ON.getArrayExprIndex());
9632       ExprResult Index = getDerived().TransformExpr(FromIndex);
9633       if (Index.isInvalid())
9634         return ExprError();
9635 
9636       ExprChanged = ExprChanged || Index.get() != FromIndex;
9637       Comp.isBrackets = true;
9638       Comp.U.E = Index.get();
9639       break;
9640     }
9641 
9642     case OffsetOfNode::Field:
9643     case OffsetOfNode::Identifier:
9644       Comp.isBrackets = false;
9645       Comp.U.IdentInfo = ON.getFieldName();
9646       if (!Comp.U.IdentInfo)
9647         continue;
9648 
9649       break;
9650 
9651     case OffsetOfNode::Base:
9652       // Will be recomputed during the rebuild.
9653       continue;
9654     }
9655 
9656     Components.push_back(Comp);
9657   }
9658 
9659   // If nothing changed, retain the existing expression.
9660   if (!getDerived().AlwaysRebuild() &&
9661       Type == E->getTypeSourceInfo() &&
9662       !ExprChanged)
9663     return E;
9664 
9665   // Build a new offsetof expression.
9666   return getDerived().RebuildOffsetOfExpr(E->getOperatorLoc(), Type,
9667                                           Components, E->getRParenLoc());
9668 }
9669 
9670 template<typename Derived>
9671 ExprResult
9672 TreeTransform<Derived>::TransformOpaqueValueExpr(OpaqueValueExpr *E) {
9673   assert((!E->getSourceExpr() || getDerived().AlreadyTransformed(E->getType())) &&
9674          "opaque value expression requires transformation");
9675   return E;
9676 }
9677 
9678 template<typename Derived>
9679 ExprResult
9680 TreeTransform<Derived>::TransformTypoExpr(TypoExpr *E) {
9681   return E;
9682 }
9683 
9684 template<typename Derived>
9685 ExprResult
9686 TreeTransform<Derived>::TransformPseudoObjectExpr(PseudoObjectExpr *E) {
9687   // Rebuild the syntactic form.  The original syntactic form has
9688   // opaque-value expressions in it, so strip those away and rebuild
9689   // the result.  This is a really awful way of doing this, but the
9690   // better solution (rebuilding the semantic expressions and
9691   // rebinding OVEs as necessary) doesn't work; we'd need
9692   // TreeTransform to not strip away implicit conversions.
9693   Expr *newSyntacticForm = SemaRef.recreateSyntacticForm(E);
9694   ExprResult result = getDerived().TransformExpr(newSyntacticForm);
9695   if (result.isInvalid()) return ExprError();
9696 
9697   // If that gives us a pseudo-object result back, the pseudo-object
9698   // expression must have been an lvalue-to-rvalue conversion which we
9699   // should reapply.
9700   if (result.get()->hasPlaceholderType(BuiltinType::PseudoObject))
9701     result = SemaRef.checkPseudoObjectRValue(result.get());
9702 
9703   return result;
9704 }
9705 
9706 template<typename Derived>
9707 ExprResult
9708 TreeTransform<Derived>::TransformUnaryExprOrTypeTraitExpr(
9709                                                 UnaryExprOrTypeTraitExpr *E) {
9710   if (E->isArgumentType()) {
9711     TypeSourceInfo *OldT = E->getArgumentTypeInfo();
9712 
9713     TypeSourceInfo *NewT = getDerived().TransformType(OldT);
9714     if (!NewT)
9715       return ExprError();
9716 
9717     if (!getDerived().AlwaysRebuild() && OldT == NewT)
9718       return E;
9719 
9720     return getDerived().RebuildUnaryExprOrTypeTrait(NewT, E->getOperatorLoc(),
9721                                                     E->getKind(),
9722                                                     E->getSourceRange());
9723   }
9724 
9725   // C++0x [expr.sizeof]p1:
9726   //   The operand is either an expression, which is an unevaluated operand
9727   //   [...]
9728   EnterExpressionEvaluationContext Unevaluated(
9729       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated,
9730       Sema::ReuseLambdaContextDecl);
9731 
9732   // Try to recover if we have something like sizeof(T::X) where X is a type.
9733   // Notably, there must be *exactly* one set of parens if X is a type.
9734   TypeSourceInfo *RecoveryTSI = nullptr;
9735   ExprResult SubExpr;
9736   auto *PE = dyn_cast<ParenExpr>(E->getArgumentExpr());
9737   if (auto *DRE =
9738           PE ? dyn_cast<DependentScopeDeclRefExpr>(PE->getSubExpr()) : nullptr)
9739     SubExpr = getDerived().TransformParenDependentScopeDeclRefExpr(
9740         PE, DRE, false, &RecoveryTSI);
9741   else
9742     SubExpr = getDerived().TransformExpr(E->getArgumentExpr());
9743 
9744   if (RecoveryTSI) {
9745     return getDerived().RebuildUnaryExprOrTypeTrait(
9746         RecoveryTSI, E->getOperatorLoc(), E->getKind(), E->getSourceRange());
9747   } else if (SubExpr.isInvalid())
9748     return ExprError();
9749 
9750   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getArgumentExpr())
9751     return E;
9752 
9753   return getDerived().RebuildUnaryExprOrTypeTrait(SubExpr.get(),
9754                                                   E->getOperatorLoc(),
9755                                                   E->getKind(),
9756                                                   E->getSourceRange());
9757 }
9758 
9759 template<typename Derived>
9760 ExprResult
9761 TreeTransform<Derived>::TransformArraySubscriptExpr(ArraySubscriptExpr *E) {
9762   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
9763   if (LHS.isInvalid())
9764     return ExprError();
9765 
9766   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
9767   if (RHS.isInvalid())
9768     return ExprError();
9769 
9770 
9771   if (!getDerived().AlwaysRebuild() &&
9772       LHS.get() == E->getLHS() &&
9773       RHS.get() == E->getRHS())
9774     return E;
9775 
9776   return getDerived().RebuildArraySubscriptExpr(
9777       LHS.get(),
9778       /*FIXME:*/ E->getLHS()->getBeginLoc(), RHS.get(), E->getRBracketLoc());
9779 }
9780 
9781 template <typename Derived>
9782 ExprResult
9783 TreeTransform<Derived>::TransformOMPArraySectionExpr(OMPArraySectionExpr *E) {
9784   ExprResult Base = getDerived().TransformExpr(E->getBase());
9785   if (Base.isInvalid())
9786     return ExprError();
9787 
9788   ExprResult LowerBound;
9789   if (E->getLowerBound()) {
9790     LowerBound = getDerived().TransformExpr(E->getLowerBound());
9791     if (LowerBound.isInvalid())
9792       return ExprError();
9793   }
9794 
9795   ExprResult Length;
9796   if (E->getLength()) {
9797     Length = getDerived().TransformExpr(E->getLength());
9798     if (Length.isInvalid())
9799       return ExprError();
9800   }
9801 
9802   if (!getDerived().AlwaysRebuild() && Base.get() == E->getBase() &&
9803       LowerBound.get() == E->getLowerBound() && Length.get() == E->getLength())
9804     return E;
9805 
9806   return getDerived().RebuildOMPArraySectionExpr(
9807       Base.get(), E->getBase()->getEndLoc(), LowerBound.get(), E->getColonLoc(),
9808       Length.get(), E->getRBracketLoc());
9809 }
9810 
9811 template<typename Derived>
9812 ExprResult
9813 TreeTransform<Derived>::TransformCallExpr(CallExpr *E) {
9814   // Transform the callee.
9815   ExprResult Callee = getDerived().TransformExpr(E->getCallee());
9816   if (Callee.isInvalid())
9817     return ExprError();
9818 
9819   // Transform arguments.
9820   bool ArgChanged = false;
9821   SmallVector<Expr*, 8> Args;
9822   if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
9823                                   &ArgChanged))
9824     return ExprError();
9825 
9826   if (!getDerived().AlwaysRebuild() &&
9827       Callee.get() == E->getCallee() &&
9828       !ArgChanged)
9829     return SemaRef.MaybeBindToTemporary(E);
9830 
9831   // FIXME: Wrong source location information for the '('.
9832   SourceLocation FakeLParenLoc
9833     = ((Expr *)Callee.get())->getSourceRange().getBegin();
9834   return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc,
9835                                       Args,
9836                                       E->getRParenLoc());
9837 }
9838 
9839 template<typename Derived>
9840 ExprResult
9841 TreeTransform<Derived>::TransformMemberExpr(MemberExpr *E) {
9842   ExprResult Base = getDerived().TransformExpr(E->getBase());
9843   if (Base.isInvalid())
9844     return ExprError();
9845 
9846   NestedNameSpecifierLoc QualifierLoc;
9847   if (E->hasQualifier()) {
9848     QualifierLoc
9849       = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
9850 
9851     if (!QualifierLoc)
9852       return ExprError();
9853   }
9854   SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc();
9855 
9856   ValueDecl *Member
9857     = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getMemberLoc(),
9858                                                          E->getMemberDecl()));
9859   if (!Member)
9860     return ExprError();
9861 
9862   NamedDecl *FoundDecl = E->getFoundDecl();
9863   if (FoundDecl == E->getMemberDecl()) {
9864     FoundDecl = Member;
9865   } else {
9866     FoundDecl = cast_or_null<NamedDecl>(
9867                    getDerived().TransformDecl(E->getMemberLoc(), FoundDecl));
9868     if (!FoundDecl)
9869       return ExprError();
9870   }
9871 
9872   if (!getDerived().AlwaysRebuild() &&
9873       Base.get() == E->getBase() &&
9874       QualifierLoc == E->getQualifierLoc() &&
9875       Member == E->getMemberDecl() &&
9876       FoundDecl == E->getFoundDecl() &&
9877       !E->hasExplicitTemplateArgs()) {
9878 
9879     // Mark it referenced in the new context regardless.
9880     // FIXME: this is a bit instantiation-specific.
9881     SemaRef.MarkMemberReferenced(E);
9882 
9883     return E;
9884   }
9885 
9886   TemplateArgumentListInfo TransArgs;
9887   if (E->hasExplicitTemplateArgs()) {
9888     TransArgs.setLAngleLoc(E->getLAngleLoc());
9889     TransArgs.setRAngleLoc(E->getRAngleLoc());
9890     if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
9891                                                 E->getNumTemplateArgs(),
9892                                                 TransArgs))
9893       return ExprError();
9894   }
9895 
9896   // FIXME: Bogus source location for the operator
9897   SourceLocation FakeOperatorLoc =
9898       SemaRef.getLocForEndOfToken(E->getBase()->getSourceRange().getEnd());
9899 
9900   // FIXME: to do this check properly, we will need to preserve the
9901   // first-qualifier-in-scope here, just in case we had a dependent
9902   // base (and therefore couldn't do the check) and a
9903   // nested-name-qualifier (and therefore could do the lookup).
9904   NamedDecl *FirstQualifierInScope = nullptr;
9905   DeclarationNameInfo MemberNameInfo = E->getMemberNameInfo();
9906   if (MemberNameInfo.getName()) {
9907     MemberNameInfo = getDerived().TransformDeclarationNameInfo(MemberNameInfo);
9908     if (!MemberNameInfo.getName())
9909       return ExprError();
9910   }
9911 
9912   return getDerived().RebuildMemberExpr(Base.get(), FakeOperatorLoc,
9913                                         E->isArrow(),
9914                                         QualifierLoc,
9915                                         TemplateKWLoc,
9916                                         MemberNameInfo,
9917                                         Member,
9918                                         FoundDecl,
9919                                         (E->hasExplicitTemplateArgs()
9920                                            ? &TransArgs : nullptr),
9921                                         FirstQualifierInScope);
9922 }
9923 
9924 template<typename Derived>
9925 ExprResult
9926 TreeTransform<Derived>::TransformBinaryOperator(BinaryOperator *E) {
9927   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
9928   if (LHS.isInvalid())
9929     return ExprError();
9930 
9931   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
9932   if (RHS.isInvalid())
9933     return ExprError();
9934 
9935   if (!getDerived().AlwaysRebuild() &&
9936       LHS.get() == E->getLHS() &&
9937       RHS.get() == E->getRHS())
9938     return E;
9939 
9940   Sema::FPContractStateRAII FPContractState(getSema());
9941   getSema().FPFeatures = E->getFPFeatures();
9942 
9943   return getDerived().RebuildBinaryOperator(E->getOperatorLoc(), E->getOpcode(),
9944                                             LHS.get(), RHS.get());
9945 }
9946 
9947 template <typename Derived>
9948 ExprResult TreeTransform<Derived>::TransformCXXRewrittenBinaryOperator(
9949     CXXRewrittenBinaryOperator *E) {
9950   CXXRewrittenBinaryOperator::DecomposedForm Decomp = E->getDecomposedForm();
9951 
9952   ExprResult LHS = getDerived().TransformExpr(const_cast<Expr*>(Decomp.LHS));
9953   if (LHS.isInvalid())
9954     return ExprError();
9955 
9956   ExprResult RHS = getDerived().TransformExpr(const_cast<Expr*>(Decomp.RHS));
9957   if (RHS.isInvalid())
9958     return ExprError();
9959 
9960   if (!getDerived().AlwaysRebuild() &&
9961       LHS.get() == Decomp.LHS &&
9962       RHS.get() == Decomp.RHS)
9963     return E;
9964 
9965   // Extract the already-resolved callee declarations so that we can restrict
9966   // ourselves to using them as the unqualified lookup results when rebuilding.
9967   UnresolvedSet<2> UnqualLookups;
9968   Expr *PossibleBinOps[] = {E->getSemanticForm(),
9969                             const_cast<Expr *>(Decomp.InnerBinOp)};
9970   for (Expr *PossibleBinOp : PossibleBinOps) {
9971     auto *Op = dyn_cast<CXXOperatorCallExpr>(PossibleBinOp->IgnoreImplicit());
9972     if (!Op)
9973       continue;
9974     auto *Callee = dyn_cast<DeclRefExpr>(Op->getCallee()->IgnoreImplicit());
9975     if (!Callee || isa<CXXMethodDecl>(Callee->getDecl()))
9976       continue;
9977 
9978     // Transform the callee in case we built a call to a local extern
9979     // declaration.
9980     NamedDecl *Found = cast_or_null<NamedDecl>(getDerived().TransformDecl(
9981         E->getOperatorLoc(), Callee->getFoundDecl()));
9982     if (!Found)
9983       return ExprError();
9984     UnqualLookups.addDecl(Found);
9985   }
9986 
9987   return getDerived().RebuildCXXRewrittenBinaryOperator(
9988       E->getOperatorLoc(), Decomp.Opcode, UnqualLookups, LHS.get(), RHS.get());
9989 }
9990 
9991 template<typename Derived>
9992 ExprResult
9993 TreeTransform<Derived>::TransformCompoundAssignOperator(
9994                                                       CompoundAssignOperator *E) {
9995   return getDerived().TransformBinaryOperator(E);
9996 }
9997 
9998 template<typename Derived>
9999 ExprResult TreeTransform<Derived>::
10000 TransformBinaryConditionalOperator(BinaryConditionalOperator *e) {
10001   // Just rebuild the common and RHS expressions and see whether we
10002   // get any changes.
10003 
10004   ExprResult commonExpr = getDerived().TransformExpr(e->getCommon());
10005   if (commonExpr.isInvalid())
10006     return ExprError();
10007 
10008   ExprResult rhs = getDerived().TransformExpr(e->getFalseExpr());
10009   if (rhs.isInvalid())
10010     return ExprError();
10011 
10012   if (!getDerived().AlwaysRebuild() &&
10013       commonExpr.get() == e->getCommon() &&
10014       rhs.get() == e->getFalseExpr())
10015     return e;
10016 
10017   return getDerived().RebuildConditionalOperator(commonExpr.get(),
10018                                                  e->getQuestionLoc(),
10019                                                  nullptr,
10020                                                  e->getColonLoc(),
10021                                                  rhs.get());
10022 }
10023 
10024 template<typename Derived>
10025 ExprResult
10026 TreeTransform<Derived>::TransformConditionalOperator(ConditionalOperator *E) {
10027   ExprResult Cond = getDerived().TransformExpr(E->getCond());
10028   if (Cond.isInvalid())
10029     return ExprError();
10030 
10031   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
10032   if (LHS.isInvalid())
10033     return ExprError();
10034 
10035   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
10036   if (RHS.isInvalid())
10037     return ExprError();
10038 
10039   if (!getDerived().AlwaysRebuild() &&
10040       Cond.get() == E->getCond() &&
10041       LHS.get() == E->getLHS() &&
10042       RHS.get() == E->getRHS())
10043     return E;
10044 
10045   return getDerived().RebuildConditionalOperator(Cond.get(),
10046                                                  E->getQuestionLoc(),
10047                                                  LHS.get(),
10048                                                  E->getColonLoc(),
10049                                                  RHS.get());
10050 }
10051 
10052 template<typename Derived>
10053 ExprResult
10054 TreeTransform<Derived>::TransformImplicitCastExpr(ImplicitCastExpr *E) {
10055   // Implicit casts are eliminated during transformation, since they
10056   // will be recomputed by semantic analysis after transformation.
10057   return getDerived().TransformExpr(E->getSubExprAsWritten());
10058 }
10059 
10060 template<typename Derived>
10061 ExprResult
10062 TreeTransform<Derived>::TransformCStyleCastExpr(CStyleCastExpr *E) {
10063   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten());
10064   if (!Type)
10065     return ExprError();
10066 
10067   ExprResult SubExpr
10068     = getDerived().TransformExpr(E->getSubExprAsWritten());
10069   if (SubExpr.isInvalid())
10070     return ExprError();
10071 
10072   if (!getDerived().AlwaysRebuild() &&
10073       Type == E->getTypeInfoAsWritten() &&
10074       SubExpr.get() == E->getSubExpr())
10075     return E;
10076 
10077   return getDerived().RebuildCStyleCastExpr(E->getLParenLoc(),
10078                                             Type,
10079                                             E->getRParenLoc(),
10080                                             SubExpr.get());
10081 }
10082 
10083 template<typename Derived>
10084 ExprResult
10085 TreeTransform<Derived>::TransformCompoundLiteralExpr(CompoundLiteralExpr *E) {
10086   TypeSourceInfo *OldT = E->getTypeSourceInfo();
10087   TypeSourceInfo *NewT = getDerived().TransformType(OldT);
10088   if (!NewT)
10089     return ExprError();
10090 
10091   ExprResult Init = getDerived().TransformExpr(E->getInitializer());
10092   if (Init.isInvalid())
10093     return ExprError();
10094 
10095   if (!getDerived().AlwaysRebuild() &&
10096       OldT == NewT &&
10097       Init.get() == E->getInitializer())
10098     return SemaRef.MaybeBindToTemporary(E);
10099 
10100   // Note: the expression type doesn't necessarily match the
10101   // type-as-written, but that's okay, because it should always be
10102   // derivable from the initializer.
10103 
10104   return getDerived().RebuildCompoundLiteralExpr(
10105       E->getLParenLoc(), NewT,
10106       /*FIXME:*/ E->getInitializer()->getEndLoc(), Init.get());
10107 }
10108 
10109 template<typename Derived>
10110 ExprResult
10111 TreeTransform<Derived>::TransformExtVectorElementExpr(ExtVectorElementExpr *E) {
10112   ExprResult Base = getDerived().TransformExpr(E->getBase());
10113   if (Base.isInvalid())
10114     return ExprError();
10115 
10116   if (!getDerived().AlwaysRebuild() &&
10117       Base.get() == E->getBase())
10118     return E;
10119 
10120   // FIXME: Bad source location
10121   SourceLocation FakeOperatorLoc =
10122       SemaRef.getLocForEndOfToken(E->getBase()->getEndLoc());
10123   return getDerived().RebuildExtVectorElementExpr(Base.get(), FakeOperatorLoc,
10124                                                   E->getAccessorLoc(),
10125                                                   E->getAccessor());
10126 }
10127 
10128 template<typename Derived>
10129 ExprResult
10130 TreeTransform<Derived>::TransformInitListExpr(InitListExpr *E) {
10131   if (InitListExpr *Syntactic = E->getSyntacticForm())
10132     E = Syntactic;
10133 
10134   bool InitChanged = false;
10135 
10136   EnterExpressionEvaluationContext Context(
10137       getSema(), EnterExpressionEvaluationContext::InitList);
10138 
10139   SmallVector<Expr*, 4> Inits;
10140   if (getDerived().TransformExprs(E->getInits(), E->getNumInits(), false,
10141                                   Inits, &InitChanged))
10142     return ExprError();
10143 
10144   if (!getDerived().AlwaysRebuild() && !InitChanged) {
10145     // FIXME: Attempt to reuse the existing syntactic form of the InitListExpr
10146     // in some cases. We can't reuse it in general, because the syntactic and
10147     // semantic forms are linked, and we can't know that semantic form will
10148     // match even if the syntactic form does.
10149   }
10150 
10151   return getDerived().RebuildInitList(E->getLBraceLoc(), Inits,
10152                                       E->getRBraceLoc());
10153 }
10154 
10155 template<typename Derived>
10156 ExprResult
10157 TreeTransform<Derived>::TransformDesignatedInitExpr(DesignatedInitExpr *E) {
10158   Designation Desig;
10159 
10160   // transform the initializer value
10161   ExprResult Init = getDerived().TransformExpr(E->getInit());
10162   if (Init.isInvalid())
10163     return ExprError();
10164 
10165   // transform the designators.
10166   SmallVector<Expr*, 4> ArrayExprs;
10167   bool ExprChanged = false;
10168   for (const DesignatedInitExpr::Designator &D : E->designators()) {
10169     if (D.isFieldDesignator()) {
10170       Desig.AddDesignator(Designator::getField(D.getFieldName(),
10171                                                D.getDotLoc(),
10172                                                D.getFieldLoc()));
10173       if (D.getField()) {
10174         FieldDecl *Field = cast_or_null<FieldDecl>(
10175             getDerived().TransformDecl(D.getFieldLoc(), D.getField()));
10176         if (Field != D.getField())
10177           // Rebuild the expression when the transformed FieldDecl is
10178           // different to the already assigned FieldDecl.
10179           ExprChanged = true;
10180       } else {
10181         // Ensure that the designator expression is rebuilt when there isn't
10182         // a resolved FieldDecl in the designator as we don't want to assign
10183         // a FieldDecl to a pattern designator that will be instantiated again.
10184         ExprChanged = true;
10185       }
10186       continue;
10187     }
10188 
10189     if (D.isArrayDesignator()) {
10190       ExprResult Index = getDerived().TransformExpr(E->getArrayIndex(D));
10191       if (Index.isInvalid())
10192         return ExprError();
10193 
10194       Desig.AddDesignator(
10195           Designator::getArray(Index.get(), D.getLBracketLoc()));
10196 
10197       ExprChanged = ExprChanged || Init.get() != E->getArrayIndex(D);
10198       ArrayExprs.push_back(Index.get());
10199       continue;
10200     }
10201 
10202     assert(D.isArrayRangeDesignator() && "New kind of designator?");
10203     ExprResult Start
10204       = getDerived().TransformExpr(E->getArrayRangeStart(D));
10205     if (Start.isInvalid())
10206       return ExprError();
10207 
10208     ExprResult End = getDerived().TransformExpr(E->getArrayRangeEnd(D));
10209     if (End.isInvalid())
10210       return ExprError();
10211 
10212     Desig.AddDesignator(Designator::getArrayRange(Start.get(),
10213                                                   End.get(),
10214                                                   D.getLBracketLoc(),
10215                                                   D.getEllipsisLoc()));
10216 
10217     ExprChanged = ExprChanged || Start.get() != E->getArrayRangeStart(D) ||
10218                   End.get() != E->getArrayRangeEnd(D);
10219 
10220     ArrayExprs.push_back(Start.get());
10221     ArrayExprs.push_back(End.get());
10222   }
10223 
10224   if (!getDerived().AlwaysRebuild() &&
10225       Init.get() == E->getInit() &&
10226       !ExprChanged)
10227     return E;
10228 
10229   return getDerived().RebuildDesignatedInitExpr(Desig, ArrayExprs,
10230                                                 E->getEqualOrColonLoc(),
10231                                                 E->usesGNUSyntax(), Init.get());
10232 }
10233 
10234 // Seems that if TransformInitListExpr() only works on the syntactic form of an
10235 // InitListExpr, then a DesignatedInitUpdateExpr is not encountered.
10236 template<typename Derived>
10237 ExprResult
10238 TreeTransform<Derived>::TransformDesignatedInitUpdateExpr(
10239     DesignatedInitUpdateExpr *E) {
10240   llvm_unreachable("Unexpected DesignatedInitUpdateExpr in syntactic form of "
10241                    "initializer");
10242   return ExprError();
10243 }
10244 
10245 template<typename Derived>
10246 ExprResult
10247 TreeTransform<Derived>::TransformNoInitExpr(
10248     NoInitExpr *E) {
10249   llvm_unreachable("Unexpected NoInitExpr in syntactic form of initializer");
10250   return ExprError();
10251 }
10252 
10253 template<typename Derived>
10254 ExprResult
10255 TreeTransform<Derived>::TransformArrayInitLoopExpr(ArrayInitLoopExpr *E) {
10256   llvm_unreachable("Unexpected ArrayInitLoopExpr outside of initializer");
10257   return ExprError();
10258 }
10259 
10260 template<typename Derived>
10261 ExprResult
10262 TreeTransform<Derived>::TransformArrayInitIndexExpr(ArrayInitIndexExpr *E) {
10263   llvm_unreachable("Unexpected ArrayInitIndexExpr outside of initializer");
10264   return ExprError();
10265 }
10266 
10267 template<typename Derived>
10268 ExprResult
10269 TreeTransform<Derived>::TransformImplicitValueInitExpr(
10270                                                      ImplicitValueInitExpr *E) {
10271   TemporaryBase Rebase(*this, E->getBeginLoc(), DeclarationName());
10272 
10273   // FIXME: Will we ever have proper type location here? Will we actually
10274   // need to transform the type?
10275   QualType T = getDerived().TransformType(E->getType());
10276   if (T.isNull())
10277     return ExprError();
10278 
10279   if (!getDerived().AlwaysRebuild() &&
10280       T == E->getType())
10281     return E;
10282 
10283   return getDerived().RebuildImplicitValueInitExpr(T);
10284 }
10285 
10286 template<typename Derived>
10287 ExprResult
10288 TreeTransform<Derived>::TransformVAArgExpr(VAArgExpr *E) {
10289   TypeSourceInfo *TInfo = getDerived().TransformType(E->getWrittenTypeInfo());
10290   if (!TInfo)
10291     return ExprError();
10292 
10293   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
10294   if (SubExpr.isInvalid())
10295     return ExprError();
10296 
10297   if (!getDerived().AlwaysRebuild() &&
10298       TInfo == E->getWrittenTypeInfo() &&
10299       SubExpr.get() == E->getSubExpr())
10300     return E;
10301 
10302   return getDerived().RebuildVAArgExpr(E->getBuiltinLoc(), SubExpr.get(),
10303                                        TInfo, E->getRParenLoc());
10304 }
10305 
10306 template<typename Derived>
10307 ExprResult
10308 TreeTransform<Derived>::TransformParenListExpr(ParenListExpr *E) {
10309   bool ArgumentChanged = false;
10310   SmallVector<Expr*, 4> Inits;
10311   if (TransformExprs(E->getExprs(), E->getNumExprs(), true, Inits,
10312                      &ArgumentChanged))
10313     return ExprError();
10314 
10315   return getDerived().RebuildParenListExpr(E->getLParenLoc(),
10316                                            Inits,
10317                                            E->getRParenLoc());
10318 }
10319 
10320 /// Transform an address-of-label expression.
10321 ///
10322 /// By default, the transformation of an address-of-label expression always
10323 /// rebuilds the expression, so that the label identifier can be resolved to
10324 /// the corresponding label statement by semantic analysis.
10325 template<typename Derived>
10326 ExprResult
10327 TreeTransform<Derived>::TransformAddrLabelExpr(AddrLabelExpr *E) {
10328   Decl *LD = getDerived().TransformDecl(E->getLabel()->getLocation(),
10329                                         E->getLabel());
10330   if (!LD)
10331     return ExprError();
10332 
10333   return getDerived().RebuildAddrLabelExpr(E->getAmpAmpLoc(), E->getLabelLoc(),
10334                                            cast<LabelDecl>(LD));
10335 }
10336 
10337 template<typename Derived>
10338 ExprResult
10339 TreeTransform<Derived>::TransformStmtExpr(StmtExpr *E) {
10340   SemaRef.ActOnStartStmtExpr();
10341   StmtResult SubStmt
10342     = getDerived().TransformCompoundStmt(E->getSubStmt(), true);
10343   if (SubStmt.isInvalid()) {
10344     SemaRef.ActOnStmtExprError();
10345     return ExprError();
10346   }
10347 
10348   if (!getDerived().AlwaysRebuild() &&
10349       SubStmt.get() == E->getSubStmt()) {
10350     // Calling this an 'error' is unintuitive, but it does the right thing.
10351     SemaRef.ActOnStmtExprError();
10352     return SemaRef.MaybeBindToTemporary(E);
10353   }
10354 
10355   return getDerived().RebuildStmtExpr(E->getLParenLoc(),
10356                                       SubStmt.get(),
10357                                       E->getRParenLoc());
10358 }
10359 
10360 template<typename Derived>
10361 ExprResult
10362 TreeTransform<Derived>::TransformChooseExpr(ChooseExpr *E) {
10363   ExprResult Cond = getDerived().TransformExpr(E->getCond());
10364   if (Cond.isInvalid())
10365     return ExprError();
10366 
10367   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
10368   if (LHS.isInvalid())
10369     return ExprError();
10370 
10371   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
10372   if (RHS.isInvalid())
10373     return ExprError();
10374 
10375   if (!getDerived().AlwaysRebuild() &&
10376       Cond.get() == E->getCond() &&
10377       LHS.get() == E->getLHS() &&
10378       RHS.get() == E->getRHS())
10379     return E;
10380 
10381   return getDerived().RebuildChooseExpr(E->getBuiltinLoc(),
10382                                         Cond.get(), LHS.get(), RHS.get(),
10383                                         E->getRParenLoc());
10384 }
10385 
10386 template<typename Derived>
10387 ExprResult
10388 TreeTransform<Derived>::TransformGNUNullExpr(GNUNullExpr *E) {
10389   return E;
10390 }
10391 
10392 template<typename Derived>
10393 ExprResult
10394 TreeTransform<Derived>::TransformCXXOperatorCallExpr(CXXOperatorCallExpr *E) {
10395   switch (E->getOperator()) {
10396   case OO_New:
10397   case OO_Delete:
10398   case OO_Array_New:
10399   case OO_Array_Delete:
10400     llvm_unreachable("new and delete operators cannot use CXXOperatorCallExpr");
10401 
10402   case OO_Call: {
10403     // This is a call to an object's operator().
10404     assert(E->getNumArgs() >= 1 && "Object call is missing arguments");
10405 
10406     // Transform the object itself.
10407     ExprResult Object = getDerived().TransformExpr(E->getArg(0));
10408     if (Object.isInvalid())
10409       return ExprError();
10410 
10411     // FIXME: Poor location information
10412     SourceLocation FakeLParenLoc = SemaRef.getLocForEndOfToken(
10413         static_cast<Expr *>(Object.get())->getEndLoc());
10414 
10415     // Transform the call arguments.
10416     SmallVector<Expr*, 8> Args;
10417     if (getDerived().TransformExprs(E->getArgs() + 1, E->getNumArgs() - 1, true,
10418                                     Args))
10419       return ExprError();
10420 
10421     return getDerived().RebuildCallExpr(Object.get(), FakeLParenLoc, Args,
10422                                         E->getEndLoc());
10423   }
10424 
10425 #define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly) \
10426   case OO_##Name:
10427 #define OVERLOADED_OPERATOR_MULTI(Name,Spelling,Unary,Binary,MemberOnly)
10428 #include "clang/Basic/OperatorKinds.def"
10429   case OO_Subscript:
10430     // Handled below.
10431     break;
10432 
10433   case OO_Conditional:
10434     llvm_unreachable("conditional operator is not actually overloadable");
10435 
10436   case OO_None:
10437   case NUM_OVERLOADED_OPERATORS:
10438     llvm_unreachable("not an overloaded operator?");
10439   }
10440 
10441   ExprResult Callee = getDerived().TransformExpr(E->getCallee());
10442   if (Callee.isInvalid())
10443     return ExprError();
10444 
10445   ExprResult First;
10446   if (E->getOperator() == OO_Amp)
10447     First = getDerived().TransformAddressOfOperand(E->getArg(0));
10448   else
10449     First = getDerived().TransformExpr(E->getArg(0));
10450   if (First.isInvalid())
10451     return ExprError();
10452 
10453   ExprResult Second;
10454   if (E->getNumArgs() == 2) {
10455     Second = getDerived().TransformExpr(E->getArg(1));
10456     if (Second.isInvalid())
10457       return ExprError();
10458   }
10459 
10460   if (!getDerived().AlwaysRebuild() &&
10461       Callee.get() == E->getCallee() &&
10462       First.get() == E->getArg(0) &&
10463       (E->getNumArgs() != 2 || Second.get() == E->getArg(1)))
10464     return SemaRef.MaybeBindToTemporary(E);
10465 
10466   Sema::FPContractStateRAII FPContractState(getSema());
10467   getSema().FPFeatures = E->getFPFeatures();
10468 
10469   return getDerived().RebuildCXXOperatorCallExpr(E->getOperator(),
10470                                                  E->getOperatorLoc(),
10471                                                  Callee.get(),
10472                                                  First.get(),
10473                                                  Second.get());
10474 }
10475 
10476 template<typename Derived>
10477 ExprResult
10478 TreeTransform<Derived>::TransformCXXMemberCallExpr(CXXMemberCallExpr *E) {
10479   return getDerived().TransformCallExpr(E);
10480 }
10481 
10482 template <typename Derived>
10483 ExprResult TreeTransform<Derived>::TransformSourceLocExpr(SourceLocExpr *E) {
10484   bool NeedRebuildFunc = E->getIdentKind() == SourceLocExpr::Function &&
10485                          getSema().CurContext != E->getParentContext();
10486 
10487   if (!getDerived().AlwaysRebuild() && !NeedRebuildFunc)
10488     return E;
10489 
10490   return getDerived().RebuildSourceLocExpr(E->getIdentKind(), E->getBeginLoc(),
10491                                            E->getEndLoc(),
10492                                            getSema().CurContext);
10493 }
10494 
10495 template<typename Derived>
10496 ExprResult
10497 TreeTransform<Derived>::TransformCUDAKernelCallExpr(CUDAKernelCallExpr *E) {
10498   // Transform the callee.
10499   ExprResult Callee = getDerived().TransformExpr(E->getCallee());
10500   if (Callee.isInvalid())
10501     return ExprError();
10502 
10503   // Transform exec config.
10504   ExprResult EC = getDerived().TransformCallExpr(E->getConfig());
10505   if (EC.isInvalid())
10506     return ExprError();
10507 
10508   // Transform arguments.
10509   bool ArgChanged = false;
10510   SmallVector<Expr*, 8> Args;
10511   if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
10512                                   &ArgChanged))
10513     return ExprError();
10514 
10515   if (!getDerived().AlwaysRebuild() &&
10516       Callee.get() == E->getCallee() &&
10517       !ArgChanged)
10518     return SemaRef.MaybeBindToTemporary(E);
10519 
10520   // FIXME: Wrong source location information for the '('.
10521   SourceLocation FakeLParenLoc
10522     = ((Expr *)Callee.get())->getSourceRange().getBegin();
10523   return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc,
10524                                       Args,
10525                                       E->getRParenLoc(), EC.get());
10526 }
10527 
10528 template<typename Derived>
10529 ExprResult
10530 TreeTransform<Derived>::TransformCXXNamedCastExpr(CXXNamedCastExpr *E) {
10531   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten());
10532   if (!Type)
10533     return ExprError();
10534 
10535   ExprResult SubExpr
10536     = getDerived().TransformExpr(E->getSubExprAsWritten());
10537   if (SubExpr.isInvalid())
10538     return ExprError();
10539 
10540   if (!getDerived().AlwaysRebuild() &&
10541       Type == E->getTypeInfoAsWritten() &&
10542       SubExpr.get() == E->getSubExpr())
10543     return E;
10544   return getDerived().RebuildCXXNamedCastExpr(
10545       E->getOperatorLoc(), E->getStmtClass(), E->getAngleBrackets().getBegin(),
10546       Type, E->getAngleBrackets().getEnd(),
10547       // FIXME. this should be '(' location
10548       E->getAngleBrackets().getEnd(), SubExpr.get(), E->getRParenLoc());
10549 }
10550 
10551 template<typename Derived>
10552 ExprResult
10553 TreeTransform<Derived>::TransformBuiltinBitCastExpr(BuiltinBitCastExpr *BCE) {
10554   TypeSourceInfo *TSI =
10555       getDerived().TransformType(BCE->getTypeInfoAsWritten());
10556   if (!TSI)
10557     return ExprError();
10558 
10559   ExprResult Sub = getDerived().TransformExpr(BCE->getSubExpr());
10560   if (Sub.isInvalid())
10561     return ExprError();
10562 
10563   return getDerived().RebuildBuiltinBitCastExpr(BCE->getBeginLoc(), TSI,
10564                                                 Sub.get(), BCE->getEndLoc());
10565 }
10566 
10567 template<typename Derived>
10568 ExprResult
10569 TreeTransform<Derived>::TransformCXXStaticCastExpr(CXXStaticCastExpr *E) {
10570   return getDerived().TransformCXXNamedCastExpr(E);
10571 }
10572 
10573 template<typename Derived>
10574 ExprResult
10575 TreeTransform<Derived>::TransformCXXDynamicCastExpr(CXXDynamicCastExpr *E) {
10576   return getDerived().TransformCXXNamedCastExpr(E);
10577 }
10578 
10579 template<typename Derived>
10580 ExprResult
10581 TreeTransform<Derived>::TransformCXXReinterpretCastExpr(
10582                                                       CXXReinterpretCastExpr *E) {
10583   return getDerived().TransformCXXNamedCastExpr(E);
10584 }
10585 
10586 template<typename Derived>
10587 ExprResult
10588 TreeTransform<Derived>::TransformCXXConstCastExpr(CXXConstCastExpr *E) {
10589   return getDerived().TransformCXXNamedCastExpr(E);
10590 }
10591 
10592 template<typename Derived>
10593 ExprResult
10594 TreeTransform<Derived>::TransformCXXFunctionalCastExpr(
10595                                                      CXXFunctionalCastExpr *E) {
10596   TypeSourceInfo *Type =
10597       getDerived().TransformTypeWithDeducedTST(E->getTypeInfoAsWritten());
10598   if (!Type)
10599     return ExprError();
10600 
10601   ExprResult SubExpr
10602     = getDerived().TransformExpr(E->getSubExprAsWritten());
10603   if (SubExpr.isInvalid())
10604     return ExprError();
10605 
10606   if (!getDerived().AlwaysRebuild() &&
10607       Type == E->getTypeInfoAsWritten() &&
10608       SubExpr.get() == E->getSubExpr())
10609     return E;
10610 
10611   return getDerived().RebuildCXXFunctionalCastExpr(Type,
10612                                                    E->getLParenLoc(),
10613                                                    SubExpr.get(),
10614                                                    E->getRParenLoc(),
10615                                                    E->isListInitialization());
10616 }
10617 
10618 template<typename Derived>
10619 ExprResult
10620 TreeTransform<Derived>::TransformCXXTypeidExpr(CXXTypeidExpr *E) {
10621   if (E->isTypeOperand()) {
10622     TypeSourceInfo *TInfo
10623       = getDerived().TransformType(E->getTypeOperandSourceInfo());
10624     if (!TInfo)
10625       return ExprError();
10626 
10627     if (!getDerived().AlwaysRebuild() &&
10628         TInfo == E->getTypeOperandSourceInfo())
10629       return E;
10630 
10631     return getDerived().RebuildCXXTypeidExpr(E->getType(), E->getBeginLoc(),
10632                                              TInfo, E->getEndLoc());
10633   }
10634 
10635   // We don't know whether the subexpression is potentially evaluated until
10636   // after we perform semantic analysis.  We speculatively assume it is
10637   // unevaluated; it will get fixed later if the subexpression is in fact
10638   // potentially evaluated.
10639   EnterExpressionEvaluationContext Unevaluated(
10640       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated,
10641       Sema::ReuseLambdaContextDecl);
10642 
10643   ExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand());
10644   if (SubExpr.isInvalid())
10645     return ExprError();
10646 
10647   if (!getDerived().AlwaysRebuild() &&
10648       SubExpr.get() == E->getExprOperand())
10649     return E;
10650 
10651   return getDerived().RebuildCXXTypeidExpr(E->getType(), E->getBeginLoc(),
10652                                            SubExpr.get(), E->getEndLoc());
10653 }
10654 
10655 template<typename Derived>
10656 ExprResult
10657 TreeTransform<Derived>::TransformCXXUuidofExpr(CXXUuidofExpr *E) {
10658   if (E->isTypeOperand()) {
10659     TypeSourceInfo *TInfo
10660       = getDerived().TransformType(E->getTypeOperandSourceInfo());
10661     if (!TInfo)
10662       return ExprError();
10663 
10664     if (!getDerived().AlwaysRebuild() &&
10665         TInfo == E->getTypeOperandSourceInfo())
10666       return E;
10667 
10668     return getDerived().RebuildCXXUuidofExpr(E->getType(), E->getBeginLoc(),
10669                                              TInfo, E->getEndLoc());
10670   }
10671 
10672   EnterExpressionEvaluationContext Unevaluated(
10673       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
10674 
10675   ExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand());
10676   if (SubExpr.isInvalid())
10677     return ExprError();
10678 
10679   if (!getDerived().AlwaysRebuild() &&
10680       SubExpr.get() == E->getExprOperand())
10681     return E;
10682 
10683   return getDerived().RebuildCXXUuidofExpr(E->getType(), E->getBeginLoc(),
10684                                            SubExpr.get(), E->getEndLoc());
10685 }
10686 
10687 template<typename Derived>
10688 ExprResult
10689 TreeTransform<Derived>::TransformCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) {
10690   return E;
10691 }
10692 
10693 template<typename Derived>
10694 ExprResult
10695 TreeTransform<Derived>::TransformCXXNullPtrLiteralExpr(
10696                                                      CXXNullPtrLiteralExpr *E) {
10697   return E;
10698 }
10699 
10700 template<typename Derived>
10701 ExprResult
10702 TreeTransform<Derived>::TransformCXXThisExpr(CXXThisExpr *E) {
10703   QualType T = getSema().getCurrentThisType();
10704 
10705   if (!getDerived().AlwaysRebuild() && T == E->getType()) {
10706     // Mark it referenced in the new context regardless.
10707     // FIXME: this is a bit instantiation-specific.
10708     getSema().MarkThisReferenced(E);
10709     return E;
10710   }
10711 
10712   return getDerived().RebuildCXXThisExpr(E->getBeginLoc(), T, E->isImplicit());
10713 }
10714 
10715 template<typename Derived>
10716 ExprResult
10717 TreeTransform<Derived>::TransformCXXThrowExpr(CXXThrowExpr *E) {
10718   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
10719   if (SubExpr.isInvalid())
10720     return ExprError();
10721 
10722   if (!getDerived().AlwaysRebuild() &&
10723       SubExpr.get() == E->getSubExpr())
10724     return E;
10725 
10726   return getDerived().RebuildCXXThrowExpr(E->getThrowLoc(), SubExpr.get(),
10727                                           E->isThrownVariableInScope());
10728 }
10729 
10730 template<typename Derived>
10731 ExprResult
10732 TreeTransform<Derived>::TransformCXXDefaultArgExpr(CXXDefaultArgExpr *E) {
10733   ParmVarDecl *Param = cast_or_null<ParmVarDecl>(
10734       getDerived().TransformDecl(E->getBeginLoc(), E->getParam()));
10735   if (!Param)
10736     return ExprError();
10737 
10738   if (!getDerived().AlwaysRebuild() && Param == E->getParam() &&
10739       E->getUsedContext() == SemaRef.CurContext)
10740     return E;
10741 
10742   return getDerived().RebuildCXXDefaultArgExpr(E->getUsedLocation(), Param);
10743 }
10744 
10745 template<typename Derived>
10746 ExprResult
10747 TreeTransform<Derived>::TransformCXXDefaultInitExpr(CXXDefaultInitExpr *E) {
10748   FieldDecl *Field = cast_or_null<FieldDecl>(
10749       getDerived().TransformDecl(E->getBeginLoc(), E->getField()));
10750   if (!Field)
10751     return ExprError();
10752 
10753   if (!getDerived().AlwaysRebuild() && Field == E->getField() &&
10754       E->getUsedContext() == SemaRef.CurContext)
10755     return E;
10756 
10757   return getDerived().RebuildCXXDefaultInitExpr(E->getExprLoc(), Field);
10758 }
10759 
10760 template<typename Derived>
10761 ExprResult
10762 TreeTransform<Derived>::TransformCXXScalarValueInitExpr(
10763                                                     CXXScalarValueInitExpr *E) {
10764   TypeSourceInfo *T = getDerived().TransformType(E->getTypeSourceInfo());
10765   if (!T)
10766     return ExprError();
10767 
10768   if (!getDerived().AlwaysRebuild() &&
10769       T == E->getTypeSourceInfo())
10770     return E;
10771 
10772   return getDerived().RebuildCXXScalarValueInitExpr(T,
10773                                           /*FIXME:*/T->getTypeLoc().getEndLoc(),
10774                                                     E->getRParenLoc());
10775 }
10776 
10777 template<typename Derived>
10778 ExprResult
10779 TreeTransform<Derived>::TransformCXXNewExpr(CXXNewExpr *E) {
10780   // Transform the type that we're allocating
10781   TypeSourceInfo *AllocTypeInfo =
10782       getDerived().TransformTypeWithDeducedTST(E->getAllocatedTypeSourceInfo());
10783   if (!AllocTypeInfo)
10784     return ExprError();
10785 
10786   // Transform the size of the array we're allocating (if any).
10787   Optional<Expr *> ArraySize;
10788   if (Optional<Expr *> OldArraySize = E->getArraySize()) {
10789     ExprResult NewArraySize;
10790     if (*OldArraySize) {
10791       NewArraySize = getDerived().TransformExpr(*OldArraySize);
10792       if (NewArraySize.isInvalid())
10793         return ExprError();
10794     }
10795     ArraySize = NewArraySize.get();
10796   }
10797 
10798   // Transform the placement arguments (if any).
10799   bool ArgumentChanged = false;
10800   SmallVector<Expr*, 8> PlacementArgs;
10801   if (getDerived().TransformExprs(E->getPlacementArgs(),
10802                                   E->getNumPlacementArgs(), true,
10803                                   PlacementArgs, &ArgumentChanged))
10804     return ExprError();
10805 
10806   // Transform the initializer (if any).
10807   Expr *OldInit = E->getInitializer();
10808   ExprResult NewInit;
10809   if (OldInit)
10810     NewInit = getDerived().TransformInitializer(OldInit, true);
10811   if (NewInit.isInvalid())
10812     return ExprError();
10813 
10814   // Transform new operator and delete operator.
10815   FunctionDecl *OperatorNew = nullptr;
10816   if (E->getOperatorNew()) {
10817     OperatorNew = cast_or_null<FunctionDecl>(
10818         getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorNew()));
10819     if (!OperatorNew)
10820       return ExprError();
10821   }
10822 
10823   FunctionDecl *OperatorDelete = nullptr;
10824   if (E->getOperatorDelete()) {
10825     OperatorDelete = cast_or_null<FunctionDecl>(
10826         getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorDelete()));
10827     if (!OperatorDelete)
10828       return ExprError();
10829   }
10830 
10831   if (!getDerived().AlwaysRebuild() &&
10832       AllocTypeInfo == E->getAllocatedTypeSourceInfo() &&
10833       ArraySize == E->getArraySize() &&
10834       NewInit.get() == OldInit &&
10835       OperatorNew == E->getOperatorNew() &&
10836       OperatorDelete == E->getOperatorDelete() &&
10837       !ArgumentChanged) {
10838     // Mark any declarations we need as referenced.
10839     // FIXME: instantiation-specific.
10840     if (OperatorNew)
10841       SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorNew);
10842     if (OperatorDelete)
10843       SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorDelete);
10844 
10845     if (E->isArray() && !E->getAllocatedType()->isDependentType()) {
10846       QualType ElementType
10847         = SemaRef.Context.getBaseElementType(E->getAllocatedType());
10848       if (const RecordType *RecordT = ElementType->getAs<RecordType>()) {
10849         CXXRecordDecl *Record = cast<CXXRecordDecl>(RecordT->getDecl());
10850         if (CXXDestructorDecl *Destructor = SemaRef.LookupDestructor(Record)) {
10851           SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Destructor);
10852         }
10853       }
10854     }
10855 
10856     return E;
10857   }
10858 
10859   QualType AllocType = AllocTypeInfo->getType();
10860   if (!ArraySize) {
10861     // If no array size was specified, but the new expression was
10862     // instantiated with an array type (e.g., "new T" where T is
10863     // instantiated with "int[4]"), extract the outer bound from the
10864     // array type as our array size. We do this with constant and
10865     // dependently-sized array types.
10866     const ArrayType *ArrayT = SemaRef.Context.getAsArrayType(AllocType);
10867     if (!ArrayT) {
10868       // Do nothing
10869     } else if (const ConstantArrayType *ConsArrayT
10870                                      = dyn_cast<ConstantArrayType>(ArrayT)) {
10871       ArraySize = IntegerLiteral::Create(SemaRef.Context, ConsArrayT->getSize(),
10872                                          SemaRef.Context.getSizeType(),
10873                                          /*FIXME:*/ E->getBeginLoc());
10874       AllocType = ConsArrayT->getElementType();
10875     } else if (const DependentSizedArrayType *DepArrayT
10876                               = dyn_cast<DependentSizedArrayType>(ArrayT)) {
10877       if (DepArrayT->getSizeExpr()) {
10878         ArraySize = DepArrayT->getSizeExpr();
10879         AllocType = DepArrayT->getElementType();
10880       }
10881     }
10882   }
10883 
10884   return getDerived().RebuildCXXNewExpr(
10885       E->getBeginLoc(), E->isGlobalNew(),
10886       /*FIXME:*/ E->getBeginLoc(), PlacementArgs,
10887       /*FIXME:*/ E->getBeginLoc(), E->getTypeIdParens(), AllocType,
10888       AllocTypeInfo, ArraySize, E->getDirectInitRange(), NewInit.get());
10889 }
10890 
10891 template<typename Derived>
10892 ExprResult
10893 TreeTransform<Derived>::TransformCXXDeleteExpr(CXXDeleteExpr *E) {
10894   ExprResult Operand = getDerived().TransformExpr(E->getArgument());
10895   if (Operand.isInvalid())
10896     return ExprError();
10897 
10898   // Transform the delete operator, if known.
10899   FunctionDecl *OperatorDelete = nullptr;
10900   if (E->getOperatorDelete()) {
10901     OperatorDelete = cast_or_null<FunctionDecl>(
10902         getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorDelete()));
10903     if (!OperatorDelete)
10904       return ExprError();
10905   }
10906 
10907   if (!getDerived().AlwaysRebuild() &&
10908       Operand.get() == E->getArgument() &&
10909       OperatorDelete == E->getOperatorDelete()) {
10910     // Mark any declarations we need as referenced.
10911     // FIXME: instantiation-specific.
10912     if (OperatorDelete)
10913       SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorDelete);
10914 
10915     if (!E->getArgument()->isTypeDependent()) {
10916       QualType Destroyed = SemaRef.Context.getBaseElementType(
10917                                                          E->getDestroyedType());
10918       if (const RecordType *DestroyedRec = Destroyed->getAs<RecordType>()) {
10919         CXXRecordDecl *Record = cast<CXXRecordDecl>(DestroyedRec->getDecl());
10920         SemaRef.MarkFunctionReferenced(E->getBeginLoc(),
10921                                        SemaRef.LookupDestructor(Record));
10922       }
10923     }
10924 
10925     return E;
10926   }
10927 
10928   return getDerived().RebuildCXXDeleteExpr(
10929       E->getBeginLoc(), E->isGlobalDelete(), E->isArrayForm(), Operand.get());
10930 }
10931 
10932 template<typename Derived>
10933 ExprResult
10934 TreeTransform<Derived>::TransformCXXPseudoDestructorExpr(
10935                                                      CXXPseudoDestructorExpr *E) {
10936   ExprResult Base = getDerived().TransformExpr(E->getBase());
10937   if (Base.isInvalid())
10938     return ExprError();
10939 
10940   ParsedType ObjectTypePtr;
10941   bool MayBePseudoDestructor = false;
10942   Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(),
10943                                               E->getOperatorLoc(),
10944                                         E->isArrow()? tok::arrow : tok::period,
10945                                               ObjectTypePtr,
10946                                               MayBePseudoDestructor);
10947   if (Base.isInvalid())
10948     return ExprError();
10949 
10950   QualType ObjectType = ObjectTypePtr.get();
10951   NestedNameSpecifierLoc QualifierLoc = E->getQualifierLoc();
10952   if (QualifierLoc) {
10953     QualifierLoc
10954       = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc, ObjectType);
10955     if (!QualifierLoc)
10956       return ExprError();
10957   }
10958   CXXScopeSpec SS;
10959   SS.Adopt(QualifierLoc);
10960 
10961   PseudoDestructorTypeStorage Destroyed;
10962   if (E->getDestroyedTypeInfo()) {
10963     TypeSourceInfo *DestroyedTypeInfo
10964       = getDerived().TransformTypeInObjectScope(E->getDestroyedTypeInfo(),
10965                                                 ObjectType, nullptr, SS);
10966     if (!DestroyedTypeInfo)
10967       return ExprError();
10968     Destroyed = DestroyedTypeInfo;
10969   } else if (!ObjectType.isNull() && ObjectType->isDependentType()) {
10970     // We aren't likely to be able to resolve the identifier down to a type
10971     // now anyway, so just retain the identifier.
10972     Destroyed = PseudoDestructorTypeStorage(E->getDestroyedTypeIdentifier(),
10973                                             E->getDestroyedTypeLoc());
10974   } else {
10975     // Look for a destructor known with the given name.
10976     ParsedType T = SemaRef.getDestructorName(E->getTildeLoc(),
10977                                               *E->getDestroyedTypeIdentifier(),
10978                                                 E->getDestroyedTypeLoc(),
10979                                                 /*Scope=*/nullptr,
10980                                                 SS, ObjectTypePtr,
10981                                                 false);
10982     if (!T)
10983       return ExprError();
10984 
10985     Destroyed
10986       = SemaRef.Context.getTrivialTypeSourceInfo(SemaRef.GetTypeFromParser(T),
10987                                                  E->getDestroyedTypeLoc());
10988   }
10989 
10990   TypeSourceInfo *ScopeTypeInfo = nullptr;
10991   if (E->getScopeTypeInfo()) {
10992     CXXScopeSpec EmptySS;
10993     ScopeTypeInfo = getDerived().TransformTypeInObjectScope(
10994                       E->getScopeTypeInfo(), ObjectType, nullptr, EmptySS);
10995     if (!ScopeTypeInfo)
10996       return ExprError();
10997   }
10998 
10999   return getDerived().RebuildCXXPseudoDestructorExpr(Base.get(),
11000                                                      E->getOperatorLoc(),
11001                                                      E->isArrow(),
11002                                                      SS,
11003                                                      ScopeTypeInfo,
11004                                                      E->getColonColonLoc(),
11005                                                      E->getTildeLoc(),
11006                                                      Destroyed);
11007 }
11008 
11009 template <typename Derived>
11010 bool TreeTransform<Derived>::TransformOverloadExprDecls(OverloadExpr *Old,
11011                                                         bool RequiresADL,
11012                                                         LookupResult &R) {
11013   // Transform all the decls.
11014   bool AllEmptyPacks = true;
11015   for (auto *OldD : Old->decls()) {
11016     Decl *InstD = getDerived().TransformDecl(Old->getNameLoc(), OldD);
11017     if (!InstD) {
11018       // Silently ignore these if a UsingShadowDecl instantiated to nothing.
11019       // This can happen because of dependent hiding.
11020       if (isa<UsingShadowDecl>(OldD))
11021         continue;
11022       else {
11023         R.clear();
11024         return true;
11025       }
11026     }
11027 
11028     // Expand using pack declarations.
11029     NamedDecl *SingleDecl = cast<NamedDecl>(InstD);
11030     ArrayRef<NamedDecl*> Decls = SingleDecl;
11031     if (auto *UPD = dyn_cast<UsingPackDecl>(InstD))
11032       Decls = UPD->expansions();
11033 
11034     // Expand using declarations.
11035     for (auto *D : Decls) {
11036       if (auto *UD = dyn_cast<UsingDecl>(D)) {
11037         for (auto *SD : UD->shadows())
11038           R.addDecl(SD);
11039       } else {
11040         R.addDecl(D);
11041       }
11042     }
11043 
11044     AllEmptyPacks &= Decls.empty();
11045   };
11046 
11047   // C++ [temp.res]/8.4.2:
11048   //   The program is ill-formed, no diagnostic required, if [...] lookup for
11049   //   a name in the template definition found a using-declaration, but the
11050   //   lookup in the corresponding scope in the instantiation odoes not find
11051   //   any declarations because the using-declaration was a pack expansion and
11052   //   the corresponding pack is empty
11053   if (AllEmptyPacks && !RequiresADL) {
11054     getSema().Diag(Old->getNameLoc(), diag::err_using_pack_expansion_empty)
11055         << isa<UnresolvedMemberExpr>(Old) << Old->getName();
11056     return true;
11057   }
11058 
11059   // Resolve a kind, but don't do any further analysis.  If it's
11060   // ambiguous, the callee needs to deal with it.
11061   R.resolveKind();
11062   return false;
11063 }
11064 
11065 template<typename Derived>
11066 ExprResult
11067 TreeTransform<Derived>::TransformUnresolvedLookupExpr(
11068                                                   UnresolvedLookupExpr *Old) {
11069   LookupResult R(SemaRef, Old->getName(), Old->getNameLoc(),
11070                  Sema::LookupOrdinaryName);
11071 
11072   // Transform the declaration set.
11073   if (TransformOverloadExprDecls(Old, Old->requiresADL(), R))
11074     return ExprError();
11075 
11076   // Rebuild the nested-name qualifier, if present.
11077   CXXScopeSpec SS;
11078   if (Old->getQualifierLoc()) {
11079     NestedNameSpecifierLoc QualifierLoc
11080       = getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc());
11081     if (!QualifierLoc)
11082       return ExprError();
11083 
11084     SS.Adopt(QualifierLoc);
11085   }
11086 
11087   if (Old->getNamingClass()) {
11088     CXXRecordDecl *NamingClass
11089       = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl(
11090                                                             Old->getNameLoc(),
11091                                                         Old->getNamingClass()));
11092     if (!NamingClass) {
11093       R.clear();
11094       return ExprError();
11095     }
11096 
11097     R.setNamingClass(NamingClass);
11098   }
11099 
11100   SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc();
11101 
11102   // If we have neither explicit template arguments, nor the template keyword,
11103   // it's a normal declaration name or member reference.
11104   if (!Old->hasExplicitTemplateArgs() && !TemplateKWLoc.isValid()) {
11105     NamedDecl *D = R.getAsSingle<NamedDecl>();
11106     // In a C++11 unevaluated context, an UnresolvedLookupExpr might refer to an
11107     // instance member. In other contexts, BuildPossibleImplicitMemberExpr will
11108     // give a good diagnostic.
11109     if (D && D->isCXXInstanceMember()) {
11110       return SemaRef.BuildPossibleImplicitMemberExpr(SS, TemplateKWLoc, R,
11111                                                      /*TemplateArgs=*/nullptr,
11112                                                      /*Scope=*/nullptr);
11113     }
11114 
11115     return getDerived().RebuildDeclarationNameExpr(SS, R, Old->requiresADL());
11116   }
11117 
11118   // If we have template arguments, rebuild them, then rebuild the
11119   // templateid expression.
11120   TemplateArgumentListInfo TransArgs(Old->getLAngleLoc(), Old->getRAngleLoc());
11121   if (Old->hasExplicitTemplateArgs() &&
11122       getDerived().TransformTemplateArguments(Old->getTemplateArgs(),
11123                                               Old->getNumTemplateArgs(),
11124                                               TransArgs)) {
11125     R.clear();
11126     return ExprError();
11127   }
11128 
11129   return getDerived().RebuildTemplateIdExpr(SS, TemplateKWLoc, R,
11130                                             Old->requiresADL(), &TransArgs);
11131 }
11132 
11133 template<typename Derived>
11134 ExprResult
11135 TreeTransform<Derived>::TransformTypeTraitExpr(TypeTraitExpr *E) {
11136   bool ArgChanged = false;
11137   SmallVector<TypeSourceInfo *, 4> Args;
11138   for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) {
11139     TypeSourceInfo *From = E->getArg(I);
11140     TypeLoc FromTL = From->getTypeLoc();
11141     if (!FromTL.getAs<PackExpansionTypeLoc>()) {
11142       TypeLocBuilder TLB;
11143       TLB.reserve(FromTL.getFullDataSize());
11144       QualType To = getDerived().TransformType(TLB, FromTL);
11145       if (To.isNull())
11146         return ExprError();
11147 
11148       if (To == From->getType())
11149         Args.push_back(From);
11150       else {
11151         Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
11152         ArgChanged = true;
11153       }
11154       continue;
11155     }
11156 
11157     ArgChanged = true;
11158 
11159     // We have a pack expansion. Instantiate it.
11160     PackExpansionTypeLoc ExpansionTL = FromTL.castAs<PackExpansionTypeLoc>();
11161     TypeLoc PatternTL = ExpansionTL.getPatternLoc();
11162     SmallVector<UnexpandedParameterPack, 2> Unexpanded;
11163     SemaRef.collectUnexpandedParameterPacks(PatternTL, Unexpanded);
11164 
11165     // Determine whether the set of unexpanded parameter packs can and should
11166     // be expanded.
11167     bool Expand = true;
11168     bool RetainExpansion = false;
11169     Optional<unsigned> OrigNumExpansions =
11170         ExpansionTL.getTypePtr()->getNumExpansions();
11171     Optional<unsigned> NumExpansions = OrigNumExpansions;
11172     if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(),
11173                                              PatternTL.getSourceRange(),
11174                                              Unexpanded,
11175                                              Expand, RetainExpansion,
11176                                              NumExpansions))
11177       return ExprError();
11178 
11179     if (!Expand) {
11180       // The transform has determined that we should perform a simple
11181       // transformation on the pack expansion, producing another pack
11182       // expansion.
11183       Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
11184 
11185       TypeLocBuilder TLB;
11186       TLB.reserve(From->getTypeLoc().getFullDataSize());
11187 
11188       QualType To = getDerived().TransformType(TLB, PatternTL);
11189       if (To.isNull())
11190         return ExprError();
11191 
11192       To = getDerived().RebuildPackExpansionType(To,
11193                                                  PatternTL.getSourceRange(),
11194                                                  ExpansionTL.getEllipsisLoc(),
11195                                                  NumExpansions);
11196       if (To.isNull())
11197         return ExprError();
11198 
11199       PackExpansionTypeLoc ToExpansionTL
11200         = TLB.push<PackExpansionTypeLoc>(To);
11201       ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc());
11202       Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
11203       continue;
11204     }
11205 
11206     // Expand the pack expansion by substituting for each argument in the
11207     // pack(s).
11208     for (unsigned I = 0; I != *NumExpansions; ++I) {
11209       Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(SemaRef, I);
11210       TypeLocBuilder TLB;
11211       TLB.reserve(PatternTL.getFullDataSize());
11212       QualType To = getDerived().TransformType(TLB, PatternTL);
11213       if (To.isNull())
11214         return ExprError();
11215 
11216       if (To->containsUnexpandedParameterPack()) {
11217         To = getDerived().RebuildPackExpansionType(To,
11218                                                    PatternTL.getSourceRange(),
11219                                                    ExpansionTL.getEllipsisLoc(),
11220                                                    NumExpansions);
11221         if (To.isNull())
11222           return ExprError();
11223 
11224         PackExpansionTypeLoc ToExpansionTL
11225           = TLB.push<PackExpansionTypeLoc>(To);
11226         ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc());
11227       }
11228 
11229       Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
11230     }
11231 
11232     if (!RetainExpansion)
11233       continue;
11234 
11235     // If we're supposed to retain a pack expansion, do so by temporarily
11236     // forgetting the partially-substituted parameter pack.
11237     ForgetPartiallySubstitutedPackRAII Forget(getDerived());
11238 
11239     TypeLocBuilder TLB;
11240     TLB.reserve(From->getTypeLoc().getFullDataSize());
11241 
11242     QualType To = getDerived().TransformType(TLB, PatternTL);
11243     if (To.isNull())
11244       return ExprError();
11245 
11246     To = getDerived().RebuildPackExpansionType(To,
11247                                                PatternTL.getSourceRange(),
11248                                                ExpansionTL.getEllipsisLoc(),
11249                                                NumExpansions);
11250     if (To.isNull())
11251       return ExprError();
11252 
11253     PackExpansionTypeLoc ToExpansionTL
11254       = TLB.push<PackExpansionTypeLoc>(To);
11255     ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc());
11256     Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
11257   }
11258 
11259   if (!getDerived().AlwaysRebuild() && !ArgChanged)
11260     return E;
11261 
11262   return getDerived().RebuildTypeTrait(E->getTrait(), E->getBeginLoc(), Args,
11263                                        E->getEndLoc());
11264 }
11265 
11266 template<typename Derived>
11267 ExprResult
11268 TreeTransform<Derived>::TransformConceptSpecializationExpr(
11269                                                  ConceptSpecializationExpr *E) {
11270   const ASTTemplateArgumentListInfo *Old = E->getTemplateArgsAsWritten();
11271   TemplateArgumentListInfo TransArgs(Old->LAngleLoc, Old->RAngleLoc);
11272   if (getDerived().TransformTemplateArguments(Old->getTemplateArgs(),
11273                                               Old->NumTemplateArgs, TransArgs))
11274     return ExprError();
11275 
11276   return getDerived().RebuildConceptSpecializationExpr(
11277       E->getNestedNameSpecifierLoc(), E->getTemplateKWLoc(),
11278       E->getConceptNameInfo(), E->getFoundDecl(), E->getNamedConcept(),
11279       &TransArgs);
11280 }
11281 
11282 template<typename Derived>
11283 ExprResult
11284 TreeTransform<Derived>::TransformRequiresExpr(RequiresExpr *E) {
11285   SmallVector<ParmVarDecl*, 4> TransParams;
11286   SmallVector<QualType, 4> TransParamTypes;
11287   Sema::ExtParameterInfoBuilder ExtParamInfos;
11288 
11289   // C++2a [expr.prim.req]p2
11290   // Expressions appearing within a requirement-body are unevaluated operands.
11291   EnterExpressionEvaluationContext Ctx(
11292       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
11293 
11294   RequiresExprBodyDecl *Body = RequiresExprBodyDecl::Create(
11295       getSema().Context, E->getBody()->getDeclContext(),
11296       E->getBody()->getBeginLoc());
11297 
11298   Sema::ContextRAII SavedContext(getSema(), Body, /*NewThisContext*/false);
11299 
11300   if (getDerived().TransformFunctionTypeParams(E->getRequiresKWLoc(),
11301                                                E->getLocalParameters(),
11302                                                /*ParamTypes=*/nullptr,
11303                                                /*ParamInfos=*/nullptr,
11304                                                TransParamTypes, &TransParams,
11305                                                ExtParamInfos))
11306     return ExprError();
11307 
11308   for (ParmVarDecl *Param : TransParams)
11309     Param->setDeclContext(Body);
11310 
11311   SmallVector<concepts::Requirement *, 4> TransReqs;
11312   if (getDerived().TransformRequiresExprRequirements(E->getRequirements(),
11313                                                      TransReqs))
11314     return ExprError();
11315 
11316   for (concepts::Requirement *Req : TransReqs) {
11317     if (auto *ER = dyn_cast<concepts::ExprRequirement>(Req)) {
11318       if (ER->getReturnTypeRequirement().isTypeConstraint()) {
11319         ER->getReturnTypeRequirement()
11320                 .getTypeConstraintTemplateParameterList()->getParam(0)
11321                 ->setDeclContext(Body);
11322       }
11323     }
11324   }
11325 
11326   return getDerived().RebuildRequiresExpr(E->getRequiresKWLoc(), Body,
11327                                           TransParams, TransReqs,
11328                                           E->getRBraceLoc());
11329 }
11330 
11331 template<typename Derived>
11332 bool TreeTransform<Derived>::TransformRequiresExprRequirements(
11333     ArrayRef<concepts::Requirement *> Reqs,
11334     SmallVectorImpl<concepts::Requirement *> &Transformed) {
11335   for (concepts::Requirement *Req : Reqs) {
11336     concepts::Requirement *TransReq = nullptr;
11337     if (auto *TypeReq = dyn_cast<concepts::TypeRequirement>(Req))
11338       TransReq = getDerived().TransformTypeRequirement(TypeReq);
11339     else if (auto *ExprReq = dyn_cast<concepts::ExprRequirement>(Req))
11340       TransReq = getDerived().TransformExprRequirement(ExprReq);
11341     else
11342       TransReq = getDerived().TransformNestedRequirement(
11343                      cast<concepts::NestedRequirement>(Req));
11344     if (!TransReq)
11345       return true;
11346     Transformed.push_back(TransReq);
11347   }
11348   return false;
11349 }
11350 
11351 template<typename Derived>
11352 concepts::TypeRequirement *
11353 TreeTransform<Derived>::TransformTypeRequirement(
11354     concepts::TypeRequirement *Req) {
11355   if (Req->isSubstitutionFailure()) {
11356     if (getDerived().AlwaysRebuild())
11357       return getDerived().RebuildTypeRequirement(
11358               Req->getSubstitutionDiagnostic());
11359     return Req;
11360   }
11361   TypeSourceInfo *TransType = getDerived().TransformType(Req->getType());
11362   if (!TransType)
11363     return nullptr;
11364   return getDerived().RebuildTypeRequirement(TransType);
11365 }
11366 
11367 template<typename Derived>
11368 concepts::ExprRequirement *
11369 TreeTransform<Derived>::TransformExprRequirement(concepts::ExprRequirement *Req) {
11370   llvm::PointerUnion<Expr *, concepts::Requirement::SubstitutionDiagnostic *> TransExpr;
11371   if (Req->isExprSubstitutionFailure())
11372     TransExpr = Req->getExprSubstitutionDiagnostic();
11373   else {
11374     ExprResult TransExprRes = getDerived().TransformExpr(Req->getExpr());
11375     if (TransExprRes.isInvalid())
11376       return nullptr;
11377     TransExpr = TransExprRes.get();
11378   }
11379 
11380   llvm::Optional<concepts::ExprRequirement::ReturnTypeRequirement> TransRetReq;
11381   const auto &RetReq = Req->getReturnTypeRequirement();
11382   if (RetReq.isEmpty())
11383     TransRetReq.emplace();
11384   else if (RetReq.isSubstitutionFailure())
11385     TransRetReq.emplace(RetReq.getSubstitutionDiagnostic());
11386   else if (RetReq.isTypeConstraint()) {
11387     TemplateParameterList *OrigTPL =
11388         RetReq.getTypeConstraintTemplateParameterList();
11389     TemplateParameterList *TPL =
11390         getDerived().TransformTemplateParameterList(OrigTPL);
11391     if (!TPL)
11392       return nullptr;
11393     TransRetReq.emplace(TPL);
11394   }
11395   assert(TransRetReq.hasValue() &&
11396          "All code paths leading here must set TransRetReq");
11397   if (Expr *E = TransExpr.dyn_cast<Expr *>())
11398     return getDerived().RebuildExprRequirement(E, Req->isSimple(),
11399                                                Req->getNoexceptLoc(),
11400                                                std::move(*TransRetReq));
11401   return getDerived().RebuildExprRequirement(
11402       TransExpr.get<concepts::Requirement::SubstitutionDiagnostic *>(),
11403       Req->isSimple(), Req->getNoexceptLoc(), std::move(*TransRetReq));
11404 }
11405 
11406 template<typename Derived>
11407 concepts::NestedRequirement *
11408 TreeTransform<Derived>::TransformNestedRequirement(
11409     concepts::NestedRequirement *Req) {
11410   if (Req->isSubstitutionFailure()) {
11411     if (getDerived().AlwaysRebuild())
11412       return getDerived().RebuildNestedRequirement(
11413           Req->getSubstitutionDiagnostic());
11414     return Req;
11415   }
11416   ExprResult TransConstraint =
11417       getDerived().TransformExpr(Req->getConstraintExpr());
11418   if (TransConstraint.isInvalid())
11419     return nullptr;
11420   return getDerived().RebuildNestedRequirement(TransConstraint.get());
11421 }
11422 
11423 template<typename Derived>
11424 ExprResult
11425 TreeTransform<Derived>::TransformArrayTypeTraitExpr(ArrayTypeTraitExpr *E) {
11426   TypeSourceInfo *T = getDerived().TransformType(E->getQueriedTypeSourceInfo());
11427   if (!T)
11428     return ExprError();
11429 
11430   if (!getDerived().AlwaysRebuild() &&
11431       T == E->getQueriedTypeSourceInfo())
11432     return E;
11433 
11434   ExprResult SubExpr;
11435   {
11436     EnterExpressionEvaluationContext Unevaluated(
11437         SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
11438     SubExpr = getDerived().TransformExpr(E->getDimensionExpression());
11439     if (SubExpr.isInvalid())
11440       return ExprError();
11441 
11442     if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getDimensionExpression())
11443       return E;
11444   }
11445 
11446   return getDerived().RebuildArrayTypeTrait(E->getTrait(), E->getBeginLoc(), T,
11447                                             SubExpr.get(), E->getEndLoc());
11448 }
11449 
11450 template<typename Derived>
11451 ExprResult
11452 TreeTransform<Derived>::TransformExpressionTraitExpr(ExpressionTraitExpr *E) {
11453   ExprResult SubExpr;
11454   {
11455     EnterExpressionEvaluationContext Unevaluated(
11456         SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
11457     SubExpr = getDerived().TransformExpr(E->getQueriedExpression());
11458     if (SubExpr.isInvalid())
11459       return ExprError();
11460 
11461     if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getQueriedExpression())
11462       return E;
11463   }
11464 
11465   return getDerived().RebuildExpressionTrait(E->getTrait(), E->getBeginLoc(),
11466                                              SubExpr.get(), E->getEndLoc());
11467 }
11468 
11469 template <typename Derived>
11470 ExprResult TreeTransform<Derived>::TransformParenDependentScopeDeclRefExpr(
11471     ParenExpr *PE, DependentScopeDeclRefExpr *DRE, bool AddrTaken,
11472     TypeSourceInfo **RecoveryTSI) {
11473   ExprResult NewDRE = getDerived().TransformDependentScopeDeclRefExpr(
11474       DRE, AddrTaken, RecoveryTSI);
11475 
11476   // Propagate both errors and recovered types, which return ExprEmpty.
11477   if (!NewDRE.isUsable())
11478     return NewDRE;
11479 
11480   // We got an expr, wrap it up in parens.
11481   if (!getDerived().AlwaysRebuild() && NewDRE.get() == DRE)
11482     return PE;
11483   return getDerived().RebuildParenExpr(NewDRE.get(), PE->getLParen(),
11484                                        PE->getRParen());
11485 }
11486 
11487 template <typename Derived>
11488 ExprResult TreeTransform<Derived>::TransformDependentScopeDeclRefExpr(
11489     DependentScopeDeclRefExpr *E) {
11490   return TransformDependentScopeDeclRefExpr(E, /*IsAddressOfOperand=*/false,
11491                                             nullptr);
11492 }
11493 
11494 template<typename Derived>
11495 ExprResult
11496 TreeTransform<Derived>::TransformDependentScopeDeclRefExpr(
11497                                                DependentScopeDeclRefExpr *E,
11498                                                bool IsAddressOfOperand,
11499                                                TypeSourceInfo **RecoveryTSI) {
11500   assert(E->getQualifierLoc());
11501   NestedNameSpecifierLoc QualifierLoc
11502   = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
11503   if (!QualifierLoc)
11504     return ExprError();
11505   SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc();
11506 
11507   // TODO: If this is a conversion-function-id, verify that the
11508   // destination type name (if present) resolves the same way after
11509   // instantiation as it did in the local scope.
11510 
11511   DeclarationNameInfo NameInfo
11512     = getDerived().TransformDeclarationNameInfo(E->getNameInfo());
11513   if (!NameInfo.getName())
11514     return ExprError();
11515 
11516   if (!E->hasExplicitTemplateArgs()) {
11517     if (!getDerived().AlwaysRebuild() &&
11518         QualifierLoc == E->getQualifierLoc() &&
11519         // Note: it is sufficient to compare the Name component of NameInfo:
11520         // if name has not changed, DNLoc has not changed either.
11521         NameInfo.getName() == E->getDeclName())
11522       return E;
11523 
11524     return getDerived().RebuildDependentScopeDeclRefExpr(
11525         QualifierLoc, TemplateKWLoc, NameInfo, /*TemplateArgs=*/nullptr,
11526         IsAddressOfOperand, RecoveryTSI);
11527   }
11528 
11529   TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc());
11530   if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
11531                                               E->getNumTemplateArgs(),
11532                                               TransArgs))
11533     return ExprError();
11534 
11535   return getDerived().RebuildDependentScopeDeclRefExpr(
11536       QualifierLoc, TemplateKWLoc, NameInfo, &TransArgs, IsAddressOfOperand,
11537       RecoveryTSI);
11538 }
11539 
11540 template<typename Derived>
11541 ExprResult
11542 TreeTransform<Derived>::TransformCXXConstructExpr(CXXConstructExpr *E) {
11543   // CXXConstructExprs other than for list-initialization and
11544   // CXXTemporaryObjectExpr are always implicit, so when we have
11545   // a 1-argument construction we just transform that argument.
11546   if ((E->getNumArgs() == 1 ||
11547        (E->getNumArgs() > 1 && getDerived().DropCallArgument(E->getArg(1)))) &&
11548       (!getDerived().DropCallArgument(E->getArg(0))) &&
11549       !E->isListInitialization())
11550     return getDerived().TransformExpr(E->getArg(0));
11551 
11552   TemporaryBase Rebase(*this, /*FIXME*/ E->getBeginLoc(), DeclarationName());
11553 
11554   QualType T = getDerived().TransformType(E->getType());
11555   if (T.isNull())
11556     return ExprError();
11557 
11558   CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>(
11559       getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor()));
11560   if (!Constructor)
11561     return ExprError();
11562 
11563   bool ArgumentChanged = false;
11564   SmallVector<Expr*, 8> Args;
11565   {
11566     EnterExpressionEvaluationContext Context(
11567         getSema(), EnterExpressionEvaluationContext::InitList,
11568         E->isListInitialization());
11569     if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
11570                                     &ArgumentChanged))
11571       return ExprError();
11572   }
11573 
11574   if (!getDerived().AlwaysRebuild() &&
11575       T == E->getType() &&
11576       Constructor == E->getConstructor() &&
11577       !ArgumentChanged) {
11578     // Mark the constructor as referenced.
11579     // FIXME: Instantiation-specific
11580     SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor);
11581     return E;
11582   }
11583 
11584   return getDerived().RebuildCXXConstructExpr(
11585       T, /*FIXME:*/ E->getBeginLoc(), Constructor, E->isElidable(), Args,
11586       E->hadMultipleCandidates(), E->isListInitialization(),
11587       E->isStdInitListInitialization(), E->requiresZeroInitialization(),
11588       E->getConstructionKind(), E->getParenOrBraceRange());
11589 }
11590 
11591 template<typename Derived>
11592 ExprResult TreeTransform<Derived>::TransformCXXInheritedCtorInitExpr(
11593     CXXInheritedCtorInitExpr *E) {
11594   QualType T = getDerived().TransformType(E->getType());
11595   if (T.isNull())
11596     return ExprError();
11597 
11598   CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>(
11599       getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor()));
11600   if (!Constructor)
11601     return ExprError();
11602 
11603   if (!getDerived().AlwaysRebuild() &&
11604       T == E->getType() &&
11605       Constructor == E->getConstructor()) {
11606     // Mark the constructor as referenced.
11607     // FIXME: Instantiation-specific
11608     SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor);
11609     return E;
11610   }
11611 
11612   return getDerived().RebuildCXXInheritedCtorInitExpr(
11613       T, E->getLocation(), Constructor,
11614       E->constructsVBase(), E->inheritedFromVBase());
11615 }
11616 
11617 /// Transform a C++ temporary-binding expression.
11618 ///
11619 /// Since CXXBindTemporaryExpr nodes are implicitly generated, we just
11620 /// transform the subexpression and return that.
11621 template<typename Derived>
11622 ExprResult
11623 TreeTransform<Derived>::TransformCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) {
11624   return getDerived().TransformExpr(E->getSubExpr());
11625 }
11626 
11627 /// Transform a C++ expression that contains cleanups that should
11628 /// be run after the expression is evaluated.
11629 ///
11630 /// Since ExprWithCleanups nodes are implicitly generated, we
11631 /// just transform the subexpression and return that.
11632 template<typename Derived>
11633 ExprResult
11634 TreeTransform<Derived>::TransformExprWithCleanups(ExprWithCleanups *E) {
11635   return getDerived().TransformExpr(E->getSubExpr());
11636 }
11637 
11638 template<typename Derived>
11639 ExprResult
11640 TreeTransform<Derived>::TransformCXXTemporaryObjectExpr(
11641                                                     CXXTemporaryObjectExpr *E) {
11642   TypeSourceInfo *T =
11643       getDerived().TransformTypeWithDeducedTST(E->getTypeSourceInfo());
11644   if (!T)
11645     return ExprError();
11646 
11647   CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>(
11648       getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor()));
11649   if (!Constructor)
11650     return ExprError();
11651 
11652   bool ArgumentChanged = false;
11653   SmallVector<Expr*, 8> Args;
11654   Args.reserve(E->getNumArgs());
11655   {
11656     EnterExpressionEvaluationContext Context(
11657         getSema(), EnterExpressionEvaluationContext::InitList,
11658         E->isListInitialization());
11659     if (TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
11660                        &ArgumentChanged))
11661       return ExprError();
11662   }
11663 
11664   if (!getDerived().AlwaysRebuild() &&
11665       T == E->getTypeSourceInfo() &&
11666       Constructor == E->getConstructor() &&
11667       !ArgumentChanged) {
11668     // FIXME: Instantiation-specific
11669     SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor);
11670     return SemaRef.MaybeBindToTemporary(E);
11671   }
11672 
11673   // FIXME: We should just pass E->isListInitialization(), but we're not
11674   // prepared to handle list-initialization without a child InitListExpr.
11675   SourceLocation LParenLoc = T->getTypeLoc().getEndLoc();
11676   return getDerived().RebuildCXXTemporaryObjectExpr(
11677       T, LParenLoc, Args, E->getEndLoc(),
11678       /*ListInitialization=*/LParenLoc.isInvalid());
11679 }
11680 
11681 template<typename Derived>
11682 ExprResult
11683 TreeTransform<Derived>::TransformLambdaExpr(LambdaExpr *E) {
11684   // Transform any init-capture expressions before entering the scope of the
11685   // lambda body, because they are not semantically within that scope.
11686   typedef std::pair<ExprResult, QualType> InitCaptureInfoTy;
11687   struct TransformedInitCapture {
11688     // The location of the ... if the result is retaining a pack expansion.
11689     SourceLocation EllipsisLoc;
11690     // Zero or more expansions of the init-capture.
11691     SmallVector<InitCaptureInfoTy, 4> Expansions;
11692   };
11693   SmallVector<TransformedInitCapture, 4> InitCaptures;
11694   InitCaptures.resize(E->explicit_capture_end() - E->explicit_capture_begin());
11695   for (LambdaExpr::capture_iterator C = E->capture_begin(),
11696                                     CEnd = E->capture_end();
11697        C != CEnd; ++C) {
11698     if (!E->isInitCapture(C))
11699       continue;
11700 
11701     TransformedInitCapture &Result = InitCaptures[C - E->capture_begin()];
11702     VarDecl *OldVD = C->getCapturedVar();
11703 
11704     auto SubstInitCapture = [&](SourceLocation EllipsisLoc,
11705                                 Optional<unsigned> NumExpansions) {
11706       ExprResult NewExprInitResult = getDerived().TransformInitializer(
11707           OldVD->getInit(), OldVD->getInitStyle() == VarDecl::CallInit);
11708 
11709       if (NewExprInitResult.isInvalid()) {
11710         Result.Expansions.push_back(InitCaptureInfoTy(ExprError(), QualType()));
11711         return;
11712       }
11713       Expr *NewExprInit = NewExprInitResult.get();
11714 
11715       QualType NewInitCaptureType =
11716           getSema().buildLambdaInitCaptureInitialization(
11717               C->getLocation(), OldVD->getType()->isReferenceType(),
11718               EllipsisLoc, NumExpansions, OldVD->getIdentifier(),
11719               C->getCapturedVar()->getInitStyle() != VarDecl::CInit,
11720               NewExprInit);
11721       Result.Expansions.push_back(
11722           InitCaptureInfoTy(NewExprInit, NewInitCaptureType));
11723     };
11724 
11725     // If this is an init-capture pack, consider expanding the pack now.
11726     if (OldVD->isParameterPack()) {
11727       PackExpansionTypeLoc ExpansionTL = OldVD->getTypeSourceInfo()
11728                                              ->getTypeLoc()
11729                                              .castAs<PackExpansionTypeLoc>();
11730       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
11731       SemaRef.collectUnexpandedParameterPacks(OldVD->getInit(), Unexpanded);
11732 
11733       // Determine whether the set of unexpanded parameter packs can and should
11734       // be expanded.
11735       bool Expand = true;
11736       bool RetainExpansion = false;
11737       Optional<unsigned> OrigNumExpansions =
11738           ExpansionTL.getTypePtr()->getNumExpansions();
11739       Optional<unsigned> NumExpansions = OrigNumExpansions;
11740       if (getDerived().TryExpandParameterPacks(
11741               ExpansionTL.getEllipsisLoc(),
11742               OldVD->getInit()->getSourceRange(), Unexpanded, Expand,
11743               RetainExpansion, NumExpansions))
11744         return ExprError();
11745       if (Expand) {
11746         for (unsigned I = 0; I != *NumExpansions; ++I) {
11747           Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
11748           SubstInitCapture(SourceLocation(), None);
11749         }
11750       }
11751       if (!Expand || RetainExpansion) {
11752         ForgetPartiallySubstitutedPackRAII Forget(getDerived());
11753         SubstInitCapture(ExpansionTL.getEllipsisLoc(), NumExpansions);
11754         Result.EllipsisLoc = ExpansionTL.getEllipsisLoc();
11755       }
11756     } else {
11757       SubstInitCapture(SourceLocation(), None);
11758     }
11759   }
11760 
11761   LambdaScopeInfo *LSI = getSema().PushLambdaScope();
11762   Sema::FunctionScopeRAII FuncScopeCleanup(getSema());
11763 
11764   // Transform the template parameters, and add them to the current
11765   // instantiation scope. The null case is handled correctly.
11766   auto TPL = getDerived().TransformTemplateParameterList(
11767       E->getTemplateParameterList());
11768   LSI->GLTemplateParameterList = TPL;
11769 
11770   // Transform the type of the original lambda's call operator.
11771   // The transformation MUST be done in the CurrentInstantiationScope since
11772   // it introduces a mapping of the original to the newly created
11773   // transformed parameters.
11774   TypeSourceInfo *NewCallOpTSI = nullptr;
11775   {
11776     TypeSourceInfo *OldCallOpTSI = E->getCallOperator()->getTypeSourceInfo();
11777     FunctionProtoTypeLoc OldCallOpFPTL =
11778         OldCallOpTSI->getTypeLoc().getAs<FunctionProtoTypeLoc>();
11779 
11780     TypeLocBuilder NewCallOpTLBuilder;
11781     SmallVector<QualType, 4> ExceptionStorage;
11782     TreeTransform *This = this; // Work around gcc.gnu.org/PR56135.
11783     QualType NewCallOpType = TransformFunctionProtoType(
11784         NewCallOpTLBuilder, OldCallOpFPTL, nullptr, Qualifiers(),
11785         [&](FunctionProtoType::ExceptionSpecInfo &ESI, bool &Changed) {
11786           return This->TransformExceptionSpec(OldCallOpFPTL.getBeginLoc(), ESI,
11787                                               ExceptionStorage, Changed);
11788         });
11789     if (NewCallOpType.isNull())
11790       return ExprError();
11791     NewCallOpTSI = NewCallOpTLBuilder.getTypeSourceInfo(getSema().Context,
11792                                                         NewCallOpType);
11793   }
11794 
11795   // Transform the trailing requires clause
11796   ExprResult NewTrailingRequiresClause;
11797   if (Expr *TRC = E->getCallOperator()->getTrailingRequiresClause())
11798     // FIXME: Concepts: Substitution into requires clause should only happen
11799     //                  when checking satisfaction.
11800     NewTrailingRequiresClause = getDerived().TransformExpr(TRC);
11801 
11802   // Create the local class that will describe the lambda.
11803   // FIXME: KnownDependent below is wrong when substituting inside a templated
11804   // context that isn't a DeclContext (such as a variable template).
11805   CXXRecordDecl *OldClass = E->getLambdaClass();
11806   CXXRecordDecl *Class
11807     = getSema().createLambdaClosureType(E->getIntroducerRange(),
11808                                         NewCallOpTSI,
11809                                         /*KnownDependent=*/false,
11810                                         E->getCaptureDefault());
11811   getDerived().transformedLocalDecl(OldClass, {Class});
11812 
11813   Optional<std::tuple<unsigned, bool, Decl *>> Mangling;
11814   if (getDerived().ReplacingOriginal())
11815     Mangling = std::make_tuple(OldClass->getLambdaManglingNumber(),
11816                                OldClass->hasKnownLambdaInternalLinkage(),
11817                                OldClass->getLambdaContextDecl());
11818 
11819   // Build the call operator.
11820   CXXMethodDecl *NewCallOperator = getSema().startLambdaDefinition(
11821       Class, E->getIntroducerRange(), NewCallOpTSI,
11822       E->getCallOperator()->getEndLoc(),
11823       NewCallOpTSI->getTypeLoc().castAs<FunctionProtoTypeLoc>().getParams(),
11824       E->getCallOperator()->getConstexprKind(),
11825       NewTrailingRequiresClause.get());
11826 
11827   LSI->CallOperator = NewCallOperator;
11828 
11829   for (unsigned I = 0, NumParams = NewCallOperator->getNumParams();
11830        I != NumParams; ++I) {
11831     auto *P = NewCallOperator->getParamDecl(I);
11832     if (P->hasUninstantiatedDefaultArg()) {
11833       EnterExpressionEvaluationContext Eval(
11834           getSema(),
11835           Sema::ExpressionEvaluationContext::PotentiallyEvaluatedIfUsed, P);
11836       ExprResult R = getDerived().TransformExpr(
11837           E->getCallOperator()->getParamDecl(I)->getDefaultArg());
11838       P->setDefaultArg(R.get());
11839     }
11840   }
11841 
11842   getDerived().transformAttrs(E->getCallOperator(), NewCallOperator);
11843   getDerived().transformedLocalDecl(E->getCallOperator(), {NewCallOperator});
11844 
11845   // Number the lambda for linkage purposes if necessary.
11846   getSema().handleLambdaNumbering(Class, NewCallOperator, Mangling);
11847 
11848   // Introduce the context of the call operator.
11849   Sema::ContextRAII SavedContext(getSema(), NewCallOperator,
11850                                  /*NewThisContext*/false);
11851 
11852   // Enter the scope of the lambda.
11853   getSema().buildLambdaScope(LSI, NewCallOperator,
11854                              E->getIntroducerRange(),
11855                              E->getCaptureDefault(),
11856                              E->getCaptureDefaultLoc(),
11857                              E->hasExplicitParameters(),
11858                              E->hasExplicitResultType(),
11859                              E->isMutable());
11860 
11861   bool Invalid = false;
11862 
11863   // Transform captures.
11864   for (LambdaExpr::capture_iterator C = E->capture_begin(),
11865                                  CEnd = E->capture_end();
11866        C != CEnd; ++C) {
11867     // When we hit the first implicit capture, tell Sema that we've finished
11868     // the list of explicit captures.
11869     if (C->isImplicit())
11870       break;
11871 
11872     // Capturing 'this' is trivial.
11873     if (C->capturesThis()) {
11874       getSema().CheckCXXThisCapture(C->getLocation(), C->isExplicit(),
11875                                     /*BuildAndDiagnose*/ true, nullptr,
11876                                     C->getCaptureKind() == LCK_StarThis);
11877       continue;
11878     }
11879     // Captured expression will be recaptured during captured variables
11880     // rebuilding.
11881     if (C->capturesVLAType())
11882       continue;
11883 
11884     // Rebuild init-captures, including the implied field declaration.
11885     if (E->isInitCapture(C)) {
11886       TransformedInitCapture &NewC = InitCaptures[C - E->capture_begin()];
11887 
11888       VarDecl *OldVD = C->getCapturedVar();
11889       llvm::SmallVector<Decl*, 4> NewVDs;
11890 
11891       for (InitCaptureInfoTy &Info : NewC.Expansions) {
11892         ExprResult Init = Info.first;
11893         QualType InitQualType = Info.second;
11894         if (Init.isInvalid() || InitQualType.isNull()) {
11895           Invalid = true;
11896           break;
11897         }
11898         VarDecl *NewVD = getSema().createLambdaInitCaptureVarDecl(
11899             OldVD->getLocation(), InitQualType, NewC.EllipsisLoc,
11900             OldVD->getIdentifier(), OldVD->getInitStyle(), Init.get());
11901         if (!NewVD) {
11902           Invalid = true;
11903           break;
11904         }
11905         NewVDs.push_back(NewVD);
11906         getSema().addInitCapture(LSI, NewVD);
11907       }
11908 
11909       if (Invalid)
11910         break;
11911 
11912       getDerived().transformedLocalDecl(OldVD, NewVDs);
11913       continue;
11914     }
11915 
11916     assert(C->capturesVariable() && "unexpected kind of lambda capture");
11917 
11918     // Determine the capture kind for Sema.
11919     Sema::TryCaptureKind Kind
11920       = C->isImplicit()? Sema::TryCapture_Implicit
11921                        : C->getCaptureKind() == LCK_ByCopy
11922                            ? Sema::TryCapture_ExplicitByVal
11923                            : Sema::TryCapture_ExplicitByRef;
11924     SourceLocation EllipsisLoc;
11925     if (C->isPackExpansion()) {
11926       UnexpandedParameterPack Unexpanded(C->getCapturedVar(), C->getLocation());
11927       bool ShouldExpand = false;
11928       bool RetainExpansion = false;
11929       Optional<unsigned> NumExpansions;
11930       if (getDerived().TryExpandParameterPacks(C->getEllipsisLoc(),
11931                                                C->getLocation(),
11932                                                Unexpanded,
11933                                                ShouldExpand, RetainExpansion,
11934                                                NumExpansions)) {
11935         Invalid = true;
11936         continue;
11937       }
11938 
11939       if (ShouldExpand) {
11940         // The transform has determined that we should perform an expansion;
11941         // transform and capture each of the arguments.
11942         // expansion of the pattern. Do so.
11943         VarDecl *Pack = C->getCapturedVar();
11944         for (unsigned I = 0; I != *NumExpansions; ++I) {
11945           Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
11946           VarDecl *CapturedVar
11947             = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(),
11948                                                                Pack));
11949           if (!CapturedVar) {
11950             Invalid = true;
11951             continue;
11952           }
11953 
11954           // Capture the transformed variable.
11955           getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind);
11956         }
11957 
11958         // FIXME: Retain a pack expansion if RetainExpansion is true.
11959 
11960         continue;
11961       }
11962 
11963       EllipsisLoc = C->getEllipsisLoc();
11964     }
11965 
11966     // Transform the captured variable.
11967     VarDecl *CapturedVar
11968       = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(),
11969                                                          C->getCapturedVar()));
11970     if (!CapturedVar || CapturedVar->isInvalidDecl()) {
11971       Invalid = true;
11972       continue;
11973     }
11974 
11975     // Capture the transformed variable.
11976     getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind,
11977                                  EllipsisLoc);
11978   }
11979   getSema().finishLambdaExplicitCaptures(LSI);
11980 
11981   // FIXME: Sema's lambda-building mechanism expects us to push an expression
11982   // evaluation context even if we're not transforming the function body.
11983   getSema().PushExpressionEvaluationContext(
11984       Sema::ExpressionEvaluationContext::PotentiallyEvaluated);
11985 
11986   // Instantiate the body of the lambda expression.
11987   StmtResult Body =
11988       Invalid ? StmtError() : getDerived().TransformLambdaBody(E, E->getBody());
11989 
11990   // ActOnLambda* will pop the function scope for us.
11991   FuncScopeCleanup.disable();
11992 
11993   if (Body.isInvalid()) {
11994     SavedContext.pop();
11995     getSema().ActOnLambdaError(E->getBeginLoc(), /*CurScope=*/nullptr,
11996                                /*IsInstantiation=*/true);
11997     return ExprError();
11998   }
11999 
12000   // Copy the LSI before ActOnFinishFunctionBody removes it.
12001   // FIXME: This is dumb. Store the lambda information somewhere that outlives
12002   // the call operator.
12003   auto LSICopy = *LSI;
12004   getSema().ActOnFinishFunctionBody(NewCallOperator, Body.get(),
12005                                     /*IsInstantiation*/ true);
12006   SavedContext.pop();
12007 
12008   return getSema().BuildLambdaExpr(E->getBeginLoc(), Body.get()->getEndLoc(),
12009                                    &LSICopy);
12010 }
12011 
12012 template<typename Derived>
12013 StmtResult
12014 TreeTransform<Derived>::TransformLambdaBody(LambdaExpr *E, Stmt *S) {
12015   return TransformStmt(S);
12016 }
12017 
12018 template<typename Derived>
12019 StmtResult
12020 TreeTransform<Derived>::SkipLambdaBody(LambdaExpr *E, Stmt *S) {
12021   // Transform captures.
12022   for (LambdaExpr::capture_iterator C = E->capture_begin(),
12023                                  CEnd = E->capture_end();
12024        C != CEnd; ++C) {
12025     // When we hit the first implicit capture, tell Sema that we've finished
12026     // the list of explicit captures.
12027     if (!C->isImplicit())
12028       continue;
12029 
12030     // Capturing 'this' is trivial.
12031     if (C->capturesThis()) {
12032       getSema().CheckCXXThisCapture(C->getLocation(), C->isExplicit(),
12033                                     /*BuildAndDiagnose*/ true, nullptr,
12034                                     C->getCaptureKind() == LCK_StarThis);
12035       continue;
12036     }
12037     // Captured expression will be recaptured during captured variables
12038     // rebuilding.
12039     if (C->capturesVLAType())
12040       continue;
12041 
12042     assert(C->capturesVariable() && "unexpected kind of lambda capture");
12043     assert(!E->isInitCapture(C) && "implicit init-capture?");
12044 
12045     // Transform the captured variable.
12046     VarDecl *CapturedVar = cast_or_null<VarDecl>(
12047         getDerived().TransformDecl(C->getLocation(), C->getCapturedVar()));
12048     if (!CapturedVar || CapturedVar->isInvalidDecl())
12049       return StmtError();
12050 
12051     // Capture the transformed variable.
12052     getSema().tryCaptureVariable(CapturedVar, C->getLocation());
12053   }
12054 
12055   return S;
12056 }
12057 
12058 template<typename Derived>
12059 ExprResult
12060 TreeTransform<Derived>::TransformCXXUnresolvedConstructExpr(
12061                                                   CXXUnresolvedConstructExpr *E) {
12062   TypeSourceInfo *T =
12063       getDerived().TransformTypeWithDeducedTST(E->getTypeSourceInfo());
12064   if (!T)
12065     return ExprError();
12066 
12067   bool ArgumentChanged = false;
12068   SmallVector<Expr*, 8> Args;
12069   Args.reserve(E->arg_size());
12070   {
12071     EnterExpressionEvaluationContext Context(
12072         getSema(), EnterExpressionEvaluationContext::InitList,
12073         E->isListInitialization());
12074     if (getDerived().TransformExprs(E->arg_begin(), E->arg_size(), true, Args,
12075                                     &ArgumentChanged))
12076       return ExprError();
12077   }
12078 
12079   if (!getDerived().AlwaysRebuild() &&
12080       T == E->getTypeSourceInfo() &&
12081       !ArgumentChanged)
12082     return E;
12083 
12084   // FIXME: we're faking the locations of the commas
12085   return getDerived().RebuildCXXUnresolvedConstructExpr(
12086       T, E->getLParenLoc(), Args, E->getRParenLoc(), E->isListInitialization());
12087 }
12088 
12089 template<typename Derived>
12090 ExprResult
12091 TreeTransform<Derived>::TransformCXXDependentScopeMemberExpr(
12092                                              CXXDependentScopeMemberExpr *E) {
12093   // Transform the base of the expression.
12094   ExprResult Base((Expr*) nullptr);
12095   Expr *OldBase;
12096   QualType BaseType;
12097   QualType ObjectType;
12098   if (!E->isImplicitAccess()) {
12099     OldBase = E->getBase();
12100     Base = getDerived().TransformExpr(OldBase);
12101     if (Base.isInvalid())
12102       return ExprError();
12103 
12104     // Start the member reference and compute the object's type.
12105     ParsedType ObjectTy;
12106     bool MayBePseudoDestructor = false;
12107     Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(),
12108                                                 E->getOperatorLoc(),
12109                                       E->isArrow()? tok::arrow : tok::period,
12110                                                 ObjectTy,
12111                                                 MayBePseudoDestructor);
12112     if (Base.isInvalid())
12113       return ExprError();
12114 
12115     ObjectType = ObjectTy.get();
12116     BaseType = ((Expr*) Base.get())->getType();
12117   } else {
12118     OldBase = nullptr;
12119     BaseType = getDerived().TransformType(E->getBaseType());
12120     ObjectType = BaseType->castAs<PointerType>()->getPointeeType();
12121   }
12122 
12123   // Transform the first part of the nested-name-specifier that qualifies
12124   // the member name.
12125   NamedDecl *FirstQualifierInScope
12126     = getDerived().TransformFirstQualifierInScope(
12127                                             E->getFirstQualifierFoundInScope(),
12128                                             E->getQualifierLoc().getBeginLoc());
12129 
12130   NestedNameSpecifierLoc QualifierLoc;
12131   if (E->getQualifier()) {
12132     QualifierLoc
12133       = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc(),
12134                                                      ObjectType,
12135                                                      FirstQualifierInScope);
12136     if (!QualifierLoc)
12137       return ExprError();
12138   }
12139 
12140   SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc();
12141 
12142   // TODO: If this is a conversion-function-id, verify that the
12143   // destination type name (if present) resolves the same way after
12144   // instantiation as it did in the local scope.
12145 
12146   DeclarationNameInfo NameInfo
12147     = getDerived().TransformDeclarationNameInfo(E->getMemberNameInfo());
12148   if (!NameInfo.getName())
12149     return ExprError();
12150 
12151   if (!E->hasExplicitTemplateArgs()) {
12152     // This is a reference to a member without an explicitly-specified
12153     // template argument list. Optimize for this common case.
12154     if (!getDerived().AlwaysRebuild() &&
12155         Base.get() == OldBase &&
12156         BaseType == E->getBaseType() &&
12157         QualifierLoc == E->getQualifierLoc() &&
12158         NameInfo.getName() == E->getMember() &&
12159         FirstQualifierInScope == E->getFirstQualifierFoundInScope())
12160       return E;
12161 
12162     return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(),
12163                                                        BaseType,
12164                                                        E->isArrow(),
12165                                                        E->getOperatorLoc(),
12166                                                        QualifierLoc,
12167                                                        TemplateKWLoc,
12168                                                        FirstQualifierInScope,
12169                                                        NameInfo,
12170                                                        /*TemplateArgs*/nullptr);
12171   }
12172 
12173   TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc());
12174   if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
12175                                               E->getNumTemplateArgs(),
12176                                               TransArgs))
12177     return ExprError();
12178 
12179   return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(),
12180                                                      BaseType,
12181                                                      E->isArrow(),
12182                                                      E->getOperatorLoc(),
12183                                                      QualifierLoc,
12184                                                      TemplateKWLoc,
12185                                                      FirstQualifierInScope,
12186                                                      NameInfo,
12187                                                      &TransArgs);
12188 }
12189 
12190 template<typename Derived>
12191 ExprResult
12192 TreeTransform<Derived>::TransformUnresolvedMemberExpr(UnresolvedMemberExpr *Old) {
12193   // Transform the base of the expression.
12194   ExprResult Base((Expr*) nullptr);
12195   QualType BaseType;
12196   if (!Old->isImplicitAccess()) {
12197     Base = getDerived().TransformExpr(Old->getBase());
12198     if (Base.isInvalid())
12199       return ExprError();
12200     Base = getSema().PerformMemberExprBaseConversion(Base.get(),
12201                                                      Old->isArrow());
12202     if (Base.isInvalid())
12203       return ExprError();
12204     BaseType = Base.get()->getType();
12205   } else {
12206     BaseType = getDerived().TransformType(Old->getBaseType());
12207   }
12208 
12209   NestedNameSpecifierLoc QualifierLoc;
12210   if (Old->getQualifierLoc()) {
12211     QualifierLoc
12212     = getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc());
12213     if (!QualifierLoc)
12214       return ExprError();
12215   }
12216 
12217   SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc();
12218 
12219   LookupResult R(SemaRef, Old->getMemberNameInfo(),
12220                  Sema::LookupOrdinaryName);
12221 
12222   // Transform the declaration set.
12223   if (TransformOverloadExprDecls(Old, /*RequiresADL*/false, R))
12224     return ExprError();
12225 
12226   // Determine the naming class.
12227   if (Old->getNamingClass()) {
12228     CXXRecordDecl *NamingClass
12229       = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl(
12230                                                           Old->getMemberLoc(),
12231                                                         Old->getNamingClass()));
12232     if (!NamingClass)
12233       return ExprError();
12234 
12235     R.setNamingClass(NamingClass);
12236   }
12237 
12238   TemplateArgumentListInfo TransArgs;
12239   if (Old->hasExplicitTemplateArgs()) {
12240     TransArgs.setLAngleLoc(Old->getLAngleLoc());
12241     TransArgs.setRAngleLoc(Old->getRAngleLoc());
12242     if (getDerived().TransformTemplateArguments(Old->getTemplateArgs(),
12243                                                 Old->getNumTemplateArgs(),
12244                                                 TransArgs))
12245       return ExprError();
12246   }
12247 
12248   // FIXME: to do this check properly, we will need to preserve the
12249   // first-qualifier-in-scope here, just in case we had a dependent
12250   // base (and therefore couldn't do the check) and a
12251   // nested-name-qualifier (and therefore could do the lookup).
12252   NamedDecl *FirstQualifierInScope = nullptr;
12253 
12254   return getDerived().RebuildUnresolvedMemberExpr(Base.get(),
12255                                                   BaseType,
12256                                                   Old->getOperatorLoc(),
12257                                                   Old->isArrow(),
12258                                                   QualifierLoc,
12259                                                   TemplateKWLoc,
12260                                                   FirstQualifierInScope,
12261                                                   R,
12262                                               (Old->hasExplicitTemplateArgs()
12263                                                   ? &TransArgs : nullptr));
12264 }
12265 
12266 template<typename Derived>
12267 ExprResult
12268 TreeTransform<Derived>::TransformCXXNoexceptExpr(CXXNoexceptExpr *E) {
12269   EnterExpressionEvaluationContext Unevaluated(
12270       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
12271   ExprResult SubExpr = getDerived().TransformExpr(E->getOperand());
12272   if (SubExpr.isInvalid())
12273     return ExprError();
12274 
12275   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getOperand())
12276     return E;
12277 
12278   return getDerived().RebuildCXXNoexceptExpr(E->getSourceRange(),SubExpr.get());
12279 }
12280 
12281 template<typename Derived>
12282 ExprResult
12283 TreeTransform<Derived>::TransformPackExpansionExpr(PackExpansionExpr *E) {
12284   ExprResult Pattern = getDerived().TransformExpr(E->getPattern());
12285   if (Pattern.isInvalid())
12286     return ExprError();
12287 
12288   if (!getDerived().AlwaysRebuild() && Pattern.get() == E->getPattern())
12289     return E;
12290 
12291   return getDerived().RebuildPackExpansion(Pattern.get(), E->getEllipsisLoc(),
12292                                            E->getNumExpansions());
12293 }
12294 
12295 template<typename Derived>
12296 ExprResult
12297 TreeTransform<Derived>::TransformSizeOfPackExpr(SizeOfPackExpr *E) {
12298   // If E is not value-dependent, then nothing will change when we transform it.
12299   // Note: This is an instantiation-centric view.
12300   if (!E->isValueDependent())
12301     return E;
12302 
12303   EnterExpressionEvaluationContext Unevaluated(
12304       getSema(), Sema::ExpressionEvaluationContext::Unevaluated);
12305 
12306   ArrayRef<TemplateArgument> PackArgs;
12307   TemplateArgument ArgStorage;
12308 
12309   // Find the argument list to transform.
12310   if (E->isPartiallySubstituted()) {
12311     PackArgs = E->getPartialArguments();
12312   } else if (E->isValueDependent()) {
12313     UnexpandedParameterPack Unexpanded(E->getPack(), E->getPackLoc());
12314     bool ShouldExpand = false;
12315     bool RetainExpansion = false;
12316     Optional<unsigned> NumExpansions;
12317     if (getDerived().TryExpandParameterPacks(E->getOperatorLoc(), E->getPackLoc(),
12318                                              Unexpanded,
12319                                              ShouldExpand, RetainExpansion,
12320                                              NumExpansions))
12321       return ExprError();
12322 
12323     // If we need to expand the pack, build a template argument from it and
12324     // expand that.
12325     if (ShouldExpand) {
12326       auto *Pack = E->getPack();
12327       if (auto *TTPD = dyn_cast<TemplateTypeParmDecl>(Pack)) {
12328         ArgStorage = getSema().Context.getPackExpansionType(
12329             getSema().Context.getTypeDeclType(TTPD), None);
12330       } else if (auto *TTPD = dyn_cast<TemplateTemplateParmDecl>(Pack)) {
12331         ArgStorage = TemplateArgument(TemplateName(TTPD), None);
12332       } else {
12333         auto *VD = cast<ValueDecl>(Pack);
12334         ExprResult DRE = getSema().BuildDeclRefExpr(
12335             VD, VD->getType().getNonLValueExprType(getSema().Context),
12336             VD->getType()->isReferenceType() ? VK_LValue : VK_RValue,
12337             E->getPackLoc());
12338         if (DRE.isInvalid())
12339           return ExprError();
12340         ArgStorage = new (getSema().Context) PackExpansionExpr(
12341             getSema().Context.DependentTy, DRE.get(), E->getPackLoc(), None);
12342       }
12343       PackArgs = ArgStorage;
12344     }
12345   }
12346 
12347   // If we're not expanding the pack, just transform the decl.
12348   if (!PackArgs.size()) {
12349     auto *Pack = cast_or_null<NamedDecl>(
12350         getDerived().TransformDecl(E->getPackLoc(), E->getPack()));
12351     if (!Pack)
12352       return ExprError();
12353     return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), Pack,
12354                                               E->getPackLoc(),
12355                                               E->getRParenLoc(), None, None);
12356   }
12357 
12358   // Try to compute the result without performing a partial substitution.
12359   Optional<unsigned> Result = 0;
12360   for (const TemplateArgument &Arg : PackArgs) {
12361     if (!Arg.isPackExpansion()) {
12362       Result = *Result + 1;
12363       continue;
12364     }
12365 
12366     TemplateArgumentLoc ArgLoc;
12367     InventTemplateArgumentLoc(Arg, ArgLoc);
12368 
12369     // Find the pattern of the pack expansion.
12370     SourceLocation Ellipsis;
12371     Optional<unsigned> OrigNumExpansions;
12372     TemplateArgumentLoc Pattern =
12373         getSema().getTemplateArgumentPackExpansionPattern(ArgLoc, Ellipsis,
12374                                                           OrigNumExpansions);
12375 
12376     // Substitute under the pack expansion. Do not expand the pack (yet).
12377     TemplateArgumentLoc OutPattern;
12378     Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
12379     if (getDerived().TransformTemplateArgument(Pattern, OutPattern,
12380                                                /*Uneval*/ true))
12381       return true;
12382 
12383     // See if we can determine the number of arguments from the result.
12384     Optional<unsigned> NumExpansions =
12385         getSema().getFullyPackExpandedSize(OutPattern.getArgument());
12386     if (!NumExpansions) {
12387       // No: we must be in an alias template expansion, and we're going to need
12388       // to actually expand the packs.
12389       Result = None;
12390       break;
12391     }
12392 
12393     Result = *Result + *NumExpansions;
12394   }
12395 
12396   // Common case: we could determine the number of expansions without
12397   // substituting.
12398   if (Result)
12399     return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(),
12400                                               E->getPackLoc(),
12401                                               E->getRParenLoc(), *Result, None);
12402 
12403   TemplateArgumentListInfo TransformedPackArgs(E->getPackLoc(),
12404                                                E->getPackLoc());
12405   {
12406     TemporaryBase Rebase(*this, E->getPackLoc(), getBaseEntity());
12407     typedef TemplateArgumentLocInventIterator<
12408         Derived, const TemplateArgument*> PackLocIterator;
12409     if (TransformTemplateArguments(PackLocIterator(*this, PackArgs.begin()),
12410                                    PackLocIterator(*this, PackArgs.end()),
12411                                    TransformedPackArgs, /*Uneval*/true))
12412       return ExprError();
12413   }
12414 
12415   // Check whether we managed to fully-expand the pack.
12416   // FIXME: Is it possible for us to do so and not hit the early exit path?
12417   SmallVector<TemplateArgument, 8> Args;
12418   bool PartialSubstitution = false;
12419   for (auto &Loc : TransformedPackArgs.arguments()) {
12420     Args.push_back(Loc.getArgument());
12421     if (Loc.getArgument().isPackExpansion())
12422       PartialSubstitution = true;
12423   }
12424 
12425   if (PartialSubstitution)
12426     return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(),
12427                                               E->getPackLoc(),
12428                                               E->getRParenLoc(), None, Args);
12429 
12430   return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(),
12431                                             E->getPackLoc(), E->getRParenLoc(),
12432                                             Args.size(), None);
12433 }
12434 
12435 template<typename Derived>
12436 ExprResult
12437 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmPackExpr(
12438                                           SubstNonTypeTemplateParmPackExpr *E) {
12439   // Default behavior is to do nothing with this transformation.
12440   return E;
12441 }
12442 
12443 template<typename Derived>
12444 ExprResult
12445 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmExpr(
12446                                           SubstNonTypeTemplateParmExpr *E) {
12447   // Default behavior is to do nothing with this transformation.
12448   return E;
12449 }
12450 
12451 template<typename Derived>
12452 ExprResult
12453 TreeTransform<Derived>::TransformFunctionParmPackExpr(FunctionParmPackExpr *E) {
12454   // Default behavior is to do nothing with this transformation.
12455   return E;
12456 }
12457 
12458 template<typename Derived>
12459 ExprResult
12460 TreeTransform<Derived>::TransformMaterializeTemporaryExpr(
12461                                                   MaterializeTemporaryExpr *E) {
12462   return getDerived().TransformExpr(E->getSubExpr());
12463 }
12464 
12465 template<typename Derived>
12466 ExprResult
12467 TreeTransform<Derived>::TransformCXXFoldExpr(CXXFoldExpr *E) {
12468   Expr *Pattern = E->getPattern();
12469 
12470   SmallVector<UnexpandedParameterPack, 2> Unexpanded;
12471   getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
12472   assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
12473 
12474   // Determine whether the set of unexpanded parameter packs can and should
12475   // be expanded.
12476   bool Expand = true;
12477   bool RetainExpansion = false;
12478   Optional<unsigned> OrigNumExpansions = E->getNumExpansions(),
12479                      NumExpansions = OrigNumExpansions;
12480   if (getDerived().TryExpandParameterPacks(E->getEllipsisLoc(),
12481                                            Pattern->getSourceRange(),
12482                                            Unexpanded,
12483                                            Expand, RetainExpansion,
12484                                            NumExpansions))
12485     return true;
12486 
12487   if (!Expand) {
12488     // Do not expand any packs here, just transform and rebuild a fold
12489     // expression.
12490     Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
12491 
12492     ExprResult LHS =
12493         E->getLHS() ? getDerived().TransformExpr(E->getLHS()) : ExprResult();
12494     if (LHS.isInvalid())
12495       return true;
12496 
12497     ExprResult RHS =
12498         E->getRHS() ? getDerived().TransformExpr(E->getRHS()) : ExprResult();
12499     if (RHS.isInvalid())
12500       return true;
12501 
12502     if (!getDerived().AlwaysRebuild() &&
12503         LHS.get() == E->getLHS() && RHS.get() == E->getRHS())
12504       return E;
12505 
12506     return getDerived().RebuildCXXFoldExpr(
12507         E->getBeginLoc(), LHS.get(), E->getOperator(), E->getEllipsisLoc(),
12508         RHS.get(), E->getEndLoc(), NumExpansions);
12509   }
12510 
12511   // The transform has determined that we should perform an elementwise
12512   // expansion of the pattern. Do so.
12513   ExprResult Result = getDerived().TransformExpr(E->getInit());
12514   if (Result.isInvalid())
12515     return true;
12516   bool LeftFold = E->isLeftFold();
12517 
12518   // If we're retaining an expansion for a right fold, it is the innermost
12519   // component and takes the init (if any).
12520   if (!LeftFold && RetainExpansion) {
12521     ForgetPartiallySubstitutedPackRAII Forget(getDerived());
12522 
12523     ExprResult Out = getDerived().TransformExpr(Pattern);
12524     if (Out.isInvalid())
12525       return true;
12526 
12527     Result = getDerived().RebuildCXXFoldExpr(
12528         E->getBeginLoc(), Out.get(), E->getOperator(), E->getEllipsisLoc(),
12529         Result.get(), E->getEndLoc(), OrigNumExpansions);
12530     if (Result.isInvalid())
12531       return true;
12532   }
12533 
12534   for (unsigned I = 0; I != *NumExpansions; ++I) {
12535     Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(
12536         getSema(), LeftFold ? I : *NumExpansions - I - 1);
12537     ExprResult Out = getDerived().TransformExpr(Pattern);
12538     if (Out.isInvalid())
12539       return true;
12540 
12541     if (Out.get()->containsUnexpandedParameterPack()) {
12542       // We still have a pack; retain a pack expansion for this slice.
12543       Result = getDerived().RebuildCXXFoldExpr(
12544           E->getBeginLoc(), LeftFold ? Result.get() : Out.get(),
12545           E->getOperator(), E->getEllipsisLoc(),
12546           LeftFold ? Out.get() : Result.get(), E->getEndLoc(),
12547           OrigNumExpansions);
12548     } else if (Result.isUsable()) {
12549       // We've got down to a single element; build a binary operator.
12550       Result = getDerived().RebuildBinaryOperator(
12551           E->getEllipsisLoc(), E->getOperator(),
12552           LeftFold ? Result.get() : Out.get(),
12553           LeftFold ? Out.get() : Result.get());
12554     } else
12555       Result = Out;
12556 
12557     if (Result.isInvalid())
12558       return true;
12559   }
12560 
12561   // If we're retaining an expansion for a left fold, it is the outermost
12562   // component and takes the complete expansion so far as its init (if any).
12563   if (LeftFold && RetainExpansion) {
12564     ForgetPartiallySubstitutedPackRAII Forget(getDerived());
12565 
12566     ExprResult Out = getDerived().TransformExpr(Pattern);
12567     if (Out.isInvalid())
12568       return true;
12569 
12570     Result = getDerived().RebuildCXXFoldExpr(
12571         E->getBeginLoc(), Result.get(), E->getOperator(), E->getEllipsisLoc(),
12572         Out.get(), E->getEndLoc(), OrigNumExpansions);
12573     if (Result.isInvalid())
12574       return true;
12575   }
12576 
12577   // If we had no init and an empty pack, and we're not retaining an expansion,
12578   // then produce a fallback value or error.
12579   if (Result.isUnset())
12580     return getDerived().RebuildEmptyCXXFoldExpr(E->getEllipsisLoc(),
12581                                                 E->getOperator());
12582 
12583   return Result;
12584 }
12585 
12586 template<typename Derived>
12587 ExprResult
12588 TreeTransform<Derived>::TransformCXXStdInitializerListExpr(
12589     CXXStdInitializerListExpr *E) {
12590   return getDerived().TransformExpr(E->getSubExpr());
12591 }
12592 
12593 template<typename Derived>
12594 ExprResult
12595 TreeTransform<Derived>::TransformObjCStringLiteral(ObjCStringLiteral *E) {
12596   return SemaRef.MaybeBindToTemporary(E);
12597 }
12598 
12599 template<typename Derived>
12600 ExprResult
12601 TreeTransform<Derived>::TransformObjCBoolLiteralExpr(ObjCBoolLiteralExpr *E) {
12602   return E;
12603 }
12604 
12605 template<typename Derived>
12606 ExprResult
12607 TreeTransform<Derived>::TransformObjCBoxedExpr(ObjCBoxedExpr *E) {
12608   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
12609   if (SubExpr.isInvalid())
12610     return ExprError();
12611 
12612   if (!getDerived().AlwaysRebuild() &&
12613       SubExpr.get() == E->getSubExpr())
12614     return E;
12615 
12616   return getDerived().RebuildObjCBoxedExpr(E->getSourceRange(), SubExpr.get());
12617 }
12618 
12619 template<typename Derived>
12620 ExprResult
12621 TreeTransform<Derived>::TransformObjCArrayLiteral(ObjCArrayLiteral *E) {
12622   // Transform each of the elements.
12623   SmallVector<Expr *, 8> Elements;
12624   bool ArgChanged = false;
12625   if (getDerived().TransformExprs(E->getElements(), E->getNumElements(),
12626                                   /*IsCall=*/false, Elements, &ArgChanged))
12627     return ExprError();
12628 
12629   if (!getDerived().AlwaysRebuild() && !ArgChanged)
12630     return SemaRef.MaybeBindToTemporary(E);
12631 
12632   return getDerived().RebuildObjCArrayLiteral(E->getSourceRange(),
12633                                               Elements.data(),
12634                                               Elements.size());
12635 }
12636 
12637 template<typename Derived>
12638 ExprResult
12639 TreeTransform<Derived>::TransformObjCDictionaryLiteral(
12640                                                     ObjCDictionaryLiteral *E) {
12641   // Transform each of the elements.
12642   SmallVector<ObjCDictionaryElement, 8> Elements;
12643   bool ArgChanged = false;
12644   for (unsigned I = 0, N = E->getNumElements(); I != N; ++I) {
12645     ObjCDictionaryElement OrigElement = E->getKeyValueElement(I);
12646 
12647     if (OrigElement.isPackExpansion()) {
12648       // This key/value element is a pack expansion.
12649       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
12650       getSema().collectUnexpandedParameterPacks(OrigElement.Key, Unexpanded);
12651       getSema().collectUnexpandedParameterPacks(OrigElement.Value, Unexpanded);
12652       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
12653 
12654       // Determine whether the set of unexpanded parameter packs can
12655       // and should be expanded.
12656       bool Expand = true;
12657       bool RetainExpansion = false;
12658       Optional<unsigned> OrigNumExpansions = OrigElement.NumExpansions;
12659       Optional<unsigned> NumExpansions = OrigNumExpansions;
12660       SourceRange PatternRange(OrigElement.Key->getBeginLoc(),
12661                                OrigElement.Value->getEndLoc());
12662       if (getDerived().TryExpandParameterPacks(OrigElement.EllipsisLoc,
12663                                                PatternRange, Unexpanded, Expand,
12664                                                RetainExpansion, NumExpansions))
12665         return ExprError();
12666 
12667       if (!Expand) {
12668         // The transform has determined that we should perform a simple
12669         // transformation on the pack expansion, producing another pack
12670         // expansion.
12671         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
12672         ExprResult Key = getDerived().TransformExpr(OrigElement.Key);
12673         if (Key.isInvalid())
12674           return ExprError();
12675 
12676         if (Key.get() != OrigElement.Key)
12677           ArgChanged = true;
12678 
12679         ExprResult Value = getDerived().TransformExpr(OrigElement.Value);
12680         if (Value.isInvalid())
12681           return ExprError();
12682 
12683         if (Value.get() != OrigElement.Value)
12684           ArgChanged = true;
12685 
12686         ObjCDictionaryElement Expansion = {
12687           Key.get(), Value.get(), OrigElement.EllipsisLoc, NumExpansions
12688         };
12689         Elements.push_back(Expansion);
12690         continue;
12691       }
12692 
12693       // Record right away that the argument was changed.  This needs
12694       // to happen even if the array expands to nothing.
12695       ArgChanged = true;
12696 
12697       // The transform has determined that we should perform an elementwise
12698       // expansion of the pattern. Do so.
12699       for (unsigned I = 0; I != *NumExpansions; ++I) {
12700         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
12701         ExprResult Key = getDerived().TransformExpr(OrigElement.Key);
12702         if (Key.isInvalid())
12703           return ExprError();
12704 
12705         ExprResult Value = getDerived().TransformExpr(OrigElement.Value);
12706         if (Value.isInvalid())
12707           return ExprError();
12708 
12709         ObjCDictionaryElement Element = {
12710           Key.get(), Value.get(), SourceLocation(), NumExpansions
12711         };
12712 
12713         // If any unexpanded parameter packs remain, we still have a
12714         // pack expansion.
12715         // FIXME: Can this really happen?
12716         if (Key.get()->containsUnexpandedParameterPack() ||
12717             Value.get()->containsUnexpandedParameterPack())
12718           Element.EllipsisLoc = OrigElement.EllipsisLoc;
12719 
12720         Elements.push_back(Element);
12721       }
12722 
12723       // FIXME: Retain a pack expansion if RetainExpansion is true.
12724 
12725       // We've finished with this pack expansion.
12726       continue;
12727     }
12728 
12729     // Transform and check key.
12730     ExprResult Key = getDerived().TransformExpr(OrigElement.Key);
12731     if (Key.isInvalid())
12732       return ExprError();
12733 
12734     if (Key.get() != OrigElement.Key)
12735       ArgChanged = true;
12736 
12737     // Transform and check value.
12738     ExprResult Value
12739       = getDerived().TransformExpr(OrigElement.Value);
12740     if (Value.isInvalid())
12741       return ExprError();
12742 
12743     if (Value.get() != OrigElement.Value)
12744       ArgChanged = true;
12745 
12746     ObjCDictionaryElement Element = {
12747       Key.get(), Value.get(), SourceLocation(), None
12748     };
12749     Elements.push_back(Element);
12750   }
12751 
12752   if (!getDerived().AlwaysRebuild() && !ArgChanged)
12753     return SemaRef.MaybeBindToTemporary(E);
12754 
12755   return getDerived().RebuildObjCDictionaryLiteral(E->getSourceRange(),
12756                                                    Elements);
12757 }
12758 
12759 template<typename Derived>
12760 ExprResult
12761 TreeTransform<Derived>::TransformObjCEncodeExpr(ObjCEncodeExpr *E) {
12762   TypeSourceInfo *EncodedTypeInfo
12763     = getDerived().TransformType(E->getEncodedTypeSourceInfo());
12764   if (!EncodedTypeInfo)
12765     return ExprError();
12766 
12767   if (!getDerived().AlwaysRebuild() &&
12768       EncodedTypeInfo == E->getEncodedTypeSourceInfo())
12769     return E;
12770 
12771   return getDerived().RebuildObjCEncodeExpr(E->getAtLoc(),
12772                                             EncodedTypeInfo,
12773                                             E->getRParenLoc());
12774 }
12775 
12776 template<typename Derived>
12777 ExprResult TreeTransform<Derived>::
12778 TransformObjCIndirectCopyRestoreExpr(ObjCIndirectCopyRestoreExpr *E) {
12779   // This is a kind of implicit conversion, and it needs to get dropped
12780   // and recomputed for the same general reasons that ImplicitCastExprs
12781   // do, as well a more specific one: this expression is only valid when
12782   // it appears *immediately* as an argument expression.
12783   return getDerived().TransformExpr(E->getSubExpr());
12784 }
12785 
12786 template<typename Derived>
12787 ExprResult TreeTransform<Derived>::
12788 TransformObjCBridgedCastExpr(ObjCBridgedCastExpr *E) {
12789   TypeSourceInfo *TSInfo
12790     = getDerived().TransformType(E->getTypeInfoAsWritten());
12791   if (!TSInfo)
12792     return ExprError();
12793 
12794   ExprResult Result = getDerived().TransformExpr(E->getSubExpr());
12795   if (Result.isInvalid())
12796     return ExprError();
12797 
12798   if (!getDerived().AlwaysRebuild() &&
12799       TSInfo == E->getTypeInfoAsWritten() &&
12800       Result.get() == E->getSubExpr())
12801     return E;
12802 
12803   return SemaRef.BuildObjCBridgedCast(E->getLParenLoc(), E->getBridgeKind(),
12804                                       E->getBridgeKeywordLoc(), TSInfo,
12805                                       Result.get());
12806 }
12807 
12808 template <typename Derived>
12809 ExprResult TreeTransform<Derived>::TransformObjCAvailabilityCheckExpr(
12810     ObjCAvailabilityCheckExpr *E) {
12811   return E;
12812 }
12813 
12814 template<typename Derived>
12815 ExprResult
12816 TreeTransform<Derived>::TransformObjCMessageExpr(ObjCMessageExpr *E) {
12817   // Transform arguments.
12818   bool ArgChanged = false;
12819   SmallVector<Expr*, 8> Args;
12820   Args.reserve(E->getNumArgs());
12821   if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), false, Args,
12822                                   &ArgChanged))
12823     return ExprError();
12824 
12825   if (E->getReceiverKind() == ObjCMessageExpr::Class) {
12826     // Class message: transform the receiver type.
12827     TypeSourceInfo *ReceiverTypeInfo
12828       = getDerived().TransformType(E->getClassReceiverTypeInfo());
12829     if (!ReceiverTypeInfo)
12830       return ExprError();
12831 
12832     // If nothing changed, just retain the existing message send.
12833     if (!getDerived().AlwaysRebuild() &&
12834         ReceiverTypeInfo == E->getClassReceiverTypeInfo() && !ArgChanged)
12835       return SemaRef.MaybeBindToTemporary(E);
12836 
12837     // Build a new class message send.
12838     SmallVector<SourceLocation, 16> SelLocs;
12839     E->getSelectorLocs(SelLocs);
12840     return getDerived().RebuildObjCMessageExpr(ReceiverTypeInfo,
12841                                                E->getSelector(),
12842                                                SelLocs,
12843                                                E->getMethodDecl(),
12844                                                E->getLeftLoc(),
12845                                                Args,
12846                                                E->getRightLoc());
12847   }
12848   else if (E->getReceiverKind() == ObjCMessageExpr::SuperClass ||
12849            E->getReceiverKind() == ObjCMessageExpr::SuperInstance) {
12850     if (!E->getMethodDecl())
12851       return ExprError();
12852 
12853     // Build a new class message send to 'super'.
12854     SmallVector<SourceLocation, 16> SelLocs;
12855     E->getSelectorLocs(SelLocs);
12856     return getDerived().RebuildObjCMessageExpr(E->getSuperLoc(),
12857                                                E->getSelector(),
12858                                                SelLocs,
12859                                                E->getReceiverType(),
12860                                                E->getMethodDecl(),
12861                                                E->getLeftLoc(),
12862                                                Args,
12863                                                E->getRightLoc());
12864   }
12865 
12866   // Instance message: transform the receiver
12867   assert(E->getReceiverKind() == ObjCMessageExpr::Instance &&
12868          "Only class and instance messages may be instantiated");
12869   ExprResult Receiver
12870     = getDerived().TransformExpr(E->getInstanceReceiver());
12871   if (Receiver.isInvalid())
12872     return ExprError();
12873 
12874   // If nothing changed, just retain the existing message send.
12875   if (!getDerived().AlwaysRebuild() &&
12876       Receiver.get() == E->getInstanceReceiver() && !ArgChanged)
12877     return SemaRef.MaybeBindToTemporary(E);
12878 
12879   // Build a new instance message send.
12880   SmallVector<SourceLocation, 16> SelLocs;
12881   E->getSelectorLocs(SelLocs);
12882   return getDerived().RebuildObjCMessageExpr(Receiver.get(),
12883                                              E->getSelector(),
12884                                              SelLocs,
12885                                              E->getMethodDecl(),
12886                                              E->getLeftLoc(),
12887                                              Args,
12888                                              E->getRightLoc());
12889 }
12890 
12891 template<typename Derived>
12892 ExprResult
12893 TreeTransform<Derived>::TransformObjCSelectorExpr(ObjCSelectorExpr *E) {
12894   return E;
12895 }
12896 
12897 template<typename Derived>
12898 ExprResult
12899 TreeTransform<Derived>::TransformObjCProtocolExpr(ObjCProtocolExpr *E) {
12900   return E;
12901 }
12902 
12903 template<typename Derived>
12904 ExprResult
12905 TreeTransform<Derived>::TransformObjCIvarRefExpr(ObjCIvarRefExpr *E) {
12906   // Transform the base expression.
12907   ExprResult Base = getDerived().TransformExpr(E->getBase());
12908   if (Base.isInvalid())
12909     return ExprError();
12910 
12911   // We don't need to transform the ivar; it will never change.
12912 
12913   // If nothing changed, just retain the existing expression.
12914   if (!getDerived().AlwaysRebuild() &&
12915       Base.get() == E->getBase())
12916     return E;
12917 
12918   return getDerived().RebuildObjCIvarRefExpr(Base.get(), E->getDecl(),
12919                                              E->getLocation(),
12920                                              E->isArrow(), E->isFreeIvar());
12921 }
12922 
12923 template<typename Derived>
12924 ExprResult
12925 TreeTransform<Derived>::TransformObjCPropertyRefExpr(ObjCPropertyRefExpr *E) {
12926   // 'super' and types never change. Property never changes. Just
12927   // retain the existing expression.
12928   if (!E->isObjectReceiver())
12929     return E;
12930 
12931   // Transform the base expression.
12932   ExprResult Base = getDerived().TransformExpr(E->getBase());
12933   if (Base.isInvalid())
12934     return ExprError();
12935 
12936   // We don't need to transform the property; it will never change.
12937 
12938   // If nothing changed, just retain the existing expression.
12939   if (!getDerived().AlwaysRebuild() &&
12940       Base.get() == E->getBase())
12941     return E;
12942 
12943   if (E->isExplicitProperty())
12944     return getDerived().RebuildObjCPropertyRefExpr(Base.get(),
12945                                                    E->getExplicitProperty(),
12946                                                    E->getLocation());
12947 
12948   return getDerived().RebuildObjCPropertyRefExpr(Base.get(),
12949                                                  SemaRef.Context.PseudoObjectTy,
12950                                                  E->getImplicitPropertyGetter(),
12951                                                  E->getImplicitPropertySetter(),
12952                                                  E->getLocation());
12953 }
12954 
12955 template<typename Derived>
12956 ExprResult
12957 TreeTransform<Derived>::TransformObjCSubscriptRefExpr(ObjCSubscriptRefExpr *E) {
12958   // Transform the base expression.
12959   ExprResult Base = getDerived().TransformExpr(E->getBaseExpr());
12960   if (Base.isInvalid())
12961     return ExprError();
12962 
12963   // Transform the key expression.
12964   ExprResult Key = getDerived().TransformExpr(E->getKeyExpr());
12965   if (Key.isInvalid())
12966     return ExprError();
12967 
12968   // If nothing changed, just retain the existing expression.
12969   if (!getDerived().AlwaysRebuild() &&
12970       Key.get() == E->getKeyExpr() && Base.get() == E->getBaseExpr())
12971     return E;
12972 
12973   return getDerived().RebuildObjCSubscriptRefExpr(E->getRBracket(),
12974                                                   Base.get(), Key.get(),
12975                                                   E->getAtIndexMethodDecl(),
12976                                                   E->setAtIndexMethodDecl());
12977 }
12978 
12979 template<typename Derived>
12980 ExprResult
12981 TreeTransform<Derived>::TransformObjCIsaExpr(ObjCIsaExpr *E) {
12982   // Transform the base expression.
12983   ExprResult Base = getDerived().TransformExpr(E->getBase());
12984   if (Base.isInvalid())
12985     return ExprError();
12986 
12987   // If nothing changed, just retain the existing expression.
12988   if (!getDerived().AlwaysRebuild() &&
12989       Base.get() == E->getBase())
12990     return E;
12991 
12992   return getDerived().RebuildObjCIsaExpr(Base.get(), E->getIsaMemberLoc(),
12993                                          E->getOpLoc(),
12994                                          E->isArrow());
12995 }
12996 
12997 template<typename Derived>
12998 ExprResult
12999 TreeTransform<Derived>::TransformShuffleVectorExpr(ShuffleVectorExpr *E) {
13000   bool ArgumentChanged = false;
13001   SmallVector<Expr*, 8> SubExprs;
13002   SubExprs.reserve(E->getNumSubExprs());
13003   if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false,
13004                                   SubExprs, &ArgumentChanged))
13005     return ExprError();
13006 
13007   if (!getDerived().AlwaysRebuild() &&
13008       !ArgumentChanged)
13009     return E;
13010 
13011   return getDerived().RebuildShuffleVectorExpr(E->getBuiltinLoc(),
13012                                                SubExprs,
13013                                                E->getRParenLoc());
13014 }
13015 
13016 template<typename Derived>
13017 ExprResult
13018 TreeTransform<Derived>::TransformConvertVectorExpr(ConvertVectorExpr *E) {
13019   ExprResult SrcExpr = getDerived().TransformExpr(E->getSrcExpr());
13020   if (SrcExpr.isInvalid())
13021     return ExprError();
13022 
13023   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo());
13024   if (!Type)
13025     return ExprError();
13026 
13027   if (!getDerived().AlwaysRebuild() &&
13028       Type == E->getTypeSourceInfo() &&
13029       SrcExpr.get() == E->getSrcExpr())
13030     return E;
13031 
13032   return getDerived().RebuildConvertVectorExpr(E->getBuiltinLoc(),
13033                                                SrcExpr.get(), Type,
13034                                                E->getRParenLoc());
13035 }
13036 
13037 template<typename Derived>
13038 ExprResult
13039 TreeTransform<Derived>::TransformBlockExpr(BlockExpr *E) {
13040   BlockDecl *oldBlock = E->getBlockDecl();
13041 
13042   SemaRef.ActOnBlockStart(E->getCaretLocation(), /*Scope=*/nullptr);
13043   BlockScopeInfo *blockScope = SemaRef.getCurBlock();
13044 
13045   blockScope->TheDecl->setIsVariadic(oldBlock->isVariadic());
13046   blockScope->TheDecl->setBlockMissingReturnType(
13047                          oldBlock->blockMissingReturnType());
13048 
13049   SmallVector<ParmVarDecl*, 4> params;
13050   SmallVector<QualType, 4> paramTypes;
13051 
13052   const FunctionProtoType *exprFunctionType = E->getFunctionType();
13053 
13054   // Parameter substitution.
13055   Sema::ExtParameterInfoBuilder extParamInfos;
13056   if (getDerived().TransformFunctionTypeParams(
13057           E->getCaretLocation(), oldBlock->parameters(), nullptr,
13058           exprFunctionType->getExtParameterInfosOrNull(), paramTypes, &params,
13059           extParamInfos)) {
13060     getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr);
13061     return ExprError();
13062   }
13063 
13064   QualType exprResultType =
13065       getDerived().TransformType(exprFunctionType->getReturnType());
13066 
13067   auto epi = exprFunctionType->getExtProtoInfo();
13068   epi.ExtParameterInfos = extParamInfos.getPointerOrNull(paramTypes.size());
13069 
13070   QualType functionType =
13071     getDerived().RebuildFunctionProtoType(exprResultType, paramTypes, epi);
13072   blockScope->FunctionType = functionType;
13073 
13074   // Set the parameters on the block decl.
13075   if (!params.empty())
13076     blockScope->TheDecl->setParams(params);
13077 
13078   if (!oldBlock->blockMissingReturnType()) {
13079     blockScope->HasImplicitReturnType = false;
13080     blockScope->ReturnType = exprResultType;
13081   }
13082 
13083   // Transform the body
13084   StmtResult body = getDerived().TransformStmt(E->getBody());
13085   if (body.isInvalid()) {
13086     getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr);
13087     return ExprError();
13088   }
13089 
13090 #ifndef NDEBUG
13091   // In builds with assertions, make sure that we captured everything we
13092   // captured before.
13093   if (!SemaRef.getDiagnostics().hasErrorOccurred()) {
13094     for (const auto &I : oldBlock->captures()) {
13095       VarDecl *oldCapture = I.getVariable();
13096 
13097       // Ignore parameter packs.
13098       if (oldCapture->isParameterPack())
13099         continue;
13100 
13101       VarDecl *newCapture =
13102         cast<VarDecl>(getDerived().TransformDecl(E->getCaretLocation(),
13103                                                  oldCapture));
13104       assert(blockScope->CaptureMap.count(newCapture));
13105     }
13106     assert(oldBlock->capturesCXXThis() == blockScope->isCXXThisCaptured());
13107   }
13108 #endif
13109 
13110   return SemaRef.ActOnBlockStmtExpr(E->getCaretLocation(), body.get(),
13111                                     /*Scope=*/nullptr);
13112 }
13113 
13114 template<typename Derived>
13115 ExprResult
13116 TreeTransform<Derived>::TransformAsTypeExpr(AsTypeExpr *E) {
13117   llvm_unreachable("Cannot transform asType expressions yet");
13118 }
13119 
13120 template<typename Derived>
13121 ExprResult
13122 TreeTransform<Derived>::TransformAtomicExpr(AtomicExpr *E) {
13123   bool ArgumentChanged = false;
13124   SmallVector<Expr*, 8> SubExprs;
13125   SubExprs.reserve(E->getNumSubExprs());
13126   if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false,
13127                                   SubExprs, &ArgumentChanged))
13128     return ExprError();
13129 
13130   if (!getDerived().AlwaysRebuild() &&
13131       !ArgumentChanged)
13132     return E;
13133 
13134   return getDerived().RebuildAtomicExpr(E->getBuiltinLoc(), SubExprs,
13135                                         E->getOp(), E->getRParenLoc());
13136 }
13137 
13138 //===----------------------------------------------------------------------===//
13139 // Type reconstruction
13140 //===----------------------------------------------------------------------===//
13141 
13142 template<typename Derived>
13143 QualType TreeTransform<Derived>::RebuildPointerType(QualType PointeeType,
13144                                                     SourceLocation Star) {
13145   return SemaRef.BuildPointerType(PointeeType, Star,
13146                                   getDerived().getBaseEntity());
13147 }
13148 
13149 template<typename Derived>
13150 QualType TreeTransform<Derived>::RebuildBlockPointerType(QualType PointeeType,
13151                                                          SourceLocation Star) {
13152   return SemaRef.BuildBlockPointerType(PointeeType, Star,
13153                                        getDerived().getBaseEntity());
13154 }
13155 
13156 template<typename Derived>
13157 QualType
13158 TreeTransform<Derived>::RebuildReferenceType(QualType ReferentType,
13159                                              bool WrittenAsLValue,
13160                                              SourceLocation Sigil) {
13161   return SemaRef.BuildReferenceType(ReferentType, WrittenAsLValue,
13162                                     Sigil, getDerived().getBaseEntity());
13163 }
13164 
13165 template<typename Derived>
13166 QualType
13167 TreeTransform<Derived>::RebuildMemberPointerType(QualType PointeeType,
13168                                                  QualType ClassType,
13169                                                  SourceLocation Sigil) {
13170   return SemaRef.BuildMemberPointerType(PointeeType, ClassType, Sigil,
13171                                         getDerived().getBaseEntity());
13172 }
13173 
13174 template<typename Derived>
13175 QualType TreeTransform<Derived>::RebuildObjCTypeParamType(
13176            const ObjCTypeParamDecl *Decl,
13177            SourceLocation ProtocolLAngleLoc,
13178            ArrayRef<ObjCProtocolDecl *> Protocols,
13179            ArrayRef<SourceLocation> ProtocolLocs,
13180            SourceLocation ProtocolRAngleLoc) {
13181   return SemaRef.BuildObjCTypeParamType(Decl,
13182                                         ProtocolLAngleLoc, Protocols,
13183                                         ProtocolLocs, ProtocolRAngleLoc,
13184                                         /*FailOnError=*/true);
13185 }
13186 
13187 template<typename Derived>
13188 QualType TreeTransform<Derived>::RebuildObjCObjectType(
13189            QualType BaseType,
13190            SourceLocation Loc,
13191            SourceLocation TypeArgsLAngleLoc,
13192            ArrayRef<TypeSourceInfo *> TypeArgs,
13193            SourceLocation TypeArgsRAngleLoc,
13194            SourceLocation ProtocolLAngleLoc,
13195            ArrayRef<ObjCProtocolDecl *> Protocols,
13196            ArrayRef<SourceLocation> ProtocolLocs,
13197            SourceLocation ProtocolRAngleLoc) {
13198   return SemaRef.BuildObjCObjectType(BaseType, Loc, TypeArgsLAngleLoc,
13199                                      TypeArgs, TypeArgsRAngleLoc,
13200                                      ProtocolLAngleLoc, Protocols, ProtocolLocs,
13201                                      ProtocolRAngleLoc,
13202                                      /*FailOnError=*/true);
13203 }
13204 
13205 template<typename Derived>
13206 QualType TreeTransform<Derived>::RebuildObjCObjectPointerType(
13207            QualType PointeeType,
13208            SourceLocation Star) {
13209   return SemaRef.Context.getObjCObjectPointerType(PointeeType);
13210 }
13211 
13212 template<typename Derived>
13213 QualType
13214 TreeTransform<Derived>::RebuildArrayType(QualType ElementType,
13215                                          ArrayType::ArraySizeModifier SizeMod,
13216                                          const llvm::APInt *Size,
13217                                          Expr *SizeExpr,
13218                                          unsigned IndexTypeQuals,
13219                                          SourceRange BracketsRange) {
13220   if (SizeExpr || !Size)
13221     return SemaRef.BuildArrayType(ElementType, SizeMod, SizeExpr,
13222                                   IndexTypeQuals, BracketsRange,
13223                                   getDerived().getBaseEntity());
13224 
13225   QualType Types[] = {
13226     SemaRef.Context.UnsignedCharTy, SemaRef.Context.UnsignedShortTy,
13227     SemaRef.Context.UnsignedIntTy, SemaRef.Context.UnsignedLongTy,
13228     SemaRef.Context.UnsignedLongLongTy, SemaRef.Context.UnsignedInt128Ty
13229   };
13230   const unsigned NumTypes = llvm::array_lengthof(Types);
13231   QualType SizeType;
13232   for (unsigned I = 0; I != NumTypes; ++I)
13233     if (Size->getBitWidth() == SemaRef.Context.getIntWidth(Types[I])) {
13234       SizeType = Types[I];
13235       break;
13236     }
13237 
13238   // Note that we can return a VariableArrayType here in the case where
13239   // the element type was a dependent VariableArrayType.
13240   IntegerLiteral *ArraySize
13241       = IntegerLiteral::Create(SemaRef.Context, *Size, SizeType,
13242                                /*FIXME*/BracketsRange.getBegin());
13243   return SemaRef.BuildArrayType(ElementType, SizeMod, ArraySize,
13244                                 IndexTypeQuals, BracketsRange,
13245                                 getDerived().getBaseEntity());
13246 }
13247 
13248 template<typename Derived>
13249 QualType
13250 TreeTransform<Derived>::RebuildConstantArrayType(QualType ElementType,
13251                                                  ArrayType::ArraySizeModifier SizeMod,
13252                                                  const llvm::APInt &Size,
13253                                                  Expr *SizeExpr,
13254                                                  unsigned IndexTypeQuals,
13255                                                  SourceRange BracketsRange) {
13256   return getDerived().RebuildArrayType(ElementType, SizeMod, &Size, SizeExpr,
13257                                         IndexTypeQuals, BracketsRange);
13258 }
13259 
13260 template<typename Derived>
13261 QualType
13262 TreeTransform<Derived>::RebuildIncompleteArrayType(QualType ElementType,
13263                                           ArrayType::ArraySizeModifier SizeMod,
13264                                                  unsigned IndexTypeQuals,
13265                                                    SourceRange BracketsRange) {
13266   return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr, nullptr,
13267                                        IndexTypeQuals, BracketsRange);
13268 }
13269 
13270 template<typename Derived>
13271 QualType
13272 TreeTransform<Derived>::RebuildVariableArrayType(QualType ElementType,
13273                                           ArrayType::ArraySizeModifier SizeMod,
13274                                                  Expr *SizeExpr,
13275                                                  unsigned IndexTypeQuals,
13276                                                  SourceRange BracketsRange) {
13277   return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr,
13278                                        SizeExpr,
13279                                        IndexTypeQuals, BracketsRange);
13280 }
13281 
13282 template<typename Derived>
13283 QualType
13284 TreeTransform<Derived>::RebuildDependentSizedArrayType(QualType ElementType,
13285                                           ArrayType::ArraySizeModifier SizeMod,
13286                                                        Expr *SizeExpr,
13287                                                        unsigned IndexTypeQuals,
13288                                                    SourceRange BracketsRange) {
13289   return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr,
13290                                        SizeExpr,
13291                                        IndexTypeQuals, BracketsRange);
13292 }
13293 
13294 template <typename Derived>
13295 QualType TreeTransform<Derived>::RebuildDependentAddressSpaceType(
13296     QualType PointeeType, Expr *AddrSpaceExpr, SourceLocation AttributeLoc) {
13297   return SemaRef.BuildAddressSpaceAttr(PointeeType, AddrSpaceExpr,
13298                                           AttributeLoc);
13299 }
13300 
13301 template <typename Derived>
13302 QualType
13303 TreeTransform<Derived>::RebuildVectorType(QualType ElementType,
13304                                           unsigned NumElements,
13305                                           VectorType::VectorKind VecKind) {
13306   // FIXME: semantic checking!
13307   return SemaRef.Context.getVectorType(ElementType, NumElements, VecKind);
13308 }
13309 
13310 template <typename Derived>
13311 QualType TreeTransform<Derived>::RebuildDependentVectorType(
13312     QualType ElementType, Expr *SizeExpr, SourceLocation AttributeLoc,
13313     VectorType::VectorKind VecKind) {
13314   return SemaRef.BuildVectorType(ElementType, SizeExpr, AttributeLoc);
13315 }
13316 
13317 template<typename Derived>
13318 QualType TreeTransform<Derived>::RebuildExtVectorType(QualType ElementType,
13319                                                       unsigned NumElements,
13320                                                  SourceLocation AttributeLoc) {
13321   llvm::APInt numElements(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy),
13322                           NumElements, true);
13323   IntegerLiteral *VectorSize
13324     = IntegerLiteral::Create(SemaRef.Context, numElements, SemaRef.Context.IntTy,
13325                              AttributeLoc);
13326   return SemaRef.BuildExtVectorType(ElementType, VectorSize, AttributeLoc);
13327 }
13328 
13329 template<typename Derived>
13330 QualType
13331 TreeTransform<Derived>::RebuildDependentSizedExtVectorType(QualType ElementType,
13332                                                            Expr *SizeExpr,
13333                                                   SourceLocation AttributeLoc) {
13334   return SemaRef.BuildExtVectorType(ElementType, SizeExpr, AttributeLoc);
13335 }
13336 
13337 template<typename Derived>
13338 QualType TreeTransform<Derived>::RebuildFunctionProtoType(
13339     QualType T,
13340     MutableArrayRef<QualType> ParamTypes,
13341     const FunctionProtoType::ExtProtoInfo &EPI) {
13342   return SemaRef.BuildFunctionType(T, ParamTypes,
13343                                    getDerived().getBaseLocation(),
13344                                    getDerived().getBaseEntity(),
13345                                    EPI);
13346 }
13347 
13348 template<typename Derived>
13349 QualType TreeTransform<Derived>::RebuildFunctionNoProtoType(QualType T) {
13350   return SemaRef.Context.getFunctionNoProtoType(T);
13351 }
13352 
13353 template<typename Derived>
13354 QualType TreeTransform<Derived>::RebuildUnresolvedUsingType(SourceLocation Loc,
13355                                                             Decl *D) {
13356   assert(D && "no decl found");
13357   if (D->isInvalidDecl()) return QualType();
13358 
13359   // FIXME: Doesn't account for ObjCInterfaceDecl!
13360   TypeDecl *Ty;
13361   if (auto *UPD = dyn_cast<UsingPackDecl>(D)) {
13362     // A valid resolved using typename pack expansion decl can have multiple
13363     // UsingDecls, but they must each have exactly one type, and it must be
13364     // the same type in every case. But we must have at least one expansion!
13365     if (UPD->expansions().empty()) {
13366       getSema().Diag(Loc, diag::err_using_pack_expansion_empty)
13367           << UPD->isCXXClassMember() << UPD;
13368       return QualType();
13369     }
13370 
13371     // We might still have some unresolved types. Try to pick a resolved type
13372     // if we can. The final instantiation will check that the remaining
13373     // unresolved types instantiate to the type we pick.
13374     QualType FallbackT;
13375     QualType T;
13376     for (auto *E : UPD->expansions()) {
13377       QualType ThisT = RebuildUnresolvedUsingType(Loc, E);
13378       if (ThisT.isNull())
13379         continue;
13380       else if (ThisT->getAs<UnresolvedUsingType>())
13381         FallbackT = ThisT;
13382       else if (T.isNull())
13383         T = ThisT;
13384       else
13385         assert(getSema().Context.hasSameType(ThisT, T) &&
13386                "mismatched resolved types in using pack expansion");
13387     }
13388     return T.isNull() ? FallbackT : T;
13389   } else if (auto *Using = dyn_cast<UsingDecl>(D)) {
13390     assert(Using->hasTypename() &&
13391            "UnresolvedUsingTypenameDecl transformed to non-typename using");
13392 
13393     // A valid resolved using typename decl points to exactly one type decl.
13394     assert(++Using->shadow_begin() == Using->shadow_end());
13395     Ty = cast<TypeDecl>((*Using->shadow_begin())->getTargetDecl());
13396   } else {
13397     assert(isa<UnresolvedUsingTypenameDecl>(D) &&
13398            "UnresolvedUsingTypenameDecl transformed to non-using decl");
13399     Ty = cast<UnresolvedUsingTypenameDecl>(D);
13400   }
13401 
13402   return SemaRef.Context.getTypeDeclType(Ty);
13403 }
13404 
13405 template<typename Derived>
13406 QualType TreeTransform<Derived>::RebuildTypeOfExprType(Expr *E,
13407                                                        SourceLocation Loc) {
13408   return SemaRef.BuildTypeofExprType(E, Loc);
13409 }
13410 
13411 template<typename Derived>
13412 QualType TreeTransform<Derived>::RebuildTypeOfType(QualType Underlying) {
13413   return SemaRef.Context.getTypeOfType(Underlying);
13414 }
13415 
13416 template<typename Derived>
13417 QualType TreeTransform<Derived>::RebuildDecltypeType(Expr *E,
13418                                                      SourceLocation Loc) {
13419   return SemaRef.BuildDecltypeType(E, Loc);
13420 }
13421 
13422 template<typename Derived>
13423 QualType TreeTransform<Derived>::RebuildUnaryTransformType(QualType BaseType,
13424                                             UnaryTransformType::UTTKind UKind,
13425                                             SourceLocation Loc) {
13426   return SemaRef.BuildUnaryTransformType(BaseType, UKind, Loc);
13427 }
13428 
13429 template<typename Derived>
13430 QualType TreeTransform<Derived>::RebuildTemplateSpecializationType(
13431                                                       TemplateName Template,
13432                                              SourceLocation TemplateNameLoc,
13433                                      TemplateArgumentListInfo &TemplateArgs) {
13434   return SemaRef.CheckTemplateIdType(Template, TemplateNameLoc, TemplateArgs);
13435 }
13436 
13437 template<typename Derived>
13438 QualType TreeTransform<Derived>::RebuildAtomicType(QualType ValueType,
13439                                                    SourceLocation KWLoc) {
13440   return SemaRef.BuildAtomicType(ValueType, KWLoc);
13441 }
13442 
13443 template<typename Derived>
13444 QualType TreeTransform<Derived>::RebuildPipeType(QualType ValueType,
13445                                                  SourceLocation KWLoc,
13446                                                  bool isReadPipe) {
13447   return isReadPipe ? SemaRef.BuildReadPipeType(ValueType, KWLoc)
13448                     : SemaRef.BuildWritePipeType(ValueType, KWLoc);
13449 }
13450 
13451 template<typename Derived>
13452 TemplateName
13453 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS,
13454                                             bool TemplateKW,
13455                                             TemplateDecl *Template) {
13456   return SemaRef.Context.getQualifiedTemplateName(SS.getScopeRep(), TemplateKW,
13457                                                   Template);
13458 }
13459 
13460 template<typename Derived>
13461 TemplateName
13462 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS,
13463                                             SourceLocation TemplateKWLoc,
13464                                             const IdentifierInfo &Name,
13465                                             SourceLocation NameLoc,
13466                                             QualType ObjectType,
13467                                             NamedDecl *FirstQualifierInScope,
13468                                             bool AllowInjectedClassName) {
13469   UnqualifiedId TemplateName;
13470   TemplateName.setIdentifier(&Name, NameLoc);
13471   Sema::TemplateTy Template;
13472   getSema().ActOnDependentTemplateName(/*Scope=*/nullptr,
13473                                        SS, TemplateKWLoc, TemplateName,
13474                                        ParsedType::make(ObjectType),
13475                                        /*EnteringContext=*/false,
13476                                        Template, AllowInjectedClassName);
13477   return Template.get();
13478 }
13479 
13480 template<typename Derived>
13481 TemplateName
13482 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS,
13483                                             SourceLocation TemplateKWLoc,
13484                                             OverloadedOperatorKind Operator,
13485                                             SourceLocation NameLoc,
13486                                             QualType ObjectType,
13487                                             bool AllowInjectedClassName) {
13488   UnqualifiedId Name;
13489   // FIXME: Bogus location information.
13490   SourceLocation SymbolLocations[3] = { NameLoc, NameLoc, NameLoc };
13491   Name.setOperatorFunctionId(NameLoc, Operator, SymbolLocations);
13492   Sema::TemplateTy Template;
13493   getSema().ActOnDependentTemplateName(/*Scope=*/nullptr,
13494                                        SS, TemplateKWLoc, Name,
13495                                        ParsedType::make(ObjectType),
13496                                        /*EnteringContext=*/false,
13497                                        Template, AllowInjectedClassName);
13498   return Template.get();
13499 }
13500 
13501 template<typename Derived>
13502 ExprResult
13503 TreeTransform<Derived>::RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op,
13504                                                    SourceLocation OpLoc,
13505                                                    Expr *OrigCallee,
13506                                                    Expr *First,
13507                                                    Expr *Second) {
13508   Expr *Callee = OrigCallee->IgnoreParenCasts();
13509   bool isPostIncDec = Second && (Op == OO_PlusPlus || Op == OO_MinusMinus);
13510 
13511   if (First->getObjectKind() == OK_ObjCProperty) {
13512     BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op);
13513     if (BinaryOperator::isAssignmentOp(Opc))
13514       return SemaRef.checkPseudoObjectAssignment(/*Scope=*/nullptr, OpLoc, Opc,
13515                                                  First, Second);
13516     ExprResult Result = SemaRef.CheckPlaceholderExpr(First);
13517     if (Result.isInvalid())
13518       return ExprError();
13519     First = Result.get();
13520   }
13521 
13522   if (Second && Second->getObjectKind() == OK_ObjCProperty) {
13523     ExprResult Result = SemaRef.CheckPlaceholderExpr(Second);
13524     if (Result.isInvalid())
13525       return ExprError();
13526     Second = Result.get();
13527   }
13528 
13529   // Determine whether this should be a builtin operation.
13530   if (Op == OO_Subscript) {
13531     if (!First->getType()->isOverloadableType() &&
13532         !Second->getType()->isOverloadableType())
13533       return getSema().CreateBuiltinArraySubscriptExpr(
13534           First, Callee->getBeginLoc(), Second, OpLoc);
13535   } else if (Op == OO_Arrow) {
13536     // -> is never a builtin operation.
13537     return SemaRef.BuildOverloadedArrowExpr(nullptr, First, OpLoc);
13538   } else if (Second == nullptr || isPostIncDec) {
13539     if (!First->getType()->isOverloadableType() ||
13540         (Op == OO_Amp && getSema().isQualifiedMemberAccess(First))) {
13541       // The argument is not of overloadable type, or this is an expression
13542       // of the form &Class::member, so try to create a built-in unary
13543       // operation.
13544       UnaryOperatorKind Opc
13545         = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec);
13546 
13547       return getSema().CreateBuiltinUnaryOp(OpLoc, Opc, First);
13548     }
13549   } else {
13550     if (!First->getType()->isOverloadableType() &&
13551         !Second->getType()->isOverloadableType()) {
13552       // Neither of the arguments is an overloadable type, so try to
13553       // create a built-in binary operation.
13554       BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op);
13555       ExprResult Result
13556         = SemaRef.CreateBuiltinBinOp(OpLoc, Opc, First, Second);
13557       if (Result.isInvalid())
13558         return ExprError();
13559 
13560       return Result;
13561     }
13562   }
13563 
13564   // Compute the transformed set of functions (and function templates) to be
13565   // used during overload resolution.
13566   UnresolvedSet<16> Functions;
13567   bool RequiresADL;
13568 
13569   if (UnresolvedLookupExpr *ULE = dyn_cast<UnresolvedLookupExpr>(Callee)) {
13570     Functions.append(ULE->decls_begin(), ULE->decls_end());
13571     // If the overload could not be resolved in the template definition
13572     // (because we had a dependent argument), ADL is performed as part of
13573     // template instantiation.
13574     RequiresADL = ULE->requiresADL();
13575   } else {
13576     // If we've resolved this to a particular non-member function, just call
13577     // that function. If we resolved it to a member function,
13578     // CreateOverloaded* will find that function for us.
13579     NamedDecl *ND = cast<DeclRefExpr>(Callee)->getDecl();
13580     if (!isa<CXXMethodDecl>(ND))
13581       Functions.addDecl(ND);
13582     RequiresADL = false;
13583   }
13584 
13585   // Add any functions found via argument-dependent lookup.
13586   Expr *Args[2] = { First, Second };
13587   unsigned NumArgs = 1 + (Second != nullptr);
13588 
13589   // Create the overloaded operator invocation for unary operators.
13590   if (NumArgs == 1 || isPostIncDec) {
13591     UnaryOperatorKind Opc
13592       = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec);
13593     return SemaRef.CreateOverloadedUnaryOp(OpLoc, Opc, Functions, First,
13594                                            RequiresADL);
13595   }
13596 
13597   if (Op == OO_Subscript) {
13598     SourceLocation LBrace;
13599     SourceLocation RBrace;
13600 
13601     if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Callee)) {
13602         DeclarationNameLoc NameLoc = DRE->getNameInfo().getInfo();
13603         LBrace = SourceLocation::getFromRawEncoding(
13604                     NameLoc.CXXOperatorName.BeginOpNameLoc);
13605         RBrace = SourceLocation::getFromRawEncoding(
13606                     NameLoc.CXXOperatorName.EndOpNameLoc);
13607     } else {
13608       LBrace = Callee->getBeginLoc();
13609       RBrace = OpLoc;
13610     }
13611 
13612     return SemaRef.CreateOverloadedArraySubscriptExpr(LBrace, RBrace,
13613                                                       First, Second);
13614   }
13615 
13616   // Create the overloaded operator invocation for binary operators.
13617   BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op);
13618   ExprResult Result = SemaRef.CreateOverloadedBinOp(
13619       OpLoc, Opc, Functions, Args[0], Args[1], RequiresADL);
13620   if (Result.isInvalid())
13621     return ExprError();
13622 
13623   return Result;
13624 }
13625 
13626 template<typename Derived>
13627 ExprResult
13628 TreeTransform<Derived>::RebuildCXXPseudoDestructorExpr(Expr *Base,
13629                                                      SourceLocation OperatorLoc,
13630                                                        bool isArrow,
13631                                                        CXXScopeSpec &SS,
13632                                                      TypeSourceInfo *ScopeType,
13633                                                        SourceLocation CCLoc,
13634                                                        SourceLocation TildeLoc,
13635                                         PseudoDestructorTypeStorage Destroyed) {
13636   QualType BaseType = Base->getType();
13637   if (Base->isTypeDependent() || Destroyed.getIdentifier() ||
13638       (!isArrow && !BaseType->getAs<RecordType>()) ||
13639       (isArrow && BaseType->getAs<PointerType>() &&
13640        !BaseType->castAs<PointerType>()->getPointeeType()
13641                                               ->template getAs<RecordType>())){
13642     // This pseudo-destructor expression is still a pseudo-destructor.
13643     return SemaRef.BuildPseudoDestructorExpr(
13644         Base, OperatorLoc, isArrow ? tok::arrow : tok::period, SS, ScopeType,
13645         CCLoc, TildeLoc, Destroyed);
13646   }
13647 
13648   TypeSourceInfo *DestroyedType = Destroyed.getTypeSourceInfo();
13649   DeclarationName Name(SemaRef.Context.DeclarationNames.getCXXDestructorName(
13650                  SemaRef.Context.getCanonicalType(DestroyedType->getType())));
13651   DeclarationNameInfo NameInfo(Name, Destroyed.getLocation());
13652   NameInfo.setNamedTypeInfo(DestroyedType);
13653 
13654   // The scope type is now known to be a valid nested name specifier
13655   // component. Tack it on to the end of the nested name specifier.
13656   if (ScopeType) {
13657     if (!ScopeType->getType()->getAs<TagType>()) {
13658       getSema().Diag(ScopeType->getTypeLoc().getBeginLoc(),
13659                      diag::err_expected_class_or_namespace)
13660           << ScopeType->getType() << getSema().getLangOpts().CPlusPlus;
13661       return ExprError();
13662     }
13663     SS.Extend(SemaRef.Context, SourceLocation(), ScopeType->getTypeLoc(),
13664               CCLoc);
13665   }
13666 
13667   SourceLocation TemplateKWLoc; // FIXME: retrieve it from caller.
13668   return getSema().BuildMemberReferenceExpr(Base, BaseType,
13669                                             OperatorLoc, isArrow,
13670                                             SS, TemplateKWLoc,
13671                                             /*FIXME: FirstQualifier*/ nullptr,
13672                                             NameInfo,
13673                                             /*TemplateArgs*/ nullptr,
13674                                             /*S*/nullptr);
13675 }
13676 
13677 template<typename Derived>
13678 StmtResult
13679 TreeTransform<Derived>::TransformCapturedStmt(CapturedStmt *S) {
13680   SourceLocation Loc = S->getBeginLoc();
13681   CapturedDecl *CD = S->getCapturedDecl();
13682   unsigned NumParams = CD->getNumParams();
13683   unsigned ContextParamPos = CD->getContextParamPosition();
13684   SmallVector<Sema::CapturedParamNameType, 4> Params;
13685   for (unsigned I = 0; I < NumParams; ++I) {
13686     if (I != ContextParamPos) {
13687       Params.push_back(
13688              std::make_pair(
13689                   CD->getParam(I)->getName(),
13690                   getDerived().TransformType(CD->getParam(I)->getType())));
13691     } else {
13692       Params.push_back(std::make_pair(StringRef(), QualType()));
13693     }
13694   }
13695   getSema().ActOnCapturedRegionStart(Loc, /*CurScope*/nullptr,
13696                                      S->getCapturedRegionKind(), Params);
13697   StmtResult Body;
13698   {
13699     Sema::CompoundScopeRAII CompoundScope(getSema());
13700     Body = getDerived().TransformStmt(S->getCapturedStmt());
13701   }
13702 
13703   if (Body.isInvalid()) {
13704     getSema().ActOnCapturedRegionError();
13705     return StmtError();
13706   }
13707 
13708   return getSema().ActOnCapturedRegionEnd(Body.get());
13709 }
13710 
13711 } // end namespace clang
13712 
13713 #endif // LLVM_CLANG_LIB_SEMA_TREETRANSFORM_H
13714