1 //===------- TreeTransform.h - Semantic Tree Transformation -----*- C++ -*-===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //===----------------------------------------------------------------------===//
7 //
8 //  This file implements a semantic tree transformation that takes a given
9 //  AST and rebuilds it, possibly transforming some nodes in the process.
10 //
11 //===----------------------------------------------------------------------===//
12 
13 #ifndef LLVM_CLANG_LIB_SEMA_TREETRANSFORM_H
14 #define LLVM_CLANG_LIB_SEMA_TREETRANSFORM_H
15 
16 #include "CoroutineStmtBuilder.h"
17 #include "TypeLocBuilder.h"
18 #include "clang/AST/Decl.h"
19 #include "clang/AST/DeclObjC.h"
20 #include "clang/AST/DeclTemplate.h"
21 #include "clang/AST/Expr.h"
22 #include "clang/AST/ExprConcepts.h"
23 #include "clang/AST/ExprCXX.h"
24 #include "clang/AST/ExprObjC.h"
25 #include "clang/AST/ExprOpenMP.h"
26 #include "clang/AST/OpenMPClause.h"
27 #include "clang/AST/Stmt.h"
28 #include "clang/AST/StmtCXX.h"
29 #include "clang/AST/StmtObjC.h"
30 #include "clang/AST/StmtOpenMP.h"
31 #include "clang/Basic/DiagnosticParse.h"
32 #include "clang/Basic/OpenMPKinds.h"
33 #include "clang/Sema/Designator.h"
34 #include "clang/Sema/Lookup.h"
35 #include "clang/Sema/Ownership.h"
36 #include "clang/Sema/ParsedTemplate.h"
37 #include "clang/Sema/ScopeInfo.h"
38 #include "clang/Sema/SemaDiagnostic.h"
39 #include "clang/Sema/SemaInternal.h"
40 #include "llvm/ADT/ArrayRef.h"
41 #include "llvm/Support/ErrorHandling.h"
42 #include <algorithm>
43 
44 using namespace llvm::omp;
45 
46 namespace clang {
47 using namespace sema;
48 
49 /// A semantic tree transformation that allows one to transform one
50 /// abstract syntax tree into another.
51 ///
52 /// A new tree transformation is defined by creating a new subclass \c X of
53 /// \c TreeTransform<X> and then overriding certain operations to provide
54 /// behavior specific to that transformation. For example, template
55 /// instantiation is implemented as a tree transformation where the
56 /// transformation of TemplateTypeParmType nodes involves substituting the
57 /// template arguments for their corresponding template parameters; a similar
58 /// transformation is performed for non-type template parameters and
59 /// template template parameters.
60 ///
61 /// This tree-transformation template uses static polymorphism to allow
62 /// subclasses to customize any of its operations. Thus, a subclass can
63 /// override any of the transformation or rebuild operators by providing an
64 /// operation with the same signature as the default implementation. The
65 /// overriding function should not be virtual.
66 ///
67 /// Semantic tree transformations are split into two stages, either of which
68 /// can be replaced by a subclass. The "transform" step transforms an AST node
69 /// or the parts of an AST node using the various transformation functions,
70 /// then passes the pieces on to the "rebuild" step, which constructs a new AST
71 /// node of the appropriate kind from the pieces. The default transformation
72 /// routines recursively transform the operands to composite AST nodes (e.g.,
73 /// the pointee type of a PointerType node) and, if any of those operand nodes
74 /// were changed by the transformation, invokes the rebuild operation to create
75 /// a new AST node.
76 ///
77 /// Subclasses can customize the transformation at various levels. The
78 /// most coarse-grained transformations involve replacing TransformType(),
79 /// TransformExpr(), TransformDecl(), TransformNestedNameSpecifierLoc(),
80 /// TransformTemplateName(), or TransformTemplateArgument() with entirely
81 /// new implementations.
82 ///
83 /// For more fine-grained transformations, subclasses can replace any of the
84 /// \c TransformXXX functions (where XXX is the name of an AST node, e.g.,
85 /// PointerType, StmtExpr) to alter the transformation. As mentioned previously,
86 /// replacing TransformTemplateTypeParmType() allows template instantiation
87 /// to substitute template arguments for their corresponding template
88 /// parameters. Additionally, subclasses can override the \c RebuildXXX
89 /// functions to control how AST nodes are rebuilt when their operands change.
90 /// By default, \c TreeTransform will invoke semantic analysis to rebuild
91 /// AST nodes. However, certain other tree transformations (e.g, cloning) may
92 /// be able to use more efficient rebuild steps.
93 ///
94 /// There are a handful of other functions that can be overridden, allowing one
95 /// to avoid traversing nodes that don't need any transformation
96 /// (\c AlreadyTransformed()), force rebuilding AST nodes even when their
97 /// operands have not changed (\c AlwaysRebuild()), and customize the
98 /// default locations and entity names used for type-checking
99 /// (\c getBaseLocation(), \c getBaseEntity()).
100 template<typename Derived>
101 class TreeTransform {
102   /// Private RAII object that helps us forget and then re-remember
103   /// the template argument corresponding to a partially-substituted parameter
104   /// pack.
105   class ForgetPartiallySubstitutedPackRAII {
106     Derived &Self;
107     TemplateArgument Old;
108 
109   public:
110     ForgetPartiallySubstitutedPackRAII(Derived &Self) : Self(Self) {
111       Old = Self.ForgetPartiallySubstitutedPack();
112     }
113 
114     ~ForgetPartiallySubstitutedPackRAII() {
115       Self.RememberPartiallySubstitutedPack(Old);
116     }
117   };
118 
119 protected:
120   Sema &SemaRef;
121 
122   /// The set of local declarations that have been transformed, for
123   /// cases where we are forced to build new declarations within the transformer
124   /// rather than in the subclass (e.g., lambda closure types).
125   llvm::DenseMap<Decl *, Decl *> TransformedLocalDecls;
126 
127 public:
128   /// Initializes a new tree transformer.
129   TreeTransform(Sema &SemaRef) : SemaRef(SemaRef) { }
130 
131   /// Retrieves a reference to the derived class.
132   Derived &getDerived() { return static_cast<Derived&>(*this); }
133 
134   /// Retrieves a reference to the derived class.
135   const Derived &getDerived() const {
136     return static_cast<const Derived&>(*this);
137   }
138 
139   static inline ExprResult Owned(Expr *E) { return E; }
140   static inline StmtResult Owned(Stmt *S) { return S; }
141 
142   /// Retrieves a reference to the semantic analysis object used for
143   /// this tree transform.
144   Sema &getSema() const { return SemaRef; }
145 
146   /// Whether the transformation should always rebuild AST nodes, even
147   /// if none of the children have changed.
148   ///
149   /// Subclasses may override this function to specify when the transformation
150   /// should rebuild all AST nodes.
151   ///
152   /// We must always rebuild all AST nodes when performing variadic template
153   /// pack expansion, in order to avoid violating the AST invariant that each
154   /// statement node appears at most once in its containing declaration.
155   bool AlwaysRebuild() { return SemaRef.ArgumentPackSubstitutionIndex != -1; }
156 
157   /// Whether the transformation is forming an expression or statement that
158   /// replaces the original. In this case, we'll reuse mangling numbers from
159   /// existing lambdas.
160   bool ReplacingOriginal() { return false; }
161 
162   /// Wether CXXConstructExpr can be skipped when they are implicit.
163   /// They will be reconstructed when used if needed.
164   /// This is useful when the user that cause rebuilding of the
165   /// CXXConstructExpr is outside of the expression at which the TreeTransform
166   /// started.
167   bool AllowSkippingCXXConstructExpr() { return true; }
168 
169   /// Returns the location of the entity being transformed, if that
170   /// information was not available elsewhere in the AST.
171   ///
172   /// By default, returns no source-location information. Subclasses can
173   /// provide an alternative implementation that provides better location
174   /// information.
175   SourceLocation getBaseLocation() { return SourceLocation(); }
176 
177   /// Returns the name of the entity being transformed, if that
178   /// information was not available elsewhere in the AST.
179   ///
180   /// By default, returns an empty name. Subclasses can provide an alternative
181   /// implementation with a more precise name.
182   DeclarationName getBaseEntity() { return DeclarationName(); }
183 
184   /// Sets the "base" location and entity when that
185   /// information is known based on another transformation.
186   ///
187   /// By default, the source location and entity are ignored. Subclasses can
188   /// override this function to provide a customized implementation.
189   void setBase(SourceLocation Loc, DeclarationName Entity) { }
190 
191   /// RAII object that temporarily sets the base location and entity
192   /// used for reporting diagnostics in types.
193   class TemporaryBase {
194     TreeTransform &Self;
195     SourceLocation OldLocation;
196     DeclarationName OldEntity;
197 
198   public:
199     TemporaryBase(TreeTransform &Self, SourceLocation Location,
200                   DeclarationName Entity) : Self(Self) {
201       OldLocation = Self.getDerived().getBaseLocation();
202       OldEntity = Self.getDerived().getBaseEntity();
203 
204       if (Location.isValid())
205         Self.getDerived().setBase(Location, Entity);
206     }
207 
208     ~TemporaryBase() {
209       Self.getDerived().setBase(OldLocation, OldEntity);
210     }
211   };
212 
213   /// Determine whether the given type \p T has already been
214   /// transformed.
215   ///
216   /// Subclasses can provide an alternative implementation of this routine
217   /// to short-circuit evaluation when it is known that a given type will
218   /// not change. For example, template instantiation need not traverse
219   /// non-dependent types.
220   bool AlreadyTransformed(QualType T) {
221     return T.isNull();
222   }
223 
224   /// Transform a template parameter depth level.
225   ///
226   /// During a transformation that transforms template parameters, this maps
227   /// an old template parameter depth to a new depth.
228   unsigned TransformTemplateDepth(unsigned Depth) {
229     return Depth;
230   }
231 
232   /// Determine whether the given call argument should be dropped, e.g.,
233   /// because it is a default argument.
234   ///
235   /// Subclasses can provide an alternative implementation of this routine to
236   /// determine which kinds of call arguments get dropped. By default,
237   /// CXXDefaultArgument nodes are dropped (prior to transformation).
238   bool DropCallArgument(Expr *E) {
239     return E->isDefaultArgument();
240   }
241 
242   /// Determine whether we should expand a pack expansion with the
243   /// given set of parameter packs into separate arguments by repeatedly
244   /// transforming the pattern.
245   ///
246   /// By default, the transformer never tries to expand pack expansions.
247   /// Subclasses can override this routine to provide different behavior.
248   ///
249   /// \param EllipsisLoc The location of the ellipsis that identifies the
250   /// pack expansion.
251   ///
252   /// \param PatternRange The source range that covers the entire pattern of
253   /// the pack expansion.
254   ///
255   /// \param Unexpanded The set of unexpanded parameter packs within the
256   /// pattern.
257   ///
258   /// \param ShouldExpand Will be set to \c true if the transformer should
259   /// expand the corresponding pack expansions into separate arguments. When
260   /// set, \c NumExpansions must also be set.
261   ///
262   /// \param RetainExpansion Whether the caller should add an unexpanded
263   /// pack expansion after all of the expanded arguments. This is used
264   /// when extending explicitly-specified template argument packs per
265   /// C++0x [temp.arg.explicit]p9.
266   ///
267   /// \param NumExpansions The number of separate arguments that will be in
268   /// the expanded form of the corresponding pack expansion. This is both an
269   /// input and an output parameter, which can be set by the caller if the
270   /// number of expansions is known a priori (e.g., due to a prior substitution)
271   /// and will be set by the callee when the number of expansions is known.
272   /// The callee must set this value when \c ShouldExpand is \c true; it may
273   /// set this value in other cases.
274   ///
275   /// \returns true if an error occurred (e.g., because the parameter packs
276   /// are to be instantiated with arguments of different lengths), false
277   /// otherwise. If false, \c ShouldExpand (and possibly \c NumExpansions)
278   /// must be set.
279   bool TryExpandParameterPacks(SourceLocation EllipsisLoc,
280                                SourceRange PatternRange,
281                                ArrayRef<UnexpandedParameterPack> Unexpanded,
282                                bool &ShouldExpand,
283                                bool &RetainExpansion,
284                                Optional<unsigned> &NumExpansions) {
285     ShouldExpand = false;
286     return false;
287   }
288 
289   /// "Forget" about the partially-substituted pack template argument,
290   /// when performing an instantiation that must preserve the parameter pack
291   /// use.
292   ///
293   /// This routine is meant to be overridden by the template instantiator.
294   TemplateArgument ForgetPartiallySubstitutedPack() {
295     return TemplateArgument();
296   }
297 
298   /// "Remember" the partially-substituted pack template argument
299   /// after performing an instantiation that must preserve the parameter pack
300   /// use.
301   ///
302   /// This routine is meant to be overridden by the template instantiator.
303   void RememberPartiallySubstitutedPack(TemplateArgument Arg) { }
304 
305   /// Note to the derived class when a function parameter pack is
306   /// being expanded.
307   void ExpandingFunctionParameterPack(ParmVarDecl *Pack) { }
308 
309   /// Transforms the given type into another type.
310   ///
311   /// By default, this routine transforms a type by creating a
312   /// TypeSourceInfo for it and delegating to the appropriate
313   /// function.  This is expensive, but we don't mind, because
314   /// this method is deprecated anyway;  all users should be
315   /// switched to storing TypeSourceInfos.
316   ///
317   /// \returns the transformed type.
318   QualType TransformType(QualType T);
319 
320   /// Transforms the given type-with-location into a new
321   /// type-with-location.
322   ///
323   /// By default, this routine transforms a type by delegating to the
324   /// appropriate TransformXXXType to build a new type.  Subclasses
325   /// may override this function (to take over all type
326   /// transformations) or some set of the TransformXXXType functions
327   /// to alter the transformation.
328   TypeSourceInfo *TransformType(TypeSourceInfo *DI);
329 
330   /// Transform the given type-with-location into a new
331   /// type, collecting location information in the given builder
332   /// as necessary.
333   ///
334   QualType TransformType(TypeLocBuilder &TLB, TypeLoc TL);
335 
336   /// Transform a type that is permitted to produce a
337   /// DeducedTemplateSpecializationType.
338   ///
339   /// This is used in the (relatively rare) contexts where it is acceptable
340   /// for transformation to produce a class template type with deduced
341   /// template arguments.
342   /// @{
343   QualType TransformTypeWithDeducedTST(QualType T);
344   TypeSourceInfo *TransformTypeWithDeducedTST(TypeSourceInfo *DI);
345   /// @}
346 
347   /// The reason why the value of a statement is not discarded, if any.
348   enum StmtDiscardKind {
349     SDK_Discarded,
350     SDK_NotDiscarded,
351     SDK_StmtExprResult,
352   };
353 
354   /// Transform the given statement.
355   ///
356   /// By default, this routine transforms a statement by delegating to the
357   /// appropriate TransformXXXStmt function to transform a specific kind of
358   /// statement or the TransformExpr() function to transform an expression.
359   /// Subclasses may override this function to transform statements using some
360   /// other mechanism.
361   ///
362   /// \returns the transformed statement.
363   StmtResult TransformStmt(Stmt *S, StmtDiscardKind SDK = SDK_Discarded);
364 
365   /// Transform the given statement.
366   ///
367   /// By default, this routine transforms a statement by delegating to the
368   /// appropriate TransformOMPXXXClause function to transform a specific kind
369   /// of clause. Subclasses may override this function to transform statements
370   /// using some other mechanism.
371   ///
372   /// \returns the transformed OpenMP clause.
373   OMPClause *TransformOMPClause(OMPClause *S);
374 
375   /// Transform the given attribute.
376   ///
377   /// By default, this routine transforms a statement by delegating to the
378   /// appropriate TransformXXXAttr function to transform a specific kind
379   /// of attribute. Subclasses may override this function to transform
380   /// attributed statements using some other mechanism.
381   ///
382   /// \returns the transformed attribute
383   const Attr *TransformAttr(const Attr *S);
384 
385 /// Transform the specified attribute.
386 ///
387 /// Subclasses should override the transformation of attributes with a pragma
388 /// spelling to transform expressions stored within the attribute.
389 ///
390 /// \returns the transformed attribute.
391 #define ATTR(X)
392 #define PRAGMA_SPELLING_ATTR(X)                                                \
393   const X##Attr *Transform##X##Attr(const X##Attr *R) { return R; }
394 #include "clang/Basic/AttrList.inc"
395 
396   /// Transform the given expression.
397   ///
398   /// By default, this routine transforms an expression by delegating to the
399   /// appropriate TransformXXXExpr function to build a new expression.
400   /// Subclasses may override this function to transform expressions using some
401   /// other mechanism.
402   ///
403   /// \returns the transformed expression.
404   ExprResult TransformExpr(Expr *E);
405 
406   /// Transform the given initializer.
407   ///
408   /// By default, this routine transforms an initializer by stripping off the
409   /// semantic nodes added by initialization, then passing the result to
410   /// TransformExpr or TransformExprs.
411   ///
412   /// \returns the transformed initializer.
413   ExprResult TransformInitializer(Expr *Init, bool NotCopyInit);
414 
415   /// Transform the given list of expressions.
416   ///
417   /// This routine transforms a list of expressions by invoking
418   /// \c TransformExpr() for each subexpression. However, it also provides
419   /// support for variadic templates by expanding any pack expansions (if the
420   /// derived class permits such expansion) along the way. When pack expansions
421   /// are present, the number of outputs may not equal the number of inputs.
422   ///
423   /// \param Inputs The set of expressions to be transformed.
424   ///
425   /// \param NumInputs The number of expressions in \c Inputs.
426   ///
427   /// \param IsCall If \c true, then this transform is being performed on
428   /// function-call arguments, and any arguments that should be dropped, will
429   /// be.
430   ///
431   /// \param Outputs The transformed input expressions will be added to this
432   /// vector.
433   ///
434   /// \param ArgChanged If non-NULL, will be set \c true if any argument changed
435   /// due to transformation.
436   ///
437   /// \returns true if an error occurred, false otherwise.
438   bool TransformExprs(Expr *const *Inputs, unsigned NumInputs, bool IsCall,
439                       SmallVectorImpl<Expr *> &Outputs,
440                       bool *ArgChanged = nullptr);
441 
442   /// Transform the given declaration, which is referenced from a type
443   /// or expression.
444   ///
445   /// By default, acts as the identity function on declarations, unless the
446   /// transformer has had to transform the declaration itself. Subclasses
447   /// may override this function to provide alternate behavior.
448   Decl *TransformDecl(SourceLocation Loc, Decl *D) {
449     llvm::DenseMap<Decl *, Decl *>::iterator Known
450       = TransformedLocalDecls.find(D);
451     if (Known != TransformedLocalDecls.end())
452       return Known->second;
453 
454     return D;
455   }
456 
457   /// Transform the specified condition.
458   ///
459   /// By default, this transforms the variable and expression and rebuilds
460   /// the condition.
461   Sema::ConditionResult TransformCondition(SourceLocation Loc, VarDecl *Var,
462                                            Expr *Expr,
463                                            Sema::ConditionKind Kind);
464 
465   /// Transform the attributes associated with the given declaration and
466   /// place them on the new declaration.
467   ///
468   /// By default, this operation does nothing. Subclasses may override this
469   /// behavior to transform attributes.
470   void transformAttrs(Decl *Old, Decl *New) { }
471 
472   /// Note that a local declaration has been transformed by this
473   /// transformer.
474   ///
475   /// Local declarations are typically transformed via a call to
476   /// TransformDefinition. However, in some cases (e.g., lambda expressions),
477   /// the transformer itself has to transform the declarations. This routine
478   /// can be overridden by a subclass that keeps track of such mappings.
479   void transformedLocalDecl(Decl *Old, ArrayRef<Decl *> New) {
480     assert(New.size() == 1 &&
481            "must override transformedLocalDecl if performing pack expansion");
482     TransformedLocalDecls[Old] = New.front();
483   }
484 
485   /// Transform the definition of the given declaration.
486   ///
487   /// By default, invokes TransformDecl() to transform the declaration.
488   /// Subclasses may override this function to provide alternate behavior.
489   Decl *TransformDefinition(SourceLocation Loc, Decl *D) {
490     return getDerived().TransformDecl(Loc, D);
491   }
492 
493   /// Transform the given declaration, which was the first part of a
494   /// nested-name-specifier in a member access expression.
495   ///
496   /// This specific declaration transformation only applies to the first
497   /// identifier in a nested-name-specifier of a member access expression, e.g.,
498   /// the \c T in \c x->T::member
499   ///
500   /// By default, invokes TransformDecl() to transform the declaration.
501   /// Subclasses may override this function to provide alternate behavior.
502   NamedDecl *TransformFirstQualifierInScope(NamedDecl *D, SourceLocation Loc) {
503     return cast_or_null<NamedDecl>(getDerived().TransformDecl(Loc, D));
504   }
505 
506   /// Transform the set of declarations in an OverloadExpr.
507   bool TransformOverloadExprDecls(OverloadExpr *Old, bool RequiresADL,
508                                   LookupResult &R);
509 
510   /// Transform the given nested-name-specifier with source-location
511   /// information.
512   ///
513   /// By default, transforms all of the types and declarations within the
514   /// nested-name-specifier. Subclasses may override this function to provide
515   /// alternate behavior.
516   NestedNameSpecifierLoc
517   TransformNestedNameSpecifierLoc(NestedNameSpecifierLoc NNS,
518                                   QualType ObjectType = QualType(),
519                                   NamedDecl *FirstQualifierInScope = nullptr);
520 
521   /// Transform the given declaration name.
522   ///
523   /// By default, transforms the types of conversion function, constructor,
524   /// and destructor names and then (if needed) rebuilds the declaration name.
525   /// Identifiers and selectors are returned unmodified. Subclasses may
526   /// override this function to provide alternate behavior.
527   DeclarationNameInfo
528   TransformDeclarationNameInfo(const DeclarationNameInfo &NameInfo);
529 
530   bool TransformRequiresExprRequirements(ArrayRef<concepts::Requirement *> Reqs,
531       llvm::SmallVectorImpl<concepts::Requirement *> &Transformed);
532   concepts::TypeRequirement *
533   TransformTypeRequirement(concepts::TypeRequirement *Req);
534   concepts::ExprRequirement *
535   TransformExprRequirement(concepts::ExprRequirement *Req);
536   concepts::NestedRequirement *
537   TransformNestedRequirement(concepts::NestedRequirement *Req);
538 
539   /// Transform the given template name.
540   ///
541   /// \param SS The nested-name-specifier that qualifies the template
542   /// name. This nested-name-specifier must already have been transformed.
543   ///
544   /// \param Name The template name to transform.
545   ///
546   /// \param NameLoc The source location of the template name.
547   ///
548   /// \param ObjectType If we're translating a template name within a member
549   /// access expression, this is the type of the object whose member template
550   /// is being referenced.
551   ///
552   /// \param FirstQualifierInScope If the first part of a nested-name-specifier
553   /// also refers to a name within the current (lexical) scope, this is the
554   /// declaration it refers to.
555   ///
556   /// By default, transforms the template name by transforming the declarations
557   /// and nested-name-specifiers that occur within the template name.
558   /// Subclasses may override this function to provide alternate behavior.
559   TemplateName
560   TransformTemplateName(CXXScopeSpec &SS, TemplateName Name,
561                         SourceLocation NameLoc,
562                         QualType ObjectType = QualType(),
563                         NamedDecl *FirstQualifierInScope = nullptr,
564                         bool AllowInjectedClassName = false);
565 
566   /// Transform the given template argument.
567   ///
568   /// By default, this operation transforms the type, expression, or
569   /// declaration stored within the template argument and constructs a
570   /// new template argument from the transformed result. Subclasses may
571   /// override this function to provide alternate behavior.
572   ///
573   /// Returns true if there was an error.
574   bool TransformTemplateArgument(const TemplateArgumentLoc &Input,
575                                  TemplateArgumentLoc &Output,
576                                  bool Uneval = false);
577 
578   /// Transform the given set of template arguments.
579   ///
580   /// By default, this operation transforms all of the template arguments
581   /// in the input set using \c TransformTemplateArgument(), and appends
582   /// the transformed arguments to the output list.
583   ///
584   /// Note that this overload of \c TransformTemplateArguments() is merely
585   /// a convenience function. Subclasses that wish to override this behavior
586   /// should override the iterator-based member template version.
587   ///
588   /// \param Inputs The set of template arguments to be transformed.
589   ///
590   /// \param NumInputs The number of template arguments in \p Inputs.
591   ///
592   /// \param Outputs The set of transformed template arguments output by this
593   /// routine.
594   ///
595   /// Returns true if an error occurred.
596   bool TransformTemplateArguments(const TemplateArgumentLoc *Inputs,
597                                   unsigned NumInputs,
598                                   TemplateArgumentListInfo &Outputs,
599                                   bool Uneval = false) {
600     return TransformTemplateArguments(Inputs, Inputs + NumInputs, Outputs,
601                                       Uneval);
602   }
603 
604   /// Transform the given set of template arguments.
605   ///
606   /// By default, this operation transforms all of the template arguments
607   /// in the input set using \c TransformTemplateArgument(), and appends
608   /// the transformed arguments to the output list.
609   ///
610   /// \param First An iterator to the first template argument.
611   ///
612   /// \param Last An iterator one step past the last template argument.
613   ///
614   /// \param Outputs The set of transformed template arguments output by this
615   /// routine.
616   ///
617   /// Returns true if an error occurred.
618   template<typename InputIterator>
619   bool TransformTemplateArguments(InputIterator First,
620                                   InputIterator Last,
621                                   TemplateArgumentListInfo &Outputs,
622                                   bool Uneval = false);
623 
624   /// Fakes up a TemplateArgumentLoc for a given TemplateArgument.
625   void InventTemplateArgumentLoc(const TemplateArgument &Arg,
626                                  TemplateArgumentLoc &ArgLoc);
627 
628   /// Fakes up a TypeSourceInfo for a type.
629   TypeSourceInfo *InventTypeSourceInfo(QualType T) {
630     return SemaRef.Context.getTrivialTypeSourceInfo(T,
631                        getDerived().getBaseLocation());
632   }
633 
634 #define ABSTRACT_TYPELOC(CLASS, PARENT)
635 #define TYPELOC(CLASS, PARENT)                                   \
636   QualType Transform##CLASS##Type(TypeLocBuilder &TLB, CLASS##TypeLoc T);
637 #include "clang/AST/TypeLocNodes.def"
638 
639   template<typename Fn>
640   QualType TransformFunctionProtoType(TypeLocBuilder &TLB,
641                                       FunctionProtoTypeLoc TL,
642                                       CXXRecordDecl *ThisContext,
643                                       Qualifiers ThisTypeQuals,
644                                       Fn TransformExceptionSpec);
645 
646   bool TransformExceptionSpec(SourceLocation Loc,
647                               FunctionProtoType::ExceptionSpecInfo &ESI,
648                               SmallVectorImpl<QualType> &Exceptions,
649                               bool &Changed);
650 
651   StmtResult TransformSEHHandler(Stmt *Handler);
652 
653   QualType
654   TransformTemplateSpecializationType(TypeLocBuilder &TLB,
655                                       TemplateSpecializationTypeLoc TL,
656                                       TemplateName Template);
657 
658   QualType
659   TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB,
660                                       DependentTemplateSpecializationTypeLoc TL,
661                                                TemplateName Template,
662                                                CXXScopeSpec &SS);
663 
664   QualType TransformDependentTemplateSpecializationType(
665       TypeLocBuilder &TLB, DependentTemplateSpecializationTypeLoc TL,
666       NestedNameSpecifierLoc QualifierLoc);
667 
668   /// Transforms the parameters of a function type into the
669   /// given vectors.
670   ///
671   /// The result vectors should be kept in sync; null entries in the
672   /// variables vector are acceptable.
673   ///
674   /// Return true on error.
675   bool TransformFunctionTypeParams(
676       SourceLocation Loc, ArrayRef<ParmVarDecl *> Params,
677       const QualType *ParamTypes,
678       const FunctionProtoType::ExtParameterInfo *ParamInfos,
679       SmallVectorImpl<QualType> &PTypes, SmallVectorImpl<ParmVarDecl *> *PVars,
680       Sema::ExtParameterInfoBuilder &PInfos);
681 
682   /// Transforms a single function-type parameter.  Return null
683   /// on error.
684   ///
685   /// \param indexAdjustment - A number to add to the parameter's
686   ///   scope index;  can be negative
687   ParmVarDecl *TransformFunctionTypeParam(ParmVarDecl *OldParm,
688                                           int indexAdjustment,
689                                           Optional<unsigned> NumExpansions,
690                                           bool ExpectParameterPack);
691 
692   /// Transform the body of a lambda-expression.
693   StmtResult TransformLambdaBody(LambdaExpr *E, Stmt *Body);
694   /// Alternative implementation of TransformLambdaBody that skips transforming
695   /// the body.
696   StmtResult SkipLambdaBody(LambdaExpr *E, Stmt *Body);
697 
698   QualType TransformReferenceType(TypeLocBuilder &TLB, ReferenceTypeLoc TL);
699 
700   StmtResult TransformCompoundStmt(CompoundStmt *S, bool IsStmtExpr);
701   ExprResult TransformCXXNamedCastExpr(CXXNamedCastExpr *E);
702 
703   TemplateParameterList *TransformTemplateParameterList(
704         TemplateParameterList *TPL) {
705     return TPL;
706   }
707 
708   ExprResult TransformAddressOfOperand(Expr *E);
709 
710   ExprResult TransformDependentScopeDeclRefExpr(DependentScopeDeclRefExpr *E,
711                                                 bool IsAddressOfOperand,
712                                                 TypeSourceInfo **RecoveryTSI);
713 
714   ExprResult TransformParenDependentScopeDeclRefExpr(
715       ParenExpr *PE, DependentScopeDeclRefExpr *DRE, bool IsAddressOfOperand,
716       TypeSourceInfo **RecoveryTSI);
717 
718   StmtResult TransformOMPExecutableDirective(OMPExecutableDirective *S);
719 
720 // FIXME: We use LLVM_ATTRIBUTE_NOINLINE because inlining causes a ridiculous
721 // amount of stack usage with clang.
722 #define STMT(Node, Parent)                        \
723   LLVM_ATTRIBUTE_NOINLINE \
724   StmtResult Transform##Node(Node *S);
725 #define VALUESTMT(Node, Parent)                   \
726   LLVM_ATTRIBUTE_NOINLINE \
727   StmtResult Transform##Node(Node *S, StmtDiscardKind SDK);
728 #define EXPR(Node, Parent)                        \
729   LLVM_ATTRIBUTE_NOINLINE \
730   ExprResult Transform##Node(Node *E);
731 #define ABSTRACT_STMT(Stmt)
732 #include "clang/AST/StmtNodes.inc"
733 
734 #define GEN_CLANG_CLAUSE_CLASS
735 #define CLAUSE_CLASS(Enum, Str, Class)                                         \
736   LLVM_ATTRIBUTE_NOINLINE                                                      \
737   OMPClause *Transform##Class(Class *S);
738 #include "llvm/Frontend/OpenMP/OMP.inc"
739 
740   /// Build a new qualified type given its unqualified type and type location.
741   ///
742   /// By default, this routine adds type qualifiers only to types that can
743   /// have qualifiers, and silently suppresses those qualifiers that are not
744   /// permitted. Subclasses may override this routine to provide different
745   /// behavior.
746   QualType RebuildQualifiedType(QualType T, QualifiedTypeLoc TL);
747 
748   /// Build a new pointer type given its pointee type.
749   ///
750   /// By default, performs semantic analysis when building the pointer type.
751   /// Subclasses may override this routine to provide different behavior.
752   QualType RebuildPointerType(QualType PointeeType, SourceLocation Sigil);
753 
754   /// Build a new block pointer type given its pointee type.
755   ///
756   /// By default, performs semantic analysis when building the block pointer
757   /// type. Subclasses may override this routine to provide different behavior.
758   QualType RebuildBlockPointerType(QualType PointeeType, SourceLocation Sigil);
759 
760   /// Build a new reference type given the type it references.
761   ///
762   /// By default, performs semantic analysis when building the
763   /// reference type. Subclasses may override this routine to provide
764   /// different behavior.
765   ///
766   /// \param LValue whether the type was written with an lvalue sigil
767   /// or an rvalue sigil.
768   QualType RebuildReferenceType(QualType ReferentType,
769                                 bool LValue,
770                                 SourceLocation Sigil);
771 
772   /// Build a new member pointer type given the pointee type and the
773   /// class type it refers into.
774   ///
775   /// By default, performs semantic analysis when building the member pointer
776   /// type. Subclasses may override this routine to provide different behavior.
777   QualType RebuildMemberPointerType(QualType PointeeType, QualType ClassType,
778                                     SourceLocation Sigil);
779 
780   QualType RebuildObjCTypeParamType(const ObjCTypeParamDecl *Decl,
781                                     SourceLocation ProtocolLAngleLoc,
782                                     ArrayRef<ObjCProtocolDecl *> Protocols,
783                                     ArrayRef<SourceLocation> ProtocolLocs,
784                                     SourceLocation ProtocolRAngleLoc);
785 
786   /// Build an Objective-C object type.
787   ///
788   /// By default, performs semantic analysis when building the object type.
789   /// Subclasses may override this routine to provide different behavior.
790   QualType RebuildObjCObjectType(QualType BaseType,
791                                  SourceLocation Loc,
792                                  SourceLocation TypeArgsLAngleLoc,
793                                  ArrayRef<TypeSourceInfo *> TypeArgs,
794                                  SourceLocation TypeArgsRAngleLoc,
795                                  SourceLocation ProtocolLAngleLoc,
796                                  ArrayRef<ObjCProtocolDecl *> Protocols,
797                                  ArrayRef<SourceLocation> ProtocolLocs,
798                                  SourceLocation ProtocolRAngleLoc);
799 
800   /// Build a new Objective-C object pointer type given the pointee type.
801   ///
802   /// By default, directly builds the pointer type, with no additional semantic
803   /// analysis.
804   QualType RebuildObjCObjectPointerType(QualType PointeeType,
805                                         SourceLocation Star);
806 
807   /// Build a new array type given the element type, size
808   /// modifier, size of the array (if known), size expression, and index type
809   /// qualifiers.
810   ///
811   /// By default, performs semantic analysis when building the array type.
812   /// Subclasses may override this routine to provide different behavior.
813   /// Also by default, all of the other Rebuild*Array
814   QualType RebuildArrayType(QualType ElementType,
815                             ArrayType::ArraySizeModifier SizeMod,
816                             const llvm::APInt *Size,
817                             Expr *SizeExpr,
818                             unsigned IndexTypeQuals,
819                             SourceRange BracketsRange);
820 
821   /// Build a new constant array type given the element type, size
822   /// modifier, (known) size of the array, and index type qualifiers.
823   ///
824   /// By default, performs semantic analysis when building the array type.
825   /// Subclasses may override this routine to provide different behavior.
826   QualType RebuildConstantArrayType(QualType ElementType,
827                                     ArrayType::ArraySizeModifier SizeMod,
828                                     const llvm::APInt &Size,
829                                     Expr *SizeExpr,
830                                     unsigned IndexTypeQuals,
831                                     SourceRange BracketsRange);
832 
833   /// Build a new incomplete array type given the element type, size
834   /// modifier, and index type qualifiers.
835   ///
836   /// By default, performs semantic analysis when building the array type.
837   /// Subclasses may override this routine to provide different behavior.
838   QualType RebuildIncompleteArrayType(QualType ElementType,
839                                       ArrayType::ArraySizeModifier SizeMod,
840                                       unsigned IndexTypeQuals,
841                                       SourceRange BracketsRange);
842 
843   /// Build a new variable-length array type given the element type,
844   /// size modifier, size expression, and index type qualifiers.
845   ///
846   /// By default, performs semantic analysis when building the array type.
847   /// Subclasses may override this routine to provide different behavior.
848   QualType RebuildVariableArrayType(QualType ElementType,
849                                     ArrayType::ArraySizeModifier SizeMod,
850                                     Expr *SizeExpr,
851                                     unsigned IndexTypeQuals,
852                                     SourceRange BracketsRange);
853 
854   /// Build a new dependent-sized array type given the element type,
855   /// size modifier, size expression, and index type qualifiers.
856   ///
857   /// By default, performs semantic analysis when building the array type.
858   /// Subclasses may override this routine to provide different behavior.
859   QualType RebuildDependentSizedArrayType(QualType ElementType,
860                                           ArrayType::ArraySizeModifier SizeMod,
861                                           Expr *SizeExpr,
862                                           unsigned IndexTypeQuals,
863                                           SourceRange BracketsRange);
864 
865   /// Build a new vector type given the element type and
866   /// number of elements.
867   ///
868   /// By default, performs semantic analysis when building the vector type.
869   /// Subclasses may override this routine to provide different behavior.
870   QualType RebuildVectorType(QualType ElementType, unsigned NumElements,
871                              VectorType::VectorKind VecKind);
872 
873   /// Build a new potentially dependently-sized extended vector type
874   /// given the element type and number of elements.
875   ///
876   /// By default, performs semantic analysis when building the vector type.
877   /// Subclasses may override this routine to provide different behavior.
878   QualType RebuildDependentVectorType(QualType ElementType, Expr *SizeExpr,
879                                            SourceLocation AttributeLoc,
880                                            VectorType::VectorKind);
881 
882   /// Build a new extended vector type given the element type and
883   /// number of elements.
884   ///
885   /// By default, performs semantic analysis when building the vector type.
886   /// Subclasses may override this routine to provide different behavior.
887   QualType RebuildExtVectorType(QualType ElementType, unsigned NumElements,
888                                 SourceLocation AttributeLoc);
889 
890   /// Build a new potentially dependently-sized extended vector type
891   /// given the element type and number of elements.
892   ///
893   /// By default, performs semantic analysis when building the vector type.
894   /// Subclasses may override this routine to provide different behavior.
895   QualType RebuildDependentSizedExtVectorType(QualType ElementType,
896                                               Expr *SizeExpr,
897                                               SourceLocation AttributeLoc);
898 
899   /// Build a new matrix type given the element type and dimensions.
900   QualType RebuildConstantMatrixType(QualType ElementType, unsigned NumRows,
901                                      unsigned NumColumns);
902 
903   /// Build a new matrix type given the type and dependently-defined
904   /// dimensions.
905   QualType RebuildDependentSizedMatrixType(QualType ElementType, Expr *RowExpr,
906                                            Expr *ColumnExpr,
907                                            SourceLocation AttributeLoc);
908 
909   /// Build a new DependentAddressSpaceType or return the pointee
910   /// type variable with the correct address space (retrieved from
911   /// AddrSpaceExpr) applied to it. The former will be returned in cases
912   /// where the address space remains dependent.
913   ///
914   /// By default, performs semantic analysis when building the type with address
915   /// space applied. Subclasses may override this routine to provide different
916   /// behavior.
917   QualType RebuildDependentAddressSpaceType(QualType PointeeType,
918                                             Expr *AddrSpaceExpr,
919                                             SourceLocation AttributeLoc);
920 
921   /// Build a new function type.
922   ///
923   /// By default, performs semantic analysis when building the function type.
924   /// Subclasses may override this routine to provide different behavior.
925   QualType RebuildFunctionProtoType(QualType T,
926                                     MutableArrayRef<QualType> ParamTypes,
927                                     const FunctionProtoType::ExtProtoInfo &EPI);
928 
929   /// Build a new unprototyped function type.
930   QualType RebuildFunctionNoProtoType(QualType ResultType);
931 
932   /// Rebuild an unresolved typename type, given the decl that
933   /// the UnresolvedUsingTypenameDecl was transformed to.
934   QualType RebuildUnresolvedUsingType(SourceLocation NameLoc, Decl *D);
935 
936   /// Build a new type found via an alias.
937   QualType RebuildUsingType(UsingShadowDecl *Found, QualType Underlying) {
938     return SemaRef.Context.getUsingType(Found, Underlying);
939   }
940 
941   /// Build a new typedef type.
942   QualType RebuildTypedefType(TypedefNameDecl *Typedef) {
943     return SemaRef.Context.getTypeDeclType(Typedef);
944   }
945 
946   /// Build a new MacroDefined type.
947   QualType RebuildMacroQualifiedType(QualType T,
948                                      const IdentifierInfo *MacroII) {
949     return SemaRef.Context.getMacroQualifiedType(T, MacroII);
950   }
951 
952   /// Build a new class/struct/union type.
953   QualType RebuildRecordType(RecordDecl *Record) {
954     return SemaRef.Context.getTypeDeclType(Record);
955   }
956 
957   /// Build a new Enum type.
958   QualType RebuildEnumType(EnumDecl *Enum) {
959     return SemaRef.Context.getTypeDeclType(Enum);
960   }
961 
962   /// Build a new typeof(expr) type.
963   ///
964   /// By default, performs semantic analysis when building the typeof type.
965   /// Subclasses may override this routine to provide different behavior.
966   QualType RebuildTypeOfExprType(Expr *Underlying, SourceLocation Loc);
967 
968   /// Build a new typeof(type) type.
969   ///
970   /// By default, builds a new TypeOfType with the given underlying type.
971   QualType RebuildTypeOfType(QualType Underlying);
972 
973   /// Build a new unary transform type.
974   QualType RebuildUnaryTransformType(QualType BaseType,
975                                      UnaryTransformType::UTTKind UKind,
976                                      SourceLocation Loc);
977 
978   /// Build a new C++11 decltype type.
979   ///
980   /// By default, performs semantic analysis when building the decltype type.
981   /// Subclasses may override this routine to provide different behavior.
982   QualType RebuildDecltypeType(Expr *Underlying, SourceLocation Loc);
983 
984   /// Build a new C++11 auto type.
985   ///
986   /// By default, builds a new AutoType with the given deduced type.
987   QualType RebuildAutoType(QualType Deduced, AutoTypeKeyword Keyword,
988                            ConceptDecl *TypeConstraintConcept,
989                            ArrayRef<TemplateArgument> TypeConstraintArgs) {
990     // Note, IsDependent is always false here: we implicitly convert an 'auto'
991     // which has been deduced to a dependent type into an undeduced 'auto', so
992     // that we'll retry deduction after the transformation.
993     return SemaRef.Context.getAutoType(Deduced, Keyword,
994                                        /*IsDependent*/ false, /*IsPack=*/false,
995                                        TypeConstraintConcept,
996                                        TypeConstraintArgs);
997   }
998 
999   /// By default, builds a new DeducedTemplateSpecializationType with the given
1000   /// deduced type.
1001   QualType RebuildDeducedTemplateSpecializationType(TemplateName Template,
1002       QualType Deduced) {
1003     return SemaRef.Context.getDeducedTemplateSpecializationType(
1004         Template, Deduced, /*IsDependent*/ false);
1005   }
1006 
1007   /// Build a new template specialization type.
1008   ///
1009   /// By default, performs semantic analysis when building the template
1010   /// specialization type. Subclasses may override this routine to provide
1011   /// different behavior.
1012   QualType RebuildTemplateSpecializationType(TemplateName Template,
1013                                              SourceLocation TemplateLoc,
1014                                              TemplateArgumentListInfo &Args);
1015 
1016   /// Build a new parenthesized type.
1017   ///
1018   /// By default, builds a new ParenType type from the inner type.
1019   /// Subclasses may override this routine to provide different behavior.
1020   QualType RebuildParenType(QualType InnerType) {
1021     return SemaRef.BuildParenType(InnerType);
1022   }
1023 
1024   /// Build a new qualified name type.
1025   ///
1026   /// By default, builds a new ElaboratedType type from the keyword,
1027   /// the nested-name-specifier and the named type.
1028   /// Subclasses may override this routine to provide different behavior.
1029   QualType RebuildElaboratedType(SourceLocation KeywordLoc,
1030                                  ElaboratedTypeKeyword Keyword,
1031                                  NestedNameSpecifierLoc QualifierLoc,
1032                                  QualType Named) {
1033     return SemaRef.Context.getElaboratedType(Keyword,
1034                                          QualifierLoc.getNestedNameSpecifier(),
1035                                              Named);
1036   }
1037 
1038   /// Build a new typename type that refers to a template-id.
1039   ///
1040   /// By default, builds a new DependentNameType type from the
1041   /// nested-name-specifier and the given type. Subclasses may override
1042   /// this routine to provide different behavior.
1043   QualType RebuildDependentTemplateSpecializationType(
1044                                           ElaboratedTypeKeyword Keyword,
1045                                           NestedNameSpecifierLoc QualifierLoc,
1046                                           SourceLocation TemplateKWLoc,
1047                                           const IdentifierInfo *Name,
1048                                           SourceLocation NameLoc,
1049                                           TemplateArgumentListInfo &Args,
1050                                           bool AllowInjectedClassName) {
1051     // Rebuild the template name.
1052     // TODO: avoid TemplateName abstraction
1053     CXXScopeSpec SS;
1054     SS.Adopt(QualifierLoc);
1055     TemplateName InstName = getDerived().RebuildTemplateName(
1056         SS, TemplateKWLoc, *Name, NameLoc, QualType(), nullptr,
1057         AllowInjectedClassName);
1058 
1059     if (InstName.isNull())
1060       return QualType();
1061 
1062     // If it's still dependent, make a dependent specialization.
1063     if (InstName.getAsDependentTemplateName())
1064       return SemaRef.Context.getDependentTemplateSpecializationType(Keyword,
1065                                           QualifierLoc.getNestedNameSpecifier(),
1066                                                                     Name,
1067                                                                     Args);
1068 
1069     // Otherwise, make an elaborated type wrapping a non-dependent
1070     // specialization.
1071     QualType T =
1072     getDerived().RebuildTemplateSpecializationType(InstName, NameLoc, Args);
1073     if (T.isNull()) return QualType();
1074 
1075     if (Keyword == ETK_None && QualifierLoc.getNestedNameSpecifier() == nullptr)
1076       return T;
1077 
1078     return SemaRef.Context.getElaboratedType(Keyword,
1079                                        QualifierLoc.getNestedNameSpecifier(),
1080                                              T);
1081   }
1082 
1083   /// Build a new typename type that refers to an identifier.
1084   ///
1085   /// By default, performs semantic analysis when building the typename type
1086   /// (or elaborated type). Subclasses may override this routine to provide
1087   /// different behavior.
1088   QualType RebuildDependentNameType(ElaboratedTypeKeyword Keyword,
1089                                     SourceLocation KeywordLoc,
1090                                     NestedNameSpecifierLoc QualifierLoc,
1091                                     const IdentifierInfo *Id,
1092                                     SourceLocation IdLoc,
1093                                     bool DeducedTSTContext) {
1094     CXXScopeSpec SS;
1095     SS.Adopt(QualifierLoc);
1096 
1097     if (QualifierLoc.getNestedNameSpecifier()->isDependent()) {
1098       // If the name is still dependent, just build a new dependent name type.
1099       if (!SemaRef.computeDeclContext(SS))
1100         return SemaRef.Context.getDependentNameType(Keyword,
1101                                           QualifierLoc.getNestedNameSpecifier(),
1102                                                     Id);
1103     }
1104 
1105     if (Keyword == ETK_None || Keyword == ETK_Typename) {
1106       return SemaRef.CheckTypenameType(Keyword, KeywordLoc, QualifierLoc,
1107                                        *Id, IdLoc, DeducedTSTContext);
1108     }
1109 
1110     TagTypeKind Kind = TypeWithKeyword::getTagTypeKindForKeyword(Keyword);
1111 
1112     // We had a dependent elaborated-type-specifier that has been transformed
1113     // into a non-dependent elaborated-type-specifier. Find the tag we're
1114     // referring to.
1115     LookupResult Result(SemaRef, Id, IdLoc, Sema::LookupTagName);
1116     DeclContext *DC = SemaRef.computeDeclContext(SS, false);
1117     if (!DC)
1118       return QualType();
1119 
1120     if (SemaRef.RequireCompleteDeclContext(SS, DC))
1121       return QualType();
1122 
1123     TagDecl *Tag = nullptr;
1124     SemaRef.LookupQualifiedName(Result, DC);
1125     switch (Result.getResultKind()) {
1126       case LookupResult::NotFound:
1127       case LookupResult::NotFoundInCurrentInstantiation:
1128         break;
1129 
1130       case LookupResult::Found:
1131         Tag = Result.getAsSingle<TagDecl>();
1132         break;
1133 
1134       case LookupResult::FoundOverloaded:
1135       case LookupResult::FoundUnresolvedValue:
1136         llvm_unreachable("Tag lookup cannot find non-tags");
1137 
1138       case LookupResult::Ambiguous:
1139         // Let the LookupResult structure handle ambiguities.
1140         return QualType();
1141     }
1142 
1143     if (!Tag) {
1144       // Check where the name exists but isn't a tag type and use that to emit
1145       // better diagnostics.
1146       LookupResult Result(SemaRef, Id, IdLoc, Sema::LookupTagName);
1147       SemaRef.LookupQualifiedName(Result, DC);
1148       switch (Result.getResultKind()) {
1149         case LookupResult::Found:
1150         case LookupResult::FoundOverloaded:
1151         case LookupResult::FoundUnresolvedValue: {
1152           NamedDecl *SomeDecl = Result.getRepresentativeDecl();
1153           Sema::NonTagKind NTK = SemaRef.getNonTagTypeDeclKind(SomeDecl, Kind);
1154           SemaRef.Diag(IdLoc, diag::err_tag_reference_non_tag) << SomeDecl
1155                                                                << NTK << Kind;
1156           SemaRef.Diag(SomeDecl->getLocation(), diag::note_declared_at);
1157           break;
1158         }
1159         default:
1160           SemaRef.Diag(IdLoc, diag::err_not_tag_in_scope)
1161               << Kind << Id << DC << QualifierLoc.getSourceRange();
1162           break;
1163       }
1164       return QualType();
1165     }
1166 
1167     if (!SemaRef.isAcceptableTagRedeclaration(Tag, Kind, /*isDefinition*/false,
1168                                               IdLoc, Id)) {
1169       SemaRef.Diag(KeywordLoc, diag::err_use_with_wrong_tag) << Id;
1170       SemaRef.Diag(Tag->getLocation(), diag::note_previous_use);
1171       return QualType();
1172     }
1173 
1174     // Build the elaborated-type-specifier type.
1175     QualType T = SemaRef.Context.getTypeDeclType(Tag);
1176     return SemaRef.Context.getElaboratedType(Keyword,
1177                                          QualifierLoc.getNestedNameSpecifier(),
1178                                              T);
1179   }
1180 
1181   /// Build a new pack expansion type.
1182   ///
1183   /// By default, builds a new PackExpansionType type from the given pattern.
1184   /// Subclasses may override this routine to provide different behavior.
1185   QualType RebuildPackExpansionType(QualType Pattern,
1186                                     SourceRange PatternRange,
1187                                     SourceLocation EllipsisLoc,
1188                                     Optional<unsigned> NumExpansions) {
1189     return getSema().CheckPackExpansion(Pattern, PatternRange, EllipsisLoc,
1190                                         NumExpansions);
1191   }
1192 
1193   /// Build a new atomic type given its value type.
1194   ///
1195   /// By default, performs semantic analysis when building the atomic type.
1196   /// Subclasses may override this routine to provide different behavior.
1197   QualType RebuildAtomicType(QualType ValueType, SourceLocation KWLoc);
1198 
1199   /// Build a new pipe type given its value type.
1200   QualType RebuildPipeType(QualType ValueType, SourceLocation KWLoc,
1201                            bool isReadPipe);
1202 
1203   /// Build a bit-precise int given its value type.
1204   QualType RebuildBitIntType(bool IsUnsigned, unsigned NumBits,
1205                              SourceLocation Loc);
1206 
1207   /// Build a dependent bit-precise int given its value type.
1208   QualType RebuildDependentBitIntType(bool IsUnsigned, Expr *NumBitsExpr,
1209                                       SourceLocation Loc);
1210 
1211   /// Build a new template name given a nested name specifier, a flag
1212   /// indicating whether the "template" keyword was provided, and the template
1213   /// that the template name refers to.
1214   ///
1215   /// By default, builds the new template name directly. Subclasses may override
1216   /// this routine to provide different behavior.
1217   TemplateName RebuildTemplateName(CXXScopeSpec &SS,
1218                                    bool TemplateKW,
1219                                    TemplateDecl *Template);
1220 
1221   /// Build a new template name given a nested name specifier and the
1222   /// name that is referred to as a template.
1223   ///
1224   /// By default, performs semantic analysis to determine whether the name can
1225   /// be resolved to a specific template, then builds the appropriate kind of
1226   /// template name. Subclasses may override this routine to provide different
1227   /// behavior.
1228   TemplateName RebuildTemplateName(CXXScopeSpec &SS,
1229                                    SourceLocation TemplateKWLoc,
1230                                    const IdentifierInfo &Name,
1231                                    SourceLocation NameLoc, QualType ObjectType,
1232                                    NamedDecl *FirstQualifierInScope,
1233                                    bool AllowInjectedClassName);
1234 
1235   /// Build a new template name given a nested name specifier and the
1236   /// overloaded operator name that is referred to as a template.
1237   ///
1238   /// By default, performs semantic analysis to determine whether the name can
1239   /// be resolved to a specific template, then builds the appropriate kind of
1240   /// template name. Subclasses may override this routine to provide different
1241   /// behavior.
1242   TemplateName RebuildTemplateName(CXXScopeSpec &SS,
1243                                    SourceLocation TemplateKWLoc,
1244                                    OverloadedOperatorKind Operator,
1245                                    SourceLocation NameLoc, QualType ObjectType,
1246                                    bool AllowInjectedClassName);
1247 
1248   /// Build a new template name given a template template parameter pack
1249   /// and the
1250   ///
1251   /// By default, performs semantic analysis to determine whether the name can
1252   /// be resolved to a specific template, then builds the appropriate kind of
1253   /// template name. Subclasses may override this routine to provide different
1254   /// behavior.
1255   TemplateName RebuildTemplateName(TemplateTemplateParmDecl *Param,
1256                                    const TemplateArgument &ArgPack) {
1257     return getSema().Context.getSubstTemplateTemplateParmPack(Param, ArgPack);
1258   }
1259 
1260   /// Build a new compound statement.
1261   ///
1262   /// By default, performs semantic analysis to build the new statement.
1263   /// Subclasses may override this routine to provide different behavior.
1264   StmtResult RebuildCompoundStmt(SourceLocation LBraceLoc,
1265                                        MultiStmtArg Statements,
1266                                        SourceLocation RBraceLoc,
1267                                        bool IsStmtExpr) {
1268     return getSema().ActOnCompoundStmt(LBraceLoc, RBraceLoc, Statements,
1269                                        IsStmtExpr);
1270   }
1271 
1272   /// Build a new case statement.
1273   ///
1274   /// By default, performs semantic analysis to build the new statement.
1275   /// Subclasses may override this routine to provide different behavior.
1276   StmtResult RebuildCaseStmt(SourceLocation CaseLoc,
1277                                    Expr *LHS,
1278                                    SourceLocation EllipsisLoc,
1279                                    Expr *RHS,
1280                                    SourceLocation ColonLoc) {
1281     return getSema().ActOnCaseStmt(CaseLoc, LHS, EllipsisLoc, RHS,
1282                                    ColonLoc);
1283   }
1284 
1285   /// Attach the body to a new case statement.
1286   ///
1287   /// By default, performs semantic analysis to build the new statement.
1288   /// Subclasses may override this routine to provide different behavior.
1289   StmtResult RebuildCaseStmtBody(Stmt *S, Stmt *Body) {
1290     getSema().ActOnCaseStmtBody(S, Body);
1291     return S;
1292   }
1293 
1294   /// Build a new default 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 RebuildDefaultStmt(SourceLocation DefaultLoc,
1299                                       SourceLocation ColonLoc,
1300                                       Stmt *SubStmt) {
1301     return getSema().ActOnDefaultStmt(DefaultLoc, ColonLoc, SubStmt,
1302                                       /*CurScope=*/nullptr);
1303   }
1304 
1305   /// Build a new label statement.
1306   ///
1307   /// By default, performs semantic analysis to build the new statement.
1308   /// Subclasses may override this routine to provide different behavior.
1309   StmtResult RebuildLabelStmt(SourceLocation IdentLoc, LabelDecl *L,
1310                               SourceLocation ColonLoc, Stmt *SubStmt) {
1311     return SemaRef.ActOnLabelStmt(IdentLoc, L, ColonLoc, SubStmt);
1312   }
1313 
1314   /// Build a new attributed statement.
1315   ///
1316   /// By default, performs semantic analysis to build the new statement.
1317   /// Subclasses may override this routine to provide different behavior.
1318   StmtResult RebuildAttributedStmt(SourceLocation AttrLoc,
1319                                    ArrayRef<const Attr *> Attrs,
1320                                    Stmt *SubStmt) {
1321     return SemaRef.BuildAttributedStmt(AttrLoc, Attrs, SubStmt);
1322   }
1323 
1324   /// Build a new "if" statement.
1325   ///
1326   /// By default, performs semantic analysis to build the new statement.
1327   /// Subclasses may override this routine to provide different behavior.
1328   StmtResult RebuildIfStmt(SourceLocation IfLoc, IfStatementKind Kind,
1329                            SourceLocation LParenLoc, Sema::ConditionResult Cond,
1330                            SourceLocation RParenLoc, Stmt *Init, Stmt *Then,
1331                            SourceLocation ElseLoc, Stmt *Else) {
1332     return getSema().ActOnIfStmt(IfLoc, Kind, LParenLoc, Init, Cond, RParenLoc,
1333                                  Then, ElseLoc, Else);
1334   }
1335 
1336   /// Start building a new switch statement.
1337   ///
1338   /// By default, performs semantic analysis to build the new statement.
1339   /// Subclasses may override this routine to provide different behavior.
1340   StmtResult RebuildSwitchStmtStart(SourceLocation SwitchLoc,
1341                                     SourceLocation LParenLoc, Stmt *Init,
1342                                     Sema::ConditionResult Cond,
1343                                     SourceLocation RParenLoc) {
1344     return getSema().ActOnStartOfSwitchStmt(SwitchLoc, LParenLoc, Init, Cond,
1345                                             RParenLoc);
1346   }
1347 
1348   /// Attach the body to the switch statement.
1349   ///
1350   /// By default, performs semantic analysis to build the new statement.
1351   /// Subclasses may override this routine to provide different behavior.
1352   StmtResult RebuildSwitchStmtBody(SourceLocation SwitchLoc,
1353                                    Stmt *Switch, Stmt *Body) {
1354     return getSema().ActOnFinishSwitchStmt(SwitchLoc, Switch, Body);
1355   }
1356 
1357   /// Build a new while statement.
1358   ///
1359   /// By default, performs semantic analysis to build the new statement.
1360   /// Subclasses may override this routine to provide different behavior.
1361   StmtResult RebuildWhileStmt(SourceLocation WhileLoc, SourceLocation LParenLoc,
1362                               Sema::ConditionResult Cond,
1363                               SourceLocation RParenLoc, Stmt *Body) {
1364     return getSema().ActOnWhileStmt(WhileLoc, LParenLoc, Cond, RParenLoc, Body);
1365   }
1366 
1367   /// Build a new do-while statement.
1368   ///
1369   /// By default, performs semantic analysis to build the new statement.
1370   /// Subclasses may override this routine to provide different behavior.
1371   StmtResult RebuildDoStmt(SourceLocation DoLoc, Stmt *Body,
1372                            SourceLocation WhileLoc, SourceLocation LParenLoc,
1373                            Expr *Cond, SourceLocation RParenLoc) {
1374     return getSema().ActOnDoStmt(DoLoc, Body, WhileLoc, LParenLoc,
1375                                  Cond, RParenLoc);
1376   }
1377 
1378   /// Build a new for statement.
1379   ///
1380   /// By default, performs semantic analysis to build the new statement.
1381   /// Subclasses may override this routine to provide different behavior.
1382   StmtResult RebuildForStmt(SourceLocation ForLoc, SourceLocation LParenLoc,
1383                             Stmt *Init, Sema::ConditionResult Cond,
1384                             Sema::FullExprArg Inc, SourceLocation RParenLoc,
1385                             Stmt *Body) {
1386     return getSema().ActOnForStmt(ForLoc, LParenLoc, Init, Cond,
1387                                   Inc, RParenLoc, Body);
1388   }
1389 
1390   /// Build a new goto statement.
1391   ///
1392   /// By default, performs semantic analysis to build the new statement.
1393   /// Subclasses may override this routine to provide different behavior.
1394   StmtResult RebuildGotoStmt(SourceLocation GotoLoc, SourceLocation LabelLoc,
1395                              LabelDecl *Label) {
1396     return getSema().ActOnGotoStmt(GotoLoc, LabelLoc, Label);
1397   }
1398 
1399   /// Build a new indirect goto statement.
1400   ///
1401   /// By default, performs semantic analysis to build the new statement.
1402   /// Subclasses may override this routine to provide different behavior.
1403   StmtResult RebuildIndirectGotoStmt(SourceLocation GotoLoc,
1404                                      SourceLocation StarLoc,
1405                                      Expr *Target) {
1406     return getSema().ActOnIndirectGotoStmt(GotoLoc, StarLoc, Target);
1407   }
1408 
1409   /// Build a new return statement.
1410   ///
1411   /// By default, performs semantic analysis to build the new statement.
1412   /// Subclasses may override this routine to provide different behavior.
1413   StmtResult RebuildReturnStmt(SourceLocation ReturnLoc, Expr *Result) {
1414     return getSema().BuildReturnStmt(ReturnLoc, Result);
1415   }
1416 
1417   /// Build a new declaration statement.
1418   ///
1419   /// By default, performs semantic analysis to build the new statement.
1420   /// Subclasses may override this routine to provide different behavior.
1421   StmtResult RebuildDeclStmt(MutableArrayRef<Decl *> Decls,
1422                              SourceLocation StartLoc, SourceLocation EndLoc) {
1423     Sema::DeclGroupPtrTy DG = getSema().BuildDeclaratorGroup(Decls);
1424     return getSema().ActOnDeclStmt(DG, StartLoc, EndLoc);
1425   }
1426 
1427   /// Build a new inline asm statement.
1428   ///
1429   /// By default, performs semantic analysis to build the new statement.
1430   /// Subclasses may override this routine to provide different behavior.
1431   StmtResult RebuildGCCAsmStmt(SourceLocation AsmLoc, bool IsSimple,
1432                                bool IsVolatile, unsigned NumOutputs,
1433                                unsigned NumInputs, IdentifierInfo **Names,
1434                                MultiExprArg Constraints, MultiExprArg Exprs,
1435                                Expr *AsmString, MultiExprArg Clobbers,
1436                                unsigned NumLabels,
1437                                SourceLocation RParenLoc) {
1438     return getSema().ActOnGCCAsmStmt(AsmLoc, IsSimple, IsVolatile, NumOutputs,
1439                                      NumInputs, Names, Constraints, Exprs,
1440                                      AsmString, Clobbers, NumLabels, RParenLoc);
1441   }
1442 
1443   /// Build a new MS style inline asm statement.
1444   ///
1445   /// By default, performs semantic analysis to build the new statement.
1446   /// Subclasses may override this routine to provide different behavior.
1447   StmtResult RebuildMSAsmStmt(SourceLocation AsmLoc, SourceLocation LBraceLoc,
1448                               ArrayRef<Token> AsmToks,
1449                               StringRef AsmString,
1450                               unsigned NumOutputs, unsigned NumInputs,
1451                               ArrayRef<StringRef> Constraints,
1452                               ArrayRef<StringRef> Clobbers,
1453                               ArrayRef<Expr*> Exprs,
1454                               SourceLocation EndLoc) {
1455     return getSema().ActOnMSAsmStmt(AsmLoc, LBraceLoc, AsmToks, AsmString,
1456                                     NumOutputs, NumInputs,
1457                                     Constraints, Clobbers, Exprs, EndLoc);
1458   }
1459 
1460   /// Build a new co_return statement.
1461   ///
1462   /// By default, performs semantic analysis to build the new statement.
1463   /// Subclasses may override this routine to provide different behavior.
1464   StmtResult RebuildCoreturnStmt(SourceLocation CoreturnLoc, Expr *Result,
1465                                  bool IsImplicit) {
1466     return getSema().BuildCoreturnStmt(CoreturnLoc, Result, IsImplicit);
1467   }
1468 
1469   /// Build a new co_await expression.
1470   ///
1471   /// By default, performs semantic analysis to build the new expression.
1472   /// Subclasses may override this routine to provide different behavior.
1473   ExprResult RebuildCoawaitExpr(SourceLocation CoawaitLoc, Expr *Result,
1474                                 bool IsImplicit) {
1475     return getSema().BuildResolvedCoawaitExpr(CoawaitLoc, Result, IsImplicit);
1476   }
1477 
1478   /// Build a new co_await expression.
1479   ///
1480   /// By default, performs semantic analysis to build the new expression.
1481   /// Subclasses may override this routine to provide different behavior.
1482   ExprResult RebuildDependentCoawaitExpr(SourceLocation CoawaitLoc,
1483                                          Expr *Result,
1484                                          UnresolvedLookupExpr *Lookup) {
1485     return getSema().BuildUnresolvedCoawaitExpr(CoawaitLoc, Result, Lookup);
1486   }
1487 
1488   /// Build a new co_yield expression.
1489   ///
1490   /// By default, performs semantic analysis to build the new expression.
1491   /// Subclasses may override this routine to provide different behavior.
1492   ExprResult RebuildCoyieldExpr(SourceLocation CoyieldLoc, Expr *Result) {
1493     return getSema().BuildCoyieldExpr(CoyieldLoc, Result);
1494   }
1495 
1496   StmtResult RebuildCoroutineBodyStmt(CoroutineBodyStmt::CtorArgs Args) {
1497     return getSema().BuildCoroutineBodyStmt(Args);
1498   }
1499 
1500   /// Build a new Objective-C \@try statement.
1501   ///
1502   /// By default, performs semantic analysis to build the new statement.
1503   /// Subclasses may override this routine to provide different behavior.
1504   StmtResult RebuildObjCAtTryStmt(SourceLocation AtLoc,
1505                                         Stmt *TryBody,
1506                                         MultiStmtArg CatchStmts,
1507                                         Stmt *Finally) {
1508     return getSema().ActOnObjCAtTryStmt(AtLoc, TryBody, CatchStmts,
1509                                         Finally);
1510   }
1511 
1512   /// Rebuild an Objective-C exception declaration.
1513   ///
1514   /// By default, performs semantic analysis to build the new declaration.
1515   /// Subclasses may override this routine to provide different behavior.
1516   VarDecl *RebuildObjCExceptionDecl(VarDecl *ExceptionDecl,
1517                                     TypeSourceInfo *TInfo, QualType T) {
1518     return getSema().BuildObjCExceptionDecl(TInfo, T,
1519                                             ExceptionDecl->getInnerLocStart(),
1520                                             ExceptionDecl->getLocation(),
1521                                             ExceptionDecl->getIdentifier());
1522   }
1523 
1524   /// Build a new Objective-C \@catch statement.
1525   ///
1526   /// By default, performs semantic analysis to build the new statement.
1527   /// Subclasses may override this routine to provide different behavior.
1528   StmtResult RebuildObjCAtCatchStmt(SourceLocation AtLoc,
1529                                           SourceLocation RParenLoc,
1530                                           VarDecl *Var,
1531                                           Stmt *Body) {
1532     return getSema().ActOnObjCAtCatchStmt(AtLoc, RParenLoc,
1533                                           Var, Body);
1534   }
1535 
1536   /// Build a new Objective-C \@finally statement.
1537   ///
1538   /// By default, performs semantic analysis to build the new statement.
1539   /// Subclasses may override this routine to provide different behavior.
1540   StmtResult RebuildObjCAtFinallyStmt(SourceLocation AtLoc,
1541                                             Stmt *Body) {
1542     return getSema().ActOnObjCAtFinallyStmt(AtLoc, Body);
1543   }
1544 
1545   /// Build a new Objective-C \@throw statement.
1546   ///
1547   /// By default, performs semantic analysis to build the new statement.
1548   /// Subclasses may override this routine to provide different behavior.
1549   StmtResult RebuildObjCAtThrowStmt(SourceLocation AtLoc,
1550                                           Expr *Operand) {
1551     return getSema().BuildObjCAtThrowStmt(AtLoc, Operand);
1552   }
1553 
1554   /// Build a new OpenMP Canonical loop.
1555   ///
1556   /// Ensures that the outermost loop in @p LoopStmt is wrapped by a
1557   /// OMPCanonicalLoop.
1558   StmtResult RebuildOMPCanonicalLoop(Stmt *LoopStmt) {
1559     return getSema().ActOnOpenMPCanonicalLoop(LoopStmt);
1560   }
1561 
1562   /// Build a new OpenMP executable directive.
1563   ///
1564   /// By default, performs semantic analysis to build the new statement.
1565   /// Subclasses may override this routine to provide different behavior.
1566   StmtResult RebuildOMPExecutableDirective(OpenMPDirectiveKind Kind,
1567                                            DeclarationNameInfo DirName,
1568                                            OpenMPDirectiveKind CancelRegion,
1569                                            ArrayRef<OMPClause *> Clauses,
1570                                            Stmt *AStmt, SourceLocation StartLoc,
1571                                            SourceLocation EndLoc) {
1572     return getSema().ActOnOpenMPExecutableDirective(
1573         Kind, DirName, CancelRegion, Clauses, AStmt, StartLoc, EndLoc);
1574   }
1575 
1576   /// Build a new OpenMP 'if' clause.
1577   ///
1578   /// By default, performs semantic analysis to build the new OpenMP clause.
1579   /// Subclasses may override this routine to provide different behavior.
1580   OMPClause *RebuildOMPIfClause(OpenMPDirectiveKind NameModifier,
1581                                 Expr *Condition, SourceLocation StartLoc,
1582                                 SourceLocation LParenLoc,
1583                                 SourceLocation NameModifierLoc,
1584                                 SourceLocation ColonLoc,
1585                                 SourceLocation EndLoc) {
1586     return getSema().ActOnOpenMPIfClause(NameModifier, Condition, StartLoc,
1587                                          LParenLoc, NameModifierLoc, ColonLoc,
1588                                          EndLoc);
1589   }
1590 
1591   /// Build a new OpenMP 'final' clause.
1592   ///
1593   /// By default, performs semantic analysis to build the new OpenMP clause.
1594   /// Subclasses may override this routine to provide different behavior.
1595   OMPClause *RebuildOMPFinalClause(Expr *Condition, SourceLocation StartLoc,
1596                                    SourceLocation LParenLoc,
1597                                    SourceLocation EndLoc) {
1598     return getSema().ActOnOpenMPFinalClause(Condition, StartLoc, LParenLoc,
1599                                             EndLoc);
1600   }
1601 
1602   /// Build a new OpenMP 'num_threads' clause.
1603   ///
1604   /// By default, performs semantic analysis to build the new OpenMP clause.
1605   /// Subclasses may override this routine to provide different behavior.
1606   OMPClause *RebuildOMPNumThreadsClause(Expr *NumThreads,
1607                                         SourceLocation StartLoc,
1608                                         SourceLocation LParenLoc,
1609                                         SourceLocation EndLoc) {
1610     return getSema().ActOnOpenMPNumThreadsClause(NumThreads, StartLoc,
1611                                                  LParenLoc, EndLoc);
1612   }
1613 
1614   /// Build a new OpenMP 'safelen' 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 *RebuildOMPSafelenClause(Expr *Len, SourceLocation StartLoc,
1619                                      SourceLocation LParenLoc,
1620                                      SourceLocation EndLoc) {
1621     return getSema().ActOnOpenMPSafelenClause(Len, StartLoc, LParenLoc, EndLoc);
1622   }
1623 
1624   /// Build a new OpenMP 'simdlen' clause.
1625   ///
1626   /// By default, performs semantic analysis to build the new OpenMP clause.
1627   /// Subclasses may override this routine to provide different behavior.
1628   OMPClause *RebuildOMPSimdlenClause(Expr *Len, SourceLocation StartLoc,
1629                                      SourceLocation LParenLoc,
1630                                      SourceLocation EndLoc) {
1631     return getSema().ActOnOpenMPSimdlenClause(Len, StartLoc, LParenLoc, EndLoc);
1632   }
1633 
1634   OMPClause *RebuildOMPSizesClause(ArrayRef<Expr *> Sizes,
1635                                    SourceLocation StartLoc,
1636                                    SourceLocation LParenLoc,
1637                                    SourceLocation EndLoc) {
1638     return getSema().ActOnOpenMPSizesClause(Sizes, StartLoc, LParenLoc, EndLoc);
1639   }
1640 
1641   /// Build a new OpenMP 'full' clause.
1642   OMPClause *RebuildOMPFullClause(SourceLocation StartLoc,
1643                                   SourceLocation EndLoc) {
1644     return getSema().ActOnOpenMPFullClause(StartLoc, EndLoc);
1645   }
1646 
1647   /// Build a new OpenMP 'partial' clause.
1648   OMPClause *RebuildOMPPartialClause(Expr *Factor, SourceLocation StartLoc,
1649                                      SourceLocation LParenLoc,
1650                                      SourceLocation EndLoc) {
1651     return getSema().ActOnOpenMPPartialClause(Factor, StartLoc, LParenLoc,
1652                                               EndLoc);
1653   }
1654 
1655   /// Build a new OpenMP 'allocator' clause.
1656   ///
1657   /// By default, performs semantic analysis to build the new OpenMP clause.
1658   /// Subclasses may override this routine to provide different behavior.
1659   OMPClause *RebuildOMPAllocatorClause(Expr *A, SourceLocation StartLoc,
1660                                        SourceLocation LParenLoc,
1661                                        SourceLocation EndLoc) {
1662     return getSema().ActOnOpenMPAllocatorClause(A, StartLoc, LParenLoc, EndLoc);
1663   }
1664 
1665   /// Build a new OpenMP 'collapse' clause.
1666   ///
1667   /// By default, performs semantic analysis to build the new OpenMP clause.
1668   /// Subclasses may override this routine to provide different behavior.
1669   OMPClause *RebuildOMPCollapseClause(Expr *Num, SourceLocation StartLoc,
1670                                       SourceLocation LParenLoc,
1671                                       SourceLocation EndLoc) {
1672     return getSema().ActOnOpenMPCollapseClause(Num, StartLoc, LParenLoc,
1673                                                EndLoc);
1674   }
1675 
1676   /// Build a new OpenMP 'default' clause.
1677   ///
1678   /// By default, performs semantic analysis to build the new OpenMP clause.
1679   /// Subclasses may override this routine to provide different behavior.
1680   OMPClause *RebuildOMPDefaultClause(DefaultKind Kind, SourceLocation KindKwLoc,
1681                                      SourceLocation StartLoc,
1682                                      SourceLocation LParenLoc,
1683                                      SourceLocation EndLoc) {
1684     return getSema().ActOnOpenMPDefaultClause(Kind, KindKwLoc,
1685                                               StartLoc, LParenLoc, EndLoc);
1686   }
1687 
1688   /// Build a new OpenMP 'proc_bind' clause.
1689   ///
1690   /// By default, performs semantic analysis to build the new OpenMP clause.
1691   /// Subclasses may override this routine to provide different behavior.
1692   OMPClause *RebuildOMPProcBindClause(ProcBindKind Kind,
1693                                       SourceLocation KindKwLoc,
1694                                       SourceLocation StartLoc,
1695                                       SourceLocation LParenLoc,
1696                                       SourceLocation EndLoc) {
1697     return getSema().ActOnOpenMPProcBindClause(Kind, KindKwLoc,
1698                                                StartLoc, LParenLoc, EndLoc);
1699   }
1700 
1701   /// Build a new OpenMP 'schedule' clause.
1702   ///
1703   /// By default, performs semantic analysis to build the new OpenMP clause.
1704   /// Subclasses may override this routine to provide different behavior.
1705   OMPClause *RebuildOMPScheduleClause(
1706       OpenMPScheduleClauseModifier M1, OpenMPScheduleClauseModifier M2,
1707       OpenMPScheduleClauseKind Kind, Expr *ChunkSize, SourceLocation StartLoc,
1708       SourceLocation LParenLoc, SourceLocation M1Loc, SourceLocation M2Loc,
1709       SourceLocation KindLoc, SourceLocation CommaLoc, SourceLocation EndLoc) {
1710     return getSema().ActOnOpenMPScheduleClause(
1711         M1, M2, Kind, ChunkSize, StartLoc, LParenLoc, M1Loc, M2Loc, KindLoc,
1712         CommaLoc, EndLoc);
1713   }
1714 
1715   /// Build a new OpenMP 'ordered' clause.
1716   ///
1717   /// By default, performs semantic analysis to build the new OpenMP clause.
1718   /// Subclasses may override this routine to provide different behavior.
1719   OMPClause *RebuildOMPOrderedClause(SourceLocation StartLoc,
1720                                      SourceLocation EndLoc,
1721                                      SourceLocation LParenLoc, Expr *Num) {
1722     return getSema().ActOnOpenMPOrderedClause(StartLoc, EndLoc, LParenLoc, Num);
1723   }
1724 
1725   /// Build a new OpenMP 'private' clause.
1726   ///
1727   /// By default, performs semantic analysis to build the new OpenMP clause.
1728   /// Subclasses may override this routine to provide different behavior.
1729   OMPClause *RebuildOMPPrivateClause(ArrayRef<Expr *> VarList,
1730                                      SourceLocation StartLoc,
1731                                      SourceLocation LParenLoc,
1732                                      SourceLocation EndLoc) {
1733     return getSema().ActOnOpenMPPrivateClause(VarList, StartLoc, LParenLoc,
1734                                               EndLoc);
1735   }
1736 
1737   /// Build a new OpenMP 'firstprivate' clause.
1738   ///
1739   /// By default, performs semantic analysis to build the new OpenMP clause.
1740   /// Subclasses may override this routine to provide different behavior.
1741   OMPClause *RebuildOMPFirstprivateClause(ArrayRef<Expr *> VarList,
1742                                           SourceLocation StartLoc,
1743                                           SourceLocation LParenLoc,
1744                                           SourceLocation EndLoc) {
1745     return getSema().ActOnOpenMPFirstprivateClause(VarList, StartLoc, LParenLoc,
1746                                                    EndLoc);
1747   }
1748 
1749   /// Build a new OpenMP 'lastprivate' clause.
1750   ///
1751   /// By default, performs semantic analysis to build the new OpenMP clause.
1752   /// Subclasses may override this routine to provide different behavior.
1753   OMPClause *RebuildOMPLastprivateClause(ArrayRef<Expr *> VarList,
1754                                          OpenMPLastprivateModifier LPKind,
1755                                          SourceLocation LPKindLoc,
1756                                          SourceLocation ColonLoc,
1757                                          SourceLocation StartLoc,
1758                                          SourceLocation LParenLoc,
1759                                          SourceLocation EndLoc) {
1760     return getSema().ActOnOpenMPLastprivateClause(
1761         VarList, LPKind, LPKindLoc, ColonLoc, StartLoc, LParenLoc, EndLoc);
1762   }
1763 
1764   /// Build a new OpenMP 'shared' clause.
1765   ///
1766   /// By default, performs semantic analysis to build the new OpenMP clause.
1767   /// Subclasses may override this routine to provide different behavior.
1768   OMPClause *RebuildOMPSharedClause(ArrayRef<Expr *> VarList,
1769                                     SourceLocation StartLoc,
1770                                     SourceLocation LParenLoc,
1771                                     SourceLocation EndLoc) {
1772     return getSema().ActOnOpenMPSharedClause(VarList, StartLoc, LParenLoc,
1773                                              EndLoc);
1774   }
1775 
1776   /// Build a new OpenMP 'reduction' clause.
1777   ///
1778   /// By default, performs semantic analysis to build the new statement.
1779   /// Subclasses may override this routine to provide different behavior.
1780   OMPClause *RebuildOMPReductionClause(
1781       ArrayRef<Expr *> VarList, OpenMPReductionClauseModifier Modifier,
1782       SourceLocation StartLoc, SourceLocation LParenLoc,
1783       SourceLocation ModifierLoc, SourceLocation ColonLoc,
1784       SourceLocation EndLoc, CXXScopeSpec &ReductionIdScopeSpec,
1785       const DeclarationNameInfo &ReductionId,
1786       ArrayRef<Expr *> UnresolvedReductions) {
1787     return getSema().ActOnOpenMPReductionClause(
1788         VarList, Modifier, StartLoc, LParenLoc, ModifierLoc, ColonLoc, EndLoc,
1789         ReductionIdScopeSpec, ReductionId, UnresolvedReductions);
1790   }
1791 
1792   /// Build a new OpenMP 'task_reduction' clause.
1793   ///
1794   /// By default, performs semantic analysis to build the new statement.
1795   /// Subclasses may override this routine to provide different behavior.
1796   OMPClause *RebuildOMPTaskReductionClause(
1797       ArrayRef<Expr *> VarList, SourceLocation StartLoc,
1798       SourceLocation LParenLoc, SourceLocation ColonLoc, SourceLocation EndLoc,
1799       CXXScopeSpec &ReductionIdScopeSpec,
1800       const DeclarationNameInfo &ReductionId,
1801       ArrayRef<Expr *> UnresolvedReductions) {
1802     return getSema().ActOnOpenMPTaskReductionClause(
1803         VarList, StartLoc, LParenLoc, ColonLoc, EndLoc, ReductionIdScopeSpec,
1804         ReductionId, UnresolvedReductions);
1805   }
1806 
1807   /// Build a new OpenMP 'in_reduction' clause.
1808   ///
1809   /// By default, performs semantic analysis to build the new statement.
1810   /// Subclasses may override this routine to provide different behavior.
1811   OMPClause *
1812   RebuildOMPInReductionClause(ArrayRef<Expr *> VarList, SourceLocation StartLoc,
1813                               SourceLocation LParenLoc, SourceLocation ColonLoc,
1814                               SourceLocation EndLoc,
1815                               CXXScopeSpec &ReductionIdScopeSpec,
1816                               const DeclarationNameInfo &ReductionId,
1817                               ArrayRef<Expr *> UnresolvedReductions) {
1818     return getSema().ActOnOpenMPInReductionClause(
1819         VarList, StartLoc, LParenLoc, ColonLoc, EndLoc, ReductionIdScopeSpec,
1820         ReductionId, UnresolvedReductions);
1821   }
1822 
1823   /// Build a new OpenMP 'linear' clause.
1824   ///
1825   /// By default, performs semantic analysis to build the new OpenMP clause.
1826   /// Subclasses may override this routine to provide different behavior.
1827   OMPClause *RebuildOMPLinearClause(ArrayRef<Expr *> VarList, Expr *Step,
1828                                     SourceLocation StartLoc,
1829                                     SourceLocation LParenLoc,
1830                                     OpenMPLinearClauseKind Modifier,
1831                                     SourceLocation ModifierLoc,
1832                                     SourceLocation ColonLoc,
1833                                     SourceLocation EndLoc) {
1834     return getSema().ActOnOpenMPLinearClause(VarList, Step, StartLoc, LParenLoc,
1835                                              Modifier, ModifierLoc, ColonLoc,
1836                                              EndLoc);
1837   }
1838 
1839   /// Build a new OpenMP 'aligned' 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 *RebuildOMPAlignedClause(ArrayRef<Expr *> VarList, Expr *Alignment,
1844                                      SourceLocation StartLoc,
1845                                      SourceLocation LParenLoc,
1846                                      SourceLocation ColonLoc,
1847                                      SourceLocation EndLoc) {
1848     return getSema().ActOnOpenMPAlignedClause(VarList, Alignment, StartLoc,
1849                                               LParenLoc, ColonLoc, EndLoc);
1850   }
1851 
1852   /// Build a new OpenMP 'copyin' clause.
1853   ///
1854   /// By default, performs semantic analysis to build the new OpenMP clause.
1855   /// Subclasses may override this routine to provide different behavior.
1856   OMPClause *RebuildOMPCopyinClause(ArrayRef<Expr *> VarList,
1857                                     SourceLocation StartLoc,
1858                                     SourceLocation LParenLoc,
1859                                     SourceLocation EndLoc) {
1860     return getSema().ActOnOpenMPCopyinClause(VarList, StartLoc, LParenLoc,
1861                                              EndLoc);
1862   }
1863 
1864   /// Build a new OpenMP 'copyprivate' clause.
1865   ///
1866   /// By default, performs semantic analysis to build the new OpenMP clause.
1867   /// Subclasses may override this routine to provide different behavior.
1868   OMPClause *RebuildOMPCopyprivateClause(ArrayRef<Expr *> VarList,
1869                                          SourceLocation StartLoc,
1870                                          SourceLocation LParenLoc,
1871                                          SourceLocation EndLoc) {
1872     return getSema().ActOnOpenMPCopyprivateClause(VarList, StartLoc, LParenLoc,
1873                                                   EndLoc);
1874   }
1875 
1876   /// Build a new OpenMP 'flush' pseudo clause.
1877   ///
1878   /// By default, performs semantic analysis to build the new OpenMP clause.
1879   /// Subclasses may override this routine to provide different behavior.
1880   OMPClause *RebuildOMPFlushClause(ArrayRef<Expr *> VarList,
1881                                    SourceLocation StartLoc,
1882                                    SourceLocation LParenLoc,
1883                                    SourceLocation EndLoc) {
1884     return getSema().ActOnOpenMPFlushClause(VarList, StartLoc, LParenLoc,
1885                                             EndLoc);
1886   }
1887 
1888   /// Build a new OpenMP 'depobj' pseudo clause.
1889   ///
1890   /// By default, performs semantic analysis to build the new OpenMP clause.
1891   /// Subclasses may override this routine to provide different behavior.
1892   OMPClause *RebuildOMPDepobjClause(Expr *Depobj, SourceLocation StartLoc,
1893                                     SourceLocation LParenLoc,
1894                                     SourceLocation EndLoc) {
1895     return getSema().ActOnOpenMPDepobjClause(Depobj, StartLoc, LParenLoc,
1896                                              EndLoc);
1897   }
1898 
1899   /// Build a new OpenMP 'depend' pseudo clause.
1900   ///
1901   /// By default, performs semantic analysis to build the new OpenMP clause.
1902   /// Subclasses may override this routine to provide different behavior.
1903   OMPClause *
1904   RebuildOMPDependClause(Expr *DepModifier, OpenMPDependClauseKind DepKind,
1905                          SourceLocation DepLoc, SourceLocation ColonLoc,
1906                          ArrayRef<Expr *> VarList, SourceLocation StartLoc,
1907                          SourceLocation LParenLoc, SourceLocation EndLoc) {
1908     return getSema().ActOnOpenMPDependClause(DepModifier, DepKind, DepLoc,
1909                                              ColonLoc, VarList, StartLoc,
1910                                              LParenLoc, EndLoc);
1911   }
1912 
1913   /// Build a new OpenMP 'device' clause.
1914   ///
1915   /// By default, performs semantic analysis to build the new statement.
1916   /// Subclasses may override this routine to provide different behavior.
1917   OMPClause *RebuildOMPDeviceClause(OpenMPDeviceClauseModifier Modifier,
1918                                     Expr *Device, SourceLocation StartLoc,
1919                                     SourceLocation LParenLoc,
1920                                     SourceLocation ModifierLoc,
1921                                     SourceLocation EndLoc) {
1922     return getSema().ActOnOpenMPDeviceClause(Modifier, Device, StartLoc,
1923                                              LParenLoc, ModifierLoc, EndLoc);
1924   }
1925 
1926   /// Build a new OpenMP 'map' clause.
1927   ///
1928   /// By default, performs semantic analysis to build the new OpenMP clause.
1929   /// Subclasses may override this routine to provide different behavior.
1930   OMPClause *RebuildOMPMapClause(
1931       ArrayRef<OpenMPMapModifierKind> MapTypeModifiers,
1932       ArrayRef<SourceLocation> MapTypeModifiersLoc,
1933       CXXScopeSpec MapperIdScopeSpec, DeclarationNameInfo MapperId,
1934       OpenMPMapClauseKind MapType, bool IsMapTypeImplicit,
1935       SourceLocation MapLoc, SourceLocation ColonLoc, ArrayRef<Expr *> VarList,
1936       const OMPVarListLocTy &Locs, ArrayRef<Expr *> UnresolvedMappers) {
1937     return getSema().ActOnOpenMPMapClause(
1938         MapTypeModifiers, MapTypeModifiersLoc, MapperIdScopeSpec, MapperId,
1939         MapType, IsMapTypeImplicit, MapLoc, ColonLoc, VarList, Locs,
1940         /*NoDiagnose=*/false, UnresolvedMappers);
1941   }
1942 
1943   /// Build a new OpenMP 'allocate' clause.
1944   ///
1945   /// By default, performs semantic analysis to build the new OpenMP clause.
1946   /// Subclasses may override this routine to provide different behavior.
1947   OMPClause *RebuildOMPAllocateClause(Expr *Allocate, ArrayRef<Expr *> VarList,
1948                                       SourceLocation StartLoc,
1949                                       SourceLocation LParenLoc,
1950                                       SourceLocation ColonLoc,
1951                                       SourceLocation EndLoc) {
1952     return getSema().ActOnOpenMPAllocateClause(Allocate, VarList, StartLoc,
1953                                                LParenLoc, ColonLoc, EndLoc);
1954   }
1955 
1956   /// Build a new OpenMP 'num_teams' clause.
1957   ///
1958   /// By default, performs semantic analysis to build the new statement.
1959   /// Subclasses may override this routine to provide different behavior.
1960   OMPClause *RebuildOMPNumTeamsClause(Expr *NumTeams, SourceLocation StartLoc,
1961                                       SourceLocation LParenLoc,
1962                                       SourceLocation EndLoc) {
1963     return getSema().ActOnOpenMPNumTeamsClause(NumTeams, StartLoc, LParenLoc,
1964                                                EndLoc);
1965   }
1966 
1967   /// Build a new OpenMP 'thread_limit' clause.
1968   ///
1969   /// By default, performs semantic analysis to build the new statement.
1970   /// Subclasses may override this routine to provide different behavior.
1971   OMPClause *RebuildOMPThreadLimitClause(Expr *ThreadLimit,
1972                                          SourceLocation StartLoc,
1973                                          SourceLocation LParenLoc,
1974                                          SourceLocation EndLoc) {
1975     return getSema().ActOnOpenMPThreadLimitClause(ThreadLimit, StartLoc,
1976                                                   LParenLoc, EndLoc);
1977   }
1978 
1979   /// Build a new OpenMP 'priority' clause.
1980   ///
1981   /// By default, performs semantic analysis to build the new statement.
1982   /// Subclasses may override this routine to provide different behavior.
1983   OMPClause *RebuildOMPPriorityClause(Expr *Priority, SourceLocation StartLoc,
1984                                       SourceLocation LParenLoc,
1985                                       SourceLocation EndLoc) {
1986     return getSema().ActOnOpenMPPriorityClause(Priority, StartLoc, LParenLoc,
1987                                                EndLoc);
1988   }
1989 
1990   /// Build a new OpenMP 'grainsize' clause.
1991   ///
1992   /// By default, performs semantic analysis to build the new statement.
1993   /// Subclasses may override this routine to provide different behavior.
1994   OMPClause *RebuildOMPGrainsizeClause(Expr *Grainsize, SourceLocation StartLoc,
1995                                        SourceLocation LParenLoc,
1996                                        SourceLocation EndLoc) {
1997     return getSema().ActOnOpenMPGrainsizeClause(Grainsize, StartLoc, LParenLoc,
1998                                                 EndLoc);
1999   }
2000 
2001   /// Build a new OpenMP 'num_tasks' clause.
2002   ///
2003   /// By default, performs semantic analysis to build the new statement.
2004   /// Subclasses may override this routine to provide different behavior.
2005   OMPClause *RebuildOMPNumTasksClause(Expr *NumTasks, SourceLocation StartLoc,
2006                                       SourceLocation LParenLoc,
2007                                       SourceLocation EndLoc) {
2008     return getSema().ActOnOpenMPNumTasksClause(NumTasks, StartLoc, LParenLoc,
2009                                                EndLoc);
2010   }
2011 
2012   /// Build a new OpenMP 'hint' clause.
2013   ///
2014   /// By default, performs semantic analysis to build the new statement.
2015   /// Subclasses may override this routine to provide different behavior.
2016   OMPClause *RebuildOMPHintClause(Expr *Hint, SourceLocation StartLoc,
2017                                   SourceLocation LParenLoc,
2018                                   SourceLocation EndLoc) {
2019     return getSema().ActOnOpenMPHintClause(Hint, StartLoc, LParenLoc, EndLoc);
2020   }
2021 
2022   /// Build a new OpenMP 'detach' clause.
2023   ///
2024   /// By default, performs semantic analysis to build the new statement.
2025   /// Subclasses may override this routine to provide different behavior.
2026   OMPClause *RebuildOMPDetachClause(Expr *Evt, SourceLocation StartLoc,
2027                                     SourceLocation LParenLoc,
2028                                     SourceLocation EndLoc) {
2029     return getSema().ActOnOpenMPDetachClause(Evt, StartLoc, LParenLoc, EndLoc);
2030   }
2031 
2032   /// Build a new OpenMP 'dist_schedule' clause.
2033   ///
2034   /// By default, performs semantic analysis to build the new OpenMP clause.
2035   /// Subclasses may override this routine to provide different behavior.
2036   OMPClause *
2037   RebuildOMPDistScheduleClause(OpenMPDistScheduleClauseKind Kind,
2038                                Expr *ChunkSize, SourceLocation StartLoc,
2039                                SourceLocation LParenLoc, SourceLocation KindLoc,
2040                                SourceLocation CommaLoc, SourceLocation EndLoc) {
2041     return getSema().ActOnOpenMPDistScheduleClause(
2042         Kind, ChunkSize, StartLoc, LParenLoc, KindLoc, CommaLoc, EndLoc);
2043   }
2044 
2045   /// Build a new OpenMP 'to' clause.
2046   ///
2047   /// By default, performs semantic analysis to build the new statement.
2048   /// Subclasses may override this routine to provide different behavior.
2049   OMPClause *
2050   RebuildOMPToClause(ArrayRef<OpenMPMotionModifierKind> MotionModifiers,
2051                      ArrayRef<SourceLocation> MotionModifiersLoc,
2052                      CXXScopeSpec &MapperIdScopeSpec,
2053                      DeclarationNameInfo &MapperId, SourceLocation ColonLoc,
2054                      ArrayRef<Expr *> VarList, const OMPVarListLocTy &Locs,
2055                      ArrayRef<Expr *> UnresolvedMappers) {
2056     return getSema().ActOnOpenMPToClause(MotionModifiers, MotionModifiersLoc,
2057                                          MapperIdScopeSpec, MapperId, ColonLoc,
2058                                          VarList, Locs, UnresolvedMappers);
2059   }
2060 
2061   /// Build a new OpenMP 'from' clause.
2062   ///
2063   /// By default, performs semantic analysis to build the new statement.
2064   /// Subclasses may override this routine to provide different behavior.
2065   OMPClause *
2066   RebuildOMPFromClause(ArrayRef<OpenMPMotionModifierKind> MotionModifiers,
2067                        ArrayRef<SourceLocation> MotionModifiersLoc,
2068                        CXXScopeSpec &MapperIdScopeSpec,
2069                        DeclarationNameInfo &MapperId, SourceLocation ColonLoc,
2070                        ArrayRef<Expr *> VarList, const OMPVarListLocTy &Locs,
2071                        ArrayRef<Expr *> UnresolvedMappers) {
2072     return getSema().ActOnOpenMPFromClause(
2073         MotionModifiers, MotionModifiersLoc, MapperIdScopeSpec, MapperId,
2074         ColonLoc, VarList, Locs, UnresolvedMappers);
2075   }
2076 
2077   /// Build a new OpenMP 'use_device_ptr' clause.
2078   ///
2079   /// By default, performs semantic analysis to build the new OpenMP clause.
2080   /// Subclasses may override this routine to provide different behavior.
2081   OMPClause *RebuildOMPUseDevicePtrClause(ArrayRef<Expr *> VarList,
2082                                           const OMPVarListLocTy &Locs) {
2083     return getSema().ActOnOpenMPUseDevicePtrClause(VarList, Locs);
2084   }
2085 
2086   /// Build a new OpenMP 'use_device_addr' clause.
2087   ///
2088   /// By default, performs semantic analysis to build the new OpenMP clause.
2089   /// Subclasses may override this routine to provide different behavior.
2090   OMPClause *RebuildOMPUseDeviceAddrClause(ArrayRef<Expr *> VarList,
2091                                            const OMPVarListLocTy &Locs) {
2092     return getSema().ActOnOpenMPUseDeviceAddrClause(VarList, Locs);
2093   }
2094 
2095   /// Build a new OpenMP 'is_device_ptr' clause.
2096   ///
2097   /// By default, performs semantic analysis to build the new OpenMP clause.
2098   /// Subclasses may override this routine to provide different behavior.
2099   OMPClause *RebuildOMPIsDevicePtrClause(ArrayRef<Expr *> VarList,
2100                                          const OMPVarListLocTy &Locs) {
2101     return getSema().ActOnOpenMPIsDevicePtrClause(VarList, Locs);
2102   }
2103 
2104   /// Build a new OpenMP 'defaultmap' clause.
2105   ///
2106   /// By default, performs semantic analysis to build the new OpenMP clause.
2107   /// Subclasses may override this routine to provide different behavior.
2108   OMPClause *RebuildOMPDefaultmapClause(OpenMPDefaultmapClauseModifier M,
2109                                         OpenMPDefaultmapClauseKind Kind,
2110                                         SourceLocation StartLoc,
2111                                         SourceLocation LParenLoc,
2112                                         SourceLocation MLoc,
2113                                         SourceLocation KindLoc,
2114                                         SourceLocation EndLoc) {
2115     return getSema().ActOnOpenMPDefaultmapClause(M, Kind, StartLoc, LParenLoc,
2116                                                  MLoc, KindLoc, EndLoc);
2117   }
2118 
2119   /// Build a new OpenMP 'nontemporal' clause.
2120   ///
2121   /// By default, performs semantic analysis to build the new OpenMP clause.
2122   /// Subclasses may override this routine to provide different behavior.
2123   OMPClause *RebuildOMPNontemporalClause(ArrayRef<Expr *> VarList,
2124                                          SourceLocation StartLoc,
2125                                          SourceLocation LParenLoc,
2126                                          SourceLocation EndLoc) {
2127     return getSema().ActOnOpenMPNontemporalClause(VarList, StartLoc, LParenLoc,
2128                                                   EndLoc);
2129   }
2130 
2131   /// Build a new OpenMP 'inclusive' clause.
2132   ///
2133   /// By default, performs semantic analysis to build the new OpenMP clause.
2134   /// Subclasses may override this routine to provide different behavior.
2135   OMPClause *RebuildOMPInclusiveClause(ArrayRef<Expr *> VarList,
2136                                        SourceLocation StartLoc,
2137                                        SourceLocation LParenLoc,
2138                                        SourceLocation EndLoc) {
2139     return getSema().ActOnOpenMPInclusiveClause(VarList, StartLoc, LParenLoc,
2140                                                 EndLoc);
2141   }
2142 
2143   /// Build a new OpenMP 'exclusive' clause.
2144   ///
2145   /// By default, performs semantic analysis to build the new OpenMP clause.
2146   /// Subclasses may override this routine to provide different behavior.
2147   OMPClause *RebuildOMPExclusiveClause(ArrayRef<Expr *> VarList,
2148                                        SourceLocation StartLoc,
2149                                        SourceLocation LParenLoc,
2150                                        SourceLocation EndLoc) {
2151     return getSema().ActOnOpenMPExclusiveClause(VarList, StartLoc, LParenLoc,
2152                                                 EndLoc);
2153   }
2154 
2155   /// Build a new OpenMP 'uses_allocators' clause.
2156   ///
2157   /// By default, performs semantic analysis to build the new OpenMP clause.
2158   /// Subclasses may override this routine to provide different behavior.
2159   OMPClause *RebuildOMPUsesAllocatorsClause(
2160       ArrayRef<Sema::UsesAllocatorsData> Data, SourceLocation StartLoc,
2161       SourceLocation LParenLoc, SourceLocation EndLoc) {
2162     return getSema().ActOnOpenMPUsesAllocatorClause(StartLoc, LParenLoc, EndLoc,
2163                                                     Data);
2164   }
2165 
2166   /// Build a new OpenMP 'affinity' clause.
2167   ///
2168   /// By default, performs semantic analysis to build the new OpenMP clause.
2169   /// Subclasses may override this routine to provide different behavior.
2170   OMPClause *RebuildOMPAffinityClause(SourceLocation StartLoc,
2171                                       SourceLocation LParenLoc,
2172                                       SourceLocation ColonLoc,
2173                                       SourceLocation EndLoc, Expr *Modifier,
2174                                       ArrayRef<Expr *> Locators) {
2175     return getSema().ActOnOpenMPAffinityClause(StartLoc, LParenLoc, ColonLoc,
2176                                                EndLoc, Modifier, Locators);
2177   }
2178 
2179   /// Build a new OpenMP 'order' clause.
2180   ///
2181   /// By default, performs semantic analysis to build the new OpenMP clause.
2182   /// Subclasses may override this routine to provide different behavior.
2183   OMPClause *RebuildOMPOrderClause(OpenMPOrderClauseKind Kind,
2184                                    SourceLocation KindKwLoc,
2185                                    SourceLocation StartLoc,
2186                                    SourceLocation LParenLoc,
2187                                    SourceLocation EndLoc) {
2188     return getSema().ActOnOpenMPOrderClause(Kind, KindKwLoc, StartLoc,
2189                                             LParenLoc, EndLoc);
2190   }
2191 
2192   /// Build a new OpenMP 'init' clause.
2193   ///
2194   /// By default, performs semantic analysis to build the new OpenMP clause.
2195   /// Subclasses may override this routine to provide different behavior.
2196   OMPClause *RebuildOMPInitClause(Expr *InteropVar, ArrayRef<Expr *> PrefExprs,
2197                                   bool IsTarget, bool IsTargetSync,
2198                                   SourceLocation StartLoc,
2199                                   SourceLocation LParenLoc,
2200                                   SourceLocation VarLoc,
2201                                   SourceLocation EndLoc) {
2202     return getSema().ActOnOpenMPInitClause(InteropVar, PrefExprs, IsTarget,
2203                                            IsTargetSync, StartLoc, LParenLoc,
2204                                            VarLoc, EndLoc);
2205   }
2206 
2207   /// Build a new OpenMP 'use' clause.
2208   ///
2209   /// By default, performs semantic analysis to build the new OpenMP clause.
2210   /// Subclasses may override this routine to provide different behavior.
2211   OMPClause *RebuildOMPUseClause(Expr *InteropVar, SourceLocation StartLoc,
2212                                  SourceLocation LParenLoc,
2213                                  SourceLocation VarLoc, SourceLocation EndLoc) {
2214     return getSema().ActOnOpenMPUseClause(InteropVar, StartLoc, LParenLoc,
2215                                           VarLoc, EndLoc);
2216   }
2217 
2218   /// Build a new OpenMP 'destroy' clause.
2219   ///
2220   /// By default, performs semantic analysis to build the new OpenMP clause.
2221   /// Subclasses may override this routine to provide different behavior.
2222   OMPClause *RebuildOMPDestroyClause(Expr *InteropVar, SourceLocation StartLoc,
2223                                      SourceLocation LParenLoc,
2224                                      SourceLocation VarLoc,
2225                                      SourceLocation EndLoc) {
2226     return getSema().ActOnOpenMPDestroyClause(InteropVar, StartLoc, LParenLoc,
2227                                               VarLoc, EndLoc);
2228   }
2229 
2230   /// Build a new OpenMP 'novariants' clause.
2231   ///
2232   /// By default, performs semantic analysis to build the new OpenMP clause.
2233   /// Subclasses may override this routine to provide different behavior.
2234   OMPClause *RebuildOMPNovariantsClause(Expr *Condition,
2235                                         SourceLocation StartLoc,
2236                                         SourceLocation LParenLoc,
2237                                         SourceLocation EndLoc) {
2238     return getSema().ActOnOpenMPNovariantsClause(Condition, StartLoc, LParenLoc,
2239                                                  EndLoc);
2240   }
2241 
2242   /// Build a new OpenMP 'nocontext' clause.
2243   ///
2244   /// By default, performs semantic analysis to build the new OpenMP clause.
2245   /// Subclasses may override this routine to provide different behavior.
2246   OMPClause *RebuildOMPNocontextClause(Expr *Condition, SourceLocation StartLoc,
2247                                        SourceLocation LParenLoc,
2248                                        SourceLocation EndLoc) {
2249     return getSema().ActOnOpenMPNocontextClause(Condition, StartLoc, LParenLoc,
2250                                                 EndLoc);
2251   }
2252 
2253   /// Build a new OpenMP 'filter' clause.
2254   ///
2255   /// By default, performs semantic analysis to build the new OpenMP clause.
2256   /// Subclasses may override this routine to provide different behavior.
2257   OMPClause *RebuildOMPFilterClause(Expr *ThreadID, SourceLocation StartLoc,
2258                                     SourceLocation LParenLoc,
2259                                     SourceLocation EndLoc) {
2260     return getSema().ActOnOpenMPFilterClause(ThreadID, StartLoc, LParenLoc,
2261                                              EndLoc);
2262   }
2263 
2264   /// Build a new OpenMP 'bind' clause.
2265   ///
2266   /// By default, performs semantic analysis to build the new OpenMP clause.
2267   /// Subclasses may override this routine to provide different behavior.
2268   OMPClause *RebuildOMPBindClause(OpenMPBindClauseKind Kind,
2269                                   SourceLocation KindLoc,
2270                                   SourceLocation StartLoc,
2271                                   SourceLocation LParenLoc,
2272                                   SourceLocation EndLoc) {
2273     return getSema().ActOnOpenMPBindClause(Kind, KindLoc, StartLoc, LParenLoc,
2274                                            EndLoc);
2275   }
2276 
2277   /// Build a new OpenMP 'align' clause.
2278   ///
2279   /// By default, performs semantic analysis to build the new OpenMP clause.
2280   /// Subclasses may override this routine to provide different behavior.
2281   OMPClause *RebuildOMPAlignClause(Expr *A, SourceLocation StartLoc,
2282                                    SourceLocation LParenLoc,
2283                                    SourceLocation EndLoc) {
2284     return getSema().ActOnOpenMPAlignClause(A, StartLoc, LParenLoc, EndLoc);
2285   }
2286 
2287   /// Rebuild the operand to an Objective-C \@synchronized statement.
2288   ///
2289   /// By default, performs semantic analysis to build the new statement.
2290   /// Subclasses may override this routine to provide different behavior.
2291   ExprResult RebuildObjCAtSynchronizedOperand(SourceLocation atLoc,
2292                                               Expr *object) {
2293     return getSema().ActOnObjCAtSynchronizedOperand(atLoc, object);
2294   }
2295 
2296   /// Build a new Objective-C \@synchronized statement.
2297   ///
2298   /// By default, performs semantic analysis to build the new statement.
2299   /// Subclasses may override this routine to provide different behavior.
2300   StmtResult RebuildObjCAtSynchronizedStmt(SourceLocation AtLoc,
2301                                            Expr *Object, Stmt *Body) {
2302     return getSema().ActOnObjCAtSynchronizedStmt(AtLoc, Object, Body);
2303   }
2304 
2305   /// Build a new Objective-C \@autoreleasepool statement.
2306   ///
2307   /// By default, performs semantic analysis to build the new statement.
2308   /// Subclasses may override this routine to provide different behavior.
2309   StmtResult RebuildObjCAutoreleasePoolStmt(SourceLocation AtLoc,
2310                                             Stmt *Body) {
2311     return getSema().ActOnObjCAutoreleasePoolStmt(AtLoc, Body);
2312   }
2313 
2314   /// Build a new Objective-C fast enumeration statement.
2315   ///
2316   /// By default, performs semantic analysis to build the new statement.
2317   /// Subclasses may override this routine to provide different behavior.
2318   StmtResult RebuildObjCForCollectionStmt(SourceLocation ForLoc,
2319                                           Stmt *Element,
2320                                           Expr *Collection,
2321                                           SourceLocation RParenLoc,
2322                                           Stmt *Body) {
2323     StmtResult ForEachStmt = getSema().ActOnObjCForCollectionStmt(ForLoc,
2324                                                 Element,
2325                                                 Collection,
2326                                                 RParenLoc);
2327     if (ForEachStmt.isInvalid())
2328       return StmtError();
2329 
2330     return getSema().FinishObjCForCollectionStmt(ForEachStmt.get(), Body);
2331   }
2332 
2333   /// Build a new C++ exception declaration.
2334   ///
2335   /// By default, performs semantic analysis to build the new decaration.
2336   /// Subclasses may override this routine to provide different behavior.
2337   VarDecl *RebuildExceptionDecl(VarDecl *ExceptionDecl,
2338                                 TypeSourceInfo *Declarator,
2339                                 SourceLocation StartLoc,
2340                                 SourceLocation IdLoc,
2341                                 IdentifierInfo *Id) {
2342     VarDecl *Var = getSema().BuildExceptionDeclaration(nullptr, Declarator,
2343                                                        StartLoc, IdLoc, Id);
2344     if (Var)
2345       getSema().CurContext->addDecl(Var);
2346     return Var;
2347   }
2348 
2349   /// Build a new C++ catch statement.
2350   ///
2351   /// By default, performs semantic analysis to build the new statement.
2352   /// Subclasses may override this routine to provide different behavior.
2353   StmtResult RebuildCXXCatchStmt(SourceLocation CatchLoc,
2354                                  VarDecl *ExceptionDecl,
2355                                  Stmt *Handler) {
2356     return Owned(new (getSema().Context) CXXCatchStmt(CatchLoc, ExceptionDecl,
2357                                                       Handler));
2358   }
2359 
2360   /// Build a new C++ try statement.
2361   ///
2362   /// By default, performs semantic analysis to build the new statement.
2363   /// Subclasses may override this routine to provide different behavior.
2364   StmtResult RebuildCXXTryStmt(SourceLocation TryLoc, Stmt *TryBlock,
2365                                ArrayRef<Stmt *> Handlers) {
2366     return getSema().ActOnCXXTryBlock(TryLoc, TryBlock, Handlers);
2367   }
2368 
2369   /// Build a new C++0x range-based for statement.
2370   ///
2371   /// By default, performs semantic analysis to build the new statement.
2372   /// Subclasses may override this routine to provide different behavior.
2373   StmtResult RebuildCXXForRangeStmt(SourceLocation ForLoc,
2374                                     SourceLocation CoawaitLoc, Stmt *Init,
2375                                     SourceLocation ColonLoc, Stmt *Range,
2376                                     Stmt *Begin, Stmt *End, Expr *Cond,
2377                                     Expr *Inc, Stmt *LoopVar,
2378                                     SourceLocation RParenLoc) {
2379     // If we've just learned that the range is actually an Objective-C
2380     // collection, treat this as an Objective-C fast enumeration loop.
2381     if (DeclStmt *RangeStmt = dyn_cast<DeclStmt>(Range)) {
2382       if (RangeStmt->isSingleDecl()) {
2383         if (VarDecl *RangeVar = dyn_cast<VarDecl>(RangeStmt->getSingleDecl())) {
2384           if (RangeVar->isInvalidDecl())
2385             return StmtError();
2386 
2387           Expr *RangeExpr = RangeVar->getInit();
2388           if (!RangeExpr->isTypeDependent() &&
2389               RangeExpr->getType()->isObjCObjectPointerType()) {
2390             // FIXME: Support init-statements in Objective-C++20 ranged for
2391             // statement.
2392             if (Init) {
2393               return SemaRef.Diag(Init->getBeginLoc(),
2394                                   diag::err_objc_for_range_init_stmt)
2395                          << Init->getSourceRange();
2396             }
2397             return getSema().ActOnObjCForCollectionStmt(ForLoc, LoopVar,
2398                                                         RangeExpr, RParenLoc);
2399           }
2400         }
2401       }
2402     }
2403 
2404     return getSema().BuildCXXForRangeStmt(ForLoc, CoawaitLoc, Init, ColonLoc,
2405                                           Range, Begin, End, Cond, Inc, LoopVar,
2406                                           RParenLoc, Sema::BFRK_Rebuild);
2407   }
2408 
2409   /// Build a new C++0x range-based for statement.
2410   ///
2411   /// By default, performs semantic analysis to build the new statement.
2412   /// Subclasses may override this routine to provide different behavior.
2413   StmtResult RebuildMSDependentExistsStmt(SourceLocation KeywordLoc,
2414                                           bool IsIfExists,
2415                                           NestedNameSpecifierLoc QualifierLoc,
2416                                           DeclarationNameInfo NameInfo,
2417                                           Stmt *Nested) {
2418     return getSema().BuildMSDependentExistsStmt(KeywordLoc, IsIfExists,
2419                                                 QualifierLoc, NameInfo, Nested);
2420   }
2421 
2422   /// Attach body to a C++0x range-based for statement.
2423   ///
2424   /// By default, performs semantic analysis to finish the new statement.
2425   /// Subclasses may override this routine to provide different behavior.
2426   StmtResult FinishCXXForRangeStmt(Stmt *ForRange, Stmt *Body) {
2427     return getSema().FinishCXXForRangeStmt(ForRange, Body);
2428   }
2429 
2430   StmtResult RebuildSEHTryStmt(bool IsCXXTry, SourceLocation TryLoc,
2431                                Stmt *TryBlock, Stmt *Handler) {
2432     return getSema().ActOnSEHTryBlock(IsCXXTry, TryLoc, TryBlock, Handler);
2433   }
2434 
2435   StmtResult RebuildSEHExceptStmt(SourceLocation Loc, Expr *FilterExpr,
2436                                   Stmt *Block) {
2437     return getSema().ActOnSEHExceptBlock(Loc, FilterExpr, Block);
2438   }
2439 
2440   StmtResult RebuildSEHFinallyStmt(SourceLocation Loc, Stmt *Block) {
2441     return SEHFinallyStmt::Create(getSema().getASTContext(), Loc, Block);
2442   }
2443 
2444   ExprResult RebuildSYCLUniqueStableNameExpr(SourceLocation OpLoc,
2445                                              SourceLocation LParen,
2446                                              SourceLocation RParen,
2447                                              TypeSourceInfo *TSI) {
2448     return getSema().BuildSYCLUniqueStableNameExpr(OpLoc, LParen, RParen, TSI);
2449   }
2450 
2451   /// Build a new predefined expression.
2452   ///
2453   /// By default, performs semantic analysis to build the new expression.
2454   /// Subclasses may override this routine to provide different behavior.
2455   ExprResult RebuildPredefinedExpr(SourceLocation Loc,
2456                                    PredefinedExpr::IdentKind IK) {
2457     return getSema().BuildPredefinedExpr(Loc, IK);
2458   }
2459 
2460   /// Build a new expression that references a declaration.
2461   ///
2462   /// By default, performs semantic analysis to build the new expression.
2463   /// Subclasses may override this routine to provide different behavior.
2464   ExprResult RebuildDeclarationNameExpr(const CXXScopeSpec &SS,
2465                                         LookupResult &R,
2466                                         bool RequiresADL) {
2467     return getSema().BuildDeclarationNameExpr(SS, R, RequiresADL);
2468   }
2469 
2470 
2471   /// Build a new expression that references a declaration.
2472   ///
2473   /// By default, performs semantic analysis to build the new expression.
2474   /// Subclasses may override this routine to provide different behavior.
2475   ExprResult RebuildDeclRefExpr(NestedNameSpecifierLoc QualifierLoc,
2476                                 ValueDecl *VD,
2477                                 const DeclarationNameInfo &NameInfo,
2478                                 NamedDecl *Found,
2479                                 TemplateArgumentListInfo *TemplateArgs) {
2480     CXXScopeSpec SS;
2481     SS.Adopt(QualifierLoc);
2482     return getSema().BuildDeclarationNameExpr(SS, NameInfo, VD, Found,
2483                                               TemplateArgs);
2484   }
2485 
2486   /// Build a new expression in parentheses.
2487   ///
2488   /// By default, performs semantic analysis to build the new expression.
2489   /// Subclasses may override this routine to provide different behavior.
2490   ExprResult RebuildParenExpr(Expr *SubExpr, SourceLocation LParen,
2491                                     SourceLocation RParen) {
2492     return getSema().ActOnParenExpr(LParen, RParen, SubExpr);
2493   }
2494 
2495   /// Build a new pseudo-destructor expression.
2496   ///
2497   /// By default, performs semantic analysis to build the new expression.
2498   /// Subclasses may override this routine to provide different behavior.
2499   ExprResult RebuildCXXPseudoDestructorExpr(Expr *Base,
2500                                             SourceLocation OperatorLoc,
2501                                             bool isArrow,
2502                                             CXXScopeSpec &SS,
2503                                             TypeSourceInfo *ScopeType,
2504                                             SourceLocation CCLoc,
2505                                             SourceLocation TildeLoc,
2506                                         PseudoDestructorTypeStorage Destroyed);
2507 
2508   /// Build a new unary operator expression.
2509   ///
2510   /// By default, performs semantic analysis to build the new expression.
2511   /// Subclasses may override this routine to provide different behavior.
2512   ExprResult RebuildUnaryOperator(SourceLocation OpLoc,
2513                                         UnaryOperatorKind Opc,
2514                                         Expr *SubExpr) {
2515     return getSema().BuildUnaryOp(/*Scope=*/nullptr, OpLoc, Opc, SubExpr);
2516   }
2517 
2518   /// Build a new builtin offsetof expression.
2519   ///
2520   /// By default, performs semantic analysis to build the new expression.
2521   /// Subclasses may override this routine to provide different behavior.
2522   ExprResult RebuildOffsetOfExpr(SourceLocation OperatorLoc,
2523                                  TypeSourceInfo *Type,
2524                                  ArrayRef<Sema::OffsetOfComponent> Components,
2525                                  SourceLocation RParenLoc) {
2526     return getSema().BuildBuiltinOffsetOf(OperatorLoc, Type, Components,
2527                                           RParenLoc);
2528   }
2529 
2530   /// Build a new sizeof, alignof or vec_step expression with a
2531   /// type argument.
2532   ///
2533   /// By default, performs semantic analysis to build the new expression.
2534   /// Subclasses may override this routine to provide different behavior.
2535   ExprResult RebuildUnaryExprOrTypeTrait(TypeSourceInfo *TInfo,
2536                                          SourceLocation OpLoc,
2537                                          UnaryExprOrTypeTrait ExprKind,
2538                                          SourceRange R) {
2539     return getSema().CreateUnaryExprOrTypeTraitExpr(TInfo, OpLoc, ExprKind, R);
2540   }
2541 
2542   /// Build a new sizeof, alignof or vec step expression with an
2543   /// expression argument.
2544   ///
2545   /// By default, performs semantic analysis to build the new expression.
2546   /// Subclasses may override this routine to provide different behavior.
2547   ExprResult RebuildUnaryExprOrTypeTrait(Expr *SubExpr, SourceLocation OpLoc,
2548                                          UnaryExprOrTypeTrait ExprKind,
2549                                          SourceRange R) {
2550     ExprResult Result
2551       = getSema().CreateUnaryExprOrTypeTraitExpr(SubExpr, OpLoc, ExprKind);
2552     if (Result.isInvalid())
2553       return ExprError();
2554 
2555     return Result;
2556   }
2557 
2558   /// Build a new array subscript expression.
2559   ///
2560   /// By default, performs semantic analysis to build the new expression.
2561   /// Subclasses may override this routine to provide different behavior.
2562   ExprResult RebuildArraySubscriptExpr(Expr *LHS,
2563                                              SourceLocation LBracketLoc,
2564                                              Expr *RHS,
2565                                              SourceLocation RBracketLoc) {
2566     return getSema().ActOnArraySubscriptExpr(/*Scope=*/nullptr, LHS,
2567                                              LBracketLoc, RHS,
2568                                              RBracketLoc);
2569   }
2570 
2571   /// Build a new matrix subscript expression.
2572   ///
2573   /// By default, performs semantic analysis to build the new expression.
2574   /// Subclasses may override this routine to provide different behavior.
2575   ExprResult RebuildMatrixSubscriptExpr(Expr *Base, Expr *RowIdx,
2576                                         Expr *ColumnIdx,
2577                                         SourceLocation RBracketLoc) {
2578     return getSema().CreateBuiltinMatrixSubscriptExpr(Base, RowIdx, ColumnIdx,
2579                                                       RBracketLoc);
2580   }
2581 
2582   /// Build a new array section expression.
2583   ///
2584   /// By default, performs semantic analysis to build the new expression.
2585   /// Subclasses may override this routine to provide different behavior.
2586   ExprResult RebuildOMPArraySectionExpr(Expr *Base, SourceLocation LBracketLoc,
2587                                         Expr *LowerBound,
2588                                         SourceLocation ColonLocFirst,
2589                                         SourceLocation ColonLocSecond,
2590                                         Expr *Length, Expr *Stride,
2591                                         SourceLocation RBracketLoc) {
2592     return getSema().ActOnOMPArraySectionExpr(Base, LBracketLoc, LowerBound,
2593                                               ColonLocFirst, ColonLocSecond,
2594                                               Length, Stride, RBracketLoc);
2595   }
2596 
2597   /// Build a new array shaping expression.
2598   ///
2599   /// By default, performs semantic analysis to build the new expression.
2600   /// Subclasses may override this routine to provide different behavior.
2601   ExprResult RebuildOMPArrayShapingExpr(Expr *Base, SourceLocation LParenLoc,
2602                                         SourceLocation RParenLoc,
2603                                         ArrayRef<Expr *> Dims,
2604                                         ArrayRef<SourceRange> BracketsRanges) {
2605     return getSema().ActOnOMPArrayShapingExpr(Base, LParenLoc, RParenLoc, Dims,
2606                                               BracketsRanges);
2607   }
2608 
2609   /// Build a new iterator expression.
2610   ///
2611   /// By default, performs semantic analysis to build the new expression.
2612   /// Subclasses may override this routine to provide different behavior.
2613   ExprResult RebuildOMPIteratorExpr(
2614       SourceLocation IteratorKwLoc, SourceLocation LLoc, SourceLocation RLoc,
2615       ArrayRef<Sema::OMPIteratorData> Data) {
2616     return getSema().ActOnOMPIteratorExpr(/*Scope=*/nullptr, IteratorKwLoc,
2617                                           LLoc, RLoc, Data);
2618   }
2619 
2620   /// Build a new call expression.
2621   ///
2622   /// By default, performs semantic analysis to build the new expression.
2623   /// Subclasses may override this routine to provide different behavior.
2624   ExprResult RebuildCallExpr(Expr *Callee, SourceLocation LParenLoc,
2625                                    MultiExprArg Args,
2626                                    SourceLocation RParenLoc,
2627                                    Expr *ExecConfig = nullptr) {
2628     return getSema().ActOnCallExpr(
2629         /*Scope=*/nullptr, Callee, LParenLoc, Args, RParenLoc, ExecConfig);
2630   }
2631 
2632   ExprResult RebuildCxxSubscriptExpr(Expr *Callee, SourceLocation LParenLoc,
2633                                      MultiExprArg Args,
2634                                      SourceLocation RParenLoc) {
2635     return getSema().ActOnArraySubscriptExpr(
2636         /*Scope=*/nullptr, Callee, LParenLoc, Args, RParenLoc);
2637   }
2638 
2639   /// Build a new member access expression.
2640   ///
2641   /// By default, performs semantic analysis to build the new expression.
2642   /// Subclasses may override this routine to provide different behavior.
2643   ExprResult RebuildMemberExpr(Expr *Base, SourceLocation OpLoc,
2644                                bool isArrow,
2645                                NestedNameSpecifierLoc QualifierLoc,
2646                                SourceLocation TemplateKWLoc,
2647                                const DeclarationNameInfo &MemberNameInfo,
2648                                ValueDecl *Member,
2649                                NamedDecl *FoundDecl,
2650                         const TemplateArgumentListInfo *ExplicitTemplateArgs,
2651                                NamedDecl *FirstQualifierInScope) {
2652     ExprResult BaseResult = getSema().PerformMemberExprBaseConversion(Base,
2653                                                                       isArrow);
2654     if (!Member->getDeclName()) {
2655       // We have a reference to an unnamed field.  This is always the
2656       // base of an anonymous struct/union member access, i.e. the
2657       // field is always of record type.
2658       assert(Member->getType()->isRecordType() &&
2659              "unnamed member not of record type?");
2660 
2661       BaseResult =
2662         getSema().PerformObjectMemberConversion(BaseResult.get(),
2663                                                 QualifierLoc.getNestedNameSpecifier(),
2664                                                 FoundDecl, Member);
2665       if (BaseResult.isInvalid())
2666         return ExprError();
2667       Base = BaseResult.get();
2668 
2669       CXXScopeSpec EmptySS;
2670       return getSema().BuildFieldReferenceExpr(
2671           Base, isArrow, OpLoc, EmptySS, cast<FieldDecl>(Member),
2672           DeclAccessPair::make(FoundDecl, FoundDecl->getAccess()), MemberNameInfo);
2673     }
2674 
2675     CXXScopeSpec SS;
2676     SS.Adopt(QualifierLoc);
2677 
2678     Base = BaseResult.get();
2679     QualType BaseType = Base->getType();
2680 
2681     if (isArrow && !BaseType->isPointerType())
2682       return ExprError();
2683 
2684     // FIXME: this involves duplicating earlier analysis in a lot of
2685     // cases; we should avoid this when possible.
2686     LookupResult R(getSema(), MemberNameInfo, Sema::LookupMemberName);
2687     R.addDecl(FoundDecl);
2688     R.resolveKind();
2689 
2690     return getSema().BuildMemberReferenceExpr(Base, BaseType, OpLoc, isArrow,
2691                                               SS, TemplateKWLoc,
2692                                               FirstQualifierInScope,
2693                                               R, ExplicitTemplateArgs,
2694                                               /*S*/nullptr);
2695   }
2696 
2697   /// Build a new binary operator 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 RebuildBinaryOperator(SourceLocation OpLoc,
2702                                          BinaryOperatorKind Opc,
2703                                          Expr *LHS, Expr *RHS) {
2704     return getSema().BuildBinOp(/*Scope=*/nullptr, OpLoc, Opc, LHS, RHS);
2705   }
2706 
2707   /// Build a new rewritten operator 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 RebuildCXXRewrittenBinaryOperator(
2712       SourceLocation OpLoc, BinaryOperatorKind Opcode,
2713       const UnresolvedSetImpl &UnqualLookups, Expr *LHS, Expr *RHS) {
2714     return getSema().CreateOverloadedBinOp(OpLoc, Opcode, UnqualLookups, LHS,
2715                                            RHS, /*RequiresADL*/false);
2716   }
2717 
2718   /// Build a new conditional operator expression.
2719   ///
2720   /// By default, performs semantic analysis to build the new expression.
2721   /// Subclasses may override this routine to provide different behavior.
2722   ExprResult RebuildConditionalOperator(Expr *Cond,
2723                                         SourceLocation QuestionLoc,
2724                                         Expr *LHS,
2725                                         SourceLocation ColonLoc,
2726                                         Expr *RHS) {
2727     return getSema().ActOnConditionalOp(QuestionLoc, ColonLoc, Cond,
2728                                         LHS, RHS);
2729   }
2730 
2731   /// Build a new C-style cast expression.
2732   ///
2733   /// By default, performs semantic analysis to build the new expression.
2734   /// Subclasses may override this routine to provide different behavior.
2735   ExprResult RebuildCStyleCastExpr(SourceLocation LParenLoc,
2736                                          TypeSourceInfo *TInfo,
2737                                          SourceLocation RParenLoc,
2738                                          Expr *SubExpr) {
2739     return getSema().BuildCStyleCastExpr(LParenLoc, TInfo, RParenLoc,
2740                                          SubExpr);
2741   }
2742 
2743   /// Build a new compound literal expression.
2744   ///
2745   /// By default, performs semantic analysis to build the new expression.
2746   /// Subclasses may override this routine to provide different behavior.
2747   ExprResult RebuildCompoundLiteralExpr(SourceLocation LParenLoc,
2748                                               TypeSourceInfo *TInfo,
2749                                               SourceLocation RParenLoc,
2750                                               Expr *Init) {
2751     return getSema().BuildCompoundLiteralExpr(LParenLoc, TInfo, RParenLoc,
2752                                               Init);
2753   }
2754 
2755   /// Build a new extended vector element access expression.
2756   ///
2757   /// By default, performs semantic analysis to build the new expression.
2758   /// Subclasses may override this routine to provide different behavior.
2759   ExprResult RebuildExtVectorElementExpr(Expr *Base,
2760                                                SourceLocation OpLoc,
2761                                                SourceLocation AccessorLoc,
2762                                                IdentifierInfo &Accessor) {
2763 
2764     CXXScopeSpec SS;
2765     DeclarationNameInfo NameInfo(&Accessor, AccessorLoc);
2766     return getSema().BuildMemberReferenceExpr(Base, Base->getType(),
2767                                               OpLoc, /*IsArrow*/ false,
2768                                               SS, SourceLocation(),
2769                                               /*FirstQualifierInScope*/ nullptr,
2770                                               NameInfo,
2771                                               /* TemplateArgs */ nullptr,
2772                                               /*S*/ nullptr);
2773   }
2774 
2775   /// Build a new initializer list expression.
2776   ///
2777   /// By default, performs semantic analysis to build the new expression.
2778   /// Subclasses may override this routine to provide different behavior.
2779   ExprResult RebuildInitList(SourceLocation LBraceLoc,
2780                              MultiExprArg Inits,
2781                              SourceLocation RBraceLoc) {
2782     return SemaRef.BuildInitList(LBraceLoc, Inits, RBraceLoc);
2783   }
2784 
2785   /// Build a new designated initializer expression.
2786   ///
2787   /// By default, performs semantic analysis to build the new expression.
2788   /// Subclasses may override this routine to provide different behavior.
2789   ExprResult RebuildDesignatedInitExpr(Designation &Desig,
2790                                              MultiExprArg ArrayExprs,
2791                                              SourceLocation EqualOrColonLoc,
2792                                              bool GNUSyntax,
2793                                              Expr *Init) {
2794     ExprResult Result
2795       = SemaRef.ActOnDesignatedInitializer(Desig, EqualOrColonLoc, GNUSyntax,
2796                                            Init);
2797     if (Result.isInvalid())
2798       return ExprError();
2799 
2800     return Result;
2801   }
2802 
2803   /// Build a new value-initialized expression.
2804   ///
2805   /// By default, builds the implicit value initialization without performing
2806   /// any semantic analysis. Subclasses may override this routine to provide
2807   /// different behavior.
2808   ExprResult RebuildImplicitValueInitExpr(QualType T) {
2809     return new (SemaRef.Context) ImplicitValueInitExpr(T);
2810   }
2811 
2812   /// Build a new \c va_arg expression.
2813   ///
2814   /// By default, performs semantic analysis to build the new expression.
2815   /// Subclasses may override this routine to provide different behavior.
2816   ExprResult RebuildVAArgExpr(SourceLocation BuiltinLoc,
2817                                     Expr *SubExpr, TypeSourceInfo *TInfo,
2818                                     SourceLocation RParenLoc) {
2819     return getSema().BuildVAArgExpr(BuiltinLoc,
2820                                     SubExpr, TInfo,
2821                                     RParenLoc);
2822   }
2823 
2824   /// Build a new expression list in parentheses.
2825   ///
2826   /// By default, performs semantic analysis to build the new expression.
2827   /// Subclasses may override this routine to provide different behavior.
2828   ExprResult RebuildParenListExpr(SourceLocation LParenLoc,
2829                                   MultiExprArg SubExprs,
2830                                   SourceLocation RParenLoc) {
2831     return getSema().ActOnParenListExpr(LParenLoc, RParenLoc, SubExprs);
2832   }
2833 
2834   /// Build a new address-of-label expression.
2835   ///
2836   /// By default, performs semantic analysis, using the name of the label
2837   /// rather than attempting to map the label statement itself.
2838   /// Subclasses may override this routine to provide different behavior.
2839   ExprResult RebuildAddrLabelExpr(SourceLocation AmpAmpLoc,
2840                                   SourceLocation LabelLoc, LabelDecl *Label) {
2841     return getSema().ActOnAddrLabel(AmpAmpLoc, LabelLoc, Label);
2842   }
2843 
2844   /// Build a new GNU statement expression.
2845   ///
2846   /// By default, performs semantic analysis to build the new expression.
2847   /// Subclasses may override this routine to provide different behavior.
2848   ExprResult RebuildStmtExpr(SourceLocation LParenLoc, Stmt *SubStmt,
2849                              SourceLocation RParenLoc, unsigned TemplateDepth) {
2850     return getSema().BuildStmtExpr(LParenLoc, SubStmt, RParenLoc,
2851                                    TemplateDepth);
2852   }
2853 
2854   /// Build a new __builtin_choose_expr expression.
2855   ///
2856   /// By default, performs semantic analysis to build the new expression.
2857   /// Subclasses may override this routine to provide different behavior.
2858   ExprResult RebuildChooseExpr(SourceLocation BuiltinLoc,
2859                                      Expr *Cond, Expr *LHS, Expr *RHS,
2860                                      SourceLocation RParenLoc) {
2861     return SemaRef.ActOnChooseExpr(BuiltinLoc,
2862                                    Cond, LHS, RHS,
2863                                    RParenLoc);
2864   }
2865 
2866   /// Build a new generic selection expression.
2867   ///
2868   /// By default, performs semantic analysis to build the new expression.
2869   /// Subclasses may override this routine to provide different behavior.
2870   ExprResult RebuildGenericSelectionExpr(SourceLocation KeyLoc,
2871                                          SourceLocation DefaultLoc,
2872                                          SourceLocation RParenLoc,
2873                                          Expr *ControllingExpr,
2874                                          ArrayRef<TypeSourceInfo *> Types,
2875                                          ArrayRef<Expr *> Exprs) {
2876     return getSema().CreateGenericSelectionExpr(KeyLoc, DefaultLoc, RParenLoc,
2877                                                 ControllingExpr, Types, Exprs);
2878   }
2879 
2880   /// Build a new overloaded operator call expression.
2881   ///
2882   /// By default, performs semantic analysis to build the new expression.
2883   /// The semantic analysis provides the behavior of template instantiation,
2884   /// copying with transformations that turn what looks like an overloaded
2885   /// operator call into a use of a builtin operator, performing
2886   /// argument-dependent lookup, etc. Subclasses may override this routine to
2887   /// provide different behavior.
2888   ExprResult RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op,
2889                                               SourceLocation OpLoc,
2890                                               Expr *Callee,
2891                                               Expr *First,
2892                                               Expr *Second);
2893 
2894   /// Build a new C++ "named" cast expression, such as static_cast or
2895   /// reinterpret_cast.
2896   ///
2897   /// By default, this routine dispatches to one of the more-specific routines
2898   /// for a particular named case, e.g., RebuildCXXStaticCastExpr().
2899   /// Subclasses may override this routine to provide different behavior.
2900   ExprResult RebuildCXXNamedCastExpr(SourceLocation OpLoc,
2901                                            Stmt::StmtClass Class,
2902                                            SourceLocation LAngleLoc,
2903                                            TypeSourceInfo *TInfo,
2904                                            SourceLocation RAngleLoc,
2905                                            SourceLocation LParenLoc,
2906                                            Expr *SubExpr,
2907                                            SourceLocation RParenLoc) {
2908     switch (Class) {
2909     case Stmt::CXXStaticCastExprClass:
2910       return getDerived().RebuildCXXStaticCastExpr(OpLoc, LAngleLoc, TInfo,
2911                                                    RAngleLoc, LParenLoc,
2912                                                    SubExpr, RParenLoc);
2913 
2914     case Stmt::CXXDynamicCastExprClass:
2915       return getDerived().RebuildCXXDynamicCastExpr(OpLoc, LAngleLoc, TInfo,
2916                                                     RAngleLoc, LParenLoc,
2917                                                     SubExpr, RParenLoc);
2918 
2919     case Stmt::CXXReinterpretCastExprClass:
2920       return getDerived().RebuildCXXReinterpretCastExpr(OpLoc, LAngleLoc, TInfo,
2921                                                         RAngleLoc, LParenLoc,
2922                                                         SubExpr,
2923                                                         RParenLoc);
2924 
2925     case Stmt::CXXConstCastExprClass:
2926       return getDerived().RebuildCXXConstCastExpr(OpLoc, LAngleLoc, TInfo,
2927                                                    RAngleLoc, LParenLoc,
2928                                                    SubExpr, RParenLoc);
2929 
2930     case Stmt::CXXAddrspaceCastExprClass:
2931       return getDerived().RebuildCXXAddrspaceCastExpr(
2932           OpLoc, LAngleLoc, TInfo, RAngleLoc, LParenLoc, SubExpr, RParenLoc);
2933 
2934     default:
2935       llvm_unreachable("Invalid C++ named cast");
2936     }
2937   }
2938 
2939   /// Build a new C++ static_cast expression.
2940   ///
2941   /// By default, performs semantic analysis to build the new expression.
2942   /// Subclasses may override this routine to provide different behavior.
2943   ExprResult RebuildCXXStaticCastExpr(SourceLocation OpLoc,
2944                                             SourceLocation LAngleLoc,
2945                                             TypeSourceInfo *TInfo,
2946                                             SourceLocation RAngleLoc,
2947                                             SourceLocation LParenLoc,
2948                                             Expr *SubExpr,
2949                                             SourceLocation RParenLoc) {
2950     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_static_cast,
2951                                        TInfo, SubExpr,
2952                                        SourceRange(LAngleLoc, RAngleLoc),
2953                                        SourceRange(LParenLoc, RParenLoc));
2954   }
2955 
2956   /// Build a new C++ dynamic_cast expression.
2957   ///
2958   /// By default, performs semantic analysis to build the new expression.
2959   /// Subclasses may override this routine to provide different behavior.
2960   ExprResult RebuildCXXDynamicCastExpr(SourceLocation OpLoc,
2961                                              SourceLocation LAngleLoc,
2962                                              TypeSourceInfo *TInfo,
2963                                              SourceLocation RAngleLoc,
2964                                              SourceLocation LParenLoc,
2965                                              Expr *SubExpr,
2966                                              SourceLocation RParenLoc) {
2967     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_dynamic_cast,
2968                                        TInfo, SubExpr,
2969                                        SourceRange(LAngleLoc, RAngleLoc),
2970                                        SourceRange(LParenLoc, RParenLoc));
2971   }
2972 
2973   /// Build a new C++ reinterpret_cast expression.
2974   ///
2975   /// By default, performs semantic analysis to build the new expression.
2976   /// Subclasses may override this routine to provide different behavior.
2977   ExprResult RebuildCXXReinterpretCastExpr(SourceLocation OpLoc,
2978                                                  SourceLocation LAngleLoc,
2979                                                  TypeSourceInfo *TInfo,
2980                                                  SourceLocation RAngleLoc,
2981                                                  SourceLocation LParenLoc,
2982                                                  Expr *SubExpr,
2983                                                  SourceLocation RParenLoc) {
2984     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_reinterpret_cast,
2985                                        TInfo, SubExpr,
2986                                        SourceRange(LAngleLoc, RAngleLoc),
2987                                        SourceRange(LParenLoc, RParenLoc));
2988   }
2989 
2990   /// Build a new C++ const_cast expression.
2991   ///
2992   /// By default, performs semantic analysis to build the new expression.
2993   /// Subclasses may override this routine to provide different behavior.
2994   ExprResult RebuildCXXConstCastExpr(SourceLocation OpLoc,
2995                                            SourceLocation LAngleLoc,
2996                                            TypeSourceInfo *TInfo,
2997                                            SourceLocation RAngleLoc,
2998                                            SourceLocation LParenLoc,
2999                                            Expr *SubExpr,
3000                                            SourceLocation RParenLoc) {
3001     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_const_cast,
3002                                        TInfo, SubExpr,
3003                                        SourceRange(LAngleLoc, RAngleLoc),
3004                                        SourceRange(LParenLoc, RParenLoc));
3005   }
3006 
3007   ExprResult
3008   RebuildCXXAddrspaceCastExpr(SourceLocation OpLoc, SourceLocation LAngleLoc,
3009                               TypeSourceInfo *TInfo, SourceLocation RAngleLoc,
3010                               SourceLocation LParenLoc, Expr *SubExpr,
3011                               SourceLocation RParenLoc) {
3012     return getSema().BuildCXXNamedCast(
3013         OpLoc, tok::kw_addrspace_cast, TInfo, SubExpr,
3014         SourceRange(LAngleLoc, RAngleLoc), SourceRange(LParenLoc, RParenLoc));
3015   }
3016 
3017   /// Build a new C++ functional-style cast expression.
3018   ///
3019   /// By default, performs semantic analysis to build the new expression.
3020   /// Subclasses may override this routine to provide different behavior.
3021   ExprResult RebuildCXXFunctionalCastExpr(TypeSourceInfo *TInfo,
3022                                           SourceLocation LParenLoc,
3023                                           Expr *Sub,
3024                                           SourceLocation RParenLoc,
3025                                           bool ListInitialization) {
3026     return getSema().BuildCXXTypeConstructExpr(TInfo, LParenLoc,
3027                                                MultiExprArg(&Sub, 1), RParenLoc,
3028                                                ListInitialization);
3029   }
3030 
3031   /// Build a new C++ __builtin_bit_cast expression.
3032   ///
3033   /// By default, performs semantic analysis to build the new expression.
3034   /// Subclasses may override this routine to provide different behavior.
3035   ExprResult RebuildBuiltinBitCastExpr(SourceLocation KWLoc,
3036                                        TypeSourceInfo *TSI, Expr *Sub,
3037                                        SourceLocation RParenLoc) {
3038     return getSema().BuildBuiltinBitCastExpr(KWLoc, TSI, Sub, RParenLoc);
3039   }
3040 
3041   /// Build a new C++ typeid(type) expression.
3042   ///
3043   /// By default, performs semantic analysis to build the new expression.
3044   /// Subclasses may override this routine to provide different behavior.
3045   ExprResult RebuildCXXTypeidExpr(QualType TypeInfoType,
3046                                         SourceLocation TypeidLoc,
3047                                         TypeSourceInfo *Operand,
3048                                         SourceLocation RParenLoc) {
3049     return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand,
3050                                     RParenLoc);
3051   }
3052 
3053 
3054   /// Build a new C++ typeid(expr) expression.
3055   ///
3056   /// By default, performs semantic analysis to build the new expression.
3057   /// Subclasses may override this routine to provide different behavior.
3058   ExprResult RebuildCXXTypeidExpr(QualType TypeInfoType,
3059                                         SourceLocation TypeidLoc,
3060                                         Expr *Operand,
3061                                         SourceLocation RParenLoc) {
3062     return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand,
3063                                     RParenLoc);
3064   }
3065 
3066   /// Build a new C++ __uuidof(type) expression.
3067   ///
3068   /// By default, performs semantic analysis to build the new expression.
3069   /// Subclasses may override this routine to provide different behavior.
3070   ExprResult RebuildCXXUuidofExpr(QualType Type, SourceLocation TypeidLoc,
3071                                   TypeSourceInfo *Operand,
3072                                   SourceLocation RParenLoc) {
3073     return getSema().BuildCXXUuidof(Type, TypeidLoc, Operand, RParenLoc);
3074   }
3075 
3076   /// Build a new C++ __uuidof(expr) expression.
3077   ///
3078   /// By default, performs semantic analysis to build the new expression.
3079   /// Subclasses may override this routine to provide different behavior.
3080   ExprResult RebuildCXXUuidofExpr(QualType Type, SourceLocation TypeidLoc,
3081                                   Expr *Operand, SourceLocation RParenLoc) {
3082     return getSema().BuildCXXUuidof(Type, TypeidLoc, Operand, RParenLoc);
3083   }
3084 
3085   /// Build a new C++ "this" expression.
3086   ///
3087   /// By default, builds a new "this" expression without performing any
3088   /// semantic analysis. Subclasses may override this routine to provide
3089   /// different behavior.
3090   ExprResult RebuildCXXThisExpr(SourceLocation ThisLoc,
3091                                 QualType ThisType,
3092                                 bool isImplicit) {
3093     return getSema().BuildCXXThisExpr(ThisLoc, ThisType, isImplicit);
3094   }
3095 
3096   /// Build a new C++ throw expression.
3097   ///
3098   /// By default, performs semantic analysis to build the new expression.
3099   /// Subclasses may override this routine to provide different behavior.
3100   ExprResult RebuildCXXThrowExpr(SourceLocation ThrowLoc, Expr *Sub,
3101                                  bool IsThrownVariableInScope) {
3102     return getSema().BuildCXXThrow(ThrowLoc, Sub, IsThrownVariableInScope);
3103   }
3104 
3105   /// Build a new C++ default-argument expression.
3106   ///
3107   /// By default, builds a new default-argument expression, which does not
3108   /// require any semantic analysis. Subclasses may override this routine to
3109   /// provide different behavior.
3110   ExprResult RebuildCXXDefaultArgExpr(SourceLocation Loc, ParmVarDecl *Param) {
3111     return CXXDefaultArgExpr::Create(getSema().Context, Loc, Param,
3112                                      getSema().CurContext);
3113   }
3114 
3115   /// Build a new C++11 default-initialization expression.
3116   ///
3117   /// By default, builds a new default field initialization expression, which
3118   /// does not require any semantic analysis. Subclasses may override this
3119   /// routine to provide different behavior.
3120   ExprResult RebuildCXXDefaultInitExpr(SourceLocation Loc,
3121                                        FieldDecl *Field) {
3122     return CXXDefaultInitExpr::Create(getSema().Context, Loc, Field,
3123                                       getSema().CurContext);
3124   }
3125 
3126   /// Build a new C++ zero-initialization expression.
3127   ///
3128   /// By default, performs semantic analysis to build the new expression.
3129   /// Subclasses may override this routine to provide different behavior.
3130   ExprResult RebuildCXXScalarValueInitExpr(TypeSourceInfo *TSInfo,
3131                                            SourceLocation LParenLoc,
3132                                            SourceLocation RParenLoc) {
3133     return getSema().BuildCXXTypeConstructExpr(
3134         TSInfo, LParenLoc, None, RParenLoc, /*ListInitialization=*/false);
3135   }
3136 
3137   /// Build a new C++ "new" expression.
3138   ///
3139   /// By default, performs semantic analysis to build the new expression.
3140   /// Subclasses may override this routine to provide different behavior.
3141   ExprResult RebuildCXXNewExpr(SourceLocation StartLoc,
3142                                bool UseGlobal,
3143                                SourceLocation PlacementLParen,
3144                                MultiExprArg PlacementArgs,
3145                                SourceLocation PlacementRParen,
3146                                SourceRange TypeIdParens,
3147                                QualType AllocatedType,
3148                                TypeSourceInfo *AllocatedTypeInfo,
3149                                Optional<Expr *> ArraySize,
3150                                SourceRange DirectInitRange,
3151                                Expr *Initializer) {
3152     return getSema().BuildCXXNew(StartLoc, UseGlobal,
3153                                  PlacementLParen,
3154                                  PlacementArgs,
3155                                  PlacementRParen,
3156                                  TypeIdParens,
3157                                  AllocatedType,
3158                                  AllocatedTypeInfo,
3159                                  ArraySize,
3160                                  DirectInitRange,
3161                                  Initializer);
3162   }
3163 
3164   /// Build a new C++ "delete" expression.
3165   ///
3166   /// By default, performs semantic analysis to build the new expression.
3167   /// Subclasses may override this routine to provide different behavior.
3168   ExprResult RebuildCXXDeleteExpr(SourceLocation StartLoc,
3169                                         bool IsGlobalDelete,
3170                                         bool IsArrayForm,
3171                                         Expr *Operand) {
3172     return getSema().ActOnCXXDelete(StartLoc, IsGlobalDelete, IsArrayForm,
3173                                     Operand);
3174   }
3175 
3176   /// Build a new type trait expression.
3177   ///
3178   /// By default, performs semantic analysis to build the new expression.
3179   /// Subclasses may override this routine to provide different behavior.
3180   ExprResult RebuildTypeTrait(TypeTrait Trait,
3181                               SourceLocation StartLoc,
3182                               ArrayRef<TypeSourceInfo *> Args,
3183                               SourceLocation RParenLoc) {
3184     return getSema().BuildTypeTrait(Trait, StartLoc, Args, RParenLoc);
3185   }
3186 
3187   /// Build a new array type trait expression.
3188   ///
3189   /// By default, performs semantic analysis to build the new expression.
3190   /// Subclasses may override this routine to provide different behavior.
3191   ExprResult RebuildArrayTypeTrait(ArrayTypeTrait Trait,
3192                                    SourceLocation StartLoc,
3193                                    TypeSourceInfo *TSInfo,
3194                                    Expr *DimExpr,
3195                                    SourceLocation RParenLoc) {
3196     return getSema().BuildArrayTypeTrait(Trait, StartLoc, TSInfo, DimExpr, RParenLoc);
3197   }
3198 
3199   /// Build a new expression trait expression.
3200   ///
3201   /// By default, performs semantic analysis to build the new expression.
3202   /// Subclasses may override this routine to provide different behavior.
3203   ExprResult RebuildExpressionTrait(ExpressionTrait Trait,
3204                                    SourceLocation StartLoc,
3205                                    Expr *Queried,
3206                                    SourceLocation RParenLoc) {
3207     return getSema().BuildExpressionTrait(Trait, StartLoc, Queried, RParenLoc);
3208   }
3209 
3210   /// Build a new (previously unresolved) declaration reference
3211   /// expression.
3212   ///
3213   /// By default, performs semantic analysis to build the new expression.
3214   /// Subclasses may override this routine to provide different behavior.
3215   ExprResult RebuildDependentScopeDeclRefExpr(
3216                                           NestedNameSpecifierLoc QualifierLoc,
3217                                           SourceLocation TemplateKWLoc,
3218                                        const DeclarationNameInfo &NameInfo,
3219                               const TemplateArgumentListInfo *TemplateArgs,
3220                                           bool IsAddressOfOperand,
3221                                           TypeSourceInfo **RecoveryTSI) {
3222     CXXScopeSpec SS;
3223     SS.Adopt(QualifierLoc);
3224 
3225     if (TemplateArgs || TemplateKWLoc.isValid())
3226       return getSema().BuildQualifiedTemplateIdExpr(SS, TemplateKWLoc, NameInfo,
3227                                                     TemplateArgs);
3228 
3229     return getSema().BuildQualifiedDeclarationNameExpr(
3230         SS, NameInfo, IsAddressOfOperand, /*S*/nullptr, RecoveryTSI);
3231   }
3232 
3233   /// Build a new template-id expression.
3234   ///
3235   /// By default, performs semantic analysis to build the new expression.
3236   /// Subclasses may override this routine to provide different behavior.
3237   ExprResult RebuildTemplateIdExpr(const CXXScopeSpec &SS,
3238                                    SourceLocation TemplateKWLoc,
3239                                    LookupResult &R,
3240                                    bool RequiresADL,
3241                               const TemplateArgumentListInfo *TemplateArgs) {
3242     return getSema().BuildTemplateIdExpr(SS, TemplateKWLoc, R, RequiresADL,
3243                                          TemplateArgs);
3244   }
3245 
3246   /// Build a new object-construction 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 RebuildCXXConstructExpr(QualType T,
3251                                      SourceLocation Loc,
3252                                      CXXConstructorDecl *Constructor,
3253                                      bool IsElidable,
3254                                      MultiExprArg Args,
3255                                      bool HadMultipleCandidates,
3256                                      bool ListInitialization,
3257                                      bool StdInitListInitialization,
3258                                      bool RequiresZeroInit,
3259                              CXXConstructExpr::ConstructionKind ConstructKind,
3260                                      SourceRange ParenRange) {
3261     // Reconstruct the constructor we originally found, which might be
3262     // different if this is a call to an inherited constructor.
3263     CXXConstructorDecl *FoundCtor = Constructor;
3264     if (Constructor->isInheritingConstructor())
3265       FoundCtor = Constructor->getInheritedConstructor().getConstructor();
3266 
3267     SmallVector<Expr *, 8> ConvertedArgs;
3268     if (getSema().CompleteConstructorCall(FoundCtor, T, Args, Loc,
3269                                           ConvertedArgs))
3270       return ExprError();
3271 
3272     return getSema().BuildCXXConstructExpr(Loc, T, Constructor,
3273                                            IsElidable,
3274                                            ConvertedArgs,
3275                                            HadMultipleCandidates,
3276                                            ListInitialization,
3277                                            StdInitListInitialization,
3278                                            RequiresZeroInit, ConstructKind,
3279                                            ParenRange);
3280   }
3281 
3282   /// Build a new implicit construction via inherited constructor
3283   /// expression.
3284   ExprResult RebuildCXXInheritedCtorInitExpr(QualType T, SourceLocation Loc,
3285                                              CXXConstructorDecl *Constructor,
3286                                              bool ConstructsVBase,
3287                                              bool InheritedFromVBase) {
3288     return new (getSema().Context) CXXInheritedCtorInitExpr(
3289         Loc, T, Constructor, ConstructsVBase, InheritedFromVBase);
3290   }
3291 
3292   /// Build a new object-construction expression.
3293   ///
3294   /// By default, performs semantic analysis to build the new expression.
3295   /// Subclasses may override this routine to provide different behavior.
3296   ExprResult RebuildCXXTemporaryObjectExpr(TypeSourceInfo *TSInfo,
3297                                            SourceLocation LParenOrBraceLoc,
3298                                            MultiExprArg Args,
3299                                            SourceLocation RParenOrBraceLoc,
3300                                            bool ListInitialization) {
3301     return getSema().BuildCXXTypeConstructExpr(
3302         TSInfo, LParenOrBraceLoc, Args, RParenOrBraceLoc, ListInitialization);
3303   }
3304 
3305   /// Build a new object-construction expression.
3306   ///
3307   /// By default, performs semantic analysis to build the new expression.
3308   /// Subclasses may override this routine to provide different behavior.
3309   ExprResult RebuildCXXUnresolvedConstructExpr(TypeSourceInfo *TSInfo,
3310                                                SourceLocation LParenLoc,
3311                                                MultiExprArg Args,
3312                                                SourceLocation RParenLoc,
3313                                                bool ListInitialization) {
3314     return getSema().BuildCXXTypeConstructExpr(TSInfo, LParenLoc, Args,
3315                                                RParenLoc, ListInitialization);
3316   }
3317 
3318   /// Build a new member reference expression.
3319   ///
3320   /// By default, performs semantic analysis to build the new expression.
3321   /// Subclasses may override this routine to provide different behavior.
3322   ExprResult RebuildCXXDependentScopeMemberExpr(Expr *BaseE,
3323                                                 QualType BaseType,
3324                                                 bool IsArrow,
3325                                                 SourceLocation OperatorLoc,
3326                                           NestedNameSpecifierLoc QualifierLoc,
3327                                                 SourceLocation TemplateKWLoc,
3328                                             NamedDecl *FirstQualifierInScope,
3329                                    const DeclarationNameInfo &MemberNameInfo,
3330                               const TemplateArgumentListInfo *TemplateArgs) {
3331     CXXScopeSpec SS;
3332     SS.Adopt(QualifierLoc);
3333 
3334     return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType,
3335                                             OperatorLoc, IsArrow,
3336                                             SS, TemplateKWLoc,
3337                                             FirstQualifierInScope,
3338                                             MemberNameInfo,
3339                                             TemplateArgs, /*S*/nullptr);
3340   }
3341 
3342   /// Build a new member reference expression.
3343   ///
3344   /// By default, performs semantic analysis to build the new expression.
3345   /// Subclasses may override this routine to provide different behavior.
3346   ExprResult RebuildUnresolvedMemberExpr(Expr *BaseE, QualType BaseType,
3347                                          SourceLocation OperatorLoc,
3348                                          bool IsArrow,
3349                                          NestedNameSpecifierLoc QualifierLoc,
3350                                          SourceLocation TemplateKWLoc,
3351                                          NamedDecl *FirstQualifierInScope,
3352                                          LookupResult &R,
3353                                 const TemplateArgumentListInfo *TemplateArgs) {
3354     CXXScopeSpec SS;
3355     SS.Adopt(QualifierLoc);
3356 
3357     return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType,
3358                                             OperatorLoc, IsArrow,
3359                                             SS, TemplateKWLoc,
3360                                             FirstQualifierInScope,
3361                                             R, TemplateArgs, /*S*/nullptr);
3362   }
3363 
3364   /// Build a new noexcept expression.
3365   ///
3366   /// By default, performs semantic analysis to build the new expression.
3367   /// Subclasses may override this routine to provide different behavior.
3368   ExprResult RebuildCXXNoexceptExpr(SourceRange Range, Expr *Arg) {
3369     return SemaRef.BuildCXXNoexceptExpr(Range.getBegin(), Arg, Range.getEnd());
3370   }
3371 
3372   /// Build a new expression to compute the length of a parameter pack.
3373   ExprResult RebuildSizeOfPackExpr(SourceLocation OperatorLoc,
3374                                    NamedDecl *Pack,
3375                                    SourceLocation PackLoc,
3376                                    SourceLocation RParenLoc,
3377                                    Optional<unsigned> Length,
3378                                    ArrayRef<TemplateArgument> PartialArgs) {
3379     return SizeOfPackExpr::Create(SemaRef.Context, OperatorLoc, Pack, PackLoc,
3380                                   RParenLoc, Length, PartialArgs);
3381   }
3382 
3383   /// Build a new expression representing a call to a source location
3384   ///  builtin.
3385   ///
3386   /// By default, performs semantic analysis to build the new expression.
3387   /// Subclasses may override this routine to provide different behavior.
3388   ExprResult RebuildSourceLocExpr(SourceLocExpr::IdentKind Kind,
3389                                   SourceLocation BuiltinLoc,
3390                                   SourceLocation RPLoc,
3391                                   DeclContext *ParentContext) {
3392     return getSema().BuildSourceLocExpr(Kind, BuiltinLoc, RPLoc, ParentContext);
3393   }
3394 
3395   /// Build a new Objective-C boxed expression.
3396   ///
3397   /// By default, performs semantic analysis to build the new expression.
3398   /// Subclasses may override this routine to provide different behavior.
3399   ExprResult RebuildConceptSpecializationExpr(NestedNameSpecifierLoc NNS,
3400       SourceLocation TemplateKWLoc, DeclarationNameInfo ConceptNameInfo,
3401       NamedDecl *FoundDecl, ConceptDecl *NamedConcept,
3402       TemplateArgumentListInfo *TALI) {
3403     CXXScopeSpec SS;
3404     SS.Adopt(NNS);
3405     ExprResult Result = getSema().CheckConceptTemplateId(SS, TemplateKWLoc,
3406                                                          ConceptNameInfo,
3407                                                          FoundDecl,
3408                                                          NamedConcept, TALI);
3409     if (Result.isInvalid())
3410       return ExprError();
3411     return Result;
3412   }
3413 
3414   /// \brief Build a new requires expression.
3415   ///
3416   /// By default, performs semantic analysis to build the new expression.
3417   /// Subclasses may override this routine to provide different behavior.
3418   ExprResult RebuildRequiresExpr(SourceLocation RequiresKWLoc,
3419                                  RequiresExprBodyDecl *Body,
3420                                  ArrayRef<ParmVarDecl *> LocalParameters,
3421                                  ArrayRef<concepts::Requirement *> Requirements,
3422                                  SourceLocation ClosingBraceLoc) {
3423     return RequiresExpr::Create(SemaRef.Context, RequiresKWLoc, Body,
3424                                 LocalParameters, Requirements, ClosingBraceLoc);
3425   }
3426 
3427   concepts::TypeRequirement *
3428   RebuildTypeRequirement(
3429       concepts::Requirement::SubstitutionDiagnostic *SubstDiag) {
3430     return SemaRef.BuildTypeRequirement(SubstDiag);
3431   }
3432 
3433   concepts::TypeRequirement *RebuildTypeRequirement(TypeSourceInfo *T) {
3434     return SemaRef.BuildTypeRequirement(T);
3435   }
3436 
3437   concepts::ExprRequirement *
3438   RebuildExprRequirement(
3439       concepts::Requirement::SubstitutionDiagnostic *SubstDiag, bool IsSimple,
3440       SourceLocation NoexceptLoc,
3441       concepts::ExprRequirement::ReturnTypeRequirement Ret) {
3442     return SemaRef.BuildExprRequirement(SubstDiag, IsSimple, NoexceptLoc,
3443                                         std::move(Ret));
3444   }
3445 
3446   concepts::ExprRequirement *
3447   RebuildExprRequirement(Expr *E, bool IsSimple, SourceLocation NoexceptLoc,
3448                          concepts::ExprRequirement::ReturnTypeRequirement Ret) {
3449     return SemaRef.BuildExprRequirement(E, IsSimple, NoexceptLoc,
3450                                         std::move(Ret));
3451   }
3452 
3453   concepts::NestedRequirement *
3454   RebuildNestedRequirement(
3455       concepts::Requirement::SubstitutionDiagnostic *SubstDiag) {
3456     return SemaRef.BuildNestedRequirement(SubstDiag);
3457   }
3458 
3459   concepts::NestedRequirement *RebuildNestedRequirement(Expr *Constraint) {
3460     return SemaRef.BuildNestedRequirement(Constraint);
3461   }
3462 
3463   /// \brief Build a new Objective-C boxed expression.
3464   ///
3465   /// By default, performs semantic analysis to build the new expression.
3466   /// Subclasses may override this routine to provide different behavior.
3467   ExprResult RebuildObjCBoxedExpr(SourceRange SR, Expr *ValueExpr) {
3468     return getSema().BuildObjCBoxedExpr(SR, ValueExpr);
3469   }
3470 
3471   /// Build a new Objective-C array literal.
3472   ///
3473   /// By default, performs semantic analysis to build the new expression.
3474   /// Subclasses may override this routine to provide different behavior.
3475   ExprResult RebuildObjCArrayLiteral(SourceRange Range,
3476                                      Expr **Elements, unsigned NumElements) {
3477     return getSema().BuildObjCArrayLiteral(Range,
3478                                            MultiExprArg(Elements, NumElements));
3479   }
3480 
3481   ExprResult RebuildObjCSubscriptRefExpr(SourceLocation RB,
3482                                          Expr *Base, Expr *Key,
3483                                          ObjCMethodDecl *getterMethod,
3484                                          ObjCMethodDecl *setterMethod) {
3485     return  getSema().BuildObjCSubscriptExpression(RB, Base, Key,
3486                                                    getterMethod, setterMethod);
3487   }
3488 
3489   /// Build a new Objective-C dictionary literal.
3490   ///
3491   /// By default, performs semantic analysis to build the new expression.
3492   /// Subclasses may override this routine to provide different behavior.
3493   ExprResult RebuildObjCDictionaryLiteral(SourceRange Range,
3494                               MutableArrayRef<ObjCDictionaryElement> Elements) {
3495     return getSema().BuildObjCDictionaryLiteral(Range, Elements);
3496   }
3497 
3498   /// Build a new Objective-C \@encode expression.
3499   ///
3500   /// By default, performs semantic analysis to build the new expression.
3501   /// Subclasses may override this routine to provide different behavior.
3502   ExprResult RebuildObjCEncodeExpr(SourceLocation AtLoc,
3503                                          TypeSourceInfo *EncodeTypeInfo,
3504                                          SourceLocation RParenLoc) {
3505     return SemaRef.BuildObjCEncodeExpression(AtLoc, EncodeTypeInfo, RParenLoc);
3506   }
3507 
3508   /// Build a new Objective-C class message.
3509   ExprResult RebuildObjCMessageExpr(TypeSourceInfo *ReceiverTypeInfo,
3510                                           Selector Sel,
3511                                           ArrayRef<SourceLocation> SelectorLocs,
3512                                           ObjCMethodDecl *Method,
3513                                           SourceLocation LBracLoc,
3514                                           MultiExprArg Args,
3515                                           SourceLocation RBracLoc) {
3516     return SemaRef.BuildClassMessage(ReceiverTypeInfo,
3517                                      ReceiverTypeInfo->getType(),
3518                                      /*SuperLoc=*/SourceLocation(),
3519                                      Sel, Method, LBracLoc, SelectorLocs,
3520                                      RBracLoc, Args);
3521   }
3522 
3523   /// Build a new Objective-C instance message.
3524   ExprResult RebuildObjCMessageExpr(Expr *Receiver,
3525                                           Selector Sel,
3526                                           ArrayRef<SourceLocation> SelectorLocs,
3527                                           ObjCMethodDecl *Method,
3528                                           SourceLocation LBracLoc,
3529                                           MultiExprArg Args,
3530                                           SourceLocation RBracLoc) {
3531     return SemaRef.BuildInstanceMessage(Receiver,
3532                                         Receiver->getType(),
3533                                         /*SuperLoc=*/SourceLocation(),
3534                                         Sel, Method, LBracLoc, SelectorLocs,
3535                                         RBracLoc, Args);
3536   }
3537 
3538   /// Build a new Objective-C instance/class message to 'super'.
3539   ExprResult RebuildObjCMessageExpr(SourceLocation SuperLoc,
3540                                     Selector Sel,
3541                                     ArrayRef<SourceLocation> SelectorLocs,
3542                                     QualType SuperType,
3543                                     ObjCMethodDecl *Method,
3544                                     SourceLocation LBracLoc,
3545                                     MultiExprArg Args,
3546                                     SourceLocation RBracLoc) {
3547     return Method->isInstanceMethod() ? SemaRef.BuildInstanceMessage(nullptr,
3548                                           SuperType,
3549                                           SuperLoc,
3550                                           Sel, Method, LBracLoc, SelectorLocs,
3551                                           RBracLoc, Args)
3552                                       : SemaRef.BuildClassMessage(nullptr,
3553                                           SuperType,
3554                                           SuperLoc,
3555                                           Sel, Method, LBracLoc, SelectorLocs,
3556                                           RBracLoc, Args);
3557 
3558 
3559   }
3560 
3561   /// Build a new Objective-C ivar reference expression.
3562   ///
3563   /// By default, performs semantic analysis to build the new expression.
3564   /// Subclasses may override this routine to provide different behavior.
3565   ExprResult RebuildObjCIvarRefExpr(Expr *BaseArg, ObjCIvarDecl *Ivar,
3566                                           SourceLocation IvarLoc,
3567                                           bool IsArrow, bool IsFreeIvar) {
3568     CXXScopeSpec SS;
3569     DeclarationNameInfo NameInfo(Ivar->getDeclName(), IvarLoc);
3570     ExprResult Result = getSema().BuildMemberReferenceExpr(
3571         BaseArg, BaseArg->getType(),
3572         /*FIXME:*/ IvarLoc, IsArrow, SS, SourceLocation(),
3573         /*FirstQualifierInScope=*/nullptr, NameInfo,
3574         /*TemplateArgs=*/nullptr,
3575         /*S=*/nullptr);
3576     if (IsFreeIvar && Result.isUsable())
3577       cast<ObjCIvarRefExpr>(Result.get())->setIsFreeIvar(IsFreeIvar);
3578     return Result;
3579   }
3580 
3581   /// Build a new Objective-C property reference expression.
3582   ///
3583   /// By default, performs semantic analysis to build the new expression.
3584   /// Subclasses may override this routine to provide different behavior.
3585   ExprResult RebuildObjCPropertyRefExpr(Expr *BaseArg,
3586                                         ObjCPropertyDecl *Property,
3587                                         SourceLocation PropertyLoc) {
3588     CXXScopeSpec SS;
3589     DeclarationNameInfo NameInfo(Property->getDeclName(), PropertyLoc);
3590     return getSema().BuildMemberReferenceExpr(BaseArg, BaseArg->getType(),
3591                                               /*FIXME:*/PropertyLoc,
3592                                               /*IsArrow=*/false,
3593                                               SS, SourceLocation(),
3594                                               /*FirstQualifierInScope=*/nullptr,
3595                                               NameInfo,
3596                                               /*TemplateArgs=*/nullptr,
3597                                               /*S=*/nullptr);
3598   }
3599 
3600   /// Build a new Objective-C property reference expression.
3601   ///
3602   /// By default, performs semantic analysis to build the new expression.
3603   /// Subclasses may override this routine to provide different behavior.
3604   ExprResult RebuildObjCPropertyRefExpr(Expr *Base, QualType T,
3605                                         ObjCMethodDecl *Getter,
3606                                         ObjCMethodDecl *Setter,
3607                                         SourceLocation PropertyLoc) {
3608     // Since these expressions can only be value-dependent, we do not
3609     // need to perform semantic analysis again.
3610     return Owned(
3611       new (getSema().Context) ObjCPropertyRefExpr(Getter, Setter, T,
3612                                                   VK_LValue, OK_ObjCProperty,
3613                                                   PropertyLoc, Base));
3614   }
3615 
3616   /// Build a new Objective-C "isa" expression.
3617   ///
3618   /// By default, performs semantic analysis to build the new expression.
3619   /// Subclasses may override this routine to provide different behavior.
3620   ExprResult RebuildObjCIsaExpr(Expr *BaseArg, SourceLocation IsaLoc,
3621                                 SourceLocation OpLoc, bool IsArrow) {
3622     CXXScopeSpec SS;
3623     DeclarationNameInfo NameInfo(&getSema().Context.Idents.get("isa"), IsaLoc);
3624     return getSema().BuildMemberReferenceExpr(BaseArg, BaseArg->getType(),
3625                                               OpLoc, IsArrow,
3626                                               SS, SourceLocation(),
3627                                               /*FirstQualifierInScope=*/nullptr,
3628                                               NameInfo,
3629                                               /*TemplateArgs=*/nullptr,
3630                                               /*S=*/nullptr);
3631   }
3632 
3633   /// Build a new shuffle vector expression.
3634   ///
3635   /// By default, performs semantic analysis to build the new expression.
3636   /// Subclasses may override this routine to provide different behavior.
3637   ExprResult RebuildShuffleVectorExpr(SourceLocation BuiltinLoc,
3638                                       MultiExprArg SubExprs,
3639                                       SourceLocation RParenLoc) {
3640     // Find the declaration for __builtin_shufflevector
3641     const IdentifierInfo &Name
3642       = SemaRef.Context.Idents.get("__builtin_shufflevector");
3643     TranslationUnitDecl *TUDecl = SemaRef.Context.getTranslationUnitDecl();
3644     DeclContext::lookup_result Lookup = TUDecl->lookup(DeclarationName(&Name));
3645     assert(!Lookup.empty() && "No __builtin_shufflevector?");
3646 
3647     // Build a reference to the __builtin_shufflevector builtin
3648     FunctionDecl *Builtin = cast<FunctionDecl>(Lookup.front());
3649     Expr *Callee = new (SemaRef.Context)
3650         DeclRefExpr(SemaRef.Context, Builtin, false,
3651                     SemaRef.Context.BuiltinFnTy, VK_PRValue, BuiltinLoc);
3652     QualType CalleePtrTy = SemaRef.Context.getPointerType(Builtin->getType());
3653     Callee = SemaRef.ImpCastExprToType(Callee, CalleePtrTy,
3654                                        CK_BuiltinFnToFnPtr).get();
3655 
3656     // Build the CallExpr
3657     ExprResult TheCall = CallExpr::Create(
3658         SemaRef.Context, Callee, SubExprs, Builtin->getCallResultType(),
3659         Expr::getValueKindForType(Builtin->getReturnType()), RParenLoc,
3660         FPOptionsOverride());
3661 
3662     // Type-check the __builtin_shufflevector expression.
3663     return SemaRef.SemaBuiltinShuffleVector(cast<CallExpr>(TheCall.get()));
3664   }
3665 
3666   /// Build a new convert vector expression.
3667   ExprResult RebuildConvertVectorExpr(SourceLocation BuiltinLoc,
3668                                       Expr *SrcExpr, TypeSourceInfo *DstTInfo,
3669                                       SourceLocation RParenLoc) {
3670     return SemaRef.SemaConvertVectorExpr(SrcExpr, DstTInfo,
3671                                          BuiltinLoc, RParenLoc);
3672   }
3673 
3674   /// Build a new template argument pack expansion.
3675   ///
3676   /// By default, performs semantic analysis to build a new pack expansion
3677   /// for a template argument. Subclasses may override this routine to provide
3678   /// different behavior.
3679   TemplateArgumentLoc RebuildPackExpansion(TemplateArgumentLoc Pattern,
3680                                            SourceLocation EllipsisLoc,
3681                                            Optional<unsigned> NumExpansions) {
3682     switch (Pattern.getArgument().getKind()) {
3683     case TemplateArgument::Expression: {
3684       ExprResult Result
3685         = getSema().CheckPackExpansion(Pattern.getSourceExpression(),
3686                                        EllipsisLoc, NumExpansions);
3687       if (Result.isInvalid())
3688         return TemplateArgumentLoc();
3689 
3690       return TemplateArgumentLoc(Result.get(), Result.get());
3691     }
3692 
3693     case TemplateArgument::Template:
3694       return TemplateArgumentLoc(
3695           SemaRef.Context,
3696           TemplateArgument(Pattern.getArgument().getAsTemplate(),
3697                            NumExpansions),
3698           Pattern.getTemplateQualifierLoc(), Pattern.getTemplateNameLoc(),
3699           EllipsisLoc);
3700 
3701     case TemplateArgument::Null:
3702     case TemplateArgument::Integral:
3703     case TemplateArgument::Declaration:
3704     case TemplateArgument::Pack:
3705     case TemplateArgument::TemplateExpansion:
3706     case TemplateArgument::NullPtr:
3707       llvm_unreachable("Pack expansion pattern has no parameter packs");
3708 
3709     case TemplateArgument::Type:
3710       if (TypeSourceInfo *Expansion
3711             = getSema().CheckPackExpansion(Pattern.getTypeSourceInfo(),
3712                                            EllipsisLoc,
3713                                            NumExpansions))
3714         return TemplateArgumentLoc(TemplateArgument(Expansion->getType()),
3715                                    Expansion);
3716       break;
3717     }
3718 
3719     return TemplateArgumentLoc();
3720   }
3721 
3722   /// Build a new expression pack expansion.
3723   ///
3724   /// By default, performs semantic analysis to build a new pack expansion
3725   /// for an expression. Subclasses may override this routine to provide
3726   /// different behavior.
3727   ExprResult RebuildPackExpansion(Expr *Pattern, SourceLocation EllipsisLoc,
3728                                   Optional<unsigned> NumExpansions) {
3729     return getSema().CheckPackExpansion(Pattern, EllipsisLoc, NumExpansions);
3730   }
3731 
3732   /// Build a new C++1z fold-expression.
3733   ///
3734   /// By default, performs semantic analysis in order to build a new fold
3735   /// expression.
3736   ExprResult RebuildCXXFoldExpr(UnresolvedLookupExpr *ULE,
3737                                 SourceLocation LParenLoc, Expr *LHS,
3738                                 BinaryOperatorKind Operator,
3739                                 SourceLocation EllipsisLoc, Expr *RHS,
3740                                 SourceLocation RParenLoc,
3741                                 Optional<unsigned> NumExpansions) {
3742     return getSema().BuildCXXFoldExpr(ULE, LParenLoc, LHS, Operator,
3743                                       EllipsisLoc, RHS, RParenLoc,
3744                                       NumExpansions);
3745   }
3746 
3747   /// Build an empty C++1z fold-expression with the given operator.
3748   ///
3749   /// By default, produces the fallback value for the fold-expression, or
3750   /// produce an error if there is no fallback value.
3751   ExprResult RebuildEmptyCXXFoldExpr(SourceLocation EllipsisLoc,
3752                                      BinaryOperatorKind Operator) {
3753     return getSema().BuildEmptyCXXFoldExpr(EllipsisLoc, Operator);
3754   }
3755 
3756   /// Build a new atomic operation expression.
3757   ///
3758   /// By default, performs semantic analysis to build the new expression.
3759   /// Subclasses may override this routine to provide different behavior.
3760   ExprResult RebuildAtomicExpr(SourceLocation BuiltinLoc, MultiExprArg SubExprs,
3761                                AtomicExpr::AtomicOp Op,
3762                                SourceLocation RParenLoc) {
3763     // Use this for all of the locations, since we don't know the difference
3764     // between the call and the expr at this point.
3765     SourceRange Range{BuiltinLoc, RParenLoc};
3766     return getSema().BuildAtomicExpr(Range, Range, RParenLoc, SubExprs, Op,
3767                                      Sema::AtomicArgumentOrder::AST);
3768   }
3769 
3770   ExprResult RebuildRecoveryExpr(SourceLocation BeginLoc, SourceLocation EndLoc,
3771                                  ArrayRef<Expr *> SubExprs, QualType Type) {
3772     return getSema().CreateRecoveryExpr(BeginLoc, EndLoc, SubExprs, Type);
3773   }
3774 
3775 private:
3776   TypeLoc TransformTypeInObjectScope(TypeLoc TL,
3777                                      QualType ObjectType,
3778                                      NamedDecl *FirstQualifierInScope,
3779                                      CXXScopeSpec &SS);
3780 
3781   TypeSourceInfo *TransformTypeInObjectScope(TypeSourceInfo *TSInfo,
3782                                              QualType ObjectType,
3783                                              NamedDecl *FirstQualifierInScope,
3784                                              CXXScopeSpec &SS);
3785 
3786   TypeSourceInfo *TransformTSIInObjectScope(TypeLoc TL, QualType ObjectType,
3787                                             NamedDecl *FirstQualifierInScope,
3788                                             CXXScopeSpec &SS);
3789 
3790   QualType TransformDependentNameType(TypeLocBuilder &TLB,
3791                                       DependentNameTypeLoc TL,
3792                                       bool DeducibleTSTContext);
3793 };
3794 
3795 template <typename Derived>
3796 StmtResult TreeTransform<Derived>::TransformStmt(Stmt *S, StmtDiscardKind SDK) {
3797   if (!S)
3798     return S;
3799 
3800   switch (S->getStmtClass()) {
3801   case Stmt::NoStmtClass: break;
3802 
3803   // Transform individual statement nodes
3804   // Pass SDK into statements that can produce a value
3805 #define STMT(Node, Parent)                                              \
3806   case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(S));
3807 #define VALUESTMT(Node, Parent)                                         \
3808   case Stmt::Node##Class:                                               \
3809     return getDerived().Transform##Node(cast<Node>(S), SDK);
3810 #define ABSTRACT_STMT(Node)
3811 #define EXPR(Node, Parent)
3812 #include "clang/AST/StmtNodes.inc"
3813 
3814   // Transform expressions by calling TransformExpr.
3815 #define STMT(Node, Parent)
3816 #define ABSTRACT_STMT(Stmt)
3817 #define EXPR(Node, Parent) case Stmt::Node##Class:
3818 #include "clang/AST/StmtNodes.inc"
3819     {
3820       ExprResult E = getDerived().TransformExpr(cast<Expr>(S));
3821 
3822       if (SDK == SDK_StmtExprResult)
3823         E = getSema().ActOnStmtExprResult(E);
3824       return getSema().ActOnExprStmt(E, SDK == SDK_Discarded);
3825     }
3826   }
3827 
3828   return S;
3829 }
3830 
3831 template<typename Derived>
3832 OMPClause *TreeTransform<Derived>::TransformOMPClause(OMPClause *S) {
3833   if (!S)
3834     return S;
3835 
3836   switch (S->getClauseKind()) {
3837   default: break;
3838   // Transform individual clause nodes
3839 #define GEN_CLANG_CLAUSE_CLASS
3840 #define CLAUSE_CLASS(Enum, Str, Class)                                         \
3841   case Enum:                                                                   \
3842     return getDerived().Transform##Class(cast<Class>(S));
3843 #include "llvm/Frontend/OpenMP/OMP.inc"
3844   }
3845 
3846   return S;
3847 }
3848 
3849 
3850 template<typename Derived>
3851 ExprResult TreeTransform<Derived>::TransformExpr(Expr *E) {
3852   if (!E)
3853     return E;
3854 
3855   switch (E->getStmtClass()) {
3856     case Stmt::NoStmtClass: break;
3857 #define STMT(Node, Parent) case Stmt::Node##Class: break;
3858 #define ABSTRACT_STMT(Stmt)
3859 #define EXPR(Node, Parent)                                              \
3860     case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(E));
3861 #include "clang/AST/StmtNodes.inc"
3862   }
3863 
3864   return E;
3865 }
3866 
3867 template<typename Derived>
3868 ExprResult TreeTransform<Derived>::TransformInitializer(Expr *Init,
3869                                                         bool NotCopyInit) {
3870   // Initializers are instantiated like expressions, except that various outer
3871   // layers are stripped.
3872   if (!Init)
3873     return Init;
3874 
3875   if (auto *FE = dyn_cast<FullExpr>(Init))
3876     Init = FE->getSubExpr();
3877 
3878   if (auto *AIL = dyn_cast<ArrayInitLoopExpr>(Init)) {
3879     OpaqueValueExpr *OVE = AIL->getCommonExpr();
3880     Init = OVE->getSourceExpr();
3881   }
3882 
3883   if (MaterializeTemporaryExpr *MTE = dyn_cast<MaterializeTemporaryExpr>(Init))
3884     Init = MTE->getSubExpr();
3885 
3886   while (CXXBindTemporaryExpr *Binder = dyn_cast<CXXBindTemporaryExpr>(Init))
3887     Init = Binder->getSubExpr();
3888 
3889   if (ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(Init))
3890     Init = ICE->getSubExprAsWritten();
3891 
3892   if (CXXStdInitializerListExpr *ILE =
3893           dyn_cast<CXXStdInitializerListExpr>(Init))
3894     return TransformInitializer(ILE->getSubExpr(), NotCopyInit);
3895 
3896   // If this is copy-initialization, we only need to reconstruct
3897   // InitListExprs. Other forms of copy-initialization will be a no-op if
3898   // the initializer is already the right type.
3899   CXXConstructExpr *Construct = dyn_cast<CXXConstructExpr>(Init);
3900   if (!NotCopyInit && !(Construct && Construct->isListInitialization()))
3901     return getDerived().TransformExpr(Init);
3902 
3903   // Revert value-initialization back to empty parens.
3904   if (CXXScalarValueInitExpr *VIE = dyn_cast<CXXScalarValueInitExpr>(Init)) {
3905     SourceRange Parens = VIE->getSourceRange();
3906     return getDerived().RebuildParenListExpr(Parens.getBegin(), None,
3907                                              Parens.getEnd());
3908   }
3909 
3910   // FIXME: We shouldn't build ImplicitValueInitExprs for direct-initialization.
3911   if (isa<ImplicitValueInitExpr>(Init))
3912     return getDerived().RebuildParenListExpr(SourceLocation(), None,
3913                                              SourceLocation());
3914 
3915   // Revert initialization by constructor back to a parenthesized or braced list
3916   // of expressions. Any other form of initializer can just be reused directly.
3917   if (!Construct || isa<CXXTemporaryObjectExpr>(Construct))
3918     return getDerived().TransformExpr(Init);
3919 
3920   // If the initialization implicitly converted an initializer list to a
3921   // std::initializer_list object, unwrap the std::initializer_list too.
3922   if (Construct && Construct->isStdInitListInitialization())
3923     return TransformInitializer(Construct->getArg(0), NotCopyInit);
3924 
3925   // Enter a list-init context if this was list initialization.
3926   EnterExpressionEvaluationContext Context(
3927       getSema(), EnterExpressionEvaluationContext::InitList,
3928       Construct->isListInitialization());
3929 
3930   SmallVector<Expr*, 8> NewArgs;
3931   bool ArgChanged = false;
3932   if (getDerived().TransformExprs(Construct->getArgs(), Construct->getNumArgs(),
3933                                   /*IsCall*/true, NewArgs, &ArgChanged))
3934     return ExprError();
3935 
3936   // If this was list initialization, revert to syntactic list form.
3937   if (Construct->isListInitialization())
3938     return getDerived().RebuildInitList(Construct->getBeginLoc(), NewArgs,
3939                                         Construct->getEndLoc());
3940 
3941   // Build a ParenListExpr to represent anything else.
3942   SourceRange Parens = Construct->getParenOrBraceRange();
3943   if (Parens.isInvalid()) {
3944     // This was a variable declaration's initialization for which no initializer
3945     // was specified.
3946     assert(NewArgs.empty() &&
3947            "no parens or braces but have direct init with arguments?");
3948     return ExprEmpty();
3949   }
3950   return getDerived().RebuildParenListExpr(Parens.getBegin(), NewArgs,
3951                                            Parens.getEnd());
3952 }
3953 
3954 template<typename Derived>
3955 bool TreeTransform<Derived>::TransformExprs(Expr *const *Inputs,
3956                                             unsigned NumInputs,
3957                                             bool IsCall,
3958                                       SmallVectorImpl<Expr *> &Outputs,
3959                                             bool *ArgChanged) {
3960   for (unsigned I = 0; I != NumInputs; ++I) {
3961     // If requested, drop call arguments that need to be dropped.
3962     if (IsCall && getDerived().DropCallArgument(Inputs[I])) {
3963       if (ArgChanged)
3964         *ArgChanged = true;
3965 
3966       break;
3967     }
3968 
3969     if (PackExpansionExpr *Expansion = dyn_cast<PackExpansionExpr>(Inputs[I])) {
3970       Expr *Pattern = Expansion->getPattern();
3971 
3972       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
3973       getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
3974       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
3975 
3976       // Determine whether the set of unexpanded parameter packs can and should
3977       // be expanded.
3978       bool Expand = true;
3979       bool RetainExpansion = false;
3980       Optional<unsigned> OrigNumExpansions = Expansion->getNumExpansions();
3981       Optional<unsigned> NumExpansions = OrigNumExpansions;
3982       if (getDerived().TryExpandParameterPacks(Expansion->getEllipsisLoc(),
3983                                                Pattern->getSourceRange(),
3984                                                Unexpanded,
3985                                                Expand, RetainExpansion,
3986                                                NumExpansions))
3987         return true;
3988 
3989       if (!Expand) {
3990         // The transform has determined that we should perform a simple
3991         // transformation on the pack expansion, producing another pack
3992         // expansion.
3993         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
3994         ExprResult OutPattern = getDerived().TransformExpr(Pattern);
3995         if (OutPattern.isInvalid())
3996           return true;
3997 
3998         ExprResult Out = getDerived().RebuildPackExpansion(OutPattern.get(),
3999                                                 Expansion->getEllipsisLoc(),
4000                                                            NumExpansions);
4001         if (Out.isInvalid())
4002           return true;
4003 
4004         if (ArgChanged)
4005           *ArgChanged = true;
4006         Outputs.push_back(Out.get());
4007         continue;
4008       }
4009 
4010       // Record right away that the argument was changed.  This needs
4011       // to happen even if the array expands to nothing.
4012       if (ArgChanged) *ArgChanged = true;
4013 
4014       // The transform has determined that we should perform an elementwise
4015       // expansion of the pattern. Do so.
4016       for (unsigned I = 0; I != *NumExpansions; ++I) {
4017         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
4018         ExprResult Out = getDerived().TransformExpr(Pattern);
4019         if (Out.isInvalid())
4020           return true;
4021 
4022         if (Out.get()->containsUnexpandedParameterPack()) {
4023           Out = getDerived().RebuildPackExpansion(
4024               Out.get(), Expansion->getEllipsisLoc(), OrigNumExpansions);
4025           if (Out.isInvalid())
4026             return true;
4027         }
4028 
4029         Outputs.push_back(Out.get());
4030       }
4031 
4032       // If we're supposed to retain a pack expansion, do so by temporarily
4033       // forgetting the partially-substituted parameter pack.
4034       if (RetainExpansion) {
4035         ForgetPartiallySubstitutedPackRAII Forget(getDerived());
4036 
4037         ExprResult Out = getDerived().TransformExpr(Pattern);
4038         if (Out.isInvalid())
4039           return true;
4040 
4041         Out = getDerived().RebuildPackExpansion(
4042             Out.get(), Expansion->getEllipsisLoc(), OrigNumExpansions);
4043         if (Out.isInvalid())
4044           return true;
4045 
4046         Outputs.push_back(Out.get());
4047       }
4048 
4049       continue;
4050     }
4051 
4052     ExprResult Result =
4053       IsCall ? getDerived().TransformInitializer(Inputs[I], /*DirectInit*/false)
4054              : getDerived().TransformExpr(Inputs[I]);
4055     if (Result.isInvalid())
4056       return true;
4057 
4058     if (Result.get() != Inputs[I] && ArgChanged)
4059       *ArgChanged = true;
4060 
4061     Outputs.push_back(Result.get());
4062   }
4063 
4064   return false;
4065 }
4066 
4067 template <typename Derived>
4068 Sema::ConditionResult TreeTransform<Derived>::TransformCondition(
4069     SourceLocation Loc, VarDecl *Var, Expr *Expr, Sema::ConditionKind Kind) {
4070   if (Var) {
4071     VarDecl *ConditionVar = cast_or_null<VarDecl>(
4072         getDerived().TransformDefinition(Var->getLocation(), Var));
4073 
4074     if (!ConditionVar)
4075       return Sema::ConditionError();
4076 
4077     return getSema().ActOnConditionVariable(ConditionVar, Loc, Kind);
4078   }
4079 
4080   if (Expr) {
4081     ExprResult CondExpr = getDerived().TransformExpr(Expr);
4082 
4083     if (CondExpr.isInvalid())
4084       return Sema::ConditionError();
4085 
4086     return getSema().ActOnCondition(nullptr, Loc, CondExpr.get(), Kind,
4087                                     /*MissingOK=*/true);
4088   }
4089 
4090   return Sema::ConditionResult();
4091 }
4092 
4093 template <typename Derived>
4094 NestedNameSpecifierLoc TreeTransform<Derived>::TransformNestedNameSpecifierLoc(
4095     NestedNameSpecifierLoc NNS, QualType ObjectType,
4096     NamedDecl *FirstQualifierInScope) {
4097   SmallVector<NestedNameSpecifierLoc, 4> Qualifiers;
4098   for (NestedNameSpecifierLoc Qualifier = NNS; Qualifier;
4099        Qualifier = Qualifier.getPrefix())
4100     Qualifiers.push_back(Qualifier);
4101 
4102   CXXScopeSpec SS;
4103   while (!Qualifiers.empty()) {
4104     NestedNameSpecifierLoc Q = Qualifiers.pop_back_val();
4105     NestedNameSpecifier *QNNS = Q.getNestedNameSpecifier();
4106 
4107     switch (QNNS->getKind()) {
4108     case NestedNameSpecifier::Identifier: {
4109       Sema::NestedNameSpecInfo IdInfo(QNNS->getAsIdentifier(),
4110                                       Q.getLocalBeginLoc(), Q.getLocalEndLoc(),
4111                                       ObjectType);
4112       if (SemaRef.BuildCXXNestedNameSpecifier(/*Scope=*/nullptr, IdInfo, false,
4113                                               SS, FirstQualifierInScope, false))
4114         return NestedNameSpecifierLoc();
4115       break;
4116     }
4117 
4118     case NestedNameSpecifier::Namespace: {
4119       NamespaceDecl *NS =
4120           cast_or_null<NamespaceDecl>(getDerived().TransformDecl(
4121               Q.getLocalBeginLoc(), QNNS->getAsNamespace()));
4122       SS.Extend(SemaRef.Context, NS, Q.getLocalBeginLoc(), Q.getLocalEndLoc());
4123       break;
4124     }
4125 
4126     case NestedNameSpecifier::NamespaceAlias: {
4127       NamespaceAliasDecl *Alias =
4128           cast_or_null<NamespaceAliasDecl>(getDerived().TransformDecl(
4129               Q.getLocalBeginLoc(), QNNS->getAsNamespaceAlias()));
4130       SS.Extend(SemaRef.Context, Alias, Q.getLocalBeginLoc(),
4131                 Q.getLocalEndLoc());
4132       break;
4133     }
4134 
4135     case NestedNameSpecifier::Global:
4136       // There is no meaningful transformation that one could perform on the
4137       // global scope.
4138       SS.MakeGlobal(SemaRef.Context, Q.getBeginLoc());
4139       break;
4140 
4141     case NestedNameSpecifier::Super: {
4142       CXXRecordDecl *RD =
4143           cast_or_null<CXXRecordDecl>(getDerived().TransformDecl(
4144               SourceLocation(), QNNS->getAsRecordDecl()));
4145       SS.MakeSuper(SemaRef.Context, RD, Q.getBeginLoc(), Q.getEndLoc());
4146       break;
4147     }
4148 
4149     case NestedNameSpecifier::TypeSpecWithTemplate:
4150     case NestedNameSpecifier::TypeSpec: {
4151       TypeLoc TL = TransformTypeInObjectScope(Q.getTypeLoc(), ObjectType,
4152                                               FirstQualifierInScope, SS);
4153 
4154       if (!TL)
4155         return NestedNameSpecifierLoc();
4156 
4157       if (TL.getType()->isDependentType() || TL.getType()->isRecordType() ||
4158           (SemaRef.getLangOpts().CPlusPlus11 &&
4159            TL.getType()->isEnumeralType())) {
4160         assert(!TL.getType().hasLocalQualifiers() &&
4161                "Can't get cv-qualifiers here");
4162         if (TL.getType()->isEnumeralType())
4163           SemaRef.Diag(TL.getBeginLoc(),
4164                        diag::warn_cxx98_compat_enum_nested_name_spec);
4165         SS.Extend(SemaRef.Context, /*FIXME:*/ SourceLocation(), TL,
4166                   Q.getLocalEndLoc());
4167         break;
4168       }
4169       // If the nested-name-specifier is an invalid type def, don't emit an
4170       // error because a previous error should have already been emitted.
4171       TypedefTypeLoc TTL = TL.getAs<TypedefTypeLoc>();
4172       if (!TTL || !TTL.getTypedefNameDecl()->isInvalidDecl()) {
4173         SemaRef.Diag(TL.getBeginLoc(), diag::err_nested_name_spec_non_tag)
4174             << TL.getType() << SS.getRange();
4175       }
4176       return NestedNameSpecifierLoc();
4177     }
4178     }
4179 
4180     // The qualifier-in-scope and object type only apply to the leftmost entity.
4181     FirstQualifierInScope = nullptr;
4182     ObjectType = QualType();
4183   }
4184 
4185   // Don't rebuild the nested-name-specifier if we don't have to.
4186   if (SS.getScopeRep() == NNS.getNestedNameSpecifier() &&
4187       !getDerived().AlwaysRebuild())
4188     return NNS;
4189 
4190   // If we can re-use the source-location data from the original
4191   // nested-name-specifier, do so.
4192   if (SS.location_size() == NNS.getDataLength() &&
4193       memcmp(SS.location_data(), NNS.getOpaqueData(), SS.location_size()) == 0)
4194     return NestedNameSpecifierLoc(SS.getScopeRep(), NNS.getOpaqueData());
4195 
4196   // Allocate new nested-name-specifier location information.
4197   return SS.getWithLocInContext(SemaRef.Context);
4198 }
4199 
4200 template<typename Derived>
4201 DeclarationNameInfo
4202 TreeTransform<Derived>
4203 ::TransformDeclarationNameInfo(const DeclarationNameInfo &NameInfo) {
4204   DeclarationName Name = NameInfo.getName();
4205   if (!Name)
4206     return DeclarationNameInfo();
4207 
4208   switch (Name.getNameKind()) {
4209   case DeclarationName::Identifier:
4210   case DeclarationName::ObjCZeroArgSelector:
4211   case DeclarationName::ObjCOneArgSelector:
4212   case DeclarationName::ObjCMultiArgSelector:
4213   case DeclarationName::CXXOperatorName:
4214   case DeclarationName::CXXLiteralOperatorName:
4215   case DeclarationName::CXXUsingDirective:
4216     return NameInfo;
4217 
4218   case DeclarationName::CXXDeductionGuideName: {
4219     TemplateDecl *OldTemplate = Name.getCXXDeductionGuideTemplate();
4220     TemplateDecl *NewTemplate = cast_or_null<TemplateDecl>(
4221         getDerived().TransformDecl(NameInfo.getLoc(), OldTemplate));
4222     if (!NewTemplate)
4223       return DeclarationNameInfo();
4224 
4225     DeclarationNameInfo NewNameInfo(NameInfo);
4226     NewNameInfo.setName(
4227         SemaRef.Context.DeclarationNames.getCXXDeductionGuideName(NewTemplate));
4228     return NewNameInfo;
4229   }
4230 
4231   case DeclarationName::CXXConstructorName:
4232   case DeclarationName::CXXDestructorName:
4233   case DeclarationName::CXXConversionFunctionName: {
4234     TypeSourceInfo *NewTInfo;
4235     CanQualType NewCanTy;
4236     if (TypeSourceInfo *OldTInfo = NameInfo.getNamedTypeInfo()) {
4237       NewTInfo = getDerived().TransformType(OldTInfo);
4238       if (!NewTInfo)
4239         return DeclarationNameInfo();
4240       NewCanTy = SemaRef.Context.getCanonicalType(NewTInfo->getType());
4241     }
4242     else {
4243       NewTInfo = nullptr;
4244       TemporaryBase Rebase(*this, NameInfo.getLoc(), Name);
4245       QualType NewT = getDerived().TransformType(Name.getCXXNameType());
4246       if (NewT.isNull())
4247         return DeclarationNameInfo();
4248       NewCanTy = SemaRef.Context.getCanonicalType(NewT);
4249     }
4250 
4251     DeclarationName NewName
4252       = SemaRef.Context.DeclarationNames.getCXXSpecialName(Name.getNameKind(),
4253                                                            NewCanTy);
4254     DeclarationNameInfo NewNameInfo(NameInfo);
4255     NewNameInfo.setName(NewName);
4256     NewNameInfo.setNamedTypeInfo(NewTInfo);
4257     return NewNameInfo;
4258   }
4259   }
4260 
4261   llvm_unreachable("Unknown name kind.");
4262 }
4263 
4264 template<typename Derived>
4265 TemplateName
4266 TreeTransform<Derived>::TransformTemplateName(CXXScopeSpec &SS,
4267                                               TemplateName Name,
4268                                               SourceLocation NameLoc,
4269                                               QualType ObjectType,
4270                                               NamedDecl *FirstQualifierInScope,
4271                                               bool AllowInjectedClassName) {
4272   if (QualifiedTemplateName *QTN = Name.getAsQualifiedTemplateName()) {
4273     TemplateDecl *Template = QTN->getTemplateDecl();
4274     assert(Template && "qualified template name must refer to a template");
4275 
4276     TemplateDecl *TransTemplate
4277       = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc,
4278                                                               Template));
4279     if (!TransTemplate)
4280       return TemplateName();
4281 
4282     if (!getDerived().AlwaysRebuild() &&
4283         SS.getScopeRep() == QTN->getQualifier() &&
4284         TransTemplate == Template)
4285       return Name;
4286 
4287     return getDerived().RebuildTemplateName(SS, QTN->hasTemplateKeyword(),
4288                                             TransTemplate);
4289   }
4290 
4291   if (DependentTemplateName *DTN = Name.getAsDependentTemplateName()) {
4292     if (SS.getScopeRep()) {
4293       // These apply to the scope specifier, not the template.
4294       ObjectType = QualType();
4295       FirstQualifierInScope = nullptr;
4296     }
4297 
4298     if (!getDerived().AlwaysRebuild() &&
4299         SS.getScopeRep() == DTN->getQualifier() &&
4300         ObjectType.isNull())
4301       return Name;
4302 
4303     // FIXME: Preserve the location of the "template" keyword.
4304     SourceLocation TemplateKWLoc = NameLoc;
4305 
4306     if (DTN->isIdentifier()) {
4307       return getDerived().RebuildTemplateName(SS,
4308                                               TemplateKWLoc,
4309                                               *DTN->getIdentifier(),
4310                                               NameLoc,
4311                                               ObjectType,
4312                                               FirstQualifierInScope,
4313                                               AllowInjectedClassName);
4314     }
4315 
4316     return getDerived().RebuildTemplateName(SS, TemplateKWLoc,
4317                                             DTN->getOperator(), NameLoc,
4318                                             ObjectType, AllowInjectedClassName);
4319   }
4320 
4321   if (TemplateDecl *Template = Name.getAsTemplateDecl()) {
4322     TemplateDecl *TransTemplate
4323       = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc,
4324                                                               Template));
4325     if (!TransTemplate)
4326       return TemplateName();
4327 
4328     if (!getDerived().AlwaysRebuild() &&
4329         TransTemplate == Template)
4330       return Name;
4331 
4332     return TemplateName(TransTemplate);
4333   }
4334 
4335   if (SubstTemplateTemplateParmPackStorage *SubstPack
4336       = Name.getAsSubstTemplateTemplateParmPack()) {
4337     TemplateTemplateParmDecl *TransParam
4338     = cast_or_null<TemplateTemplateParmDecl>(
4339             getDerived().TransformDecl(NameLoc, SubstPack->getParameterPack()));
4340     if (!TransParam)
4341       return TemplateName();
4342 
4343     if (!getDerived().AlwaysRebuild() &&
4344         TransParam == SubstPack->getParameterPack())
4345       return Name;
4346 
4347     return getDerived().RebuildTemplateName(TransParam,
4348                                             SubstPack->getArgumentPack());
4349   }
4350 
4351   // These should be getting filtered out before they reach the AST.
4352   llvm_unreachable("overloaded function decl survived to here");
4353 }
4354 
4355 template<typename Derived>
4356 void TreeTransform<Derived>::InventTemplateArgumentLoc(
4357                                          const TemplateArgument &Arg,
4358                                          TemplateArgumentLoc &Output) {
4359   Output = getSema().getTrivialTemplateArgumentLoc(
4360       Arg, QualType(), getDerived().getBaseLocation());
4361 }
4362 
4363 template <typename Derived>
4364 bool TreeTransform<Derived>::TransformTemplateArgument(
4365     const TemplateArgumentLoc &Input, TemplateArgumentLoc &Output,
4366     bool Uneval) {
4367   const TemplateArgument &Arg = Input.getArgument();
4368   switch (Arg.getKind()) {
4369   case TemplateArgument::Null:
4370   case TemplateArgument::Pack:
4371     llvm_unreachable("Unexpected TemplateArgument");
4372 
4373   case TemplateArgument::Integral:
4374   case TemplateArgument::NullPtr:
4375   case TemplateArgument::Declaration: {
4376     // Transform a resolved template argument straight to a resolved template
4377     // argument. We get here when substituting into an already-substituted
4378     // template type argument during concept satisfaction checking.
4379     QualType T = Arg.getNonTypeTemplateArgumentType();
4380     QualType NewT = getDerived().TransformType(T);
4381     if (NewT.isNull())
4382       return true;
4383 
4384     ValueDecl *D = Arg.getKind() == TemplateArgument::Declaration
4385                        ? Arg.getAsDecl()
4386                        : nullptr;
4387     ValueDecl *NewD = D ? cast_or_null<ValueDecl>(getDerived().TransformDecl(
4388                               getDerived().getBaseLocation(), D))
4389                         : nullptr;
4390     if (D && !NewD)
4391       return true;
4392 
4393     if (NewT == T && D == NewD)
4394       Output = Input;
4395     else if (Arg.getKind() == TemplateArgument::Integral)
4396       Output = TemplateArgumentLoc(
4397           TemplateArgument(getSema().Context, Arg.getAsIntegral(), NewT),
4398           TemplateArgumentLocInfo());
4399     else if (Arg.getKind() == TemplateArgument::NullPtr)
4400       Output = TemplateArgumentLoc(TemplateArgument(NewT, /*IsNullPtr=*/true),
4401                                    TemplateArgumentLocInfo());
4402     else
4403       Output = TemplateArgumentLoc(TemplateArgument(NewD, NewT),
4404                                    TemplateArgumentLocInfo());
4405 
4406     return false;
4407   }
4408 
4409   case TemplateArgument::Type: {
4410     TypeSourceInfo *DI = Input.getTypeSourceInfo();
4411     if (!DI)
4412       DI = InventTypeSourceInfo(Input.getArgument().getAsType());
4413 
4414     DI = getDerived().TransformType(DI);
4415     if (!DI)
4416       return true;
4417 
4418     Output = TemplateArgumentLoc(TemplateArgument(DI->getType()), DI);
4419     return false;
4420   }
4421 
4422   case TemplateArgument::Template: {
4423     NestedNameSpecifierLoc QualifierLoc = Input.getTemplateQualifierLoc();
4424     if (QualifierLoc) {
4425       QualifierLoc = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc);
4426       if (!QualifierLoc)
4427         return true;
4428     }
4429 
4430     CXXScopeSpec SS;
4431     SS.Adopt(QualifierLoc);
4432     TemplateName Template = getDerived().TransformTemplateName(
4433         SS, Arg.getAsTemplate(), Input.getTemplateNameLoc());
4434     if (Template.isNull())
4435       return true;
4436 
4437     Output = TemplateArgumentLoc(SemaRef.Context, TemplateArgument(Template),
4438                                  QualifierLoc, Input.getTemplateNameLoc());
4439     return false;
4440   }
4441 
4442   case TemplateArgument::TemplateExpansion:
4443     llvm_unreachable("Caller should expand pack expansions");
4444 
4445   case TemplateArgument::Expression: {
4446     // Template argument expressions are constant expressions.
4447     EnterExpressionEvaluationContext Unevaluated(
4448         getSema(),
4449         Uneval ? Sema::ExpressionEvaluationContext::Unevaluated
4450                : Sema::ExpressionEvaluationContext::ConstantEvaluated,
4451         /*LambdaContextDecl=*/nullptr, /*ExprContext=*/
4452         Sema::ExpressionEvaluationContextRecord::EK_TemplateArgument);
4453 
4454     Expr *InputExpr = Input.getSourceExpression();
4455     if (!InputExpr)
4456       InputExpr = Input.getArgument().getAsExpr();
4457 
4458     ExprResult E = getDerived().TransformExpr(InputExpr);
4459     E = SemaRef.ActOnConstantExpression(E);
4460     if (E.isInvalid())
4461       return true;
4462     Output = TemplateArgumentLoc(TemplateArgument(E.get()), E.get());
4463     return false;
4464   }
4465   }
4466 
4467   // Work around bogus GCC warning
4468   return true;
4469 }
4470 
4471 /// Iterator adaptor that invents template argument location information
4472 /// for each of the template arguments in its underlying iterator.
4473 template<typename Derived, typename InputIterator>
4474 class TemplateArgumentLocInventIterator {
4475   TreeTransform<Derived> &Self;
4476   InputIterator Iter;
4477 
4478 public:
4479   typedef TemplateArgumentLoc value_type;
4480   typedef TemplateArgumentLoc reference;
4481   typedef typename std::iterator_traits<InputIterator>::difference_type
4482     difference_type;
4483   typedef std::input_iterator_tag iterator_category;
4484 
4485   class pointer {
4486     TemplateArgumentLoc Arg;
4487 
4488   public:
4489     explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { }
4490 
4491     const TemplateArgumentLoc *operator->() const { return &Arg; }
4492   };
4493 
4494   TemplateArgumentLocInventIterator() { }
4495 
4496   explicit TemplateArgumentLocInventIterator(TreeTransform<Derived> &Self,
4497                                              InputIterator Iter)
4498     : Self(Self), Iter(Iter) { }
4499 
4500   TemplateArgumentLocInventIterator &operator++() {
4501     ++Iter;
4502     return *this;
4503   }
4504 
4505   TemplateArgumentLocInventIterator operator++(int) {
4506     TemplateArgumentLocInventIterator Old(*this);
4507     ++(*this);
4508     return Old;
4509   }
4510 
4511   reference operator*() const {
4512     TemplateArgumentLoc Result;
4513     Self.InventTemplateArgumentLoc(*Iter, Result);
4514     return Result;
4515   }
4516 
4517   pointer operator->() const { return pointer(**this); }
4518 
4519   friend bool operator==(const TemplateArgumentLocInventIterator &X,
4520                          const TemplateArgumentLocInventIterator &Y) {
4521     return X.Iter == Y.Iter;
4522   }
4523 
4524   friend bool operator!=(const TemplateArgumentLocInventIterator &X,
4525                          const TemplateArgumentLocInventIterator &Y) {
4526     return X.Iter != Y.Iter;
4527   }
4528 };
4529 
4530 template<typename Derived>
4531 template<typename InputIterator>
4532 bool TreeTransform<Derived>::TransformTemplateArguments(
4533     InputIterator First, InputIterator Last, TemplateArgumentListInfo &Outputs,
4534     bool Uneval) {
4535   for (; First != Last; ++First) {
4536     TemplateArgumentLoc Out;
4537     TemplateArgumentLoc In = *First;
4538 
4539     if (In.getArgument().getKind() == TemplateArgument::Pack) {
4540       // Unpack argument packs, which we translate them into separate
4541       // arguments.
4542       // FIXME: We could do much better if we could guarantee that the
4543       // TemplateArgumentLocInfo for the pack expansion would be usable for
4544       // all of the template arguments in the argument pack.
4545       typedef TemplateArgumentLocInventIterator<Derived,
4546                                                 TemplateArgument::pack_iterator>
4547         PackLocIterator;
4548       if (TransformTemplateArguments(PackLocIterator(*this,
4549                                                  In.getArgument().pack_begin()),
4550                                      PackLocIterator(*this,
4551                                                    In.getArgument().pack_end()),
4552                                      Outputs, Uneval))
4553         return true;
4554 
4555       continue;
4556     }
4557 
4558     if (In.getArgument().isPackExpansion()) {
4559       // We have a pack expansion, for which we will be substituting into
4560       // the pattern.
4561       SourceLocation Ellipsis;
4562       Optional<unsigned> OrigNumExpansions;
4563       TemplateArgumentLoc Pattern
4564         = getSema().getTemplateArgumentPackExpansionPattern(
4565               In, Ellipsis, OrigNumExpansions);
4566 
4567       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
4568       getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
4569       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
4570 
4571       // Determine whether the set of unexpanded parameter packs can and should
4572       // be expanded.
4573       bool Expand = true;
4574       bool RetainExpansion = false;
4575       Optional<unsigned> NumExpansions = OrigNumExpansions;
4576       if (getDerived().TryExpandParameterPacks(Ellipsis,
4577                                                Pattern.getSourceRange(),
4578                                                Unexpanded,
4579                                                Expand,
4580                                                RetainExpansion,
4581                                                NumExpansions))
4582         return true;
4583 
4584       if (!Expand) {
4585         // The transform has determined that we should perform a simple
4586         // transformation on the pack expansion, producing another pack
4587         // expansion.
4588         TemplateArgumentLoc OutPattern;
4589         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
4590         if (getDerived().TransformTemplateArgument(Pattern, OutPattern, Uneval))
4591           return true;
4592 
4593         Out = getDerived().RebuildPackExpansion(OutPattern, Ellipsis,
4594                                                 NumExpansions);
4595         if (Out.getArgument().isNull())
4596           return true;
4597 
4598         Outputs.addArgument(Out);
4599         continue;
4600       }
4601 
4602       // The transform has determined that we should perform an elementwise
4603       // expansion of the pattern. Do so.
4604       for (unsigned I = 0; I != *NumExpansions; ++I) {
4605         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
4606 
4607         if (getDerived().TransformTemplateArgument(Pattern, Out, Uneval))
4608           return true;
4609 
4610         if (Out.getArgument().containsUnexpandedParameterPack()) {
4611           Out = getDerived().RebuildPackExpansion(Out, Ellipsis,
4612                                                   OrigNumExpansions);
4613           if (Out.getArgument().isNull())
4614             return true;
4615         }
4616 
4617         Outputs.addArgument(Out);
4618       }
4619 
4620       // If we're supposed to retain a pack expansion, do so by temporarily
4621       // forgetting the partially-substituted parameter pack.
4622       if (RetainExpansion) {
4623         ForgetPartiallySubstitutedPackRAII Forget(getDerived());
4624 
4625         if (getDerived().TransformTemplateArgument(Pattern, Out, Uneval))
4626           return true;
4627 
4628         Out = getDerived().RebuildPackExpansion(Out, Ellipsis,
4629                                                 OrigNumExpansions);
4630         if (Out.getArgument().isNull())
4631           return true;
4632 
4633         Outputs.addArgument(Out);
4634       }
4635 
4636       continue;
4637     }
4638 
4639     // The simple case:
4640     if (getDerived().TransformTemplateArgument(In, Out, Uneval))
4641       return true;
4642 
4643     Outputs.addArgument(Out);
4644   }
4645 
4646   return false;
4647 
4648 }
4649 
4650 //===----------------------------------------------------------------------===//
4651 // Type transformation
4652 //===----------------------------------------------------------------------===//
4653 
4654 template<typename Derived>
4655 QualType TreeTransform<Derived>::TransformType(QualType T) {
4656   if (getDerived().AlreadyTransformed(T))
4657     return T;
4658 
4659   // Temporary workaround.  All of these transformations should
4660   // eventually turn into transformations on TypeLocs.
4661   TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(T,
4662                                                 getDerived().getBaseLocation());
4663 
4664   TypeSourceInfo *NewDI = getDerived().TransformType(DI);
4665 
4666   if (!NewDI)
4667     return QualType();
4668 
4669   return NewDI->getType();
4670 }
4671 
4672 template<typename Derived>
4673 TypeSourceInfo *TreeTransform<Derived>::TransformType(TypeSourceInfo *DI) {
4674   // Refine the base location to the type's location.
4675   TemporaryBase Rebase(*this, DI->getTypeLoc().getBeginLoc(),
4676                        getDerived().getBaseEntity());
4677   if (getDerived().AlreadyTransformed(DI->getType()))
4678     return DI;
4679 
4680   TypeLocBuilder TLB;
4681 
4682   TypeLoc TL = DI->getTypeLoc();
4683   TLB.reserve(TL.getFullDataSize());
4684 
4685   QualType Result = getDerived().TransformType(TLB, TL);
4686   if (Result.isNull())
4687     return nullptr;
4688 
4689   return TLB.getTypeSourceInfo(SemaRef.Context, Result);
4690 }
4691 
4692 template<typename Derived>
4693 QualType
4694 TreeTransform<Derived>::TransformType(TypeLocBuilder &TLB, TypeLoc T) {
4695   switch (T.getTypeLocClass()) {
4696 #define ABSTRACT_TYPELOC(CLASS, PARENT)
4697 #define TYPELOC(CLASS, PARENT)                                                 \
4698   case TypeLoc::CLASS:                                                         \
4699     return getDerived().Transform##CLASS##Type(TLB,                            \
4700                                                T.castAs<CLASS##TypeLoc>());
4701 #include "clang/AST/TypeLocNodes.def"
4702   }
4703 
4704   llvm_unreachable("unhandled type loc!");
4705 }
4706 
4707 template<typename Derived>
4708 QualType TreeTransform<Derived>::TransformTypeWithDeducedTST(QualType T) {
4709   if (!isa<DependentNameType>(T))
4710     return TransformType(T);
4711 
4712   if (getDerived().AlreadyTransformed(T))
4713     return T;
4714   TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(T,
4715                                                 getDerived().getBaseLocation());
4716   TypeSourceInfo *NewDI = getDerived().TransformTypeWithDeducedTST(DI);
4717   return NewDI ? NewDI->getType() : QualType();
4718 }
4719 
4720 template<typename Derived>
4721 TypeSourceInfo *
4722 TreeTransform<Derived>::TransformTypeWithDeducedTST(TypeSourceInfo *DI) {
4723   if (!isa<DependentNameType>(DI->getType()))
4724     return TransformType(DI);
4725 
4726   // Refine the base location to the type's location.
4727   TemporaryBase Rebase(*this, DI->getTypeLoc().getBeginLoc(),
4728                        getDerived().getBaseEntity());
4729   if (getDerived().AlreadyTransformed(DI->getType()))
4730     return DI;
4731 
4732   TypeLocBuilder TLB;
4733 
4734   TypeLoc TL = DI->getTypeLoc();
4735   TLB.reserve(TL.getFullDataSize());
4736 
4737   auto QTL = TL.getAs<QualifiedTypeLoc>();
4738   if (QTL)
4739     TL = QTL.getUnqualifiedLoc();
4740 
4741   auto DNTL = TL.castAs<DependentNameTypeLoc>();
4742 
4743   QualType Result = getDerived().TransformDependentNameType(
4744       TLB, DNTL, /*DeducedTSTContext*/true);
4745   if (Result.isNull())
4746     return nullptr;
4747 
4748   if (QTL) {
4749     Result = getDerived().RebuildQualifiedType(Result, QTL);
4750     if (Result.isNull())
4751       return nullptr;
4752     TLB.TypeWasModifiedSafely(Result);
4753   }
4754 
4755   return TLB.getTypeSourceInfo(SemaRef.Context, Result);
4756 }
4757 
4758 template<typename Derived>
4759 QualType
4760 TreeTransform<Derived>::TransformQualifiedType(TypeLocBuilder &TLB,
4761                                                QualifiedTypeLoc T) {
4762   QualType Result = getDerived().TransformType(TLB, T.getUnqualifiedLoc());
4763   if (Result.isNull())
4764     return QualType();
4765 
4766   Result = getDerived().RebuildQualifiedType(Result, T);
4767 
4768   if (Result.isNull())
4769     return QualType();
4770 
4771   // RebuildQualifiedType might have updated the type, but not in a way
4772   // that invalidates the TypeLoc. (There's no location information for
4773   // qualifiers.)
4774   TLB.TypeWasModifiedSafely(Result);
4775 
4776   return Result;
4777 }
4778 
4779 template <typename Derived>
4780 QualType TreeTransform<Derived>::RebuildQualifiedType(QualType T,
4781                                                       QualifiedTypeLoc TL) {
4782 
4783   SourceLocation Loc = TL.getBeginLoc();
4784   Qualifiers Quals = TL.getType().getLocalQualifiers();
4785 
4786   if ((T.getAddressSpace() != LangAS::Default &&
4787        Quals.getAddressSpace() != LangAS::Default) &&
4788       T.getAddressSpace() != Quals.getAddressSpace()) {
4789     SemaRef.Diag(Loc, diag::err_address_space_mismatch_templ_inst)
4790         << TL.getType() << T;
4791     return QualType();
4792   }
4793 
4794   // C++ [dcl.fct]p7:
4795   //   [When] adding cv-qualifications on top of the function type [...] the
4796   //   cv-qualifiers are ignored.
4797   if (T->isFunctionType()) {
4798     T = SemaRef.getASTContext().getAddrSpaceQualType(T,
4799                                                      Quals.getAddressSpace());
4800     return T;
4801   }
4802 
4803   // C++ [dcl.ref]p1:
4804   //   when the cv-qualifiers are introduced through the use of a typedef-name
4805   //   or decltype-specifier [...] the cv-qualifiers are ignored.
4806   // Note that [dcl.ref]p1 lists all cases in which cv-qualifiers can be
4807   // applied to a reference type.
4808   if (T->isReferenceType()) {
4809     // The only qualifier that applies to a reference type is restrict.
4810     if (!Quals.hasRestrict())
4811       return T;
4812     Quals = Qualifiers::fromCVRMask(Qualifiers::Restrict);
4813   }
4814 
4815   // Suppress Objective-C lifetime qualifiers if they don't make sense for the
4816   // resulting type.
4817   if (Quals.hasObjCLifetime()) {
4818     if (!T->isObjCLifetimeType() && !T->isDependentType())
4819       Quals.removeObjCLifetime();
4820     else if (T.getObjCLifetime()) {
4821       // Objective-C ARC:
4822       //   A lifetime qualifier applied to a substituted template parameter
4823       //   overrides the lifetime qualifier from the template argument.
4824       const AutoType *AutoTy;
4825       if (const SubstTemplateTypeParmType *SubstTypeParam
4826                                 = dyn_cast<SubstTemplateTypeParmType>(T)) {
4827         QualType Replacement = SubstTypeParam->getReplacementType();
4828         Qualifiers Qs = Replacement.getQualifiers();
4829         Qs.removeObjCLifetime();
4830         Replacement = SemaRef.Context.getQualifiedType(
4831             Replacement.getUnqualifiedType(), Qs);
4832         T = SemaRef.Context.getSubstTemplateTypeParmType(
4833             SubstTypeParam->getReplacedParameter(), Replacement);
4834       } else if ((AutoTy = dyn_cast<AutoType>(T)) && AutoTy->isDeduced()) {
4835         // 'auto' types behave the same way as template parameters.
4836         QualType Deduced = AutoTy->getDeducedType();
4837         Qualifiers Qs = Deduced.getQualifiers();
4838         Qs.removeObjCLifetime();
4839         Deduced =
4840             SemaRef.Context.getQualifiedType(Deduced.getUnqualifiedType(), Qs);
4841         T = SemaRef.Context.getAutoType(Deduced, AutoTy->getKeyword(),
4842                                         AutoTy->isDependentType(),
4843                                         /*isPack=*/false,
4844                                         AutoTy->getTypeConstraintConcept(),
4845                                         AutoTy->getTypeConstraintArguments());
4846       } else {
4847         // Otherwise, complain about the addition of a qualifier to an
4848         // already-qualified type.
4849         // FIXME: Why is this check not in Sema::BuildQualifiedType?
4850         SemaRef.Diag(Loc, diag::err_attr_objc_ownership_redundant) << T;
4851         Quals.removeObjCLifetime();
4852       }
4853     }
4854   }
4855 
4856   return SemaRef.BuildQualifiedType(T, Loc, Quals);
4857 }
4858 
4859 template<typename Derived>
4860 TypeLoc
4861 TreeTransform<Derived>::TransformTypeInObjectScope(TypeLoc TL,
4862                                                    QualType ObjectType,
4863                                                    NamedDecl *UnqualLookup,
4864                                                    CXXScopeSpec &SS) {
4865   if (getDerived().AlreadyTransformed(TL.getType()))
4866     return TL;
4867 
4868   TypeSourceInfo *TSI =
4869       TransformTSIInObjectScope(TL, ObjectType, UnqualLookup, SS);
4870   if (TSI)
4871     return TSI->getTypeLoc();
4872   return TypeLoc();
4873 }
4874 
4875 template<typename Derived>
4876 TypeSourceInfo *
4877 TreeTransform<Derived>::TransformTypeInObjectScope(TypeSourceInfo *TSInfo,
4878                                                    QualType ObjectType,
4879                                                    NamedDecl *UnqualLookup,
4880                                                    CXXScopeSpec &SS) {
4881   if (getDerived().AlreadyTransformed(TSInfo->getType()))
4882     return TSInfo;
4883 
4884   return TransformTSIInObjectScope(TSInfo->getTypeLoc(), ObjectType,
4885                                    UnqualLookup, SS);
4886 }
4887 
4888 template <typename Derived>
4889 TypeSourceInfo *TreeTransform<Derived>::TransformTSIInObjectScope(
4890     TypeLoc TL, QualType ObjectType, NamedDecl *UnqualLookup,
4891     CXXScopeSpec &SS) {
4892   QualType T = TL.getType();
4893   assert(!getDerived().AlreadyTransformed(T));
4894 
4895   TypeLocBuilder TLB;
4896   QualType Result;
4897 
4898   if (isa<TemplateSpecializationType>(T)) {
4899     TemplateSpecializationTypeLoc SpecTL =
4900         TL.castAs<TemplateSpecializationTypeLoc>();
4901 
4902     TemplateName Template = getDerived().TransformTemplateName(
4903         SS, SpecTL.getTypePtr()->getTemplateName(), SpecTL.getTemplateNameLoc(),
4904         ObjectType, UnqualLookup, /*AllowInjectedClassName*/true);
4905     if (Template.isNull())
4906       return nullptr;
4907 
4908     Result = getDerived().TransformTemplateSpecializationType(TLB, SpecTL,
4909                                                               Template);
4910   } else if (isa<DependentTemplateSpecializationType>(T)) {
4911     DependentTemplateSpecializationTypeLoc SpecTL =
4912         TL.castAs<DependentTemplateSpecializationTypeLoc>();
4913 
4914     TemplateName Template
4915       = getDerived().RebuildTemplateName(SS,
4916                                          SpecTL.getTemplateKeywordLoc(),
4917                                          *SpecTL.getTypePtr()->getIdentifier(),
4918                                          SpecTL.getTemplateNameLoc(),
4919                                          ObjectType, UnqualLookup,
4920                                          /*AllowInjectedClassName*/true);
4921     if (Template.isNull())
4922       return nullptr;
4923 
4924     Result = getDerived().TransformDependentTemplateSpecializationType(TLB,
4925                                                                        SpecTL,
4926                                                                        Template,
4927                                                                        SS);
4928   } else {
4929     // Nothing special needs to be done for these.
4930     Result = getDerived().TransformType(TLB, TL);
4931   }
4932 
4933   if (Result.isNull())
4934     return nullptr;
4935 
4936   return TLB.getTypeSourceInfo(SemaRef.Context, Result);
4937 }
4938 
4939 template <class TyLoc> static inline
4940 QualType TransformTypeSpecType(TypeLocBuilder &TLB, TyLoc T) {
4941   TyLoc NewT = TLB.push<TyLoc>(T.getType());
4942   NewT.setNameLoc(T.getNameLoc());
4943   return T.getType();
4944 }
4945 
4946 template<typename Derived>
4947 QualType TreeTransform<Derived>::TransformBuiltinType(TypeLocBuilder &TLB,
4948                                                       BuiltinTypeLoc T) {
4949   BuiltinTypeLoc NewT = TLB.push<BuiltinTypeLoc>(T.getType());
4950   NewT.setBuiltinLoc(T.getBuiltinLoc());
4951   if (T.needsExtraLocalData())
4952     NewT.getWrittenBuiltinSpecs() = T.getWrittenBuiltinSpecs();
4953   return T.getType();
4954 }
4955 
4956 template<typename Derived>
4957 QualType TreeTransform<Derived>::TransformComplexType(TypeLocBuilder &TLB,
4958                                                       ComplexTypeLoc T) {
4959   // FIXME: recurse?
4960   return TransformTypeSpecType(TLB, T);
4961 }
4962 
4963 template <typename Derived>
4964 QualType TreeTransform<Derived>::TransformAdjustedType(TypeLocBuilder &TLB,
4965                                                        AdjustedTypeLoc TL) {
4966   // Adjustments applied during transformation are handled elsewhere.
4967   return getDerived().TransformType(TLB, TL.getOriginalLoc());
4968 }
4969 
4970 template<typename Derived>
4971 QualType TreeTransform<Derived>::TransformDecayedType(TypeLocBuilder &TLB,
4972                                                       DecayedTypeLoc TL) {
4973   QualType OriginalType = getDerived().TransformType(TLB, TL.getOriginalLoc());
4974   if (OriginalType.isNull())
4975     return QualType();
4976 
4977   QualType Result = TL.getType();
4978   if (getDerived().AlwaysRebuild() ||
4979       OriginalType != TL.getOriginalLoc().getType())
4980     Result = SemaRef.Context.getDecayedType(OriginalType);
4981   TLB.push<DecayedTypeLoc>(Result);
4982   // Nothing to set for DecayedTypeLoc.
4983   return Result;
4984 }
4985 
4986 template<typename Derived>
4987 QualType TreeTransform<Derived>::TransformPointerType(TypeLocBuilder &TLB,
4988                                                       PointerTypeLoc TL) {
4989   QualType PointeeType
4990     = getDerived().TransformType(TLB, TL.getPointeeLoc());
4991   if (PointeeType.isNull())
4992     return QualType();
4993 
4994   QualType Result = TL.getType();
4995   if (PointeeType->getAs<ObjCObjectType>()) {
4996     // A dependent pointer type 'T *' has is being transformed such
4997     // that an Objective-C class type is being replaced for 'T'. The
4998     // resulting pointer type is an ObjCObjectPointerType, not a
4999     // PointerType.
5000     Result = SemaRef.Context.getObjCObjectPointerType(PointeeType);
5001 
5002     ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result);
5003     NewT.setStarLoc(TL.getStarLoc());
5004     return Result;
5005   }
5006 
5007   if (getDerived().AlwaysRebuild() ||
5008       PointeeType != TL.getPointeeLoc().getType()) {
5009     Result = getDerived().RebuildPointerType(PointeeType, TL.getSigilLoc());
5010     if (Result.isNull())
5011       return QualType();
5012   }
5013 
5014   // Objective-C ARC can add lifetime qualifiers to the type that we're
5015   // pointing to.
5016   TLB.TypeWasModifiedSafely(Result->getPointeeType());
5017 
5018   PointerTypeLoc NewT = TLB.push<PointerTypeLoc>(Result);
5019   NewT.setSigilLoc(TL.getSigilLoc());
5020   return Result;
5021 }
5022 
5023 template<typename Derived>
5024 QualType
5025 TreeTransform<Derived>::TransformBlockPointerType(TypeLocBuilder &TLB,
5026                                                   BlockPointerTypeLoc TL) {
5027   QualType PointeeType
5028     = getDerived().TransformType(TLB, TL.getPointeeLoc());
5029   if (PointeeType.isNull())
5030     return QualType();
5031 
5032   QualType Result = TL.getType();
5033   if (getDerived().AlwaysRebuild() ||
5034       PointeeType != TL.getPointeeLoc().getType()) {
5035     Result = getDerived().RebuildBlockPointerType(PointeeType,
5036                                                   TL.getSigilLoc());
5037     if (Result.isNull())
5038       return QualType();
5039   }
5040 
5041   BlockPointerTypeLoc NewT = TLB.push<BlockPointerTypeLoc>(Result);
5042   NewT.setSigilLoc(TL.getSigilLoc());
5043   return Result;
5044 }
5045 
5046 /// Transforms a reference type.  Note that somewhat paradoxically we
5047 /// don't care whether the type itself is an l-value type or an r-value
5048 /// type;  we only care if the type was *written* as an l-value type
5049 /// or an r-value type.
5050 template<typename Derived>
5051 QualType
5052 TreeTransform<Derived>::TransformReferenceType(TypeLocBuilder &TLB,
5053                                                ReferenceTypeLoc TL) {
5054   const ReferenceType *T = TL.getTypePtr();
5055 
5056   // Note that this works with the pointee-as-written.
5057   QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
5058   if (PointeeType.isNull())
5059     return QualType();
5060 
5061   QualType Result = TL.getType();
5062   if (getDerived().AlwaysRebuild() ||
5063       PointeeType != T->getPointeeTypeAsWritten()) {
5064     Result = getDerived().RebuildReferenceType(PointeeType,
5065                                                T->isSpelledAsLValue(),
5066                                                TL.getSigilLoc());
5067     if (Result.isNull())
5068       return QualType();
5069   }
5070 
5071   // Objective-C ARC can add lifetime qualifiers to the type that we're
5072   // referring to.
5073   TLB.TypeWasModifiedSafely(
5074       Result->castAs<ReferenceType>()->getPointeeTypeAsWritten());
5075 
5076   // r-value references can be rebuilt as l-value references.
5077   ReferenceTypeLoc NewTL;
5078   if (isa<LValueReferenceType>(Result))
5079     NewTL = TLB.push<LValueReferenceTypeLoc>(Result);
5080   else
5081     NewTL = TLB.push<RValueReferenceTypeLoc>(Result);
5082   NewTL.setSigilLoc(TL.getSigilLoc());
5083 
5084   return Result;
5085 }
5086 
5087 template<typename Derived>
5088 QualType
5089 TreeTransform<Derived>::TransformLValueReferenceType(TypeLocBuilder &TLB,
5090                                                  LValueReferenceTypeLoc TL) {
5091   return TransformReferenceType(TLB, TL);
5092 }
5093 
5094 template<typename Derived>
5095 QualType
5096 TreeTransform<Derived>::TransformRValueReferenceType(TypeLocBuilder &TLB,
5097                                                  RValueReferenceTypeLoc TL) {
5098   return TransformReferenceType(TLB, TL);
5099 }
5100 
5101 template<typename Derived>
5102 QualType
5103 TreeTransform<Derived>::TransformMemberPointerType(TypeLocBuilder &TLB,
5104                                                    MemberPointerTypeLoc TL) {
5105   QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
5106   if (PointeeType.isNull())
5107     return QualType();
5108 
5109   TypeSourceInfo* OldClsTInfo = TL.getClassTInfo();
5110   TypeSourceInfo *NewClsTInfo = nullptr;
5111   if (OldClsTInfo) {
5112     NewClsTInfo = getDerived().TransformType(OldClsTInfo);
5113     if (!NewClsTInfo)
5114       return QualType();
5115   }
5116 
5117   const MemberPointerType *T = TL.getTypePtr();
5118   QualType OldClsType = QualType(T->getClass(), 0);
5119   QualType NewClsType;
5120   if (NewClsTInfo)
5121     NewClsType = NewClsTInfo->getType();
5122   else {
5123     NewClsType = getDerived().TransformType(OldClsType);
5124     if (NewClsType.isNull())
5125       return QualType();
5126   }
5127 
5128   QualType Result = TL.getType();
5129   if (getDerived().AlwaysRebuild() ||
5130       PointeeType != T->getPointeeType() ||
5131       NewClsType != OldClsType) {
5132     Result = getDerived().RebuildMemberPointerType(PointeeType, NewClsType,
5133                                                    TL.getStarLoc());
5134     if (Result.isNull())
5135       return QualType();
5136   }
5137 
5138   // If we had to adjust the pointee type when building a member pointer, make
5139   // sure to push TypeLoc info for it.
5140   const MemberPointerType *MPT = Result->getAs<MemberPointerType>();
5141   if (MPT && PointeeType != MPT->getPointeeType()) {
5142     assert(isa<AdjustedType>(MPT->getPointeeType()));
5143     TLB.push<AdjustedTypeLoc>(MPT->getPointeeType());
5144   }
5145 
5146   MemberPointerTypeLoc NewTL = TLB.push<MemberPointerTypeLoc>(Result);
5147   NewTL.setSigilLoc(TL.getSigilLoc());
5148   NewTL.setClassTInfo(NewClsTInfo);
5149 
5150   return Result;
5151 }
5152 
5153 template<typename Derived>
5154 QualType
5155 TreeTransform<Derived>::TransformConstantArrayType(TypeLocBuilder &TLB,
5156                                                    ConstantArrayTypeLoc TL) {
5157   const ConstantArrayType *T = TL.getTypePtr();
5158   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5159   if (ElementType.isNull())
5160     return QualType();
5161 
5162   // Prefer the expression from the TypeLoc;  the other may have been uniqued.
5163   Expr *OldSize = TL.getSizeExpr();
5164   if (!OldSize)
5165     OldSize = const_cast<Expr*>(T->getSizeExpr());
5166   Expr *NewSize = nullptr;
5167   if (OldSize) {
5168     EnterExpressionEvaluationContext Unevaluated(
5169         SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
5170     NewSize = getDerived().TransformExpr(OldSize).template getAs<Expr>();
5171     NewSize = SemaRef.ActOnConstantExpression(NewSize).get();
5172   }
5173 
5174   QualType Result = TL.getType();
5175   if (getDerived().AlwaysRebuild() ||
5176       ElementType != T->getElementType() ||
5177       (T->getSizeExpr() && NewSize != OldSize)) {
5178     Result = getDerived().RebuildConstantArrayType(ElementType,
5179                                                    T->getSizeModifier(),
5180                                                    T->getSize(), NewSize,
5181                                              T->getIndexTypeCVRQualifiers(),
5182                                                    TL.getBracketsRange());
5183     if (Result.isNull())
5184       return QualType();
5185   }
5186 
5187   // We might have either a ConstantArrayType or a VariableArrayType now:
5188   // a ConstantArrayType is allowed to have an element type which is a
5189   // VariableArrayType if the type is dependent.  Fortunately, all array
5190   // types have the same location layout.
5191   ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result);
5192   NewTL.setLBracketLoc(TL.getLBracketLoc());
5193   NewTL.setRBracketLoc(TL.getRBracketLoc());
5194   NewTL.setSizeExpr(NewSize);
5195 
5196   return Result;
5197 }
5198 
5199 template<typename Derived>
5200 QualType TreeTransform<Derived>::TransformIncompleteArrayType(
5201                                               TypeLocBuilder &TLB,
5202                                               IncompleteArrayTypeLoc TL) {
5203   const IncompleteArrayType *T = TL.getTypePtr();
5204   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5205   if (ElementType.isNull())
5206     return QualType();
5207 
5208   QualType Result = TL.getType();
5209   if (getDerived().AlwaysRebuild() ||
5210       ElementType != T->getElementType()) {
5211     Result = getDerived().RebuildIncompleteArrayType(ElementType,
5212                                                      T->getSizeModifier(),
5213                                            T->getIndexTypeCVRQualifiers(),
5214                                                      TL.getBracketsRange());
5215     if (Result.isNull())
5216       return QualType();
5217   }
5218 
5219   IncompleteArrayTypeLoc NewTL = TLB.push<IncompleteArrayTypeLoc>(Result);
5220   NewTL.setLBracketLoc(TL.getLBracketLoc());
5221   NewTL.setRBracketLoc(TL.getRBracketLoc());
5222   NewTL.setSizeExpr(nullptr);
5223 
5224   return Result;
5225 }
5226 
5227 template<typename Derived>
5228 QualType
5229 TreeTransform<Derived>::TransformVariableArrayType(TypeLocBuilder &TLB,
5230                                                    VariableArrayTypeLoc TL) {
5231   const VariableArrayType *T = TL.getTypePtr();
5232   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5233   if (ElementType.isNull())
5234     return QualType();
5235 
5236   ExprResult SizeResult;
5237   {
5238     EnterExpressionEvaluationContext Context(
5239         SemaRef, Sema::ExpressionEvaluationContext::PotentiallyEvaluated);
5240     SizeResult = getDerived().TransformExpr(T->getSizeExpr());
5241   }
5242   if (SizeResult.isInvalid())
5243     return QualType();
5244   SizeResult =
5245       SemaRef.ActOnFinishFullExpr(SizeResult.get(), /*DiscardedValue*/ false);
5246   if (SizeResult.isInvalid())
5247     return QualType();
5248 
5249   Expr *Size = SizeResult.get();
5250 
5251   QualType Result = TL.getType();
5252   if (getDerived().AlwaysRebuild() ||
5253       ElementType != T->getElementType() ||
5254       Size != T->getSizeExpr()) {
5255     Result = getDerived().RebuildVariableArrayType(ElementType,
5256                                                    T->getSizeModifier(),
5257                                                    Size,
5258                                              T->getIndexTypeCVRQualifiers(),
5259                                                    TL.getBracketsRange());
5260     if (Result.isNull())
5261       return QualType();
5262   }
5263 
5264   // We might have constant size array now, but fortunately it has the same
5265   // location layout.
5266   ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result);
5267   NewTL.setLBracketLoc(TL.getLBracketLoc());
5268   NewTL.setRBracketLoc(TL.getRBracketLoc());
5269   NewTL.setSizeExpr(Size);
5270 
5271   return Result;
5272 }
5273 
5274 template<typename Derived>
5275 QualType
5276 TreeTransform<Derived>::TransformDependentSizedArrayType(TypeLocBuilder &TLB,
5277                                              DependentSizedArrayTypeLoc TL) {
5278   const DependentSizedArrayType *T = TL.getTypePtr();
5279   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5280   if (ElementType.isNull())
5281     return QualType();
5282 
5283   // Array bounds are constant expressions.
5284   EnterExpressionEvaluationContext Unevaluated(
5285       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
5286 
5287   // Prefer the expression from the TypeLoc;  the other may have been uniqued.
5288   Expr *origSize = TL.getSizeExpr();
5289   if (!origSize) origSize = T->getSizeExpr();
5290 
5291   ExprResult sizeResult
5292     = getDerived().TransformExpr(origSize);
5293   sizeResult = SemaRef.ActOnConstantExpression(sizeResult);
5294   if (sizeResult.isInvalid())
5295     return QualType();
5296 
5297   Expr *size = sizeResult.get();
5298 
5299   QualType Result = TL.getType();
5300   if (getDerived().AlwaysRebuild() ||
5301       ElementType != T->getElementType() ||
5302       size != origSize) {
5303     Result = getDerived().RebuildDependentSizedArrayType(ElementType,
5304                                                          T->getSizeModifier(),
5305                                                          size,
5306                                                 T->getIndexTypeCVRQualifiers(),
5307                                                         TL.getBracketsRange());
5308     if (Result.isNull())
5309       return QualType();
5310   }
5311 
5312   // We might have any sort of array type now, but fortunately they
5313   // all have the same location layout.
5314   ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result);
5315   NewTL.setLBracketLoc(TL.getLBracketLoc());
5316   NewTL.setRBracketLoc(TL.getRBracketLoc());
5317   NewTL.setSizeExpr(size);
5318 
5319   return Result;
5320 }
5321 
5322 template <typename Derived>
5323 QualType TreeTransform<Derived>::TransformDependentVectorType(
5324     TypeLocBuilder &TLB, DependentVectorTypeLoc TL) {
5325   const DependentVectorType *T = TL.getTypePtr();
5326   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5327   if (ElementType.isNull())
5328     return QualType();
5329 
5330   EnterExpressionEvaluationContext Unevaluated(
5331       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
5332 
5333   ExprResult Size = getDerived().TransformExpr(T->getSizeExpr());
5334   Size = SemaRef.ActOnConstantExpression(Size);
5335   if (Size.isInvalid())
5336     return QualType();
5337 
5338   QualType Result = TL.getType();
5339   if (getDerived().AlwaysRebuild() || ElementType != T->getElementType() ||
5340       Size.get() != T->getSizeExpr()) {
5341     Result = getDerived().RebuildDependentVectorType(
5342         ElementType, Size.get(), T->getAttributeLoc(), T->getVectorKind());
5343     if (Result.isNull())
5344       return QualType();
5345   }
5346 
5347   // Result might be dependent or not.
5348   if (isa<DependentVectorType>(Result)) {
5349     DependentVectorTypeLoc NewTL =
5350         TLB.push<DependentVectorTypeLoc>(Result);
5351     NewTL.setNameLoc(TL.getNameLoc());
5352   } else {
5353     VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result);
5354     NewTL.setNameLoc(TL.getNameLoc());
5355   }
5356 
5357   return Result;
5358 }
5359 
5360 template<typename Derived>
5361 QualType TreeTransform<Derived>::TransformDependentSizedExtVectorType(
5362                                       TypeLocBuilder &TLB,
5363                                       DependentSizedExtVectorTypeLoc TL) {
5364   const DependentSizedExtVectorType *T = TL.getTypePtr();
5365 
5366   // FIXME: ext vector locs should be nested
5367   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5368   if (ElementType.isNull())
5369     return QualType();
5370 
5371   // Vector sizes are constant expressions.
5372   EnterExpressionEvaluationContext Unevaluated(
5373       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
5374 
5375   ExprResult Size = getDerived().TransformExpr(T->getSizeExpr());
5376   Size = SemaRef.ActOnConstantExpression(Size);
5377   if (Size.isInvalid())
5378     return QualType();
5379 
5380   QualType Result = TL.getType();
5381   if (getDerived().AlwaysRebuild() ||
5382       ElementType != T->getElementType() ||
5383       Size.get() != T->getSizeExpr()) {
5384     Result = getDerived().RebuildDependentSizedExtVectorType(ElementType,
5385                                                              Size.get(),
5386                                                          T->getAttributeLoc());
5387     if (Result.isNull())
5388       return QualType();
5389   }
5390 
5391   // Result might be dependent or not.
5392   if (isa<DependentSizedExtVectorType>(Result)) {
5393     DependentSizedExtVectorTypeLoc NewTL
5394       = TLB.push<DependentSizedExtVectorTypeLoc>(Result);
5395     NewTL.setNameLoc(TL.getNameLoc());
5396   } else {
5397     ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result);
5398     NewTL.setNameLoc(TL.getNameLoc());
5399   }
5400 
5401   return Result;
5402 }
5403 
5404 template <typename Derived>
5405 QualType
5406 TreeTransform<Derived>::TransformConstantMatrixType(TypeLocBuilder &TLB,
5407                                                     ConstantMatrixTypeLoc TL) {
5408   const ConstantMatrixType *T = TL.getTypePtr();
5409   QualType ElementType = getDerived().TransformType(T->getElementType());
5410   if (ElementType.isNull())
5411     return QualType();
5412 
5413   QualType Result = TL.getType();
5414   if (getDerived().AlwaysRebuild() || ElementType != T->getElementType()) {
5415     Result = getDerived().RebuildConstantMatrixType(
5416         ElementType, T->getNumRows(), T->getNumColumns());
5417     if (Result.isNull())
5418       return QualType();
5419   }
5420 
5421   ConstantMatrixTypeLoc NewTL = TLB.push<ConstantMatrixTypeLoc>(Result);
5422   NewTL.setAttrNameLoc(TL.getAttrNameLoc());
5423   NewTL.setAttrOperandParensRange(TL.getAttrOperandParensRange());
5424   NewTL.setAttrRowOperand(TL.getAttrRowOperand());
5425   NewTL.setAttrColumnOperand(TL.getAttrColumnOperand());
5426 
5427   return Result;
5428 }
5429 
5430 template <typename Derived>
5431 QualType TreeTransform<Derived>::TransformDependentSizedMatrixType(
5432     TypeLocBuilder &TLB, DependentSizedMatrixTypeLoc TL) {
5433   const DependentSizedMatrixType *T = TL.getTypePtr();
5434 
5435   QualType ElementType = getDerived().TransformType(T->getElementType());
5436   if (ElementType.isNull()) {
5437     return QualType();
5438   }
5439 
5440   // Matrix dimensions are constant expressions.
5441   EnterExpressionEvaluationContext Unevaluated(
5442       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
5443 
5444   Expr *origRows = TL.getAttrRowOperand();
5445   if (!origRows)
5446     origRows = T->getRowExpr();
5447   Expr *origColumns = TL.getAttrColumnOperand();
5448   if (!origColumns)
5449     origColumns = T->getColumnExpr();
5450 
5451   ExprResult rowResult = getDerived().TransformExpr(origRows);
5452   rowResult = SemaRef.ActOnConstantExpression(rowResult);
5453   if (rowResult.isInvalid())
5454     return QualType();
5455 
5456   ExprResult columnResult = getDerived().TransformExpr(origColumns);
5457   columnResult = SemaRef.ActOnConstantExpression(columnResult);
5458   if (columnResult.isInvalid())
5459     return QualType();
5460 
5461   Expr *rows = rowResult.get();
5462   Expr *columns = columnResult.get();
5463 
5464   QualType Result = TL.getType();
5465   if (getDerived().AlwaysRebuild() || ElementType != T->getElementType() ||
5466       rows != origRows || columns != origColumns) {
5467     Result = getDerived().RebuildDependentSizedMatrixType(
5468         ElementType, rows, columns, T->getAttributeLoc());
5469 
5470     if (Result.isNull())
5471       return QualType();
5472   }
5473 
5474   // We might have any sort of matrix type now, but fortunately they
5475   // all have the same location layout.
5476   MatrixTypeLoc NewTL = TLB.push<MatrixTypeLoc>(Result);
5477   NewTL.setAttrNameLoc(TL.getAttrNameLoc());
5478   NewTL.setAttrOperandParensRange(TL.getAttrOperandParensRange());
5479   NewTL.setAttrRowOperand(rows);
5480   NewTL.setAttrColumnOperand(columns);
5481   return Result;
5482 }
5483 
5484 template <typename Derived>
5485 QualType TreeTransform<Derived>::TransformDependentAddressSpaceType(
5486     TypeLocBuilder &TLB, DependentAddressSpaceTypeLoc TL) {
5487   const DependentAddressSpaceType *T = TL.getTypePtr();
5488 
5489   QualType pointeeType = getDerived().TransformType(T->getPointeeType());
5490 
5491   if (pointeeType.isNull())
5492     return QualType();
5493 
5494   // Address spaces are constant expressions.
5495   EnterExpressionEvaluationContext Unevaluated(
5496       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
5497 
5498   ExprResult AddrSpace = getDerived().TransformExpr(T->getAddrSpaceExpr());
5499   AddrSpace = SemaRef.ActOnConstantExpression(AddrSpace);
5500   if (AddrSpace.isInvalid())
5501     return QualType();
5502 
5503   QualType Result = TL.getType();
5504   if (getDerived().AlwaysRebuild() || pointeeType != T->getPointeeType() ||
5505       AddrSpace.get() != T->getAddrSpaceExpr()) {
5506     Result = getDerived().RebuildDependentAddressSpaceType(
5507         pointeeType, AddrSpace.get(), T->getAttributeLoc());
5508     if (Result.isNull())
5509       return QualType();
5510   }
5511 
5512   // Result might be dependent or not.
5513   if (isa<DependentAddressSpaceType>(Result)) {
5514     DependentAddressSpaceTypeLoc NewTL =
5515         TLB.push<DependentAddressSpaceTypeLoc>(Result);
5516 
5517     NewTL.setAttrOperandParensRange(TL.getAttrOperandParensRange());
5518     NewTL.setAttrExprOperand(TL.getAttrExprOperand());
5519     NewTL.setAttrNameLoc(TL.getAttrNameLoc());
5520 
5521   } else {
5522     TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(
5523         Result, getDerived().getBaseLocation());
5524     TransformType(TLB, DI->getTypeLoc());
5525   }
5526 
5527   return Result;
5528 }
5529 
5530 template <typename Derived>
5531 QualType TreeTransform<Derived>::TransformVectorType(TypeLocBuilder &TLB,
5532                                                      VectorTypeLoc TL) {
5533   const VectorType *T = TL.getTypePtr();
5534   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5535   if (ElementType.isNull())
5536     return QualType();
5537 
5538   QualType Result = TL.getType();
5539   if (getDerived().AlwaysRebuild() ||
5540       ElementType != T->getElementType()) {
5541     Result = getDerived().RebuildVectorType(ElementType, T->getNumElements(),
5542                                             T->getVectorKind());
5543     if (Result.isNull())
5544       return QualType();
5545   }
5546 
5547   VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result);
5548   NewTL.setNameLoc(TL.getNameLoc());
5549 
5550   return Result;
5551 }
5552 
5553 template<typename Derived>
5554 QualType TreeTransform<Derived>::TransformExtVectorType(TypeLocBuilder &TLB,
5555                                                         ExtVectorTypeLoc TL) {
5556   const VectorType *T = TL.getTypePtr();
5557   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5558   if (ElementType.isNull())
5559     return QualType();
5560 
5561   QualType Result = TL.getType();
5562   if (getDerived().AlwaysRebuild() ||
5563       ElementType != T->getElementType()) {
5564     Result = getDerived().RebuildExtVectorType(ElementType,
5565                                                T->getNumElements(),
5566                                                /*FIXME*/ SourceLocation());
5567     if (Result.isNull())
5568       return QualType();
5569   }
5570 
5571   ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result);
5572   NewTL.setNameLoc(TL.getNameLoc());
5573 
5574   return Result;
5575 }
5576 
5577 template <typename Derived>
5578 ParmVarDecl *TreeTransform<Derived>::TransformFunctionTypeParam(
5579     ParmVarDecl *OldParm, int indexAdjustment, Optional<unsigned> NumExpansions,
5580     bool ExpectParameterPack) {
5581   TypeSourceInfo *OldDI = OldParm->getTypeSourceInfo();
5582   TypeSourceInfo *NewDI = nullptr;
5583 
5584   if (NumExpansions && isa<PackExpansionType>(OldDI->getType())) {
5585     // If we're substituting into a pack expansion type and we know the
5586     // length we want to expand to, just substitute for the pattern.
5587     TypeLoc OldTL = OldDI->getTypeLoc();
5588     PackExpansionTypeLoc OldExpansionTL = OldTL.castAs<PackExpansionTypeLoc>();
5589 
5590     TypeLocBuilder TLB;
5591     TypeLoc NewTL = OldDI->getTypeLoc();
5592     TLB.reserve(NewTL.getFullDataSize());
5593 
5594     QualType Result = getDerived().TransformType(TLB,
5595                                                OldExpansionTL.getPatternLoc());
5596     if (Result.isNull())
5597       return nullptr;
5598 
5599     Result = RebuildPackExpansionType(Result,
5600                                 OldExpansionTL.getPatternLoc().getSourceRange(),
5601                                       OldExpansionTL.getEllipsisLoc(),
5602                                       NumExpansions);
5603     if (Result.isNull())
5604       return nullptr;
5605 
5606     PackExpansionTypeLoc NewExpansionTL
5607       = TLB.push<PackExpansionTypeLoc>(Result);
5608     NewExpansionTL.setEllipsisLoc(OldExpansionTL.getEllipsisLoc());
5609     NewDI = TLB.getTypeSourceInfo(SemaRef.Context, Result);
5610   } else
5611     NewDI = getDerived().TransformType(OldDI);
5612   if (!NewDI)
5613     return nullptr;
5614 
5615   if (NewDI == OldDI && indexAdjustment == 0)
5616     return OldParm;
5617 
5618   ParmVarDecl *newParm = ParmVarDecl::Create(SemaRef.Context,
5619                                              OldParm->getDeclContext(),
5620                                              OldParm->getInnerLocStart(),
5621                                              OldParm->getLocation(),
5622                                              OldParm->getIdentifier(),
5623                                              NewDI->getType(),
5624                                              NewDI,
5625                                              OldParm->getStorageClass(),
5626                                              /* DefArg */ nullptr);
5627   newParm->setScopeInfo(OldParm->getFunctionScopeDepth(),
5628                         OldParm->getFunctionScopeIndex() + indexAdjustment);
5629   transformedLocalDecl(OldParm, {newParm});
5630   return newParm;
5631 }
5632 
5633 template <typename Derived>
5634 bool TreeTransform<Derived>::TransformFunctionTypeParams(
5635     SourceLocation Loc, ArrayRef<ParmVarDecl *> Params,
5636     const QualType *ParamTypes,
5637     const FunctionProtoType::ExtParameterInfo *ParamInfos,
5638     SmallVectorImpl<QualType> &OutParamTypes,
5639     SmallVectorImpl<ParmVarDecl *> *PVars,
5640     Sema::ExtParameterInfoBuilder &PInfos) {
5641   int indexAdjustment = 0;
5642 
5643   unsigned NumParams = Params.size();
5644   for (unsigned i = 0; i != NumParams; ++i) {
5645     if (ParmVarDecl *OldParm = Params[i]) {
5646       assert(OldParm->getFunctionScopeIndex() == i);
5647 
5648       Optional<unsigned> NumExpansions;
5649       ParmVarDecl *NewParm = nullptr;
5650       if (OldParm->isParameterPack()) {
5651         // We have a function parameter pack that may need to be expanded.
5652         SmallVector<UnexpandedParameterPack, 2> Unexpanded;
5653 
5654         // Find the parameter packs that could be expanded.
5655         TypeLoc TL = OldParm->getTypeSourceInfo()->getTypeLoc();
5656         PackExpansionTypeLoc ExpansionTL = TL.castAs<PackExpansionTypeLoc>();
5657         TypeLoc Pattern = ExpansionTL.getPatternLoc();
5658         SemaRef.collectUnexpandedParameterPacks(Pattern, Unexpanded);
5659 
5660         // Determine whether we should expand the parameter packs.
5661         bool ShouldExpand = false;
5662         bool RetainExpansion = false;
5663         Optional<unsigned> OrigNumExpansions;
5664         if (Unexpanded.size() > 0) {
5665           OrigNumExpansions = ExpansionTL.getTypePtr()->getNumExpansions();
5666           NumExpansions = OrigNumExpansions;
5667           if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(),
5668                                                    Pattern.getSourceRange(),
5669                                                    Unexpanded,
5670                                                    ShouldExpand,
5671                                                    RetainExpansion,
5672                                                    NumExpansions)) {
5673             return true;
5674           }
5675         } else {
5676 #ifndef NDEBUG
5677           const AutoType *AT =
5678               Pattern.getType().getTypePtr()->getContainedAutoType();
5679           assert((AT && (!AT->isDeduced() || AT->getDeducedType().isNull())) &&
5680                  "Could not find parameter packs or undeduced auto type!");
5681 #endif
5682         }
5683 
5684         if (ShouldExpand) {
5685           // Expand the function parameter pack into multiple, separate
5686           // parameters.
5687           getDerived().ExpandingFunctionParameterPack(OldParm);
5688           for (unsigned I = 0; I != *NumExpansions; ++I) {
5689             Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
5690             ParmVarDecl *NewParm
5691               = getDerived().TransformFunctionTypeParam(OldParm,
5692                                                         indexAdjustment++,
5693                                                         OrigNumExpansions,
5694                                                 /*ExpectParameterPack=*/false);
5695             if (!NewParm)
5696               return true;
5697 
5698             if (ParamInfos)
5699               PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5700             OutParamTypes.push_back(NewParm->getType());
5701             if (PVars)
5702               PVars->push_back(NewParm);
5703           }
5704 
5705           // If we're supposed to retain a pack expansion, do so by temporarily
5706           // forgetting the partially-substituted parameter pack.
5707           if (RetainExpansion) {
5708             ForgetPartiallySubstitutedPackRAII Forget(getDerived());
5709             ParmVarDecl *NewParm
5710               = getDerived().TransformFunctionTypeParam(OldParm,
5711                                                         indexAdjustment++,
5712                                                         OrigNumExpansions,
5713                                                 /*ExpectParameterPack=*/false);
5714             if (!NewParm)
5715               return true;
5716 
5717             if (ParamInfos)
5718               PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5719             OutParamTypes.push_back(NewParm->getType());
5720             if (PVars)
5721               PVars->push_back(NewParm);
5722           }
5723 
5724           // The next parameter should have the same adjustment as the
5725           // last thing we pushed, but we post-incremented indexAdjustment
5726           // on every push.  Also, if we push nothing, the adjustment should
5727           // go down by one.
5728           indexAdjustment--;
5729 
5730           // We're done with the pack expansion.
5731           continue;
5732         }
5733 
5734         // We'll substitute the parameter now without expanding the pack
5735         // expansion.
5736         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
5737         NewParm = getDerived().TransformFunctionTypeParam(OldParm,
5738                                                           indexAdjustment,
5739                                                           NumExpansions,
5740                                                   /*ExpectParameterPack=*/true);
5741         assert(NewParm->isParameterPack() &&
5742                "Parameter pack no longer a parameter pack after "
5743                "transformation.");
5744       } else {
5745         NewParm = getDerived().TransformFunctionTypeParam(
5746             OldParm, indexAdjustment, None, /*ExpectParameterPack=*/ false);
5747       }
5748 
5749       if (!NewParm)
5750         return true;
5751 
5752       if (ParamInfos)
5753         PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5754       OutParamTypes.push_back(NewParm->getType());
5755       if (PVars)
5756         PVars->push_back(NewParm);
5757       continue;
5758     }
5759 
5760     // Deal with the possibility that we don't have a parameter
5761     // declaration for this parameter.
5762     QualType OldType = ParamTypes[i];
5763     bool IsPackExpansion = false;
5764     Optional<unsigned> NumExpansions;
5765     QualType NewType;
5766     if (const PackExpansionType *Expansion
5767                                        = dyn_cast<PackExpansionType>(OldType)) {
5768       // We have a function parameter pack that may need to be expanded.
5769       QualType Pattern = Expansion->getPattern();
5770       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
5771       getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
5772 
5773       // Determine whether we should expand the parameter packs.
5774       bool ShouldExpand = false;
5775       bool RetainExpansion = false;
5776       if (getDerived().TryExpandParameterPacks(Loc, SourceRange(),
5777                                                Unexpanded,
5778                                                ShouldExpand,
5779                                                RetainExpansion,
5780                                                NumExpansions)) {
5781         return true;
5782       }
5783 
5784       if (ShouldExpand) {
5785         // Expand the function parameter pack into multiple, separate
5786         // parameters.
5787         for (unsigned I = 0; I != *NumExpansions; ++I) {
5788           Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
5789           QualType NewType = getDerived().TransformType(Pattern);
5790           if (NewType.isNull())
5791             return true;
5792 
5793           if (NewType->containsUnexpandedParameterPack()) {
5794             NewType =
5795                 getSema().getASTContext().getPackExpansionType(NewType, None);
5796 
5797             if (NewType.isNull())
5798               return true;
5799           }
5800 
5801           if (ParamInfos)
5802             PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5803           OutParamTypes.push_back(NewType);
5804           if (PVars)
5805             PVars->push_back(nullptr);
5806         }
5807 
5808         // We're done with the pack expansion.
5809         continue;
5810       }
5811 
5812       // If we're supposed to retain a pack expansion, do so by temporarily
5813       // forgetting the partially-substituted parameter pack.
5814       if (RetainExpansion) {
5815         ForgetPartiallySubstitutedPackRAII Forget(getDerived());
5816         QualType NewType = getDerived().TransformType(Pattern);
5817         if (NewType.isNull())
5818           return true;
5819 
5820         if (ParamInfos)
5821           PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5822         OutParamTypes.push_back(NewType);
5823         if (PVars)
5824           PVars->push_back(nullptr);
5825       }
5826 
5827       // We'll substitute the parameter now without expanding the pack
5828       // expansion.
5829       OldType = Expansion->getPattern();
5830       IsPackExpansion = true;
5831       Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
5832       NewType = getDerived().TransformType(OldType);
5833     } else {
5834       NewType = getDerived().TransformType(OldType);
5835     }
5836 
5837     if (NewType.isNull())
5838       return true;
5839 
5840     if (IsPackExpansion)
5841       NewType = getSema().Context.getPackExpansionType(NewType,
5842                                                        NumExpansions);
5843 
5844     if (ParamInfos)
5845       PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5846     OutParamTypes.push_back(NewType);
5847     if (PVars)
5848       PVars->push_back(nullptr);
5849   }
5850 
5851 #ifndef NDEBUG
5852   if (PVars) {
5853     for (unsigned i = 0, e = PVars->size(); i != e; ++i)
5854       if (ParmVarDecl *parm = (*PVars)[i])
5855         assert(parm->getFunctionScopeIndex() == i);
5856   }
5857 #endif
5858 
5859   return false;
5860 }
5861 
5862 template<typename Derived>
5863 QualType
5864 TreeTransform<Derived>::TransformFunctionProtoType(TypeLocBuilder &TLB,
5865                                                    FunctionProtoTypeLoc TL) {
5866   SmallVector<QualType, 4> ExceptionStorage;
5867   TreeTransform *This = this; // Work around gcc.gnu.org/PR56135.
5868   return getDerived().TransformFunctionProtoType(
5869       TLB, TL, nullptr, Qualifiers(),
5870       [&](FunctionProtoType::ExceptionSpecInfo &ESI, bool &Changed) {
5871         return This->getDerived().TransformExceptionSpec(
5872             TL.getBeginLoc(), ESI, ExceptionStorage, Changed);
5873       });
5874 }
5875 
5876 template<typename Derived> template<typename Fn>
5877 QualType TreeTransform<Derived>::TransformFunctionProtoType(
5878     TypeLocBuilder &TLB, FunctionProtoTypeLoc TL, CXXRecordDecl *ThisContext,
5879     Qualifiers ThisTypeQuals, Fn TransformExceptionSpec) {
5880 
5881   // Transform the parameters and return type.
5882   //
5883   // We are required to instantiate the params and return type in source order.
5884   // When the function has a trailing return type, we instantiate the
5885   // parameters before the return type,  since the return type can then refer
5886   // to the parameters themselves (via decltype, sizeof, etc.).
5887   //
5888   SmallVector<QualType, 4> ParamTypes;
5889   SmallVector<ParmVarDecl*, 4> ParamDecls;
5890   Sema::ExtParameterInfoBuilder ExtParamInfos;
5891   const FunctionProtoType *T = TL.getTypePtr();
5892 
5893   QualType ResultType;
5894 
5895   if (T->hasTrailingReturn()) {
5896     if (getDerived().TransformFunctionTypeParams(
5897             TL.getBeginLoc(), TL.getParams(),
5898             TL.getTypePtr()->param_type_begin(),
5899             T->getExtParameterInfosOrNull(),
5900             ParamTypes, &ParamDecls, ExtParamInfos))
5901       return QualType();
5902 
5903     {
5904       // C++11 [expr.prim.general]p3:
5905       //   If a declaration declares a member function or member function
5906       //   template of a class X, the expression this is a prvalue of type
5907       //   "pointer to cv-qualifier-seq X" between the optional cv-qualifer-seq
5908       //   and the end of the function-definition, member-declarator, or
5909       //   declarator.
5910       Sema::CXXThisScopeRAII ThisScope(SemaRef, ThisContext, ThisTypeQuals);
5911 
5912       ResultType = getDerived().TransformType(TLB, TL.getReturnLoc());
5913       if (ResultType.isNull())
5914         return QualType();
5915     }
5916   }
5917   else {
5918     ResultType = getDerived().TransformType(TLB, TL.getReturnLoc());
5919     if (ResultType.isNull())
5920       return QualType();
5921 
5922     if (getDerived().TransformFunctionTypeParams(
5923             TL.getBeginLoc(), TL.getParams(),
5924             TL.getTypePtr()->param_type_begin(),
5925             T->getExtParameterInfosOrNull(),
5926             ParamTypes, &ParamDecls, ExtParamInfos))
5927       return QualType();
5928   }
5929 
5930   FunctionProtoType::ExtProtoInfo EPI = T->getExtProtoInfo();
5931 
5932   bool EPIChanged = false;
5933   if (TransformExceptionSpec(EPI.ExceptionSpec, EPIChanged))
5934     return QualType();
5935 
5936   // Handle extended parameter information.
5937   if (auto NewExtParamInfos =
5938         ExtParamInfos.getPointerOrNull(ParamTypes.size())) {
5939     if (!EPI.ExtParameterInfos ||
5940         llvm::makeArrayRef(EPI.ExtParameterInfos, TL.getNumParams())
5941           != llvm::makeArrayRef(NewExtParamInfos, ParamTypes.size())) {
5942       EPIChanged = true;
5943     }
5944     EPI.ExtParameterInfos = NewExtParamInfos;
5945   } else if (EPI.ExtParameterInfos) {
5946     EPIChanged = true;
5947     EPI.ExtParameterInfos = nullptr;
5948   }
5949 
5950   QualType Result = TL.getType();
5951   if (getDerived().AlwaysRebuild() || ResultType != T->getReturnType() ||
5952       T->getParamTypes() != llvm::makeArrayRef(ParamTypes) || EPIChanged) {
5953     Result = getDerived().RebuildFunctionProtoType(ResultType, ParamTypes, EPI);
5954     if (Result.isNull())
5955       return QualType();
5956   }
5957 
5958   FunctionProtoTypeLoc NewTL = TLB.push<FunctionProtoTypeLoc>(Result);
5959   NewTL.setLocalRangeBegin(TL.getLocalRangeBegin());
5960   NewTL.setLParenLoc(TL.getLParenLoc());
5961   NewTL.setRParenLoc(TL.getRParenLoc());
5962   NewTL.setExceptionSpecRange(TL.getExceptionSpecRange());
5963   NewTL.setLocalRangeEnd(TL.getLocalRangeEnd());
5964   for (unsigned i = 0, e = NewTL.getNumParams(); i != e; ++i)
5965     NewTL.setParam(i, ParamDecls[i]);
5966 
5967   return Result;
5968 }
5969 
5970 template<typename Derived>
5971 bool TreeTransform<Derived>::TransformExceptionSpec(
5972     SourceLocation Loc, FunctionProtoType::ExceptionSpecInfo &ESI,
5973     SmallVectorImpl<QualType> &Exceptions, bool &Changed) {
5974   assert(ESI.Type != EST_Uninstantiated && ESI.Type != EST_Unevaluated);
5975 
5976   // Instantiate a dynamic noexcept expression, if any.
5977   if (isComputedNoexcept(ESI.Type)) {
5978     EnterExpressionEvaluationContext Unevaluated(
5979         getSema(), Sema::ExpressionEvaluationContext::ConstantEvaluated);
5980     ExprResult NoexceptExpr = getDerived().TransformExpr(ESI.NoexceptExpr);
5981     if (NoexceptExpr.isInvalid())
5982       return true;
5983 
5984     ExceptionSpecificationType EST = ESI.Type;
5985     NoexceptExpr =
5986         getSema().ActOnNoexceptSpec(NoexceptExpr.get(), EST);
5987     if (NoexceptExpr.isInvalid())
5988       return true;
5989 
5990     if (ESI.NoexceptExpr != NoexceptExpr.get() || EST != ESI.Type)
5991       Changed = true;
5992     ESI.NoexceptExpr = NoexceptExpr.get();
5993     ESI.Type = EST;
5994   }
5995 
5996   if (ESI.Type != EST_Dynamic)
5997     return false;
5998 
5999   // Instantiate a dynamic exception specification's type.
6000   for (QualType T : ESI.Exceptions) {
6001     if (const PackExpansionType *PackExpansion =
6002             T->getAs<PackExpansionType>()) {
6003       Changed = true;
6004 
6005       // We have a pack expansion. Instantiate it.
6006       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
6007       SemaRef.collectUnexpandedParameterPacks(PackExpansion->getPattern(),
6008                                               Unexpanded);
6009       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
6010 
6011       // Determine whether the set of unexpanded parameter packs can and
6012       // should
6013       // be expanded.
6014       bool Expand = false;
6015       bool RetainExpansion = false;
6016       Optional<unsigned> NumExpansions = PackExpansion->getNumExpansions();
6017       // FIXME: Track the location of the ellipsis (and track source location
6018       // information for the types in the exception specification in general).
6019       if (getDerived().TryExpandParameterPacks(
6020               Loc, SourceRange(), Unexpanded, Expand,
6021               RetainExpansion, NumExpansions))
6022         return true;
6023 
6024       if (!Expand) {
6025         // We can't expand this pack expansion into separate arguments yet;
6026         // just substitute into the pattern and create a new pack expansion
6027         // type.
6028         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
6029         QualType U = getDerived().TransformType(PackExpansion->getPattern());
6030         if (U.isNull())
6031           return true;
6032 
6033         U = SemaRef.Context.getPackExpansionType(U, NumExpansions);
6034         Exceptions.push_back(U);
6035         continue;
6036       }
6037 
6038       // Substitute into the pack expansion pattern for each slice of the
6039       // pack.
6040       for (unsigned ArgIdx = 0; ArgIdx != *NumExpansions; ++ArgIdx) {
6041         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), ArgIdx);
6042 
6043         QualType U = getDerived().TransformType(PackExpansion->getPattern());
6044         if (U.isNull() || SemaRef.CheckSpecifiedExceptionType(U, Loc))
6045           return true;
6046 
6047         Exceptions.push_back(U);
6048       }
6049     } else {
6050       QualType U = getDerived().TransformType(T);
6051       if (U.isNull() || SemaRef.CheckSpecifiedExceptionType(U, Loc))
6052         return true;
6053       if (T != U)
6054         Changed = true;
6055 
6056       Exceptions.push_back(U);
6057     }
6058   }
6059 
6060   ESI.Exceptions = Exceptions;
6061   if (ESI.Exceptions.empty())
6062     ESI.Type = EST_DynamicNone;
6063   return false;
6064 }
6065 
6066 template<typename Derived>
6067 QualType TreeTransform<Derived>::TransformFunctionNoProtoType(
6068                                                  TypeLocBuilder &TLB,
6069                                                  FunctionNoProtoTypeLoc TL) {
6070   const FunctionNoProtoType *T = TL.getTypePtr();
6071   QualType ResultType = getDerived().TransformType(TLB, TL.getReturnLoc());
6072   if (ResultType.isNull())
6073     return QualType();
6074 
6075   QualType Result = TL.getType();
6076   if (getDerived().AlwaysRebuild() || ResultType != T->getReturnType())
6077     Result = getDerived().RebuildFunctionNoProtoType(ResultType);
6078 
6079   FunctionNoProtoTypeLoc NewTL = TLB.push<FunctionNoProtoTypeLoc>(Result);
6080   NewTL.setLocalRangeBegin(TL.getLocalRangeBegin());
6081   NewTL.setLParenLoc(TL.getLParenLoc());
6082   NewTL.setRParenLoc(TL.getRParenLoc());
6083   NewTL.setLocalRangeEnd(TL.getLocalRangeEnd());
6084 
6085   return Result;
6086 }
6087 
6088 template <typename Derived>
6089 QualType TreeTransform<Derived>::TransformUnresolvedUsingType(
6090     TypeLocBuilder &TLB, UnresolvedUsingTypeLoc TL) {
6091   const UnresolvedUsingType *T = TL.getTypePtr();
6092   Decl *D = getDerived().TransformDecl(TL.getNameLoc(), T->getDecl());
6093   if (!D)
6094     return QualType();
6095 
6096   QualType Result = TL.getType();
6097   if (getDerived().AlwaysRebuild() || D != T->getDecl()) {
6098     Result = getDerived().RebuildUnresolvedUsingType(TL.getNameLoc(), D);
6099     if (Result.isNull())
6100       return QualType();
6101   }
6102 
6103   // We might get an arbitrary type spec type back.  We should at
6104   // least always get a type spec type, though.
6105   TypeSpecTypeLoc NewTL = TLB.pushTypeSpec(Result);
6106   NewTL.setNameLoc(TL.getNameLoc());
6107 
6108   return Result;
6109 }
6110 
6111 template <typename Derived>
6112 QualType TreeTransform<Derived>::TransformUsingType(TypeLocBuilder &TLB,
6113                                                     UsingTypeLoc TL) {
6114   const UsingType *T = TL.getTypePtr();
6115 
6116   auto *Found = cast_or_null<UsingShadowDecl>(getDerived().TransformDecl(
6117       TL.getLocalSourceRange().getBegin(), T->getFoundDecl()));
6118   if (!Found)
6119     return QualType();
6120 
6121   QualType Underlying = getDerived().TransformType(T->desugar());
6122   if (Underlying.isNull())
6123     return QualType();
6124 
6125   QualType Result = TL.getType();
6126   if (getDerived().AlwaysRebuild() || Found != T->getFoundDecl() ||
6127       Underlying != T->getUnderlyingType()) {
6128     Result = getDerived().RebuildUsingType(Found, Underlying);
6129     if (Result.isNull())
6130       return QualType();
6131   }
6132 
6133   TLB.pushTypeSpec(Result).setNameLoc(TL.getNameLoc());
6134   return Result;
6135 }
6136 
6137 template<typename Derived>
6138 QualType TreeTransform<Derived>::TransformTypedefType(TypeLocBuilder &TLB,
6139                                                       TypedefTypeLoc TL) {
6140   const TypedefType *T = TL.getTypePtr();
6141   TypedefNameDecl *Typedef
6142     = cast_or_null<TypedefNameDecl>(getDerived().TransformDecl(TL.getNameLoc(),
6143                                                                T->getDecl()));
6144   if (!Typedef)
6145     return QualType();
6146 
6147   QualType Result = TL.getType();
6148   if (getDerived().AlwaysRebuild() ||
6149       Typedef != T->getDecl()) {
6150     Result = getDerived().RebuildTypedefType(Typedef);
6151     if (Result.isNull())
6152       return QualType();
6153   }
6154 
6155   TypedefTypeLoc NewTL = TLB.push<TypedefTypeLoc>(Result);
6156   NewTL.setNameLoc(TL.getNameLoc());
6157 
6158   return Result;
6159 }
6160 
6161 template<typename Derived>
6162 QualType TreeTransform<Derived>::TransformTypeOfExprType(TypeLocBuilder &TLB,
6163                                                       TypeOfExprTypeLoc TL) {
6164   // typeof expressions are not potentially evaluated contexts
6165   EnterExpressionEvaluationContext Unevaluated(
6166       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated,
6167       Sema::ReuseLambdaContextDecl);
6168 
6169   ExprResult E = getDerived().TransformExpr(TL.getUnderlyingExpr());
6170   if (E.isInvalid())
6171     return QualType();
6172 
6173   E = SemaRef.HandleExprEvaluationContextForTypeof(E.get());
6174   if (E.isInvalid())
6175     return QualType();
6176 
6177   QualType Result = TL.getType();
6178   if (getDerived().AlwaysRebuild() ||
6179       E.get() != TL.getUnderlyingExpr()) {
6180     Result = getDerived().RebuildTypeOfExprType(E.get(), TL.getTypeofLoc());
6181     if (Result.isNull())
6182       return QualType();
6183   }
6184   else E.get();
6185 
6186   TypeOfExprTypeLoc NewTL = TLB.push<TypeOfExprTypeLoc>(Result);
6187   NewTL.setTypeofLoc(TL.getTypeofLoc());
6188   NewTL.setLParenLoc(TL.getLParenLoc());
6189   NewTL.setRParenLoc(TL.getRParenLoc());
6190 
6191   return Result;
6192 }
6193 
6194 template<typename Derived>
6195 QualType TreeTransform<Derived>::TransformTypeOfType(TypeLocBuilder &TLB,
6196                                                      TypeOfTypeLoc TL) {
6197   TypeSourceInfo* Old_Under_TI = TL.getUnderlyingTInfo();
6198   TypeSourceInfo* New_Under_TI = getDerived().TransformType(Old_Under_TI);
6199   if (!New_Under_TI)
6200     return QualType();
6201 
6202   QualType Result = TL.getType();
6203   if (getDerived().AlwaysRebuild() || New_Under_TI != Old_Under_TI) {
6204     Result = getDerived().RebuildTypeOfType(New_Under_TI->getType());
6205     if (Result.isNull())
6206       return QualType();
6207   }
6208 
6209   TypeOfTypeLoc NewTL = TLB.push<TypeOfTypeLoc>(Result);
6210   NewTL.setTypeofLoc(TL.getTypeofLoc());
6211   NewTL.setLParenLoc(TL.getLParenLoc());
6212   NewTL.setRParenLoc(TL.getRParenLoc());
6213   NewTL.setUnderlyingTInfo(New_Under_TI);
6214 
6215   return Result;
6216 }
6217 
6218 template<typename Derived>
6219 QualType TreeTransform<Derived>::TransformDecltypeType(TypeLocBuilder &TLB,
6220                                                        DecltypeTypeLoc TL) {
6221   const DecltypeType *T = TL.getTypePtr();
6222 
6223   // decltype expressions are not potentially evaluated contexts
6224   EnterExpressionEvaluationContext Unevaluated(
6225       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, nullptr,
6226       Sema::ExpressionEvaluationContextRecord::EK_Decltype);
6227 
6228   ExprResult E = getDerived().TransformExpr(T->getUnderlyingExpr());
6229   if (E.isInvalid())
6230     return QualType();
6231 
6232   E = getSema().ActOnDecltypeExpression(E.get());
6233   if (E.isInvalid())
6234     return QualType();
6235 
6236   QualType Result = TL.getType();
6237   if (getDerived().AlwaysRebuild() ||
6238       E.get() != T->getUnderlyingExpr()) {
6239     Result = getDerived().RebuildDecltypeType(E.get(), TL.getDecltypeLoc());
6240     if (Result.isNull())
6241       return QualType();
6242   }
6243   else E.get();
6244 
6245   DecltypeTypeLoc NewTL = TLB.push<DecltypeTypeLoc>(Result);
6246   NewTL.setDecltypeLoc(TL.getDecltypeLoc());
6247   NewTL.setRParenLoc(TL.getRParenLoc());
6248   return Result;
6249 }
6250 
6251 template<typename Derived>
6252 QualType TreeTransform<Derived>::TransformUnaryTransformType(
6253                                                             TypeLocBuilder &TLB,
6254                                                      UnaryTransformTypeLoc TL) {
6255   QualType Result = TL.getType();
6256   if (Result->isDependentType()) {
6257     const UnaryTransformType *T = TL.getTypePtr();
6258     QualType NewBase =
6259       getDerived().TransformType(TL.getUnderlyingTInfo())->getType();
6260     Result = getDerived().RebuildUnaryTransformType(NewBase,
6261                                                     T->getUTTKind(),
6262                                                     TL.getKWLoc());
6263     if (Result.isNull())
6264       return QualType();
6265   }
6266 
6267   UnaryTransformTypeLoc NewTL = TLB.push<UnaryTransformTypeLoc>(Result);
6268   NewTL.setKWLoc(TL.getKWLoc());
6269   NewTL.setParensRange(TL.getParensRange());
6270   NewTL.setUnderlyingTInfo(TL.getUnderlyingTInfo());
6271   return Result;
6272 }
6273 
6274 template<typename Derived>
6275 QualType TreeTransform<Derived>::TransformDeducedTemplateSpecializationType(
6276     TypeLocBuilder &TLB, DeducedTemplateSpecializationTypeLoc TL) {
6277   const DeducedTemplateSpecializationType *T = TL.getTypePtr();
6278 
6279   CXXScopeSpec SS;
6280   TemplateName TemplateName = getDerived().TransformTemplateName(
6281       SS, T->getTemplateName(), TL.getTemplateNameLoc());
6282   if (TemplateName.isNull())
6283     return QualType();
6284 
6285   QualType OldDeduced = T->getDeducedType();
6286   QualType NewDeduced;
6287   if (!OldDeduced.isNull()) {
6288     NewDeduced = getDerived().TransformType(OldDeduced);
6289     if (NewDeduced.isNull())
6290       return QualType();
6291   }
6292 
6293   QualType Result = getDerived().RebuildDeducedTemplateSpecializationType(
6294       TemplateName, NewDeduced);
6295   if (Result.isNull())
6296     return QualType();
6297 
6298   DeducedTemplateSpecializationTypeLoc NewTL =
6299       TLB.push<DeducedTemplateSpecializationTypeLoc>(Result);
6300   NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6301 
6302   return Result;
6303 }
6304 
6305 template<typename Derived>
6306 QualType TreeTransform<Derived>::TransformRecordType(TypeLocBuilder &TLB,
6307                                                      RecordTypeLoc TL) {
6308   const RecordType *T = TL.getTypePtr();
6309   RecordDecl *Record
6310     = cast_or_null<RecordDecl>(getDerived().TransformDecl(TL.getNameLoc(),
6311                                                           T->getDecl()));
6312   if (!Record)
6313     return QualType();
6314 
6315   QualType Result = TL.getType();
6316   if (getDerived().AlwaysRebuild() ||
6317       Record != T->getDecl()) {
6318     Result = getDerived().RebuildRecordType(Record);
6319     if (Result.isNull())
6320       return QualType();
6321   }
6322 
6323   RecordTypeLoc NewTL = TLB.push<RecordTypeLoc>(Result);
6324   NewTL.setNameLoc(TL.getNameLoc());
6325 
6326   return Result;
6327 }
6328 
6329 template<typename Derived>
6330 QualType TreeTransform<Derived>::TransformEnumType(TypeLocBuilder &TLB,
6331                                                    EnumTypeLoc TL) {
6332   const EnumType *T = TL.getTypePtr();
6333   EnumDecl *Enum
6334     = cast_or_null<EnumDecl>(getDerived().TransformDecl(TL.getNameLoc(),
6335                                                         T->getDecl()));
6336   if (!Enum)
6337     return QualType();
6338 
6339   QualType Result = TL.getType();
6340   if (getDerived().AlwaysRebuild() ||
6341       Enum != T->getDecl()) {
6342     Result = getDerived().RebuildEnumType(Enum);
6343     if (Result.isNull())
6344       return QualType();
6345   }
6346 
6347   EnumTypeLoc NewTL = TLB.push<EnumTypeLoc>(Result);
6348   NewTL.setNameLoc(TL.getNameLoc());
6349 
6350   return Result;
6351 }
6352 
6353 template<typename Derived>
6354 QualType TreeTransform<Derived>::TransformInjectedClassNameType(
6355                                          TypeLocBuilder &TLB,
6356                                          InjectedClassNameTypeLoc TL) {
6357   Decl *D = getDerived().TransformDecl(TL.getNameLoc(),
6358                                        TL.getTypePtr()->getDecl());
6359   if (!D) return QualType();
6360 
6361   QualType T = SemaRef.Context.getTypeDeclType(cast<TypeDecl>(D));
6362   TLB.pushTypeSpec(T).setNameLoc(TL.getNameLoc());
6363   return T;
6364 }
6365 
6366 template<typename Derived>
6367 QualType TreeTransform<Derived>::TransformTemplateTypeParmType(
6368                                                 TypeLocBuilder &TLB,
6369                                                 TemplateTypeParmTypeLoc TL) {
6370   return TransformTypeSpecType(TLB, TL);
6371 }
6372 
6373 template<typename Derived>
6374 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmType(
6375                                          TypeLocBuilder &TLB,
6376                                          SubstTemplateTypeParmTypeLoc TL) {
6377   const SubstTemplateTypeParmType *T = TL.getTypePtr();
6378 
6379   // Substitute into the replacement type, which itself might involve something
6380   // that needs to be transformed. This only tends to occur with default
6381   // template arguments of template template parameters.
6382   TemporaryBase Rebase(*this, TL.getNameLoc(), DeclarationName());
6383   QualType Replacement = getDerived().TransformType(T->getReplacementType());
6384   if (Replacement.isNull())
6385     return QualType();
6386 
6387   // Always canonicalize the replacement type.
6388   Replacement = SemaRef.Context.getCanonicalType(Replacement);
6389   QualType Result
6390     = SemaRef.Context.getSubstTemplateTypeParmType(T->getReplacedParameter(),
6391                                                    Replacement);
6392 
6393   // Propagate type-source information.
6394   SubstTemplateTypeParmTypeLoc NewTL
6395     = TLB.push<SubstTemplateTypeParmTypeLoc>(Result);
6396   NewTL.setNameLoc(TL.getNameLoc());
6397   return Result;
6398 
6399 }
6400 
6401 template<typename Derived>
6402 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmPackType(
6403                                           TypeLocBuilder &TLB,
6404                                           SubstTemplateTypeParmPackTypeLoc TL) {
6405   return TransformTypeSpecType(TLB, TL);
6406 }
6407 
6408 template<typename Derived>
6409 QualType TreeTransform<Derived>::TransformTemplateSpecializationType(
6410                                                         TypeLocBuilder &TLB,
6411                                            TemplateSpecializationTypeLoc TL) {
6412   const TemplateSpecializationType *T = TL.getTypePtr();
6413 
6414   // The nested-name-specifier never matters in a TemplateSpecializationType,
6415   // because we can't have a dependent nested-name-specifier anyway.
6416   CXXScopeSpec SS;
6417   TemplateName Template
6418     = getDerived().TransformTemplateName(SS, T->getTemplateName(),
6419                                          TL.getTemplateNameLoc());
6420   if (Template.isNull())
6421     return QualType();
6422 
6423   return getDerived().TransformTemplateSpecializationType(TLB, TL, Template);
6424 }
6425 
6426 template<typename Derived>
6427 QualType TreeTransform<Derived>::TransformAtomicType(TypeLocBuilder &TLB,
6428                                                      AtomicTypeLoc TL) {
6429   QualType ValueType = getDerived().TransformType(TLB, TL.getValueLoc());
6430   if (ValueType.isNull())
6431     return QualType();
6432 
6433   QualType Result = TL.getType();
6434   if (getDerived().AlwaysRebuild() ||
6435       ValueType != TL.getValueLoc().getType()) {
6436     Result = getDerived().RebuildAtomicType(ValueType, TL.getKWLoc());
6437     if (Result.isNull())
6438       return QualType();
6439   }
6440 
6441   AtomicTypeLoc NewTL = TLB.push<AtomicTypeLoc>(Result);
6442   NewTL.setKWLoc(TL.getKWLoc());
6443   NewTL.setLParenLoc(TL.getLParenLoc());
6444   NewTL.setRParenLoc(TL.getRParenLoc());
6445 
6446   return Result;
6447 }
6448 
6449 template <typename Derived>
6450 QualType TreeTransform<Derived>::TransformPipeType(TypeLocBuilder &TLB,
6451                                                    PipeTypeLoc TL) {
6452   QualType ValueType = getDerived().TransformType(TLB, TL.getValueLoc());
6453   if (ValueType.isNull())
6454     return QualType();
6455 
6456   QualType Result = TL.getType();
6457   if (getDerived().AlwaysRebuild() || ValueType != TL.getValueLoc().getType()) {
6458     const PipeType *PT = Result->castAs<PipeType>();
6459     bool isReadPipe = PT->isReadOnly();
6460     Result = getDerived().RebuildPipeType(ValueType, TL.getKWLoc(), isReadPipe);
6461     if (Result.isNull())
6462       return QualType();
6463   }
6464 
6465   PipeTypeLoc NewTL = TLB.push<PipeTypeLoc>(Result);
6466   NewTL.setKWLoc(TL.getKWLoc());
6467 
6468   return Result;
6469 }
6470 
6471 template <typename Derived>
6472 QualType TreeTransform<Derived>::TransformBitIntType(TypeLocBuilder &TLB,
6473                                                      BitIntTypeLoc TL) {
6474   const BitIntType *EIT = TL.getTypePtr();
6475   QualType Result = TL.getType();
6476 
6477   if (getDerived().AlwaysRebuild()) {
6478     Result = getDerived().RebuildBitIntType(EIT->isUnsigned(),
6479                                             EIT->getNumBits(), TL.getNameLoc());
6480     if (Result.isNull())
6481       return QualType();
6482   }
6483 
6484   BitIntTypeLoc NewTL = TLB.push<BitIntTypeLoc>(Result);
6485   NewTL.setNameLoc(TL.getNameLoc());
6486   return Result;
6487 }
6488 
6489 template <typename Derived>
6490 QualType TreeTransform<Derived>::TransformDependentBitIntType(
6491     TypeLocBuilder &TLB, DependentBitIntTypeLoc TL) {
6492   const DependentBitIntType *EIT = TL.getTypePtr();
6493 
6494   EnterExpressionEvaluationContext Unevaluated(
6495       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
6496   ExprResult BitsExpr = getDerived().TransformExpr(EIT->getNumBitsExpr());
6497   BitsExpr = SemaRef.ActOnConstantExpression(BitsExpr);
6498 
6499   if (BitsExpr.isInvalid())
6500     return QualType();
6501 
6502   QualType Result = TL.getType();
6503 
6504   if (getDerived().AlwaysRebuild() || BitsExpr.get() != EIT->getNumBitsExpr()) {
6505     Result = getDerived().RebuildDependentBitIntType(
6506         EIT->isUnsigned(), BitsExpr.get(), TL.getNameLoc());
6507 
6508     if (Result.isNull())
6509       return QualType();
6510   }
6511 
6512   if (isa<DependentBitIntType>(Result)) {
6513     DependentBitIntTypeLoc NewTL = TLB.push<DependentBitIntTypeLoc>(Result);
6514     NewTL.setNameLoc(TL.getNameLoc());
6515   } else {
6516     BitIntTypeLoc NewTL = TLB.push<BitIntTypeLoc>(Result);
6517     NewTL.setNameLoc(TL.getNameLoc());
6518   }
6519   return Result;
6520 }
6521 
6522   /// Simple iterator that traverses the template arguments in a
6523   /// container that provides a \c getArgLoc() member function.
6524   ///
6525   /// This iterator is intended to be used with the iterator form of
6526   /// \c TreeTransform<Derived>::TransformTemplateArguments().
6527   template<typename ArgLocContainer>
6528   class TemplateArgumentLocContainerIterator {
6529     ArgLocContainer *Container;
6530     unsigned Index;
6531 
6532   public:
6533     typedef TemplateArgumentLoc value_type;
6534     typedef TemplateArgumentLoc reference;
6535     typedef int difference_type;
6536     typedef std::input_iterator_tag iterator_category;
6537 
6538     class pointer {
6539       TemplateArgumentLoc Arg;
6540 
6541     public:
6542       explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { }
6543 
6544       const TemplateArgumentLoc *operator->() const {
6545         return &Arg;
6546       }
6547     };
6548 
6549 
6550     TemplateArgumentLocContainerIterator() {}
6551 
6552     TemplateArgumentLocContainerIterator(ArgLocContainer &Container,
6553                                  unsigned Index)
6554       : Container(&Container), Index(Index) { }
6555 
6556     TemplateArgumentLocContainerIterator &operator++() {
6557       ++Index;
6558       return *this;
6559     }
6560 
6561     TemplateArgumentLocContainerIterator operator++(int) {
6562       TemplateArgumentLocContainerIterator Old(*this);
6563       ++(*this);
6564       return Old;
6565     }
6566 
6567     TemplateArgumentLoc operator*() const {
6568       return Container->getArgLoc(Index);
6569     }
6570 
6571     pointer operator->() const {
6572       return pointer(Container->getArgLoc(Index));
6573     }
6574 
6575     friend bool operator==(const TemplateArgumentLocContainerIterator &X,
6576                            const TemplateArgumentLocContainerIterator &Y) {
6577       return X.Container == Y.Container && X.Index == Y.Index;
6578     }
6579 
6580     friend bool operator!=(const TemplateArgumentLocContainerIterator &X,
6581                            const TemplateArgumentLocContainerIterator &Y) {
6582       return !(X == Y);
6583     }
6584   };
6585 
6586 template<typename Derived>
6587 QualType TreeTransform<Derived>::TransformAutoType(TypeLocBuilder &TLB,
6588                                                    AutoTypeLoc TL) {
6589   const AutoType *T = TL.getTypePtr();
6590   QualType OldDeduced = T->getDeducedType();
6591   QualType NewDeduced;
6592   if (!OldDeduced.isNull()) {
6593     NewDeduced = getDerived().TransformType(OldDeduced);
6594     if (NewDeduced.isNull())
6595       return QualType();
6596   }
6597 
6598   ConceptDecl *NewCD = nullptr;
6599   TemplateArgumentListInfo NewTemplateArgs;
6600   NestedNameSpecifierLoc NewNestedNameSpec;
6601   if (T->isConstrained()) {
6602     NewCD = cast_or_null<ConceptDecl>(getDerived().TransformDecl(
6603         TL.getConceptNameLoc(), T->getTypeConstraintConcept()));
6604 
6605     NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
6606     NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
6607     typedef TemplateArgumentLocContainerIterator<AutoTypeLoc> ArgIterator;
6608     if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
6609                                                 ArgIterator(TL,
6610                                                             TL.getNumArgs()),
6611                                                 NewTemplateArgs))
6612       return QualType();
6613 
6614     if (TL.getNestedNameSpecifierLoc()) {
6615       NewNestedNameSpec
6616         = getDerived().TransformNestedNameSpecifierLoc(
6617             TL.getNestedNameSpecifierLoc());
6618       if (!NewNestedNameSpec)
6619         return QualType();
6620     }
6621   }
6622 
6623   QualType Result = TL.getType();
6624   if (getDerived().AlwaysRebuild() || NewDeduced != OldDeduced ||
6625       T->isDependentType() || T->isConstrained()) {
6626     // FIXME: Maybe don't rebuild if all template arguments are the same.
6627     llvm::SmallVector<TemplateArgument, 4> NewArgList;
6628     NewArgList.reserve(NewTemplateArgs.size());
6629     for (const auto &ArgLoc : NewTemplateArgs.arguments())
6630       NewArgList.push_back(ArgLoc.getArgument());
6631     Result = getDerived().RebuildAutoType(NewDeduced, T->getKeyword(), NewCD,
6632                                           NewArgList);
6633     if (Result.isNull())
6634       return QualType();
6635   }
6636 
6637   AutoTypeLoc NewTL = TLB.push<AutoTypeLoc>(Result);
6638   NewTL.setNameLoc(TL.getNameLoc());
6639   NewTL.setNestedNameSpecifierLoc(NewNestedNameSpec);
6640   NewTL.setTemplateKWLoc(TL.getTemplateKWLoc());
6641   NewTL.setConceptNameLoc(TL.getConceptNameLoc());
6642   NewTL.setFoundDecl(TL.getFoundDecl());
6643   NewTL.setLAngleLoc(TL.getLAngleLoc());
6644   NewTL.setRAngleLoc(TL.getRAngleLoc());
6645   NewTL.setRParenLoc(TL.getRParenLoc());
6646   for (unsigned I = 0; I < NewTL.getNumArgs(); ++I)
6647     NewTL.setArgLocInfo(I, NewTemplateArgs.arguments()[I].getLocInfo());
6648 
6649   return Result;
6650 }
6651 
6652 template <typename Derived>
6653 QualType TreeTransform<Derived>::TransformTemplateSpecializationType(
6654                                                         TypeLocBuilder &TLB,
6655                                            TemplateSpecializationTypeLoc TL,
6656                                                       TemplateName Template) {
6657   TemplateArgumentListInfo NewTemplateArgs;
6658   NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
6659   NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
6660   typedef TemplateArgumentLocContainerIterator<TemplateSpecializationTypeLoc>
6661     ArgIterator;
6662   if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
6663                                               ArgIterator(TL, TL.getNumArgs()),
6664                                               NewTemplateArgs))
6665     return QualType();
6666 
6667   // FIXME: maybe don't rebuild if all the template arguments are the same.
6668 
6669   QualType Result =
6670     getDerived().RebuildTemplateSpecializationType(Template,
6671                                                    TL.getTemplateNameLoc(),
6672                                                    NewTemplateArgs);
6673 
6674   if (!Result.isNull()) {
6675     // Specializations of template template parameters are represented as
6676     // TemplateSpecializationTypes, and substitution of type alias templates
6677     // within a dependent context can transform them into
6678     // DependentTemplateSpecializationTypes.
6679     if (isa<DependentTemplateSpecializationType>(Result)) {
6680       DependentTemplateSpecializationTypeLoc NewTL
6681         = TLB.push<DependentTemplateSpecializationTypeLoc>(Result);
6682       NewTL.setElaboratedKeywordLoc(SourceLocation());
6683       NewTL.setQualifierLoc(NestedNameSpecifierLoc());
6684       NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6685       NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6686       NewTL.setLAngleLoc(TL.getLAngleLoc());
6687       NewTL.setRAngleLoc(TL.getRAngleLoc());
6688       for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
6689         NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
6690       return Result;
6691     }
6692 
6693     TemplateSpecializationTypeLoc NewTL
6694       = TLB.push<TemplateSpecializationTypeLoc>(Result);
6695     NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6696     NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6697     NewTL.setLAngleLoc(TL.getLAngleLoc());
6698     NewTL.setRAngleLoc(TL.getRAngleLoc());
6699     for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
6700       NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
6701   }
6702 
6703   return Result;
6704 }
6705 
6706 template <typename Derived>
6707 QualType TreeTransform<Derived>::TransformDependentTemplateSpecializationType(
6708                                      TypeLocBuilder &TLB,
6709                                      DependentTemplateSpecializationTypeLoc TL,
6710                                      TemplateName Template,
6711                                      CXXScopeSpec &SS) {
6712   TemplateArgumentListInfo NewTemplateArgs;
6713   NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
6714   NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
6715   typedef TemplateArgumentLocContainerIterator<
6716             DependentTemplateSpecializationTypeLoc> ArgIterator;
6717   if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
6718                                               ArgIterator(TL, TL.getNumArgs()),
6719                                               NewTemplateArgs))
6720     return QualType();
6721 
6722   // FIXME: maybe don't rebuild if all the template arguments are the same.
6723 
6724   if (DependentTemplateName *DTN = Template.getAsDependentTemplateName()) {
6725     QualType Result
6726       = getSema().Context.getDependentTemplateSpecializationType(
6727                                                 TL.getTypePtr()->getKeyword(),
6728                                                          DTN->getQualifier(),
6729                                                          DTN->getIdentifier(),
6730                                                                NewTemplateArgs);
6731 
6732     DependentTemplateSpecializationTypeLoc NewTL
6733       = TLB.push<DependentTemplateSpecializationTypeLoc>(Result);
6734     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6735     NewTL.setQualifierLoc(SS.getWithLocInContext(SemaRef.Context));
6736     NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6737     NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6738     NewTL.setLAngleLoc(TL.getLAngleLoc());
6739     NewTL.setRAngleLoc(TL.getRAngleLoc());
6740     for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
6741       NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
6742     return Result;
6743   }
6744 
6745   QualType Result
6746     = getDerived().RebuildTemplateSpecializationType(Template,
6747                                                      TL.getTemplateNameLoc(),
6748                                                      NewTemplateArgs);
6749 
6750   if (!Result.isNull()) {
6751     /// FIXME: Wrap this in an elaborated-type-specifier?
6752     TemplateSpecializationTypeLoc NewTL
6753       = TLB.push<TemplateSpecializationTypeLoc>(Result);
6754     NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6755     NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6756     NewTL.setLAngleLoc(TL.getLAngleLoc());
6757     NewTL.setRAngleLoc(TL.getRAngleLoc());
6758     for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
6759       NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
6760   }
6761 
6762   return Result;
6763 }
6764 
6765 template<typename Derived>
6766 QualType
6767 TreeTransform<Derived>::TransformElaboratedType(TypeLocBuilder &TLB,
6768                                                 ElaboratedTypeLoc TL) {
6769   const ElaboratedType *T = TL.getTypePtr();
6770 
6771   NestedNameSpecifierLoc QualifierLoc;
6772   // NOTE: the qualifier in an ElaboratedType is optional.
6773   if (TL.getQualifierLoc()) {
6774     QualifierLoc
6775       = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc());
6776     if (!QualifierLoc)
6777       return QualType();
6778   }
6779 
6780   QualType NamedT = getDerived().TransformType(TLB, TL.getNamedTypeLoc());
6781   if (NamedT.isNull())
6782     return QualType();
6783 
6784   // C++0x [dcl.type.elab]p2:
6785   //   If the identifier resolves to a typedef-name or the simple-template-id
6786   //   resolves to an alias template specialization, the
6787   //   elaborated-type-specifier is ill-formed.
6788   if (T->getKeyword() != ETK_None && T->getKeyword() != ETK_Typename) {
6789     if (const TemplateSpecializationType *TST =
6790           NamedT->getAs<TemplateSpecializationType>()) {
6791       TemplateName Template = TST->getTemplateName();
6792       if (TypeAliasTemplateDecl *TAT = dyn_cast_or_null<TypeAliasTemplateDecl>(
6793               Template.getAsTemplateDecl())) {
6794         SemaRef.Diag(TL.getNamedTypeLoc().getBeginLoc(),
6795                      diag::err_tag_reference_non_tag)
6796             << TAT << Sema::NTK_TypeAliasTemplate
6797             << ElaboratedType::getTagTypeKindForKeyword(T->getKeyword());
6798         SemaRef.Diag(TAT->getLocation(), diag::note_declared_at);
6799       }
6800     }
6801   }
6802 
6803   QualType Result = TL.getType();
6804   if (getDerived().AlwaysRebuild() ||
6805       QualifierLoc != TL.getQualifierLoc() ||
6806       NamedT != T->getNamedType()) {
6807     Result = getDerived().RebuildElaboratedType(TL.getElaboratedKeywordLoc(),
6808                                                 T->getKeyword(),
6809                                                 QualifierLoc, NamedT);
6810     if (Result.isNull())
6811       return QualType();
6812   }
6813 
6814   ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
6815   NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6816   NewTL.setQualifierLoc(QualifierLoc);
6817   return Result;
6818 }
6819 
6820 template<typename Derived>
6821 QualType TreeTransform<Derived>::TransformAttributedType(
6822                                                 TypeLocBuilder &TLB,
6823                                                 AttributedTypeLoc TL) {
6824   const AttributedType *oldType = TL.getTypePtr();
6825   QualType modifiedType = getDerived().TransformType(TLB, TL.getModifiedLoc());
6826   if (modifiedType.isNull())
6827     return QualType();
6828 
6829   // oldAttr can be null if we started with a QualType rather than a TypeLoc.
6830   const Attr *oldAttr = TL.getAttr();
6831   const Attr *newAttr = oldAttr ? getDerived().TransformAttr(oldAttr) : nullptr;
6832   if (oldAttr && !newAttr)
6833     return QualType();
6834 
6835   QualType result = TL.getType();
6836 
6837   // FIXME: dependent operand expressions?
6838   if (getDerived().AlwaysRebuild() ||
6839       modifiedType != oldType->getModifiedType()) {
6840     // TODO: this is really lame; we should really be rebuilding the
6841     // equivalent type from first principles.
6842     QualType equivalentType
6843       = getDerived().TransformType(oldType->getEquivalentType());
6844     if (equivalentType.isNull())
6845       return QualType();
6846 
6847     // Check whether we can add nullability; it is only represented as
6848     // type sugar, and therefore cannot be diagnosed in any other way.
6849     if (auto nullability = oldType->getImmediateNullability()) {
6850       if (!modifiedType->canHaveNullability()) {
6851         SemaRef.Diag(TL.getAttr()->getLocation(),
6852                      diag::err_nullability_nonpointer)
6853             << DiagNullabilityKind(*nullability, false) << modifiedType;
6854         return QualType();
6855       }
6856     }
6857 
6858     result = SemaRef.Context.getAttributedType(TL.getAttrKind(),
6859                                                modifiedType,
6860                                                equivalentType);
6861   }
6862 
6863   AttributedTypeLoc newTL = TLB.push<AttributedTypeLoc>(result);
6864   newTL.setAttr(newAttr);
6865   return result;
6866 }
6867 
6868 template<typename Derived>
6869 QualType
6870 TreeTransform<Derived>::TransformParenType(TypeLocBuilder &TLB,
6871                                            ParenTypeLoc TL) {
6872   QualType Inner = getDerived().TransformType(TLB, TL.getInnerLoc());
6873   if (Inner.isNull())
6874     return QualType();
6875 
6876   QualType Result = TL.getType();
6877   if (getDerived().AlwaysRebuild() ||
6878       Inner != TL.getInnerLoc().getType()) {
6879     Result = getDerived().RebuildParenType(Inner);
6880     if (Result.isNull())
6881       return QualType();
6882   }
6883 
6884   ParenTypeLoc NewTL = TLB.push<ParenTypeLoc>(Result);
6885   NewTL.setLParenLoc(TL.getLParenLoc());
6886   NewTL.setRParenLoc(TL.getRParenLoc());
6887   return Result;
6888 }
6889 
6890 template <typename Derived>
6891 QualType
6892 TreeTransform<Derived>::TransformMacroQualifiedType(TypeLocBuilder &TLB,
6893                                                     MacroQualifiedTypeLoc TL) {
6894   QualType Inner = getDerived().TransformType(TLB, TL.getInnerLoc());
6895   if (Inner.isNull())
6896     return QualType();
6897 
6898   QualType Result = TL.getType();
6899   if (getDerived().AlwaysRebuild() || Inner != TL.getInnerLoc().getType()) {
6900     Result =
6901         getDerived().RebuildMacroQualifiedType(Inner, TL.getMacroIdentifier());
6902     if (Result.isNull())
6903       return QualType();
6904   }
6905 
6906   MacroQualifiedTypeLoc NewTL = TLB.push<MacroQualifiedTypeLoc>(Result);
6907   NewTL.setExpansionLoc(TL.getExpansionLoc());
6908   return Result;
6909 }
6910 
6911 template<typename Derived>
6912 QualType TreeTransform<Derived>::TransformDependentNameType(
6913     TypeLocBuilder &TLB, DependentNameTypeLoc TL) {
6914   return TransformDependentNameType(TLB, TL, false);
6915 }
6916 
6917 template<typename Derived>
6918 QualType TreeTransform<Derived>::TransformDependentNameType(
6919     TypeLocBuilder &TLB, DependentNameTypeLoc TL, bool DeducedTSTContext) {
6920   const DependentNameType *T = TL.getTypePtr();
6921 
6922   NestedNameSpecifierLoc QualifierLoc
6923     = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc());
6924   if (!QualifierLoc)
6925     return QualType();
6926 
6927   QualType Result
6928     = getDerived().RebuildDependentNameType(T->getKeyword(),
6929                                             TL.getElaboratedKeywordLoc(),
6930                                             QualifierLoc,
6931                                             T->getIdentifier(),
6932                                             TL.getNameLoc(),
6933                                             DeducedTSTContext);
6934   if (Result.isNull())
6935     return QualType();
6936 
6937   if (const ElaboratedType* ElabT = Result->getAs<ElaboratedType>()) {
6938     QualType NamedT = ElabT->getNamedType();
6939     TLB.pushTypeSpec(NamedT).setNameLoc(TL.getNameLoc());
6940 
6941     ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
6942     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6943     NewTL.setQualifierLoc(QualifierLoc);
6944   } else {
6945     DependentNameTypeLoc NewTL = TLB.push<DependentNameTypeLoc>(Result);
6946     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6947     NewTL.setQualifierLoc(QualifierLoc);
6948     NewTL.setNameLoc(TL.getNameLoc());
6949   }
6950   return Result;
6951 }
6952 
6953 template<typename Derived>
6954 QualType TreeTransform<Derived>::
6955           TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB,
6956                                  DependentTemplateSpecializationTypeLoc TL) {
6957   NestedNameSpecifierLoc QualifierLoc;
6958   if (TL.getQualifierLoc()) {
6959     QualifierLoc
6960       = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc());
6961     if (!QualifierLoc)
6962       return QualType();
6963   }
6964 
6965   return getDerived()
6966            .TransformDependentTemplateSpecializationType(TLB, TL, QualifierLoc);
6967 }
6968 
6969 template<typename Derived>
6970 QualType TreeTransform<Derived>::
6971 TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB,
6972                                    DependentTemplateSpecializationTypeLoc TL,
6973                                        NestedNameSpecifierLoc QualifierLoc) {
6974   const DependentTemplateSpecializationType *T = TL.getTypePtr();
6975 
6976   TemplateArgumentListInfo NewTemplateArgs;
6977   NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
6978   NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
6979 
6980   typedef TemplateArgumentLocContainerIterator<
6981   DependentTemplateSpecializationTypeLoc> ArgIterator;
6982   if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
6983                                               ArgIterator(TL, TL.getNumArgs()),
6984                                               NewTemplateArgs))
6985     return QualType();
6986 
6987   QualType Result = getDerived().RebuildDependentTemplateSpecializationType(
6988       T->getKeyword(), QualifierLoc, TL.getTemplateKeywordLoc(),
6989       T->getIdentifier(), TL.getTemplateNameLoc(), NewTemplateArgs,
6990       /*AllowInjectedClassName*/ false);
6991   if (Result.isNull())
6992     return QualType();
6993 
6994   if (const ElaboratedType *ElabT = dyn_cast<ElaboratedType>(Result)) {
6995     QualType NamedT = ElabT->getNamedType();
6996 
6997     // Copy information relevant to the template specialization.
6998     TemplateSpecializationTypeLoc NamedTL
6999       = TLB.push<TemplateSpecializationTypeLoc>(NamedT);
7000     NamedTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
7001     NamedTL.setTemplateNameLoc(TL.getTemplateNameLoc());
7002     NamedTL.setLAngleLoc(TL.getLAngleLoc());
7003     NamedTL.setRAngleLoc(TL.getRAngleLoc());
7004     for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I)
7005       NamedTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo());
7006 
7007     // Copy information relevant to the elaborated type.
7008     ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
7009     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
7010     NewTL.setQualifierLoc(QualifierLoc);
7011   } else if (isa<DependentTemplateSpecializationType>(Result)) {
7012     DependentTemplateSpecializationTypeLoc SpecTL
7013       = TLB.push<DependentTemplateSpecializationTypeLoc>(Result);
7014     SpecTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
7015     SpecTL.setQualifierLoc(QualifierLoc);
7016     SpecTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
7017     SpecTL.setTemplateNameLoc(TL.getTemplateNameLoc());
7018     SpecTL.setLAngleLoc(TL.getLAngleLoc());
7019     SpecTL.setRAngleLoc(TL.getRAngleLoc());
7020     for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I)
7021       SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo());
7022   } else {
7023     TemplateSpecializationTypeLoc SpecTL
7024       = TLB.push<TemplateSpecializationTypeLoc>(Result);
7025     SpecTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
7026     SpecTL.setTemplateNameLoc(TL.getTemplateNameLoc());
7027     SpecTL.setLAngleLoc(TL.getLAngleLoc());
7028     SpecTL.setRAngleLoc(TL.getRAngleLoc());
7029     for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I)
7030       SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo());
7031   }
7032   return Result;
7033 }
7034 
7035 template<typename Derived>
7036 QualType TreeTransform<Derived>::TransformPackExpansionType(TypeLocBuilder &TLB,
7037                                                       PackExpansionTypeLoc TL) {
7038   QualType Pattern
7039     = getDerived().TransformType(TLB, TL.getPatternLoc());
7040   if (Pattern.isNull())
7041     return QualType();
7042 
7043   QualType Result = TL.getType();
7044   if (getDerived().AlwaysRebuild() ||
7045       Pattern != TL.getPatternLoc().getType()) {
7046     Result = getDerived().RebuildPackExpansionType(Pattern,
7047                                            TL.getPatternLoc().getSourceRange(),
7048                                                    TL.getEllipsisLoc(),
7049                                            TL.getTypePtr()->getNumExpansions());
7050     if (Result.isNull())
7051       return QualType();
7052   }
7053 
7054   PackExpansionTypeLoc NewT = TLB.push<PackExpansionTypeLoc>(Result);
7055   NewT.setEllipsisLoc(TL.getEllipsisLoc());
7056   return Result;
7057 }
7058 
7059 template<typename Derived>
7060 QualType
7061 TreeTransform<Derived>::TransformObjCInterfaceType(TypeLocBuilder &TLB,
7062                                                    ObjCInterfaceTypeLoc TL) {
7063   // ObjCInterfaceType is never dependent.
7064   TLB.pushFullCopy(TL);
7065   return TL.getType();
7066 }
7067 
7068 template<typename Derived>
7069 QualType
7070 TreeTransform<Derived>::TransformObjCTypeParamType(TypeLocBuilder &TLB,
7071                                                    ObjCTypeParamTypeLoc TL) {
7072   const ObjCTypeParamType *T = TL.getTypePtr();
7073   ObjCTypeParamDecl *OTP = cast_or_null<ObjCTypeParamDecl>(
7074       getDerived().TransformDecl(T->getDecl()->getLocation(), T->getDecl()));
7075   if (!OTP)
7076     return QualType();
7077 
7078   QualType Result = TL.getType();
7079   if (getDerived().AlwaysRebuild() ||
7080       OTP != T->getDecl()) {
7081     Result = getDerived().RebuildObjCTypeParamType(OTP,
7082                  TL.getProtocolLAngleLoc(),
7083                  llvm::makeArrayRef(TL.getTypePtr()->qual_begin(),
7084                                     TL.getNumProtocols()),
7085                  TL.getProtocolLocs(),
7086                  TL.getProtocolRAngleLoc());
7087     if (Result.isNull())
7088       return QualType();
7089   }
7090 
7091   ObjCTypeParamTypeLoc NewTL = TLB.push<ObjCTypeParamTypeLoc>(Result);
7092   if (TL.getNumProtocols()) {
7093     NewTL.setProtocolLAngleLoc(TL.getProtocolLAngleLoc());
7094     for (unsigned i = 0, n = TL.getNumProtocols(); i != n; ++i)
7095       NewTL.setProtocolLoc(i, TL.getProtocolLoc(i));
7096     NewTL.setProtocolRAngleLoc(TL.getProtocolRAngleLoc());
7097   }
7098   return Result;
7099 }
7100 
7101 template<typename Derived>
7102 QualType
7103 TreeTransform<Derived>::TransformObjCObjectType(TypeLocBuilder &TLB,
7104                                                 ObjCObjectTypeLoc TL) {
7105   // Transform base type.
7106   QualType BaseType = getDerived().TransformType(TLB, TL.getBaseLoc());
7107   if (BaseType.isNull())
7108     return QualType();
7109 
7110   bool AnyChanged = BaseType != TL.getBaseLoc().getType();
7111 
7112   // Transform type arguments.
7113   SmallVector<TypeSourceInfo *, 4> NewTypeArgInfos;
7114   for (unsigned i = 0, n = TL.getNumTypeArgs(); i != n; ++i) {
7115     TypeSourceInfo *TypeArgInfo = TL.getTypeArgTInfo(i);
7116     TypeLoc TypeArgLoc = TypeArgInfo->getTypeLoc();
7117     QualType TypeArg = TypeArgInfo->getType();
7118     if (auto PackExpansionLoc = TypeArgLoc.getAs<PackExpansionTypeLoc>()) {
7119       AnyChanged = true;
7120 
7121       // We have a pack expansion. Instantiate it.
7122       const auto *PackExpansion = PackExpansionLoc.getType()
7123                                     ->castAs<PackExpansionType>();
7124       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
7125       SemaRef.collectUnexpandedParameterPacks(PackExpansion->getPattern(),
7126                                               Unexpanded);
7127       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
7128 
7129       // Determine whether the set of unexpanded parameter packs can
7130       // and should be expanded.
7131       TypeLoc PatternLoc = PackExpansionLoc.getPatternLoc();
7132       bool Expand = false;
7133       bool RetainExpansion = false;
7134       Optional<unsigned> NumExpansions = PackExpansion->getNumExpansions();
7135       if (getDerived().TryExpandParameterPacks(
7136             PackExpansionLoc.getEllipsisLoc(), PatternLoc.getSourceRange(),
7137             Unexpanded, Expand, RetainExpansion, NumExpansions))
7138         return QualType();
7139 
7140       if (!Expand) {
7141         // We can't expand this pack expansion into separate arguments yet;
7142         // just substitute into the pattern and create a new pack expansion
7143         // type.
7144         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
7145 
7146         TypeLocBuilder TypeArgBuilder;
7147         TypeArgBuilder.reserve(PatternLoc.getFullDataSize());
7148         QualType NewPatternType = getDerived().TransformType(TypeArgBuilder,
7149                                                              PatternLoc);
7150         if (NewPatternType.isNull())
7151           return QualType();
7152 
7153         QualType NewExpansionType = SemaRef.Context.getPackExpansionType(
7154                                       NewPatternType, NumExpansions);
7155         auto NewExpansionLoc = TLB.push<PackExpansionTypeLoc>(NewExpansionType);
7156         NewExpansionLoc.setEllipsisLoc(PackExpansionLoc.getEllipsisLoc());
7157         NewTypeArgInfos.push_back(
7158           TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewExpansionType));
7159         continue;
7160       }
7161 
7162       // Substitute into the pack expansion pattern for each slice of the
7163       // pack.
7164       for (unsigned ArgIdx = 0; ArgIdx != *NumExpansions; ++ArgIdx) {
7165         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), ArgIdx);
7166 
7167         TypeLocBuilder TypeArgBuilder;
7168         TypeArgBuilder.reserve(PatternLoc.getFullDataSize());
7169 
7170         QualType NewTypeArg = getDerived().TransformType(TypeArgBuilder,
7171                                                          PatternLoc);
7172         if (NewTypeArg.isNull())
7173           return QualType();
7174 
7175         NewTypeArgInfos.push_back(
7176           TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewTypeArg));
7177       }
7178 
7179       continue;
7180     }
7181 
7182     TypeLocBuilder TypeArgBuilder;
7183     TypeArgBuilder.reserve(TypeArgLoc.getFullDataSize());
7184     QualType NewTypeArg = getDerived().TransformType(TypeArgBuilder, TypeArgLoc);
7185     if (NewTypeArg.isNull())
7186       return QualType();
7187 
7188     // If nothing changed, just keep the old TypeSourceInfo.
7189     if (NewTypeArg == TypeArg) {
7190       NewTypeArgInfos.push_back(TypeArgInfo);
7191       continue;
7192     }
7193 
7194     NewTypeArgInfos.push_back(
7195       TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewTypeArg));
7196     AnyChanged = true;
7197   }
7198 
7199   QualType Result = TL.getType();
7200   if (getDerived().AlwaysRebuild() || AnyChanged) {
7201     // Rebuild the type.
7202     Result = getDerived().RebuildObjCObjectType(
7203         BaseType, TL.getBeginLoc(), TL.getTypeArgsLAngleLoc(), NewTypeArgInfos,
7204         TL.getTypeArgsRAngleLoc(), TL.getProtocolLAngleLoc(),
7205         llvm::makeArrayRef(TL.getTypePtr()->qual_begin(), TL.getNumProtocols()),
7206         TL.getProtocolLocs(), TL.getProtocolRAngleLoc());
7207 
7208     if (Result.isNull())
7209       return QualType();
7210   }
7211 
7212   ObjCObjectTypeLoc NewT = TLB.push<ObjCObjectTypeLoc>(Result);
7213   NewT.setHasBaseTypeAsWritten(true);
7214   NewT.setTypeArgsLAngleLoc(TL.getTypeArgsLAngleLoc());
7215   for (unsigned i = 0, n = TL.getNumTypeArgs(); i != n; ++i)
7216     NewT.setTypeArgTInfo(i, NewTypeArgInfos[i]);
7217   NewT.setTypeArgsRAngleLoc(TL.getTypeArgsRAngleLoc());
7218   NewT.setProtocolLAngleLoc(TL.getProtocolLAngleLoc());
7219   for (unsigned i = 0, n = TL.getNumProtocols(); i != n; ++i)
7220     NewT.setProtocolLoc(i, TL.getProtocolLoc(i));
7221   NewT.setProtocolRAngleLoc(TL.getProtocolRAngleLoc());
7222   return Result;
7223 }
7224 
7225 template<typename Derived>
7226 QualType
7227 TreeTransform<Derived>::TransformObjCObjectPointerType(TypeLocBuilder &TLB,
7228                                                ObjCObjectPointerTypeLoc TL) {
7229   QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
7230   if (PointeeType.isNull())
7231     return QualType();
7232 
7233   QualType Result = TL.getType();
7234   if (getDerived().AlwaysRebuild() ||
7235       PointeeType != TL.getPointeeLoc().getType()) {
7236     Result = getDerived().RebuildObjCObjectPointerType(PointeeType,
7237                                                        TL.getStarLoc());
7238     if (Result.isNull())
7239       return QualType();
7240   }
7241 
7242   ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result);
7243   NewT.setStarLoc(TL.getStarLoc());
7244   return Result;
7245 }
7246 
7247 //===----------------------------------------------------------------------===//
7248 // Statement transformation
7249 //===----------------------------------------------------------------------===//
7250 template<typename Derived>
7251 StmtResult
7252 TreeTransform<Derived>::TransformNullStmt(NullStmt *S) {
7253   return S;
7254 }
7255 
7256 template<typename Derived>
7257 StmtResult
7258 TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S) {
7259   return getDerived().TransformCompoundStmt(S, false);
7260 }
7261 
7262 template<typename Derived>
7263 StmtResult
7264 TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S,
7265                                               bool IsStmtExpr) {
7266   Sema::CompoundScopeRAII CompoundScope(getSema());
7267 
7268   const Stmt *ExprResult = S->getStmtExprResult();
7269   bool SubStmtInvalid = false;
7270   bool SubStmtChanged = false;
7271   SmallVector<Stmt*, 8> Statements;
7272   for (auto *B : S->body()) {
7273     StmtResult Result = getDerived().TransformStmt(
7274         B, IsStmtExpr && B == ExprResult ? SDK_StmtExprResult : SDK_Discarded);
7275 
7276     if (Result.isInvalid()) {
7277       // Immediately fail if this was a DeclStmt, since it's very
7278       // likely that this will cause problems for future statements.
7279       if (isa<DeclStmt>(B))
7280         return StmtError();
7281 
7282       // Otherwise, just keep processing substatements and fail later.
7283       SubStmtInvalid = true;
7284       continue;
7285     }
7286 
7287     SubStmtChanged = SubStmtChanged || Result.get() != B;
7288     Statements.push_back(Result.getAs<Stmt>());
7289   }
7290 
7291   if (SubStmtInvalid)
7292     return StmtError();
7293 
7294   if (!getDerived().AlwaysRebuild() &&
7295       !SubStmtChanged)
7296     return S;
7297 
7298   return getDerived().RebuildCompoundStmt(S->getLBracLoc(),
7299                                           Statements,
7300                                           S->getRBracLoc(),
7301                                           IsStmtExpr);
7302 }
7303 
7304 template<typename Derived>
7305 StmtResult
7306 TreeTransform<Derived>::TransformCaseStmt(CaseStmt *S) {
7307   ExprResult LHS, RHS;
7308   {
7309     EnterExpressionEvaluationContext Unevaluated(
7310         SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
7311 
7312     // Transform the left-hand case value.
7313     LHS = getDerived().TransformExpr(S->getLHS());
7314     LHS = SemaRef.ActOnCaseExpr(S->getCaseLoc(), LHS);
7315     if (LHS.isInvalid())
7316       return StmtError();
7317 
7318     // Transform the right-hand case value (for the GNU case-range extension).
7319     RHS = getDerived().TransformExpr(S->getRHS());
7320     RHS = SemaRef.ActOnCaseExpr(S->getCaseLoc(), RHS);
7321     if (RHS.isInvalid())
7322       return StmtError();
7323   }
7324 
7325   // Build the case statement.
7326   // Case statements are always rebuilt so that they will attached to their
7327   // transformed switch statement.
7328   StmtResult Case = getDerived().RebuildCaseStmt(S->getCaseLoc(),
7329                                                        LHS.get(),
7330                                                        S->getEllipsisLoc(),
7331                                                        RHS.get(),
7332                                                        S->getColonLoc());
7333   if (Case.isInvalid())
7334     return StmtError();
7335 
7336   // Transform the statement following the case
7337   StmtResult SubStmt =
7338       getDerived().TransformStmt(S->getSubStmt());
7339   if (SubStmt.isInvalid())
7340     return StmtError();
7341 
7342   // Attach the body to the case statement
7343   return getDerived().RebuildCaseStmtBody(Case.get(), SubStmt.get());
7344 }
7345 
7346 template <typename Derived>
7347 StmtResult TreeTransform<Derived>::TransformDefaultStmt(DefaultStmt *S) {
7348   // Transform the statement following the default case
7349   StmtResult SubStmt =
7350       getDerived().TransformStmt(S->getSubStmt());
7351   if (SubStmt.isInvalid())
7352     return StmtError();
7353 
7354   // Default statements are always rebuilt
7355   return getDerived().RebuildDefaultStmt(S->getDefaultLoc(), S->getColonLoc(),
7356                                          SubStmt.get());
7357 }
7358 
7359 template<typename Derived>
7360 StmtResult
7361 TreeTransform<Derived>::TransformLabelStmt(LabelStmt *S, StmtDiscardKind SDK) {
7362   StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt(), SDK);
7363   if (SubStmt.isInvalid())
7364     return StmtError();
7365 
7366   Decl *LD = getDerived().TransformDecl(S->getDecl()->getLocation(),
7367                                         S->getDecl());
7368   if (!LD)
7369     return StmtError();
7370 
7371   // If we're transforming "in-place" (we're not creating new local
7372   // declarations), assume we're replacing the old label statement
7373   // and clear out the reference to it.
7374   if (LD == S->getDecl())
7375     S->getDecl()->setStmt(nullptr);
7376 
7377   // FIXME: Pass the real colon location in.
7378   return getDerived().RebuildLabelStmt(S->getIdentLoc(),
7379                                        cast<LabelDecl>(LD), SourceLocation(),
7380                                        SubStmt.get());
7381 }
7382 
7383 template <typename Derived>
7384 const Attr *TreeTransform<Derived>::TransformAttr(const Attr *R) {
7385   if (!R)
7386     return R;
7387 
7388   switch (R->getKind()) {
7389 // Transform attributes with a pragma spelling by calling TransformXXXAttr.
7390 #define ATTR(X)
7391 #define PRAGMA_SPELLING_ATTR(X)                                                \
7392   case attr::X:                                                                \
7393     return getDerived().Transform##X##Attr(cast<X##Attr>(R));
7394 #include "clang/Basic/AttrList.inc"
7395   default:
7396     return R;
7397   }
7398 }
7399 
7400 template <typename Derived>
7401 StmtResult
7402 TreeTransform<Derived>::TransformAttributedStmt(AttributedStmt *S,
7403                                                 StmtDiscardKind SDK) {
7404   bool AttrsChanged = false;
7405   SmallVector<const Attr *, 1> Attrs;
7406 
7407   // Visit attributes and keep track if any are transformed.
7408   for (const auto *I : S->getAttrs()) {
7409     const Attr *R = getDerived().TransformAttr(I);
7410     AttrsChanged |= (I != R);
7411     if (R)
7412       Attrs.push_back(R);
7413   }
7414 
7415   StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt(), SDK);
7416   if (SubStmt.isInvalid())
7417     return StmtError();
7418 
7419   if (SubStmt.get() == S->getSubStmt() && !AttrsChanged)
7420     return S;
7421 
7422   // If transforming the attributes failed for all of the attributes in the
7423   // statement, don't make an AttributedStmt without attributes.
7424   if (Attrs.empty())
7425     return SubStmt;
7426 
7427   return getDerived().RebuildAttributedStmt(S->getAttrLoc(), Attrs,
7428                                             SubStmt.get());
7429 }
7430 
7431 template<typename Derived>
7432 StmtResult
7433 TreeTransform<Derived>::TransformIfStmt(IfStmt *S) {
7434   // Transform the initialization statement
7435   StmtResult Init = getDerived().TransformStmt(S->getInit());
7436   if (Init.isInvalid())
7437     return StmtError();
7438 
7439   Sema::ConditionResult Cond;
7440   if (!S->isConsteval()) {
7441     // Transform the condition
7442     Cond = getDerived().TransformCondition(
7443         S->getIfLoc(), S->getConditionVariable(), S->getCond(),
7444         S->isConstexpr() ? Sema::ConditionKind::ConstexprIf
7445                          : Sema::ConditionKind::Boolean);
7446     if (Cond.isInvalid())
7447       return StmtError();
7448   }
7449 
7450   // If this is a constexpr if, determine which arm we should instantiate.
7451   llvm::Optional<bool> ConstexprConditionValue;
7452   if (S->isConstexpr())
7453     ConstexprConditionValue = Cond.getKnownValue();
7454 
7455   // Transform the "then" branch.
7456   StmtResult Then;
7457   if (!ConstexprConditionValue || *ConstexprConditionValue) {
7458     Then = getDerived().TransformStmt(S->getThen());
7459     if (Then.isInvalid())
7460       return StmtError();
7461   } else {
7462     Then = new (getSema().Context) NullStmt(S->getThen()->getBeginLoc());
7463   }
7464 
7465   // Transform the "else" branch.
7466   StmtResult Else;
7467   if (!ConstexprConditionValue || !*ConstexprConditionValue) {
7468     Else = getDerived().TransformStmt(S->getElse());
7469     if (Else.isInvalid())
7470       return StmtError();
7471   }
7472 
7473   if (!getDerived().AlwaysRebuild() &&
7474       Init.get() == S->getInit() &&
7475       Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) &&
7476       Then.get() == S->getThen() &&
7477       Else.get() == S->getElse())
7478     return S;
7479 
7480   return getDerived().RebuildIfStmt(
7481       S->getIfLoc(), S->getStatementKind(), S->getLParenLoc(), Cond,
7482       S->getRParenLoc(), Init.get(), Then.get(), S->getElseLoc(), Else.get());
7483 }
7484 
7485 template<typename Derived>
7486 StmtResult
7487 TreeTransform<Derived>::TransformSwitchStmt(SwitchStmt *S) {
7488   // Transform the initialization statement
7489   StmtResult Init = getDerived().TransformStmt(S->getInit());
7490   if (Init.isInvalid())
7491     return StmtError();
7492 
7493   // Transform the condition.
7494   Sema::ConditionResult Cond = getDerived().TransformCondition(
7495       S->getSwitchLoc(), S->getConditionVariable(), S->getCond(),
7496       Sema::ConditionKind::Switch);
7497   if (Cond.isInvalid())
7498     return StmtError();
7499 
7500   // Rebuild the switch statement.
7501   StmtResult Switch =
7502       getDerived().RebuildSwitchStmtStart(S->getSwitchLoc(), S->getLParenLoc(),
7503                                           Init.get(), Cond, S->getRParenLoc());
7504   if (Switch.isInvalid())
7505     return StmtError();
7506 
7507   // Transform the body of the switch statement.
7508   StmtResult Body = getDerived().TransformStmt(S->getBody());
7509   if (Body.isInvalid())
7510     return StmtError();
7511 
7512   // Complete the switch statement.
7513   return getDerived().RebuildSwitchStmtBody(S->getSwitchLoc(), Switch.get(),
7514                                             Body.get());
7515 }
7516 
7517 template<typename Derived>
7518 StmtResult
7519 TreeTransform<Derived>::TransformWhileStmt(WhileStmt *S) {
7520   // Transform the condition
7521   Sema::ConditionResult Cond = getDerived().TransformCondition(
7522       S->getWhileLoc(), S->getConditionVariable(), S->getCond(),
7523       Sema::ConditionKind::Boolean);
7524   if (Cond.isInvalid())
7525     return StmtError();
7526 
7527   // Transform the body
7528   StmtResult Body = getDerived().TransformStmt(S->getBody());
7529   if (Body.isInvalid())
7530     return StmtError();
7531 
7532   if (!getDerived().AlwaysRebuild() &&
7533       Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) &&
7534       Body.get() == S->getBody())
7535     return Owned(S);
7536 
7537   return getDerived().RebuildWhileStmt(S->getWhileLoc(), S->getLParenLoc(),
7538                                        Cond, S->getRParenLoc(), Body.get());
7539 }
7540 
7541 template<typename Derived>
7542 StmtResult
7543 TreeTransform<Derived>::TransformDoStmt(DoStmt *S) {
7544   // Transform the body
7545   StmtResult Body = getDerived().TransformStmt(S->getBody());
7546   if (Body.isInvalid())
7547     return StmtError();
7548 
7549   // Transform the condition
7550   ExprResult Cond = getDerived().TransformExpr(S->getCond());
7551   if (Cond.isInvalid())
7552     return StmtError();
7553 
7554   if (!getDerived().AlwaysRebuild() &&
7555       Cond.get() == S->getCond() &&
7556       Body.get() == S->getBody())
7557     return S;
7558 
7559   return getDerived().RebuildDoStmt(S->getDoLoc(), Body.get(), S->getWhileLoc(),
7560                                     /*FIXME:*/S->getWhileLoc(), Cond.get(),
7561                                     S->getRParenLoc());
7562 }
7563 
7564 template<typename Derived>
7565 StmtResult
7566 TreeTransform<Derived>::TransformForStmt(ForStmt *S) {
7567   if (getSema().getLangOpts().OpenMP)
7568     getSema().startOpenMPLoop();
7569 
7570   // Transform the initialization statement
7571   StmtResult Init = getDerived().TransformStmt(S->getInit());
7572   if (Init.isInvalid())
7573     return StmtError();
7574 
7575   // In OpenMP loop region loop control variable must be captured and be
7576   // private. Perform analysis of first part (if any).
7577   if (getSema().getLangOpts().OpenMP && Init.isUsable())
7578     getSema().ActOnOpenMPLoopInitialization(S->getForLoc(), Init.get());
7579 
7580   // Transform the condition
7581   Sema::ConditionResult Cond = getDerived().TransformCondition(
7582       S->getForLoc(), S->getConditionVariable(), S->getCond(),
7583       Sema::ConditionKind::Boolean);
7584   if (Cond.isInvalid())
7585     return StmtError();
7586 
7587   // Transform the increment
7588   ExprResult Inc = getDerived().TransformExpr(S->getInc());
7589   if (Inc.isInvalid())
7590     return StmtError();
7591 
7592   Sema::FullExprArg FullInc(getSema().MakeFullDiscardedValueExpr(Inc.get()));
7593   if (S->getInc() && !FullInc.get())
7594     return StmtError();
7595 
7596   // Transform the body
7597   StmtResult Body = getDerived().TransformStmt(S->getBody());
7598   if (Body.isInvalid())
7599     return StmtError();
7600 
7601   if (!getDerived().AlwaysRebuild() &&
7602       Init.get() == S->getInit() &&
7603       Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) &&
7604       Inc.get() == S->getInc() &&
7605       Body.get() == S->getBody())
7606     return S;
7607 
7608   return getDerived().RebuildForStmt(S->getForLoc(), S->getLParenLoc(),
7609                                      Init.get(), Cond, FullInc,
7610                                      S->getRParenLoc(), Body.get());
7611 }
7612 
7613 template<typename Derived>
7614 StmtResult
7615 TreeTransform<Derived>::TransformGotoStmt(GotoStmt *S) {
7616   Decl *LD = getDerived().TransformDecl(S->getLabel()->getLocation(),
7617                                         S->getLabel());
7618   if (!LD)
7619     return StmtError();
7620 
7621   // Goto statements must always be rebuilt, to resolve the label.
7622   return getDerived().RebuildGotoStmt(S->getGotoLoc(), S->getLabelLoc(),
7623                                       cast<LabelDecl>(LD));
7624 }
7625 
7626 template<typename Derived>
7627 StmtResult
7628 TreeTransform<Derived>::TransformIndirectGotoStmt(IndirectGotoStmt *S) {
7629   ExprResult Target = getDerived().TransformExpr(S->getTarget());
7630   if (Target.isInvalid())
7631     return StmtError();
7632   Target = SemaRef.MaybeCreateExprWithCleanups(Target.get());
7633 
7634   if (!getDerived().AlwaysRebuild() &&
7635       Target.get() == S->getTarget())
7636     return S;
7637 
7638   return getDerived().RebuildIndirectGotoStmt(S->getGotoLoc(), S->getStarLoc(),
7639                                               Target.get());
7640 }
7641 
7642 template<typename Derived>
7643 StmtResult
7644 TreeTransform<Derived>::TransformContinueStmt(ContinueStmt *S) {
7645   return S;
7646 }
7647 
7648 template<typename Derived>
7649 StmtResult
7650 TreeTransform<Derived>::TransformBreakStmt(BreakStmt *S) {
7651   return S;
7652 }
7653 
7654 template<typename Derived>
7655 StmtResult
7656 TreeTransform<Derived>::TransformReturnStmt(ReturnStmt *S) {
7657   ExprResult Result = getDerived().TransformInitializer(S->getRetValue(),
7658                                                         /*NotCopyInit*/false);
7659   if (Result.isInvalid())
7660     return StmtError();
7661 
7662   // FIXME: We always rebuild the return statement because there is no way
7663   // to tell whether the return type of the function has changed.
7664   return getDerived().RebuildReturnStmt(S->getReturnLoc(), Result.get());
7665 }
7666 
7667 template<typename Derived>
7668 StmtResult
7669 TreeTransform<Derived>::TransformDeclStmt(DeclStmt *S) {
7670   bool DeclChanged = false;
7671   SmallVector<Decl *, 4> Decls;
7672   for (auto *D : S->decls()) {
7673     Decl *Transformed = getDerived().TransformDefinition(D->getLocation(), D);
7674     if (!Transformed)
7675       return StmtError();
7676 
7677     if (Transformed != D)
7678       DeclChanged = true;
7679 
7680     Decls.push_back(Transformed);
7681   }
7682 
7683   if (!getDerived().AlwaysRebuild() && !DeclChanged)
7684     return S;
7685 
7686   return getDerived().RebuildDeclStmt(Decls, S->getBeginLoc(), S->getEndLoc());
7687 }
7688 
7689 template<typename Derived>
7690 StmtResult
7691 TreeTransform<Derived>::TransformGCCAsmStmt(GCCAsmStmt *S) {
7692 
7693   SmallVector<Expr*, 8> Constraints;
7694   SmallVector<Expr*, 8> Exprs;
7695   SmallVector<IdentifierInfo *, 4> Names;
7696 
7697   ExprResult AsmString;
7698   SmallVector<Expr*, 8> Clobbers;
7699 
7700   bool ExprsChanged = false;
7701 
7702   // Go through the outputs.
7703   for (unsigned I = 0, E = S->getNumOutputs(); I != E; ++I) {
7704     Names.push_back(S->getOutputIdentifier(I));
7705 
7706     // No need to transform the constraint literal.
7707     Constraints.push_back(S->getOutputConstraintLiteral(I));
7708 
7709     // Transform the output expr.
7710     Expr *OutputExpr = S->getOutputExpr(I);
7711     ExprResult Result = getDerived().TransformExpr(OutputExpr);
7712     if (Result.isInvalid())
7713       return StmtError();
7714 
7715     ExprsChanged |= Result.get() != OutputExpr;
7716 
7717     Exprs.push_back(Result.get());
7718   }
7719 
7720   // Go through the inputs.
7721   for (unsigned I = 0, E = S->getNumInputs(); I != E; ++I) {
7722     Names.push_back(S->getInputIdentifier(I));
7723 
7724     // No need to transform the constraint literal.
7725     Constraints.push_back(S->getInputConstraintLiteral(I));
7726 
7727     // Transform the input expr.
7728     Expr *InputExpr = S->getInputExpr(I);
7729     ExprResult Result = getDerived().TransformExpr(InputExpr);
7730     if (Result.isInvalid())
7731       return StmtError();
7732 
7733     ExprsChanged |= Result.get() != InputExpr;
7734 
7735     Exprs.push_back(Result.get());
7736   }
7737 
7738   // Go through the Labels.
7739   for (unsigned I = 0, E = S->getNumLabels(); I != E; ++I) {
7740     Names.push_back(S->getLabelIdentifier(I));
7741 
7742     ExprResult Result = getDerived().TransformExpr(S->getLabelExpr(I));
7743     if (Result.isInvalid())
7744       return StmtError();
7745     ExprsChanged |= Result.get() != S->getLabelExpr(I);
7746     Exprs.push_back(Result.get());
7747   }
7748   if (!getDerived().AlwaysRebuild() && !ExprsChanged)
7749     return S;
7750 
7751   // Go through the clobbers.
7752   for (unsigned I = 0, E = S->getNumClobbers(); I != E; ++I)
7753     Clobbers.push_back(S->getClobberStringLiteral(I));
7754 
7755   // No need to transform the asm string literal.
7756   AsmString = S->getAsmString();
7757   return getDerived().RebuildGCCAsmStmt(S->getAsmLoc(), S->isSimple(),
7758                                         S->isVolatile(), S->getNumOutputs(),
7759                                         S->getNumInputs(), Names.data(),
7760                                         Constraints, Exprs, AsmString.get(),
7761                                         Clobbers, S->getNumLabels(),
7762                                         S->getRParenLoc());
7763 }
7764 
7765 template<typename Derived>
7766 StmtResult
7767 TreeTransform<Derived>::TransformMSAsmStmt(MSAsmStmt *S) {
7768   ArrayRef<Token> AsmToks =
7769     llvm::makeArrayRef(S->getAsmToks(), S->getNumAsmToks());
7770 
7771   bool HadError = false, HadChange = false;
7772 
7773   ArrayRef<Expr*> SrcExprs = S->getAllExprs();
7774   SmallVector<Expr*, 8> TransformedExprs;
7775   TransformedExprs.reserve(SrcExprs.size());
7776   for (unsigned i = 0, e = SrcExprs.size(); i != e; ++i) {
7777     ExprResult Result = getDerived().TransformExpr(SrcExprs[i]);
7778     if (!Result.isUsable()) {
7779       HadError = true;
7780     } else {
7781       HadChange |= (Result.get() != SrcExprs[i]);
7782       TransformedExprs.push_back(Result.get());
7783     }
7784   }
7785 
7786   if (HadError) return StmtError();
7787   if (!HadChange && !getDerived().AlwaysRebuild())
7788     return Owned(S);
7789 
7790   return getDerived().RebuildMSAsmStmt(S->getAsmLoc(), S->getLBraceLoc(),
7791                                        AsmToks, S->getAsmString(),
7792                                        S->getNumOutputs(), S->getNumInputs(),
7793                                        S->getAllConstraints(), S->getClobbers(),
7794                                        TransformedExprs, S->getEndLoc());
7795 }
7796 
7797 // C++ Coroutines TS
7798 
7799 template<typename Derived>
7800 StmtResult
7801 TreeTransform<Derived>::TransformCoroutineBodyStmt(CoroutineBodyStmt *S) {
7802   auto *ScopeInfo = SemaRef.getCurFunction();
7803   auto *FD = cast<FunctionDecl>(SemaRef.CurContext);
7804   assert(FD && ScopeInfo && !ScopeInfo->CoroutinePromise &&
7805          ScopeInfo->NeedsCoroutineSuspends &&
7806          ScopeInfo->CoroutineSuspends.first == nullptr &&
7807          ScopeInfo->CoroutineSuspends.second == nullptr &&
7808          "expected clean scope info");
7809 
7810   // Set that we have (possibly-invalid) suspend points before we do anything
7811   // that may fail.
7812   ScopeInfo->setNeedsCoroutineSuspends(false);
7813 
7814   // We re-build the coroutine promise object (and the coroutine parameters its
7815   // type and constructor depend on) based on the types used in our current
7816   // function. We must do so, and set it on the current FunctionScopeInfo,
7817   // before attempting to transform the other parts of the coroutine body
7818   // statement, such as the implicit suspend statements (because those
7819   // statements reference the FunctionScopeInfo::CoroutinePromise).
7820   if (!SemaRef.buildCoroutineParameterMoves(FD->getLocation()))
7821     return StmtError();
7822   auto *Promise = SemaRef.buildCoroutinePromise(FD->getLocation());
7823   if (!Promise)
7824     return StmtError();
7825   getDerived().transformedLocalDecl(S->getPromiseDecl(), {Promise});
7826   ScopeInfo->CoroutinePromise = Promise;
7827 
7828   // Transform the implicit coroutine statements constructed using dependent
7829   // types during the previous parse: initial and final suspensions, the return
7830   // object, and others. We also transform the coroutine function's body.
7831   StmtResult InitSuspend = getDerived().TransformStmt(S->getInitSuspendStmt());
7832   if (InitSuspend.isInvalid())
7833     return StmtError();
7834   StmtResult FinalSuspend =
7835       getDerived().TransformStmt(S->getFinalSuspendStmt());
7836   if (FinalSuspend.isInvalid() ||
7837       !SemaRef.checkFinalSuspendNoThrow(FinalSuspend.get()))
7838     return StmtError();
7839   ScopeInfo->setCoroutineSuspends(InitSuspend.get(), FinalSuspend.get());
7840   assert(isa<Expr>(InitSuspend.get()) && isa<Expr>(FinalSuspend.get()));
7841 
7842   StmtResult BodyRes = getDerived().TransformStmt(S->getBody());
7843   if (BodyRes.isInvalid())
7844     return StmtError();
7845 
7846   CoroutineStmtBuilder Builder(SemaRef, *FD, *ScopeInfo, BodyRes.get());
7847   if (Builder.isInvalid())
7848     return StmtError();
7849 
7850   Expr *ReturnObject = S->getReturnValueInit();
7851   assert(ReturnObject && "the return object is expected to be valid");
7852   ExprResult Res = getDerived().TransformInitializer(ReturnObject,
7853                                                      /*NoCopyInit*/ false);
7854   if (Res.isInvalid())
7855     return StmtError();
7856   Builder.ReturnValue = Res.get();
7857 
7858   // If during the previous parse the coroutine still had a dependent promise
7859   // statement, we may need to build some implicit coroutine statements
7860   // (such as exception and fallthrough handlers) for the first time.
7861   if (S->hasDependentPromiseType()) {
7862     // We can only build these statements, however, if the current promise type
7863     // is not dependent.
7864     if (!Promise->getType()->isDependentType()) {
7865       assert(!S->getFallthroughHandler() && !S->getExceptionHandler() &&
7866              !S->getReturnStmtOnAllocFailure() && !S->getDeallocate() &&
7867              "these nodes should not have been built yet");
7868       if (!Builder.buildDependentStatements())
7869         return StmtError();
7870     }
7871   } else {
7872     if (auto *OnFallthrough = S->getFallthroughHandler()) {
7873       StmtResult Res = getDerived().TransformStmt(OnFallthrough);
7874       if (Res.isInvalid())
7875         return StmtError();
7876       Builder.OnFallthrough = Res.get();
7877     }
7878 
7879     if (auto *OnException = S->getExceptionHandler()) {
7880       StmtResult Res = getDerived().TransformStmt(OnException);
7881       if (Res.isInvalid())
7882         return StmtError();
7883       Builder.OnException = Res.get();
7884     }
7885 
7886     if (auto *OnAllocFailure = S->getReturnStmtOnAllocFailure()) {
7887       StmtResult Res = getDerived().TransformStmt(OnAllocFailure);
7888       if (Res.isInvalid())
7889         return StmtError();
7890       Builder.ReturnStmtOnAllocFailure = Res.get();
7891     }
7892 
7893     // Transform any additional statements we may have already built
7894     assert(S->getAllocate() && S->getDeallocate() &&
7895            "allocation and deallocation calls must already be built");
7896     ExprResult AllocRes = getDerived().TransformExpr(S->getAllocate());
7897     if (AllocRes.isInvalid())
7898       return StmtError();
7899     Builder.Allocate = AllocRes.get();
7900 
7901     ExprResult DeallocRes = getDerived().TransformExpr(S->getDeallocate());
7902     if (DeallocRes.isInvalid())
7903       return StmtError();
7904     Builder.Deallocate = DeallocRes.get();
7905 
7906     assert(S->getResultDecl() && "ResultDecl must already be built");
7907     StmtResult ResultDecl = getDerived().TransformStmt(S->getResultDecl());
7908     if (ResultDecl.isInvalid())
7909       return StmtError();
7910     Builder.ResultDecl = ResultDecl.get();
7911 
7912     if (auto *ReturnStmt = S->getReturnStmt()) {
7913       StmtResult Res = getDerived().TransformStmt(ReturnStmt);
7914       if (Res.isInvalid())
7915         return StmtError();
7916       Builder.ReturnStmt = Res.get();
7917     }
7918   }
7919 
7920   return getDerived().RebuildCoroutineBodyStmt(Builder);
7921 }
7922 
7923 template<typename Derived>
7924 StmtResult
7925 TreeTransform<Derived>::TransformCoreturnStmt(CoreturnStmt *S) {
7926   ExprResult Result = getDerived().TransformInitializer(S->getOperand(),
7927                                                         /*NotCopyInit*/false);
7928   if (Result.isInvalid())
7929     return StmtError();
7930 
7931   // Always rebuild; we don't know if this needs to be injected into a new
7932   // context or if the promise type has changed.
7933   return getDerived().RebuildCoreturnStmt(S->getKeywordLoc(), Result.get(),
7934                                           S->isImplicit());
7935 }
7936 
7937 template<typename Derived>
7938 ExprResult
7939 TreeTransform<Derived>::TransformCoawaitExpr(CoawaitExpr *E) {
7940   ExprResult Result = getDerived().TransformInitializer(E->getOperand(),
7941                                                         /*NotCopyInit*/false);
7942   if (Result.isInvalid())
7943     return ExprError();
7944 
7945   // Always rebuild; we don't know if this needs to be injected into a new
7946   // context or if the promise type has changed.
7947   return getDerived().RebuildCoawaitExpr(E->getKeywordLoc(), Result.get(),
7948                                          E->isImplicit());
7949 }
7950 
7951 template <typename Derived>
7952 ExprResult
7953 TreeTransform<Derived>::TransformDependentCoawaitExpr(DependentCoawaitExpr *E) {
7954   ExprResult OperandResult = getDerived().TransformInitializer(E->getOperand(),
7955                                                         /*NotCopyInit*/ false);
7956   if (OperandResult.isInvalid())
7957     return ExprError();
7958 
7959   ExprResult LookupResult = getDerived().TransformUnresolvedLookupExpr(
7960           E->getOperatorCoawaitLookup());
7961 
7962   if (LookupResult.isInvalid())
7963     return ExprError();
7964 
7965   // Always rebuild; we don't know if this needs to be injected into a new
7966   // context or if the promise type has changed.
7967   return getDerived().RebuildDependentCoawaitExpr(
7968       E->getKeywordLoc(), OperandResult.get(),
7969       cast<UnresolvedLookupExpr>(LookupResult.get()));
7970 }
7971 
7972 template<typename Derived>
7973 ExprResult
7974 TreeTransform<Derived>::TransformCoyieldExpr(CoyieldExpr *E) {
7975   ExprResult Result = getDerived().TransformInitializer(E->getOperand(),
7976                                                         /*NotCopyInit*/false);
7977   if (Result.isInvalid())
7978     return ExprError();
7979 
7980   // Always rebuild; we don't know if this needs to be injected into a new
7981   // context or if the promise type has changed.
7982   return getDerived().RebuildCoyieldExpr(E->getKeywordLoc(), Result.get());
7983 }
7984 
7985 // Objective-C Statements.
7986 
7987 template<typename Derived>
7988 StmtResult
7989 TreeTransform<Derived>::TransformObjCAtTryStmt(ObjCAtTryStmt *S) {
7990   // Transform the body of the @try.
7991   StmtResult TryBody = getDerived().TransformStmt(S->getTryBody());
7992   if (TryBody.isInvalid())
7993     return StmtError();
7994 
7995   // Transform the @catch statements (if present).
7996   bool AnyCatchChanged = false;
7997   SmallVector<Stmt*, 8> CatchStmts;
7998   for (unsigned I = 0, N = S->getNumCatchStmts(); I != N; ++I) {
7999     StmtResult Catch = getDerived().TransformStmt(S->getCatchStmt(I));
8000     if (Catch.isInvalid())
8001       return StmtError();
8002     if (Catch.get() != S->getCatchStmt(I))
8003       AnyCatchChanged = true;
8004     CatchStmts.push_back(Catch.get());
8005   }
8006 
8007   // Transform the @finally statement (if present).
8008   StmtResult Finally;
8009   if (S->getFinallyStmt()) {
8010     Finally = getDerived().TransformStmt(S->getFinallyStmt());
8011     if (Finally.isInvalid())
8012       return StmtError();
8013   }
8014 
8015   // If nothing changed, just retain this statement.
8016   if (!getDerived().AlwaysRebuild() &&
8017       TryBody.get() == S->getTryBody() &&
8018       !AnyCatchChanged &&
8019       Finally.get() == S->getFinallyStmt())
8020     return S;
8021 
8022   // Build a new statement.
8023   return getDerived().RebuildObjCAtTryStmt(S->getAtTryLoc(), TryBody.get(),
8024                                            CatchStmts, Finally.get());
8025 }
8026 
8027 template<typename Derived>
8028 StmtResult
8029 TreeTransform<Derived>::TransformObjCAtCatchStmt(ObjCAtCatchStmt *S) {
8030   // Transform the @catch parameter, if there is one.
8031   VarDecl *Var = nullptr;
8032   if (VarDecl *FromVar = S->getCatchParamDecl()) {
8033     TypeSourceInfo *TSInfo = nullptr;
8034     if (FromVar->getTypeSourceInfo()) {
8035       TSInfo = getDerived().TransformType(FromVar->getTypeSourceInfo());
8036       if (!TSInfo)
8037         return StmtError();
8038     }
8039 
8040     QualType T;
8041     if (TSInfo)
8042       T = TSInfo->getType();
8043     else {
8044       T = getDerived().TransformType(FromVar->getType());
8045       if (T.isNull())
8046         return StmtError();
8047     }
8048 
8049     Var = getDerived().RebuildObjCExceptionDecl(FromVar, TSInfo, T);
8050     if (!Var)
8051       return StmtError();
8052   }
8053 
8054   StmtResult Body = getDerived().TransformStmt(S->getCatchBody());
8055   if (Body.isInvalid())
8056     return StmtError();
8057 
8058   return getDerived().RebuildObjCAtCatchStmt(S->getAtCatchLoc(),
8059                                              S->getRParenLoc(),
8060                                              Var, Body.get());
8061 }
8062 
8063 template<typename Derived>
8064 StmtResult
8065 TreeTransform<Derived>::TransformObjCAtFinallyStmt(ObjCAtFinallyStmt *S) {
8066   // Transform the body.
8067   StmtResult Body = getDerived().TransformStmt(S->getFinallyBody());
8068   if (Body.isInvalid())
8069     return StmtError();
8070 
8071   // If nothing changed, just retain this statement.
8072   if (!getDerived().AlwaysRebuild() &&
8073       Body.get() == S->getFinallyBody())
8074     return S;
8075 
8076   // Build a new statement.
8077   return getDerived().RebuildObjCAtFinallyStmt(S->getAtFinallyLoc(),
8078                                                Body.get());
8079 }
8080 
8081 template<typename Derived>
8082 StmtResult
8083 TreeTransform<Derived>::TransformObjCAtThrowStmt(ObjCAtThrowStmt *S) {
8084   ExprResult Operand;
8085   if (S->getThrowExpr()) {
8086     Operand = getDerived().TransformExpr(S->getThrowExpr());
8087     if (Operand.isInvalid())
8088       return StmtError();
8089   }
8090 
8091   if (!getDerived().AlwaysRebuild() &&
8092       Operand.get() == S->getThrowExpr())
8093     return S;
8094 
8095   return getDerived().RebuildObjCAtThrowStmt(S->getThrowLoc(), Operand.get());
8096 }
8097 
8098 template<typename Derived>
8099 StmtResult
8100 TreeTransform<Derived>::TransformObjCAtSynchronizedStmt(
8101                                                   ObjCAtSynchronizedStmt *S) {
8102   // Transform the object we are locking.
8103   ExprResult Object = getDerived().TransformExpr(S->getSynchExpr());
8104   if (Object.isInvalid())
8105     return StmtError();
8106   Object =
8107     getDerived().RebuildObjCAtSynchronizedOperand(S->getAtSynchronizedLoc(),
8108                                                   Object.get());
8109   if (Object.isInvalid())
8110     return StmtError();
8111 
8112   // Transform the body.
8113   StmtResult Body = getDerived().TransformStmt(S->getSynchBody());
8114   if (Body.isInvalid())
8115     return StmtError();
8116 
8117   // If nothing change, just retain the current statement.
8118   if (!getDerived().AlwaysRebuild() &&
8119       Object.get() == S->getSynchExpr() &&
8120       Body.get() == S->getSynchBody())
8121     return S;
8122 
8123   // Build a new statement.
8124   return getDerived().RebuildObjCAtSynchronizedStmt(S->getAtSynchronizedLoc(),
8125                                                     Object.get(), Body.get());
8126 }
8127 
8128 template<typename Derived>
8129 StmtResult
8130 TreeTransform<Derived>::TransformObjCAutoreleasePoolStmt(
8131                                               ObjCAutoreleasePoolStmt *S) {
8132   // Transform the body.
8133   StmtResult Body = getDerived().TransformStmt(S->getSubStmt());
8134   if (Body.isInvalid())
8135     return StmtError();
8136 
8137   // If nothing changed, just retain this statement.
8138   if (!getDerived().AlwaysRebuild() &&
8139       Body.get() == S->getSubStmt())
8140     return S;
8141 
8142   // Build a new statement.
8143   return getDerived().RebuildObjCAutoreleasePoolStmt(
8144                         S->getAtLoc(), Body.get());
8145 }
8146 
8147 template<typename Derived>
8148 StmtResult
8149 TreeTransform<Derived>::TransformObjCForCollectionStmt(
8150                                                   ObjCForCollectionStmt *S) {
8151   // Transform the element statement.
8152   StmtResult Element =
8153       getDerived().TransformStmt(S->getElement(), SDK_NotDiscarded);
8154   if (Element.isInvalid())
8155     return StmtError();
8156 
8157   // Transform the collection expression.
8158   ExprResult Collection = getDerived().TransformExpr(S->getCollection());
8159   if (Collection.isInvalid())
8160     return StmtError();
8161 
8162   // Transform the body.
8163   StmtResult Body = getDerived().TransformStmt(S->getBody());
8164   if (Body.isInvalid())
8165     return StmtError();
8166 
8167   // If nothing changed, just retain this statement.
8168   if (!getDerived().AlwaysRebuild() &&
8169       Element.get() == S->getElement() &&
8170       Collection.get() == S->getCollection() &&
8171       Body.get() == S->getBody())
8172     return S;
8173 
8174   // Build a new statement.
8175   return getDerived().RebuildObjCForCollectionStmt(S->getForLoc(),
8176                                                    Element.get(),
8177                                                    Collection.get(),
8178                                                    S->getRParenLoc(),
8179                                                    Body.get());
8180 }
8181 
8182 template <typename Derived>
8183 StmtResult TreeTransform<Derived>::TransformCXXCatchStmt(CXXCatchStmt *S) {
8184   // Transform the exception declaration, if any.
8185   VarDecl *Var = nullptr;
8186   if (VarDecl *ExceptionDecl = S->getExceptionDecl()) {
8187     TypeSourceInfo *T =
8188         getDerived().TransformType(ExceptionDecl->getTypeSourceInfo());
8189     if (!T)
8190       return StmtError();
8191 
8192     Var = getDerived().RebuildExceptionDecl(
8193         ExceptionDecl, T, ExceptionDecl->getInnerLocStart(),
8194         ExceptionDecl->getLocation(), ExceptionDecl->getIdentifier());
8195     if (!Var || Var->isInvalidDecl())
8196       return StmtError();
8197   }
8198 
8199   // Transform the actual exception handler.
8200   StmtResult Handler = getDerived().TransformStmt(S->getHandlerBlock());
8201   if (Handler.isInvalid())
8202     return StmtError();
8203 
8204   if (!getDerived().AlwaysRebuild() && !Var &&
8205       Handler.get() == S->getHandlerBlock())
8206     return S;
8207 
8208   return getDerived().RebuildCXXCatchStmt(S->getCatchLoc(), Var, Handler.get());
8209 }
8210 
8211 template <typename Derived>
8212 StmtResult TreeTransform<Derived>::TransformCXXTryStmt(CXXTryStmt *S) {
8213   // Transform the try block itself.
8214   StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock());
8215   if (TryBlock.isInvalid())
8216     return StmtError();
8217 
8218   // Transform the handlers.
8219   bool HandlerChanged = false;
8220   SmallVector<Stmt *, 8> Handlers;
8221   for (unsigned I = 0, N = S->getNumHandlers(); I != N; ++I) {
8222     StmtResult Handler = getDerived().TransformCXXCatchStmt(S->getHandler(I));
8223     if (Handler.isInvalid())
8224       return StmtError();
8225 
8226     HandlerChanged = HandlerChanged || Handler.get() != S->getHandler(I);
8227     Handlers.push_back(Handler.getAs<Stmt>());
8228   }
8229 
8230   if (!getDerived().AlwaysRebuild() && TryBlock.get() == S->getTryBlock() &&
8231       !HandlerChanged)
8232     return S;
8233 
8234   return getDerived().RebuildCXXTryStmt(S->getTryLoc(), TryBlock.get(),
8235                                         Handlers);
8236 }
8237 
8238 template<typename Derived>
8239 StmtResult
8240 TreeTransform<Derived>::TransformCXXForRangeStmt(CXXForRangeStmt *S) {
8241   StmtResult Init =
8242       S->getInit() ? getDerived().TransformStmt(S->getInit()) : StmtResult();
8243   if (Init.isInvalid())
8244     return StmtError();
8245 
8246   StmtResult Range = getDerived().TransformStmt(S->getRangeStmt());
8247   if (Range.isInvalid())
8248     return StmtError();
8249 
8250   StmtResult Begin = getDerived().TransformStmt(S->getBeginStmt());
8251   if (Begin.isInvalid())
8252     return StmtError();
8253   StmtResult End = getDerived().TransformStmt(S->getEndStmt());
8254   if (End.isInvalid())
8255     return StmtError();
8256 
8257   ExprResult Cond = getDerived().TransformExpr(S->getCond());
8258   if (Cond.isInvalid())
8259     return StmtError();
8260   if (Cond.get())
8261     Cond = SemaRef.CheckBooleanCondition(S->getColonLoc(), Cond.get());
8262   if (Cond.isInvalid())
8263     return StmtError();
8264   if (Cond.get())
8265     Cond = SemaRef.MaybeCreateExprWithCleanups(Cond.get());
8266 
8267   ExprResult Inc = getDerived().TransformExpr(S->getInc());
8268   if (Inc.isInvalid())
8269     return StmtError();
8270   if (Inc.get())
8271     Inc = SemaRef.MaybeCreateExprWithCleanups(Inc.get());
8272 
8273   StmtResult LoopVar = getDerived().TransformStmt(S->getLoopVarStmt());
8274   if (LoopVar.isInvalid())
8275     return StmtError();
8276 
8277   StmtResult NewStmt = S;
8278   if (getDerived().AlwaysRebuild() ||
8279       Init.get() != S->getInit() ||
8280       Range.get() != S->getRangeStmt() ||
8281       Begin.get() != S->getBeginStmt() ||
8282       End.get() != S->getEndStmt() ||
8283       Cond.get() != S->getCond() ||
8284       Inc.get() != S->getInc() ||
8285       LoopVar.get() != S->getLoopVarStmt()) {
8286     NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(),
8287                                                   S->getCoawaitLoc(), Init.get(),
8288                                                   S->getColonLoc(), Range.get(),
8289                                                   Begin.get(), End.get(),
8290                                                   Cond.get(),
8291                                                   Inc.get(), LoopVar.get(),
8292                                                   S->getRParenLoc());
8293     if (NewStmt.isInvalid() && LoopVar.get() != S->getLoopVarStmt()) {
8294       // Might not have attached any initializer to the loop variable.
8295       getSema().ActOnInitializerError(
8296           cast<DeclStmt>(LoopVar.get())->getSingleDecl());
8297       return StmtError();
8298     }
8299   }
8300 
8301   StmtResult Body = getDerived().TransformStmt(S->getBody());
8302   if (Body.isInvalid())
8303     return StmtError();
8304 
8305   // Body has changed but we didn't rebuild the for-range statement. Rebuild
8306   // it now so we have a new statement to attach the body to.
8307   if (Body.get() != S->getBody() && NewStmt.get() == S) {
8308     NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(),
8309                                                   S->getCoawaitLoc(), Init.get(),
8310                                                   S->getColonLoc(), Range.get(),
8311                                                   Begin.get(), End.get(),
8312                                                   Cond.get(),
8313                                                   Inc.get(), LoopVar.get(),
8314                                                   S->getRParenLoc());
8315     if (NewStmt.isInvalid())
8316       return StmtError();
8317   }
8318 
8319   if (NewStmt.get() == S)
8320     return S;
8321 
8322   return FinishCXXForRangeStmt(NewStmt.get(), Body.get());
8323 }
8324 
8325 template<typename Derived>
8326 StmtResult
8327 TreeTransform<Derived>::TransformMSDependentExistsStmt(
8328                                                     MSDependentExistsStmt *S) {
8329   // Transform the nested-name-specifier, if any.
8330   NestedNameSpecifierLoc QualifierLoc;
8331   if (S->getQualifierLoc()) {
8332     QualifierLoc
8333       = getDerived().TransformNestedNameSpecifierLoc(S->getQualifierLoc());
8334     if (!QualifierLoc)
8335       return StmtError();
8336   }
8337 
8338   // Transform the declaration name.
8339   DeclarationNameInfo NameInfo = S->getNameInfo();
8340   if (NameInfo.getName()) {
8341     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
8342     if (!NameInfo.getName())
8343       return StmtError();
8344   }
8345 
8346   // Check whether anything changed.
8347   if (!getDerived().AlwaysRebuild() &&
8348       QualifierLoc == S->getQualifierLoc() &&
8349       NameInfo.getName() == S->getNameInfo().getName())
8350     return S;
8351 
8352   // Determine whether this name exists, if we can.
8353   CXXScopeSpec SS;
8354   SS.Adopt(QualifierLoc);
8355   bool Dependent = false;
8356   switch (getSema().CheckMicrosoftIfExistsSymbol(/*S=*/nullptr, SS, NameInfo)) {
8357   case Sema::IER_Exists:
8358     if (S->isIfExists())
8359       break;
8360 
8361     return new (getSema().Context) NullStmt(S->getKeywordLoc());
8362 
8363   case Sema::IER_DoesNotExist:
8364     if (S->isIfNotExists())
8365       break;
8366 
8367     return new (getSema().Context) NullStmt(S->getKeywordLoc());
8368 
8369   case Sema::IER_Dependent:
8370     Dependent = true;
8371     break;
8372 
8373   case Sema::IER_Error:
8374     return StmtError();
8375   }
8376 
8377   // We need to continue with the instantiation, so do so now.
8378   StmtResult SubStmt = getDerived().TransformCompoundStmt(S->getSubStmt());
8379   if (SubStmt.isInvalid())
8380     return StmtError();
8381 
8382   // If we have resolved the name, just transform to the substatement.
8383   if (!Dependent)
8384     return SubStmt;
8385 
8386   // The name is still dependent, so build a dependent expression again.
8387   return getDerived().RebuildMSDependentExistsStmt(S->getKeywordLoc(),
8388                                                    S->isIfExists(),
8389                                                    QualifierLoc,
8390                                                    NameInfo,
8391                                                    SubStmt.get());
8392 }
8393 
8394 template<typename Derived>
8395 ExprResult
8396 TreeTransform<Derived>::TransformMSPropertyRefExpr(MSPropertyRefExpr *E) {
8397   NestedNameSpecifierLoc QualifierLoc;
8398   if (E->getQualifierLoc()) {
8399     QualifierLoc
8400     = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
8401     if (!QualifierLoc)
8402       return ExprError();
8403   }
8404 
8405   MSPropertyDecl *PD = cast_or_null<MSPropertyDecl>(
8406     getDerived().TransformDecl(E->getMemberLoc(), E->getPropertyDecl()));
8407   if (!PD)
8408     return ExprError();
8409 
8410   ExprResult Base = getDerived().TransformExpr(E->getBaseExpr());
8411   if (Base.isInvalid())
8412     return ExprError();
8413 
8414   return new (SemaRef.getASTContext())
8415       MSPropertyRefExpr(Base.get(), PD, E->isArrow(),
8416                         SemaRef.getASTContext().PseudoObjectTy, VK_LValue,
8417                         QualifierLoc, E->getMemberLoc());
8418 }
8419 
8420 template <typename Derived>
8421 ExprResult TreeTransform<Derived>::TransformMSPropertySubscriptExpr(
8422     MSPropertySubscriptExpr *E) {
8423   auto BaseRes = getDerived().TransformExpr(E->getBase());
8424   if (BaseRes.isInvalid())
8425     return ExprError();
8426   auto IdxRes = getDerived().TransformExpr(E->getIdx());
8427   if (IdxRes.isInvalid())
8428     return ExprError();
8429 
8430   if (!getDerived().AlwaysRebuild() &&
8431       BaseRes.get() == E->getBase() &&
8432       IdxRes.get() == E->getIdx())
8433     return E;
8434 
8435   return getDerived().RebuildArraySubscriptExpr(
8436       BaseRes.get(), SourceLocation(), IdxRes.get(), E->getRBracketLoc());
8437 }
8438 
8439 template <typename Derived>
8440 StmtResult TreeTransform<Derived>::TransformSEHTryStmt(SEHTryStmt *S) {
8441   StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock());
8442   if (TryBlock.isInvalid())
8443     return StmtError();
8444 
8445   StmtResult Handler = getDerived().TransformSEHHandler(S->getHandler());
8446   if (Handler.isInvalid())
8447     return StmtError();
8448 
8449   if (!getDerived().AlwaysRebuild() && TryBlock.get() == S->getTryBlock() &&
8450       Handler.get() == S->getHandler())
8451     return S;
8452 
8453   return getDerived().RebuildSEHTryStmt(S->getIsCXXTry(), S->getTryLoc(),
8454                                         TryBlock.get(), Handler.get());
8455 }
8456 
8457 template <typename Derived>
8458 StmtResult TreeTransform<Derived>::TransformSEHFinallyStmt(SEHFinallyStmt *S) {
8459   StmtResult Block = getDerived().TransformCompoundStmt(S->getBlock());
8460   if (Block.isInvalid())
8461     return StmtError();
8462 
8463   return getDerived().RebuildSEHFinallyStmt(S->getFinallyLoc(), Block.get());
8464 }
8465 
8466 template <typename Derived>
8467 StmtResult TreeTransform<Derived>::TransformSEHExceptStmt(SEHExceptStmt *S) {
8468   ExprResult FilterExpr = getDerived().TransformExpr(S->getFilterExpr());
8469   if (FilterExpr.isInvalid())
8470     return StmtError();
8471 
8472   StmtResult Block = getDerived().TransformCompoundStmt(S->getBlock());
8473   if (Block.isInvalid())
8474     return StmtError();
8475 
8476   return getDerived().RebuildSEHExceptStmt(S->getExceptLoc(), FilterExpr.get(),
8477                                            Block.get());
8478 }
8479 
8480 template <typename Derived>
8481 StmtResult TreeTransform<Derived>::TransformSEHHandler(Stmt *Handler) {
8482   if (isa<SEHFinallyStmt>(Handler))
8483     return getDerived().TransformSEHFinallyStmt(cast<SEHFinallyStmt>(Handler));
8484   else
8485     return getDerived().TransformSEHExceptStmt(cast<SEHExceptStmt>(Handler));
8486 }
8487 
8488 template<typename Derived>
8489 StmtResult
8490 TreeTransform<Derived>::TransformSEHLeaveStmt(SEHLeaveStmt *S) {
8491   return S;
8492 }
8493 
8494 //===----------------------------------------------------------------------===//
8495 // OpenMP directive transformation
8496 //===----------------------------------------------------------------------===//
8497 
8498 template <typename Derived>
8499 StmtResult
8500 TreeTransform<Derived>::TransformOMPCanonicalLoop(OMPCanonicalLoop *L) {
8501   // OMPCanonicalLoops are eliminated during transformation, since they will be
8502   // recomputed by semantic analysis of the associated OMPLoopBasedDirective
8503   // after transformation.
8504   return getDerived().TransformStmt(L->getLoopStmt());
8505 }
8506 
8507 template <typename Derived>
8508 StmtResult TreeTransform<Derived>::TransformOMPExecutableDirective(
8509     OMPExecutableDirective *D) {
8510 
8511   // Transform the clauses
8512   llvm::SmallVector<OMPClause *, 16> TClauses;
8513   ArrayRef<OMPClause *> Clauses = D->clauses();
8514   TClauses.reserve(Clauses.size());
8515   for (ArrayRef<OMPClause *>::iterator I = Clauses.begin(), E = Clauses.end();
8516        I != E; ++I) {
8517     if (*I) {
8518       getDerived().getSema().StartOpenMPClause((*I)->getClauseKind());
8519       OMPClause *Clause = getDerived().TransformOMPClause(*I);
8520       getDerived().getSema().EndOpenMPClause();
8521       if (Clause)
8522         TClauses.push_back(Clause);
8523     } else {
8524       TClauses.push_back(nullptr);
8525     }
8526   }
8527   StmtResult AssociatedStmt;
8528   if (D->hasAssociatedStmt() && D->getAssociatedStmt()) {
8529     getDerived().getSema().ActOnOpenMPRegionStart(D->getDirectiveKind(),
8530                                                   /*CurScope=*/nullptr);
8531     StmtResult Body;
8532     {
8533       Sema::CompoundScopeRAII CompoundScope(getSema());
8534       Stmt *CS;
8535       if (D->getDirectiveKind() == OMPD_atomic ||
8536           D->getDirectiveKind() == OMPD_critical ||
8537           D->getDirectiveKind() == OMPD_section ||
8538           D->getDirectiveKind() == OMPD_master)
8539         CS = D->getAssociatedStmt();
8540       else
8541         CS = D->getRawStmt();
8542       Body = getDerived().TransformStmt(CS);
8543       if (Body.isUsable() && isOpenMPLoopDirective(D->getDirectiveKind()) &&
8544           getSema().getLangOpts().OpenMPIRBuilder)
8545         Body = getDerived().RebuildOMPCanonicalLoop(Body.get());
8546     }
8547     AssociatedStmt =
8548         getDerived().getSema().ActOnOpenMPRegionEnd(Body, TClauses);
8549     if (AssociatedStmt.isInvalid()) {
8550       return StmtError();
8551     }
8552   }
8553   if (TClauses.size() != Clauses.size()) {
8554     return StmtError();
8555   }
8556 
8557   // Transform directive name for 'omp critical' directive.
8558   DeclarationNameInfo DirName;
8559   if (D->getDirectiveKind() == OMPD_critical) {
8560     DirName = cast<OMPCriticalDirective>(D)->getDirectiveName();
8561     DirName = getDerived().TransformDeclarationNameInfo(DirName);
8562   }
8563   OpenMPDirectiveKind CancelRegion = OMPD_unknown;
8564   if (D->getDirectiveKind() == OMPD_cancellation_point) {
8565     CancelRegion = cast<OMPCancellationPointDirective>(D)->getCancelRegion();
8566   } else if (D->getDirectiveKind() == OMPD_cancel) {
8567     CancelRegion = cast<OMPCancelDirective>(D)->getCancelRegion();
8568   }
8569 
8570   return getDerived().RebuildOMPExecutableDirective(
8571       D->getDirectiveKind(), DirName, CancelRegion, TClauses,
8572       AssociatedStmt.get(), D->getBeginLoc(), D->getEndLoc());
8573 }
8574 
8575 template <typename Derived>
8576 StmtResult
8577 TreeTransform<Derived>::TransformOMPMetaDirective(OMPMetaDirective *D) {
8578   // TODO: Fix This
8579   SemaRef.Diag(D->getBeginLoc(), diag::err_omp_instantiation_not_supported)
8580       << getOpenMPDirectiveName(D->getDirectiveKind());
8581   return StmtError();
8582 }
8583 
8584 template <typename Derived>
8585 StmtResult
8586 TreeTransform<Derived>::TransformOMPParallelDirective(OMPParallelDirective *D) {
8587   DeclarationNameInfo DirName;
8588   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel, DirName, nullptr,
8589                                              D->getBeginLoc());
8590   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8591   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8592   return Res;
8593 }
8594 
8595 template <typename Derived>
8596 StmtResult
8597 TreeTransform<Derived>::TransformOMPSimdDirective(OMPSimdDirective *D) {
8598   DeclarationNameInfo DirName;
8599   getDerived().getSema().StartOpenMPDSABlock(OMPD_simd, DirName, nullptr,
8600                                              D->getBeginLoc());
8601   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8602   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8603   return Res;
8604 }
8605 
8606 template <typename Derived>
8607 StmtResult
8608 TreeTransform<Derived>::TransformOMPTileDirective(OMPTileDirective *D) {
8609   DeclarationNameInfo DirName;
8610   getDerived().getSema().StartOpenMPDSABlock(D->getDirectiveKind(), DirName,
8611                                              nullptr, D->getBeginLoc());
8612   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8613   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8614   return Res;
8615 }
8616 
8617 template <typename Derived>
8618 StmtResult
8619 TreeTransform<Derived>::TransformOMPUnrollDirective(OMPUnrollDirective *D) {
8620   DeclarationNameInfo DirName;
8621   getDerived().getSema().StartOpenMPDSABlock(D->getDirectiveKind(), DirName,
8622                                              nullptr, D->getBeginLoc());
8623   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8624   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8625   return Res;
8626 }
8627 
8628 template <typename Derived>
8629 StmtResult
8630 TreeTransform<Derived>::TransformOMPForDirective(OMPForDirective *D) {
8631   DeclarationNameInfo DirName;
8632   getDerived().getSema().StartOpenMPDSABlock(OMPD_for, DirName, nullptr,
8633                                              D->getBeginLoc());
8634   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8635   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8636   return Res;
8637 }
8638 
8639 template <typename Derived>
8640 StmtResult
8641 TreeTransform<Derived>::TransformOMPForSimdDirective(OMPForSimdDirective *D) {
8642   DeclarationNameInfo DirName;
8643   getDerived().getSema().StartOpenMPDSABlock(OMPD_for_simd, DirName, nullptr,
8644                                              D->getBeginLoc());
8645   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8646   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8647   return Res;
8648 }
8649 
8650 template <typename Derived>
8651 StmtResult
8652 TreeTransform<Derived>::TransformOMPSectionsDirective(OMPSectionsDirective *D) {
8653   DeclarationNameInfo DirName;
8654   getDerived().getSema().StartOpenMPDSABlock(OMPD_sections, DirName, nullptr,
8655                                              D->getBeginLoc());
8656   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8657   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8658   return Res;
8659 }
8660 
8661 template <typename Derived>
8662 StmtResult
8663 TreeTransform<Derived>::TransformOMPSectionDirective(OMPSectionDirective *D) {
8664   DeclarationNameInfo DirName;
8665   getDerived().getSema().StartOpenMPDSABlock(OMPD_section, DirName, nullptr,
8666                                              D->getBeginLoc());
8667   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8668   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8669   return Res;
8670 }
8671 
8672 template <typename Derived>
8673 StmtResult
8674 TreeTransform<Derived>::TransformOMPSingleDirective(OMPSingleDirective *D) {
8675   DeclarationNameInfo DirName;
8676   getDerived().getSema().StartOpenMPDSABlock(OMPD_single, DirName, nullptr,
8677                                              D->getBeginLoc());
8678   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8679   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8680   return Res;
8681 }
8682 
8683 template <typename Derived>
8684 StmtResult
8685 TreeTransform<Derived>::TransformOMPMasterDirective(OMPMasterDirective *D) {
8686   DeclarationNameInfo DirName;
8687   getDerived().getSema().StartOpenMPDSABlock(OMPD_master, DirName, nullptr,
8688                                              D->getBeginLoc());
8689   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8690   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8691   return Res;
8692 }
8693 
8694 template <typename Derived>
8695 StmtResult
8696 TreeTransform<Derived>::TransformOMPCriticalDirective(OMPCriticalDirective *D) {
8697   getDerived().getSema().StartOpenMPDSABlock(
8698       OMPD_critical, D->getDirectiveName(), nullptr, D->getBeginLoc());
8699   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8700   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8701   return Res;
8702 }
8703 
8704 template <typename Derived>
8705 StmtResult TreeTransform<Derived>::TransformOMPParallelForDirective(
8706     OMPParallelForDirective *D) {
8707   DeclarationNameInfo DirName;
8708   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_for, DirName,
8709                                              nullptr, D->getBeginLoc());
8710   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8711   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8712   return Res;
8713 }
8714 
8715 template <typename Derived>
8716 StmtResult TreeTransform<Derived>::TransformOMPParallelForSimdDirective(
8717     OMPParallelForSimdDirective *D) {
8718   DeclarationNameInfo DirName;
8719   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_for_simd, DirName,
8720                                              nullptr, D->getBeginLoc());
8721   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8722   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8723   return Res;
8724 }
8725 
8726 template <typename Derived>
8727 StmtResult TreeTransform<Derived>::TransformOMPParallelMasterDirective(
8728     OMPParallelMasterDirective *D) {
8729   DeclarationNameInfo DirName;
8730   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_master, DirName,
8731                                              nullptr, D->getBeginLoc());
8732   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8733   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8734   return Res;
8735 }
8736 
8737 template <typename Derived>
8738 StmtResult TreeTransform<Derived>::TransformOMPParallelSectionsDirective(
8739     OMPParallelSectionsDirective *D) {
8740   DeclarationNameInfo DirName;
8741   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_sections, DirName,
8742                                              nullptr, D->getBeginLoc());
8743   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8744   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8745   return Res;
8746 }
8747 
8748 template <typename Derived>
8749 StmtResult
8750 TreeTransform<Derived>::TransformOMPTaskDirective(OMPTaskDirective *D) {
8751   DeclarationNameInfo DirName;
8752   getDerived().getSema().StartOpenMPDSABlock(OMPD_task, DirName, nullptr,
8753                                              D->getBeginLoc());
8754   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8755   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8756   return Res;
8757 }
8758 
8759 template <typename Derived>
8760 StmtResult TreeTransform<Derived>::TransformOMPTaskyieldDirective(
8761     OMPTaskyieldDirective *D) {
8762   DeclarationNameInfo DirName;
8763   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskyield, DirName, nullptr,
8764                                              D->getBeginLoc());
8765   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8766   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8767   return Res;
8768 }
8769 
8770 template <typename Derived>
8771 StmtResult
8772 TreeTransform<Derived>::TransformOMPBarrierDirective(OMPBarrierDirective *D) {
8773   DeclarationNameInfo DirName;
8774   getDerived().getSema().StartOpenMPDSABlock(OMPD_barrier, DirName, nullptr,
8775                                              D->getBeginLoc());
8776   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8777   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8778   return Res;
8779 }
8780 
8781 template <typename Derived>
8782 StmtResult
8783 TreeTransform<Derived>::TransformOMPTaskwaitDirective(OMPTaskwaitDirective *D) {
8784   DeclarationNameInfo DirName;
8785   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskwait, DirName, nullptr,
8786                                              D->getBeginLoc());
8787   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8788   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8789   return Res;
8790 }
8791 
8792 template <typename Derived>
8793 StmtResult TreeTransform<Derived>::TransformOMPTaskgroupDirective(
8794     OMPTaskgroupDirective *D) {
8795   DeclarationNameInfo DirName;
8796   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskgroup, DirName, nullptr,
8797                                              D->getBeginLoc());
8798   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8799   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8800   return Res;
8801 }
8802 
8803 template <typename Derived>
8804 StmtResult
8805 TreeTransform<Derived>::TransformOMPFlushDirective(OMPFlushDirective *D) {
8806   DeclarationNameInfo DirName;
8807   getDerived().getSema().StartOpenMPDSABlock(OMPD_flush, DirName, nullptr,
8808                                              D->getBeginLoc());
8809   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8810   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8811   return Res;
8812 }
8813 
8814 template <typename Derived>
8815 StmtResult
8816 TreeTransform<Derived>::TransformOMPDepobjDirective(OMPDepobjDirective *D) {
8817   DeclarationNameInfo DirName;
8818   getDerived().getSema().StartOpenMPDSABlock(OMPD_depobj, DirName, nullptr,
8819                                              D->getBeginLoc());
8820   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8821   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8822   return Res;
8823 }
8824 
8825 template <typename Derived>
8826 StmtResult
8827 TreeTransform<Derived>::TransformOMPScanDirective(OMPScanDirective *D) {
8828   DeclarationNameInfo DirName;
8829   getDerived().getSema().StartOpenMPDSABlock(OMPD_scan, DirName, nullptr,
8830                                              D->getBeginLoc());
8831   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8832   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8833   return Res;
8834 }
8835 
8836 template <typename Derived>
8837 StmtResult
8838 TreeTransform<Derived>::TransformOMPOrderedDirective(OMPOrderedDirective *D) {
8839   DeclarationNameInfo DirName;
8840   getDerived().getSema().StartOpenMPDSABlock(OMPD_ordered, DirName, nullptr,
8841                                              D->getBeginLoc());
8842   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8843   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8844   return Res;
8845 }
8846 
8847 template <typename Derived>
8848 StmtResult
8849 TreeTransform<Derived>::TransformOMPAtomicDirective(OMPAtomicDirective *D) {
8850   DeclarationNameInfo DirName;
8851   getDerived().getSema().StartOpenMPDSABlock(OMPD_atomic, DirName, nullptr,
8852                                              D->getBeginLoc());
8853   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8854   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8855   return Res;
8856 }
8857 
8858 template <typename Derived>
8859 StmtResult
8860 TreeTransform<Derived>::TransformOMPTargetDirective(OMPTargetDirective *D) {
8861   DeclarationNameInfo DirName;
8862   getDerived().getSema().StartOpenMPDSABlock(OMPD_target, DirName, nullptr,
8863                                              D->getBeginLoc());
8864   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8865   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8866   return Res;
8867 }
8868 
8869 template <typename Derived>
8870 StmtResult TreeTransform<Derived>::TransformOMPTargetDataDirective(
8871     OMPTargetDataDirective *D) {
8872   DeclarationNameInfo DirName;
8873   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_data, DirName, nullptr,
8874                                              D->getBeginLoc());
8875   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8876   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8877   return Res;
8878 }
8879 
8880 template <typename Derived>
8881 StmtResult TreeTransform<Derived>::TransformOMPTargetEnterDataDirective(
8882     OMPTargetEnterDataDirective *D) {
8883   DeclarationNameInfo DirName;
8884   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_enter_data, DirName,
8885                                              nullptr, D->getBeginLoc());
8886   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8887   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8888   return Res;
8889 }
8890 
8891 template <typename Derived>
8892 StmtResult TreeTransform<Derived>::TransformOMPTargetExitDataDirective(
8893     OMPTargetExitDataDirective *D) {
8894   DeclarationNameInfo DirName;
8895   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_exit_data, DirName,
8896                                              nullptr, D->getBeginLoc());
8897   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8898   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8899   return Res;
8900 }
8901 
8902 template <typename Derived>
8903 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelDirective(
8904     OMPTargetParallelDirective *D) {
8905   DeclarationNameInfo DirName;
8906   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel, DirName,
8907                                              nullptr, D->getBeginLoc());
8908   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8909   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8910   return Res;
8911 }
8912 
8913 template <typename Derived>
8914 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelForDirective(
8915     OMPTargetParallelForDirective *D) {
8916   DeclarationNameInfo DirName;
8917   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel_for, DirName,
8918                                              nullptr, D->getBeginLoc());
8919   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8920   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8921   return Res;
8922 }
8923 
8924 template <typename Derived>
8925 StmtResult TreeTransform<Derived>::TransformOMPTargetUpdateDirective(
8926     OMPTargetUpdateDirective *D) {
8927   DeclarationNameInfo DirName;
8928   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_update, DirName,
8929                                              nullptr, D->getBeginLoc());
8930   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8931   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8932   return Res;
8933 }
8934 
8935 template <typename Derived>
8936 StmtResult
8937 TreeTransform<Derived>::TransformOMPTeamsDirective(OMPTeamsDirective *D) {
8938   DeclarationNameInfo DirName;
8939   getDerived().getSema().StartOpenMPDSABlock(OMPD_teams, DirName, nullptr,
8940                                              D->getBeginLoc());
8941   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8942   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8943   return Res;
8944 }
8945 
8946 template <typename Derived>
8947 StmtResult TreeTransform<Derived>::TransformOMPCancellationPointDirective(
8948     OMPCancellationPointDirective *D) {
8949   DeclarationNameInfo DirName;
8950   getDerived().getSema().StartOpenMPDSABlock(OMPD_cancellation_point, DirName,
8951                                              nullptr, D->getBeginLoc());
8952   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8953   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8954   return Res;
8955 }
8956 
8957 template <typename Derived>
8958 StmtResult
8959 TreeTransform<Derived>::TransformOMPCancelDirective(OMPCancelDirective *D) {
8960   DeclarationNameInfo DirName;
8961   getDerived().getSema().StartOpenMPDSABlock(OMPD_cancel, DirName, nullptr,
8962                                              D->getBeginLoc());
8963   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8964   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8965   return Res;
8966 }
8967 
8968 template <typename Derived>
8969 StmtResult
8970 TreeTransform<Derived>::TransformOMPTaskLoopDirective(OMPTaskLoopDirective *D) {
8971   DeclarationNameInfo DirName;
8972   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskloop, DirName, nullptr,
8973                                              D->getBeginLoc());
8974   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8975   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8976   return Res;
8977 }
8978 
8979 template <typename Derived>
8980 StmtResult TreeTransform<Derived>::TransformOMPTaskLoopSimdDirective(
8981     OMPTaskLoopSimdDirective *D) {
8982   DeclarationNameInfo DirName;
8983   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskloop_simd, DirName,
8984                                              nullptr, D->getBeginLoc());
8985   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8986   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8987   return Res;
8988 }
8989 
8990 template <typename Derived>
8991 StmtResult TreeTransform<Derived>::TransformOMPMasterTaskLoopDirective(
8992     OMPMasterTaskLoopDirective *D) {
8993   DeclarationNameInfo DirName;
8994   getDerived().getSema().StartOpenMPDSABlock(OMPD_master_taskloop, DirName,
8995                                              nullptr, D->getBeginLoc());
8996   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8997   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8998   return Res;
8999 }
9000 
9001 template <typename Derived>
9002 StmtResult TreeTransform<Derived>::TransformOMPMasterTaskLoopSimdDirective(
9003     OMPMasterTaskLoopSimdDirective *D) {
9004   DeclarationNameInfo DirName;
9005   getDerived().getSema().StartOpenMPDSABlock(OMPD_master_taskloop_simd, DirName,
9006                                              nullptr, D->getBeginLoc());
9007   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9008   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9009   return Res;
9010 }
9011 
9012 template <typename Derived>
9013 StmtResult TreeTransform<Derived>::TransformOMPParallelMasterTaskLoopDirective(
9014     OMPParallelMasterTaskLoopDirective *D) {
9015   DeclarationNameInfo DirName;
9016   getDerived().getSema().StartOpenMPDSABlock(
9017       OMPD_parallel_master_taskloop, DirName, nullptr, D->getBeginLoc());
9018   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9019   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9020   return Res;
9021 }
9022 
9023 template <typename Derived>
9024 StmtResult
9025 TreeTransform<Derived>::TransformOMPParallelMasterTaskLoopSimdDirective(
9026     OMPParallelMasterTaskLoopSimdDirective *D) {
9027   DeclarationNameInfo DirName;
9028   getDerived().getSema().StartOpenMPDSABlock(
9029       OMPD_parallel_master_taskloop_simd, DirName, nullptr, D->getBeginLoc());
9030   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9031   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9032   return Res;
9033 }
9034 
9035 template <typename Derived>
9036 StmtResult TreeTransform<Derived>::TransformOMPDistributeDirective(
9037     OMPDistributeDirective *D) {
9038   DeclarationNameInfo DirName;
9039   getDerived().getSema().StartOpenMPDSABlock(OMPD_distribute, DirName, nullptr,
9040                                              D->getBeginLoc());
9041   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9042   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9043   return Res;
9044 }
9045 
9046 template <typename Derived>
9047 StmtResult TreeTransform<Derived>::TransformOMPDistributeParallelForDirective(
9048     OMPDistributeParallelForDirective *D) {
9049   DeclarationNameInfo DirName;
9050   getDerived().getSema().StartOpenMPDSABlock(
9051       OMPD_distribute_parallel_for, DirName, nullptr, D->getBeginLoc());
9052   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9053   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9054   return Res;
9055 }
9056 
9057 template <typename Derived>
9058 StmtResult
9059 TreeTransform<Derived>::TransformOMPDistributeParallelForSimdDirective(
9060     OMPDistributeParallelForSimdDirective *D) {
9061   DeclarationNameInfo DirName;
9062   getDerived().getSema().StartOpenMPDSABlock(
9063       OMPD_distribute_parallel_for_simd, DirName, nullptr, D->getBeginLoc());
9064   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9065   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9066   return Res;
9067 }
9068 
9069 template <typename Derived>
9070 StmtResult TreeTransform<Derived>::TransformOMPDistributeSimdDirective(
9071     OMPDistributeSimdDirective *D) {
9072   DeclarationNameInfo DirName;
9073   getDerived().getSema().StartOpenMPDSABlock(OMPD_distribute_simd, DirName,
9074                                              nullptr, D->getBeginLoc());
9075   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9076   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9077   return Res;
9078 }
9079 
9080 template <typename Derived>
9081 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelForSimdDirective(
9082     OMPTargetParallelForSimdDirective *D) {
9083   DeclarationNameInfo DirName;
9084   getDerived().getSema().StartOpenMPDSABlock(
9085       OMPD_target_parallel_for_simd, DirName, nullptr, D->getBeginLoc());
9086   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9087   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9088   return Res;
9089 }
9090 
9091 template <typename Derived>
9092 StmtResult TreeTransform<Derived>::TransformOMPTargetSimdDirective(
9093     OMPTargetSimdDirective *D) {
9094   DeclarationNameInfo DirName;
9095   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_simd, DirName, nullptr,
9096                                              D->getBeginLoc());
9097   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9098   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9099   return Res;
9100 }
9101 
9102 template <typename Derived>
9103 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeDirective(
9104     OMPTeamsDistributeDirective *D) {
9105   DeclarationNameInfo DirName;
9106   getDerived().getSema().StartOpenMPDSABlock(OMPD_teams_distribute, DirName,
9107                                              nullptr, D->getBeginLoc());
9108   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9109   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9110   return Res;
9111 }
9112 
9113 template <typename Derived>
9114 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeSimdDirective(
9115     OMPTeamsDistributeSimdDirective *D) {
9116   DeclarationNameInfo DirName;
9117   getDerived().getSema().StartOpenMPDSABlock(
9118       OMPD_teams_distribute_simd, DirName, nullptr, D->getBeginLoc());
9119   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9120   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9121   return Res;
9122 }
9123 
9124 template <typename Derived>
9125 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeParallelForSimdDirective(
9126     OMPTeamsDistributeParallelForSimdDirective *D) {
9127   DeclarationNameInfo DirName;
9128   getDerived().getSema().StartOpenMPDSABlock(
9129       OMPD_teams_distribute_parallel_for_simd, DirName, nullptr,
9130       D->getBeginLoc());
9131   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9132   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9133   return Res;
9134 }
9135 
9136 template <typename Derived>
9137 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeParallelForDirective(
9138     OMPTeamsDistributeParallelForDirective *D) {
9139   DeclarationNameInfo DirName;
9140   getDerived().getSema().StartOpenMPDSABlock(
9141       OMPD_teams_distribute_parallel_for, DirName, nullptr, D->getBeginLoc());
9142   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9143   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9144   return Res;
9145 }
9146 
9147 template <typename Derived>
9148 StmtResult TreeTransform<Derived>::TransformOMPTargetTeamsDirective(
9149     OMPTargetTeamsDirective *D) {
9150   DeclarationNameInfo DirName;
9151   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_teams, DirName,
9152                                              nullptr, D->getBeginLoc());
9153   auto Res = getDerived().TransformOMPExecutableDirective(D);
9154   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9155   return Res;
9156 }
9157 
9158 template <typename Derived>
9159 StmtResult TreeTransform<Derived>::TransformOMPTargetTeamsDistributeDirective(
9160     OMPTargetTeamsDistributeDirective *D) {
9161   DeclarationNameInfo DirName;
9162   getDerived().getSema().StartOpenMPDSABlock(
9163       OMPD_target_teams_distribute, DirName, nullptr, D->getBeginLoc());
9164   auto Res = getDerived().TransformOMPExecutableDirective(D);
9165   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9166   return Res;
9167 }
9168 
9169 template <typename Derived>
9170 StmtResult
9171 TreeTransform<Derived>::TransformOMPTargetTeamsDistributeParallelForDirective(
9172     OMPTargetTeamsDistributeParallelForDirective *D) {
9173   DeclarationNameInfo DirName;
9174   getDerived().getSema().StartOpenMPDSABlock(
9175       OMPD_target_teams_distribute_parallel_for, DirName, nullptr,
9176       D->getBeginLoc());
9177   auto Res = getDerived().TransformOMPExecutableDirective(D);
9178   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9179   return Res;
9180 }
9181 
9182 template <typename Derived>
9183 StmtResult TreeTransform<Derived>::
9184     TransformOMPTargetTeamsDistributeParallelForSimdDirective(
9185         OMPTargetTeamsDistributeParallelForSimdDirective *D) {
9186   DeclarationNameInfo DirName;
9187   getDerived().getSema().StartOpenMPDSABlock(
9188       OMPD_target_teams_distribute_parallel_for_simd, DirName, nullptr,
9189       D->getBeginLoc());
9190   auto Res = getDerived().TransformOMPExecutableDirective(D);
9191   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9192   return Res;
9193 }
9194 
9195 template <typename Derived>
9196 StmtResult
9197 TreeTransform<Derived>::TransformOMPTargetTeamsDistributeSimdDirective(
9198     OMPTargetTeamsDistributeSimdDirective *D) {
9199   DeclarationNameInfo DirName;
9200   getDerived().getSema().StartOpenMPDSABlock(
9201       OMPD_target_teams_distribute_simd, DirName, nullptr, D->getBeginLoc());
9202   auto Res = getDerived().TransformOMPExecutableDirective(D);
9203   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9204   return Res;
9205 }
9206 
9207 template <typename Derived>
9208 StmtResult
9209 TreeTransform<Derived>::TransformOMPInteropDirective(OMPInteropDirective *D) {
9210   DeclarationNameInfo DirName;
9211   getDerived().getSema().StartOpenMPDSABlock(OMPD_interop, DirName, nullptr,
9212                                              D->getBeginLoc());
9213   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9214   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9215   return Res;
9216 }
9217 
9218 template <typename Derived>
9219 StmtResult
9220 TreeTransform<Derived>::TransformOMPDispatchDirective(OMPDispatchDirective *D) {
9221   DeclarationNameInfo DirName;
9222   getDerived().getSema().StartOpenMPDSABlock(OMPD_dispatch, DirName, nullptr,
9223                                              D->getBeginLoc());
9224   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9225   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9226   return Res;
9227 }
9228 
9229 template <typename Derived>
9230 StmtResult
9231 TreeTransform<Derived>::TransformOMPMaskedDirective(OMPMaskedDirective *D) {
9232   DeclarationNameInfo DirName;
9233   getDerived().getSema().StartOpenMPDSABlock(OMPD_masked, DirName, nullptr,
9234                                              D->getBeginLoc());
9235   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9236   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9237   return Res;
9238 }
9239 
9240 template <typename Derived>
9241 StmtResult TreeTransform<Derived>::TransformOMPGenericLoopDirective(
9242     OMPGenericLoopDirective *D) {
9243   DeclarationNameInfo DirName;
9244   getDerived().getSema().StartOpenMPDSABlock(OMPD_loop, DirName, nullptr,
9245                                              D->getBeginLoc());
9246   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9247   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9248   return Res;
9249 }
9250 
9251 //===----------------------------------------------------------------------===//
9252 // OpenMP clause transformation
9253 //===----------------------------------------------------------------------===//
9254 template <typename Derived>
9255 OMPClause *TreeTransform<Derived>::TransformOMPIfClause(OMPIfClause *C) {
9256   ExprResult Cond = getDerived().TransformExpr(C->getCondition());
9257   if (Cond.isInvalid())
9258     return nullptr;
9259   return getDerived().RebuildOMPIfClause(
9260       C->getNameModifier(), Cond.get(), C->getBeginLoc(), C->getLParenLoc(),
9261       C->getNameModifierLoc(), C->getColonLoc(), C->getEndLoc());
9262 }
9263 
9264 template <typename Derived>
9265 OMPClause *TreeTransform<Derived>::TransformOMPFinalClause(OMPFinalClause *C) {
9266   ExprResult Cond = getDerived().TransformExpr(C->getCondition());
9267   if (Cond.isInvalid())
9268     return nullptr;
9269   return getDerived().RebuildOMPFinalClause(Cond.get(), C->getBeginLoc(),
9270                                             C->getLParenLoc(), C->getEndLoc());
9271 }
9272 
9273 template <typename Derived>
9274 OMPClause *
9275 TreeTransform<Derived>::TransformOMPNumThreadsClause(OMPNumThreadsClause *C) {
9276   ExprResult NumThreads = getDerived().TransformExpr(C->getNumThreads());
9277   if (NumThreads.isInvalid())
9278     return nullptr;
9279   return getDerived().RebuildOMPNumThreadsClause(
9280       NumThreads.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9281 }
9282 
9283 template <typename Derived>
9284 OMPClause *
9285 TreeTransform<Derived>::TransformOMPSafelenClause(OMPSafelenClause *C) {
9286   ExprResult E = getDerived().TransformExpr(C->getSafelen());
9287   if (E.isInvalid())
9288     return nullptr;
9289   return getDerived().RebuildOMPSafelenClause(
9290       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9291 }
9292 
9293 template <typename Derived>
9294 OMPClause *
9295 TreeTransform<Derived>::TransformOMPAllocatorClause(OMPAllocatorClause *C) {
9296   ExprResult E = getDerived().TransformExpr(C->getAllocator());
9297   if (E.isInvalid())
9298     return nullptr;
9299   return getDerived().RebuildOMPAllocatorClause(
9300       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9301 }
9302 
9303 template <typename Derived>
9304 OMPClause *
9305 TreeTransform<Derived>::TransformOMPSimdlenClause(OMPSimdlenClause *C) {
9306   ExprResult E = getDerived().TransformExpr(C->getSimdlen());
9307   if (E.isInvalid())
9308     return nullptr;
9309   return getDerived().RebuildOMPSimdlenClause(
9310       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9311 }
9312 
9313 template <typename Derived>
9314 OMPClause *TreeTransform<Derived>::TransformOMPSizesClause(OMPSizesClause *C) {
9315   SmallVector<Expr *, 4> TransformedSizes;
9316   TransformedSizes.reserve(C->getNumSizes());
9317   bool Changed = false;
9318   for (Expr *E : C->getSizesRefs()) {
9319     if (!E) {
9320       TransformedSizes.push_back(nullptr);
9321       continue;
9322     }
9323 
9324     ExprResult T = getDerived().TransformExpr(E);
9325     if (T.isInvalid())
9326       return nullptr;
9327     if (E != T.get())
9328       Changed = true;
9329     TransformedSizes.push_back(T.get());
9330   }
9331 
9332   if (!Changed && !getDerived().AlwaysRebuild())
9333     return C;
9334   return RebuildOMPSizesClause(TransformedSizes, C->getBeginLoc(),
9335                                C->getLParenLoc(), C->getEndLoc());
9336 }
9337 
9338 template <typename Derived>
9339 OMPClause *TreeTransform<Derived>::TransformOMPFullClause(OMPFullClause *C) {
9340   if (!getDerived().AlwaysRebuild())
9341     return C;
9342   return RebuildOMPFullClause(C->getBeginLoc(), C->getEndLoc());
9343 }
9344 
9345 template <typename Derived>
9346 OMPClause *
9347 TreeTransform<Derived>::TransformOMPPartialClause(OMPPartialClause *C) {
9348   ExprResult T = getDerived().TransformExpr(C->getFactor());
9349   if (T.isInvalid())
9350     return nullptr;
9351   Expr *Factor = T.get();
9352   bool Changed = Factor != C->getFactor();
9353 
9354   if (!Changed && !getDerived().AlwaysRebuild())
9355     return C;
9356   return RebuildOMPPartialClause(Factor, C->getBeginLoc(), C->getLParenLoc(),
9357                                  C->getEndLoc());
9358 }
9359 
9360 template <typename Derived>
9361 OMPClause *
9362 TreeTransform<Derived>::TransformOMPCollapseClause(OMPCollapseClause *C) {
9363   ExprResult E = getDerived().TransformExpr(C->getNumForLoops());
9364   if (E.isInvalid())
9365     return nullptr;
9366   return getDerived().RebuildOMPCollapseClause(
9367       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9368 }
9369 
9370 template <typename Derived>
9371 OMPClause *
9372 TreeTransform<Derived>::TransformOMPDefaultClause(OMPDefaultClause *C) {
9373   return getDerived().RebuildOMPDefaultClause(
9374       C->getDefaultKind(), C->getDefaultKindKwLoc(), C->getBeginLoc(),
9375       C->getLParenLoc(), C->getEndLoc());
9376 }
9377 
9378 template <typename Derived>
9379 OMPClause *
9380 TreeTransform<Derived>::TransformOMPProcBindClause(OMPProcBindClause *C) {
9381   return getDerived().RebuildOMPProcBindClause(
9382       C->getProcBindKind(), C->getProcBindKindKwLoc(), C->getBeginLoc(),
9383       C->getLParenLoc(), C->getEndLoc());
9384 }
9385 
9386 template <typename Derived>
9387 OMPClause *
9388 TreeTransform<Derived>::TransformOMPScheduleClause(OMPScheduleClause *C) {
9389   ExprResult E = getDerived().TransformExpr(C->getChunkSize());
9390   if (E.isInvalid())
9391     return nullptr;
9392   return getDerived().RebuildOMPScheduleClause(
9393       C->getFirstScheduleModifier(), C->getSecondScheduleModifier(),
9394       C->getScheduleKind(), E.get(), C->getBeginLoc(), C->getLParenLoc(),
9395       C->getFirstScheduleModifierLoc(), C->getSecondScheduleModifierLoc(),
9396       C->getScheduleKindLoc(), C->getCommaLoc(), C->getEndLoc());
9397 }
9398 
9399 template <typename Derived>
9400 OMPClause *
9401 TreeTransform<Derived>::TransformOMPOrderedClause(OMPOrderedClause *C) {
9402   ExprResult E;
9403   if (auto *Num = C->getNumForLoops()) {
9404     E = getDerived().TransformExpr(Num);
9405     if (E.isInvalid())
9406       return nullptr;
9407   }
9408   return getDerived().RebuildOMPOrderedClause(C->getBeginLoc(), C->getEndLoc(),
9409                                               C->getLParenLoc(), E.get());
9410 }
9411 
9412 template <typename Derived>
9413 OMPClause *
9414 TreeTransform<Derived>::TransformOMPDetachClause(OMPDetachClause *C) {
9415   ExprResult E;
9416   if (Expr *Evt = C->getEventHandler()) {
9417     E = getDerived().TransformExpr(Evt);
9418     if (E.isInvalid())
9419       return nullptr;
9420   }
9421   return getDerived().RebuildOMPDetachClause(E.get(), C->getBeginLoc(),
9422                                              C->getLParenLoc(), C->getEndLoc());
9423 }
9424 
9425 template <typename Derived>
9426 OMPClause *
9427 TreeTransform<Derived>::TransformOMPNowaitClause(OMPNowaitClause *C) {
9428   // No need to rebuild this clause, no template-dependent parameters.
9429   return C;
9430 }
9431 
9432 template <typename Derived>
9433 OMPClause *
9434 TreeTransform<Derived>::TransformOMPUntiedClause(OMPUntiedClause *C) {
9435   // No need to rebuild this clause, no template-dependent parameters.
9436   return C;
9437 }
9438 
9439 template <typename Derived>
9440 OMPClause *
9441 TreeTransform<Derived>::TransformOMPMergeableClause(OMPMergeableClause *C) {
9442   // No need to rebuild this clause, no template-dependent parameters.
9443   return C;
9444 }
9445 
9446 template <typename Derived>
9447 OMPClause *TreeTransform<Derived>::TransformOMPReadClause(OMPReadClause *C) {
9448   // No need to rebuild this clause, no template-dependent parameters.
9449   return C;
9450 }
9451 
9452 template <typename Derived>
9453 OMPClause *TreeTransform<Derived>::TransformOMPWriteClause(OMPWriteClause *C) {
9454   // No need to rebuild this clause, no template-dependent parameters.
9455   return C;
9456 }
9457 
9458 template <typename Derived>
9459 OMPClause *
9460 TreeTransform<Derived>::TransformOMPUpdateClause(OMPUpdateClause *C) {
9461   // No need to rebuild this clause, no template-dependent parameters.
9462   return C;
9463 }
9464 
9465 template <typename Derived>
9466 OMPClause *
9467 TreeTransform<Derived>::TransformOMPCaptureClause(OMPCaptureClause *C) {
9468   // No need to rebuild this clause, no template-dependent parameters.
9469   return C;
9470 }
9471 
9472 template <typename Derived>
9473 OMPClause *
9474 TreeTransform<Derived>::TransformOMPCompareClause(OMPCompareClause *C) {
9475   // No need to rebuild this clause, no template-dependent parameters.
9476   return C;
9477 }
9478 
9479 template <typename Derived>
9480 OMPClause *
9481 TreeTransform<Derived>::TransformOMPSeqCstClause(OMPSeqCstClause *C) {
9482   // No need to rebuild this clause, no template-dependent parameters.
9483   return C;
9484 }
9485 
9486 template <typename Derived>
9487 OMPClause *
9488 TreeTransform<Derived>::TransformOMPAcqRelClause(OMPAcqRelClause *C) {
9489   // No need to rebuild this clause, no template-dependent parameters.
9490   return C;
9491 }
9492 
9493 template <typename Derived>
9494 OMPClause *
9495 TreeTransform<Derived>::TransformOMPAcquireClause(OMPAcquireClause *C) {
9496   // No need to rebuild this clause, no template-dependent parameters.
9497   return C;
9498 }
9499 
9500 template <typename Derived>
9501 OMPClause *
9502 TreeTransform<Derived>::TransformOMPReleaseClause(OMPReleaseClause *C) {
9503   // No need to rebuild this clause, no template-dependent parameters.
9504   return C;
9505 }
9506 
9507 template <typename Derived>
9508 OMPClause *
9509 TreeTransform<Derived>::TransformOMPRelaxedClause(OMPRelaxedClause *C) {
9510   // No need to rebuild this clause, no template-dependent parameters.
9511   return C;
9512 }
9513 
9514 template <typename Derived>
9515 OMPClause *
9516 TreeTransform<Derived>::TransformOMPThreadsClause(OMPThreadsClause *C) {
9517   // No need to rebuild this clause, no template-dependent parameters.
9518   return C;
9519 }
9520 
9521 template <typename Derived>
9522 OMPClause *TreeTransform<Derived>::TransformOMPSIMDClause(OMPSIMDClause *C) {
9523   // No need to rebuild this clause, no template-dependent parameters.
9524   return C;
9525 }
9526 
9527 template <typename Derived>
9528 OMPClause *
9529 TreeTransform<Derived>::TransformOMPNogroupClause(OMPNogroupClause *C) {
9530   // No need to rebuild this clause, no template-dependent parameters.
9531   return C;
9532 }
9533 
9534 template <typename Derived>
9535 OMPClause *TreeTransform<Derived>::TransformOMPInitClause(OMPInitClause *C) {
9536   ExprResult IVR = getDerived().TransformExpr(C->getInteropVar());
9537   if (IVR.isInvalid())
9538     return nullptr;
9539 
9540   llvm::SmallVector<Expr *, 8> PrefExprs;
9541   PrefExprs.reserve(C->varlist_size() - 1);
9542   for (Expr *E : llvm::drop_begin(C->varlists())) {
9543     ExprResult ER = getDerived().TransformExpr(cast<Expr>(E));
9544     if (ER.isInvalid())
9545       return nullptr;
9546     PrefExprs.push_back(ER.get());
9547   }
9548   return getDerived().RebuildOMPInitClause(
9549       IVR.get(), PrefExprs, C->getIsTarget(), C->getIsTargetSync(),
9550       C->getBeginLoc(), C->getLParenLoc(), C->getVarLoc(), C->getEndLoc());
9551 }
9552 
9553 template <typename Derived>
9554 OMPClause *TreeTransform<Derived>::TransformOMPUseClause(OMPUseClause *C) {
9555   ExprResult ER = getDerived().TransformExpr(C->getInteropVar());
9556   if (ER.isInvalid())
9557     return nullptr;
9558   return getDerived().RebuildOMPUseClause(ER.get(), C->getBeginLoc(),
9559                                           C->getLParenLoc(), C->getVarLoc(),
9560                                           C->getEndLoc());
9561 }
9562 
9563 template <typename Derived>
9564 OMPClause *
9565 TreeTransform<Derived>::TransformOMPDestroyClause(OMPDestroyClause *C) {
9566   ExprResult ER;
9567   if (Expr *IV = C->getInteropVar()) {
9568     ER = getDerived().TransformExpr(IV);
9569     if (ER.isInvalid())
9570       return nullptr;
9571   }
9572   return getDerived().RebuildOMPDestroyClause(ER.get(), C->getBeginLoc(),
9573                                               C->getLParenLoc(), C->getVarLoc(),
9574                                               C->getEndLoc());
9575 }
9576 
9577 template <typename Derived>
9578 OMPClause *
9579 TreeTransform<Derived>::TransformOMPNovariantsClause(OMPNovariantsClause *C) {
9580   ExprResult Cond = getDerived().TransformExpr(C->getCondition());
9581   if (Cond.isInvalid())
9582     return nullptr;
9583   return getDerived().RebuildOMPNovariantsClause(
9584       Cond.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9585 }
9586 
9587 template <typename Derived>
9588 OMPClause *
9589 TreeTransform<Derived>::TransformOMPNocontextClause(OMPNocontextClause *C) {
9590   ExprResult Cond = getDerived().TransformExpr(C->getCondition());
9591   if (Cond.isInvalid())
9592     return nullptr;
9593   return getDerived().RebuildOMPNocontextClause(
9594       Cond.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9595 }
9596 
9597 template <typename Derived>
9598 OMPClause *
9599 TreeTransform<Derived>::TransformOMPFilterClause(OMPFilterClause *C) {
9600   ExprResult ThreadID = getDerived().TransformExpr(C->getThreadID());
9601   if (ThreadID.isInvalid())
9602     return nullptr;
9603   return getDerived().RebuildOMPFilterClause(ThreadID.get(), C->getBeginLoc(),
9604                                              C->getLParenLoc(), C->getEndLoc());
9605 }
9606 
9607 template <typename Derived>
9608 OMPClause *TreeTransform<Derived>::TransformOMPAlignClause(OMPAlignClause *C) {
9609   ExprResult E = getDerived().TransformExpr(C->getAlignment());
9610   if (E.isInvalid())
9611     return nullptr;
9612   return getDerived().RebuildOMPAlignClause(E.get(), C->getBeginLoc(),
9613                                             C->getLParenLoc(), C->getEndLoc());
9614 }
9615 
9616 template <typename Derived>
9617 OMPClause *TreeTransform<Derived>::TransformOMPUnifiedAddressClause(
9618     OMPUnifiedAddressClause *C) {
9619   llvm_unreachable("unified_address clause cannot appear in dependent context");
9620 }
9621 
9622 template <typename Derived>
9623 OMPClause *TreeTransform<Derived>::TransformOMPUnifiedSharedMemoryClause(
9624     OMPUnifiedSharedMemoryClause *C) {
9625   llvm_unreachable(
9626       "unified_shared_memory clause cannot appear in dependent context");
9627 }
9628 
9629 template <typename Derived>
9630 OMPClause *TreeTransform<Derived>::TransformOMPReverseOffloadClause(
9631     OMPReverseOffloadClause *C) {
9632   llvm_unreachable("reverse_offload clause cannot appear in dependent context");
9633 }
9634 
9635 template <typename Derived>
9636 OMPClause *TreeTransform<Derived>::TransformOMPDynamicAllocatorsClause(
9637     OMPDynamicAllocatorsClause *C) {
9638   llvm_unreachable(
9639       "dynamic_allocators clause cannot appear in dependent context");
9640 }
9641 
9642 template <typename Derived>
9643 OMPClause *TreeTransform<Derived>::TransformOMPAtomicDefaultMemOrderClause(
9644     OMPAtomicDefaultMemOrderClause *C) {
9645   llvm_unreachable(
9646       "atomic_default_mem_order clause cannot appear in dependent context");
9647 }
9648 
9649 template <typename Derived>
9650 OMPClause *
9651 TreeTransform<Derived>::TransformOMPPrivateClause(OMPPrivateClause *C) {
9652   llvm::SmallVector<Expr *, 16> Vars;
9653   Vars.reserve(C->varlist_size());
9654   for (auto *VE : C->varlists()) {
9655     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9656     if (EVar.isInvalid())
9657       return nullptr;
9658     Vars.push_back(EVar.get());
9659   }
9660   return getDerived().RebuildOMPPrivateClause(
9661       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9662 }
9663 
9664 template <typename Derived>
9665 OMPClause *TreeTransform<Derived>::TransformOMPFirstprivateClause(
9666     OMPFirstprivateClause *C) {
9667   llvm::SmallVector<Expr *, 16> Vars;
9668   Vars.reserve(C->varlist_size());
9669   for (auto *VE : C->varlists()) {
9670     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9671     if (EVar.isInvalid())
9672       return nullptr;
9673     Vars.push_back(EVar.get());
9674   }
9675   return getDerived().RebuildOMPFirstprivateClause(
9676       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9677 }
9678 
9679 template <typename Derived>
9680 OMPClause *
9681 TreeTransform<Derived>::TransformOMPLastprivateClause(OMPLastprivateClause *C) {
9682   llvm::SmallVector<Expr *, 16> Vars;
9683   Vars.reserve(C->varlist_size());
9684   for (auto *VE : C->varlists()) {
9685     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9686     if (EVar.isInvalid())
9687       return nullptr;
9688     Vars.push_back(EVar.get());
9689   }
9690   return getDerived().RebuildOMPLastprivateClause(
9691       Vars, C->getKind(), C->getKindLoc(), C->getColonLoc(), C->getBeginLoc(),
9692       C->getLParenLoc(), C->getEndLoc());
9693 }
9694 
9695 template <typename Derived>
9696 OMPClause *
9697 TreeTransform<Derived>::TransformOMPSharedClause(OMPSharedClause *C) {
9698   llvm::SmallVector<Expr *, 16> Vars;
9699   Vars.reserve(C->varlist_size());
9700   for (auto *VE : C->varlists()) {
9701     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9702     if (EVar.isInvalid())
9703       return nullptr;
9704     Vars.push_back(EVar.get());
9705   }
9706   return getDerived().RebuildOMPSharedClause(Vars, C->getBeginLoc(),
9707                                              C->getLParenLoc(), C->getEndLoc());
9708 }
9709 
9710 template <typename Derived>
9711 OMPClause *
9712 TreeTransform<Derived>::TransformOMPReductionClause(OMPReductionClause *C) {
9713   llvm::SmallVector<Expr *, 16> Vars;
9714   Vars.reserve(C->varlist_size());
9715   for (auto *VE : C->varlists()) {
9716     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9717     if (EVar.isInvalid())
9718       return nullptr;
9719     Vars.push_back(EVar.get());
9720   }
9721   CXXScopeSpec ReductionIdScopeSpec;
9722   ReductionIdScopeSpec.Adopt(C->getQualifierLoc());
9723 
9724   DeclarationNameInfo NameInfo = C->getNameInfo();
9725   if (NameInfo.getName()) {
9726     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
9727     if (!NameInfo.getName())
9728       return nullptr;
9729   }
9730   // Build a list of all UDR decls with the same names ranged by the Scopes.
9731   // The Scope boundary is a duplication of the previous decl.
9732   llvm::SmallVector<Expr *, 16> UnresolvedReductions;
9733   for (auto *E : C->reduction_ops()) {
9734     // Transform all the decls.
9735     if (E) {
9736       auto *ULE = cast<UnresolvedLookupExpr>(E);
9737       UnresolvedSet<8> Decls;
9738       for (auto *D : ULE->decls()) {
9739         NamedDecl *InstD =
9740             cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D));
9741         Decls.addDecl(InstD, InstD->getAccess());
9742       }
9743       UnresolvedReductions.push_back(
9744        UnresolvedLookupExpr::Create(
9745           SemaRef.Context, /*NamingClass=*/nullptr,
9746           ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context),
9747           NameInfo, /*ADL=*/true, ULE->isOverloaded(),
9748           Decls.begin(), Decls.end()));
9749     } else
9750       UnresolvedReductions.push_back(nullptr);
9751   }
9752   return getDerived().RebuildOMPReductionClause(
9753       Vars, C->getModifier(), C->getBeginLoc(), C->getLParenLoc(),
9754       C->getModifierLoc(), C->getColonLoc(), C->getEndLoc(),
9755       ReductionIdScopeSpec, NameInfo, UnresolvedReductions);
9756 }
9757 
9758 template <typename Derived>
9759 OMPClause *TreeTransform<Derived>::TransformOMPTaskReductionClause(
9760     OMPTaskReductionClause *C) {
9761   llvm::SmallVector<Expr *, 16> Vars;
9762   Vars.reserve(C->varlist_size());
9763   for (auto *VE : C->varlists()) {
9764     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9765     if (EVar.isInvalid())
9766       return nullptr;
9767     Vars.push_back(EVar.get());
9768   }
9769   CXXScopeSpec ReductionIdScopeSpec;
9770   ReductionIdScopeSpec.Adopt(C->getQualifierLoc());
9771 
9772   DeclarationNameInfo NameInfo = C->getNameInfo();
9773   if (NameInfo.getName()) {
9774     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
9775     if (!NameInfo.getName())
9776       return nullptr;
9777   }
9778   // Build a list of all UDR decls with the same names ranged by the Scopes.
9779   // The Scope boundary is a duplication of the previous decl.
9780   llvm::SmallVector<Expr *, 16> UnresolvedReductions;
9781   for (auto *E : C->reduction_ops()) {
9782     // Transform all the decls.
9783     if (E) {
9784       auto *ULE = cast<UnresolvedLookupExpr>(E);
9785       UnresolvedSet<8> Decls;
9786       for (auto *D : ULE->decls()) {
9787         NamedDecl *InstD =
9788             cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D));
9789         Decls.addDecl(InstD, InstD->getAccess());
9790       }
9791       UnresolvedReductions.push_back(UnresolvedLookupExpr::Create(
9792           SemaRef.Context, /*NamingClass=*/nullptr,
9793           ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), NameInfo,
9794           /*ADL=*/true, ULE->isOverloaded(), Decls.begin(), Decls.end()));
9795     } else
9796       UnresolvedReductions.push_back(nullptr);
9797   }
9798   return getDerived().RebuildOMPTaskReductionClause(
9799       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(),
9800       C->getEndLoc(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions);
9801 }
9802 
9803 template <typename Derived>
9804 OMPClause *
9805 TreeTransform<Derived>::TransformOMPInReductionClause(OMPInReductionClause *C) {
9806   llvm::SmallVector<Expr *, 16> Vars;
9807   Vars.reserve(C->varlist_size());
9808   for (auto *VE : C->varlists()) {
9809     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9810     if (EVar.isInvalid())
9811       return nullptr;
9812     Vars.push_back(EVar.get());
9813   }
9814   CXXScopeSpec ReductionIdScopeSpec;
9815   ReductionIdScopeSpec.Adopt(C->getQualifierLoc());
9816 
9817   DeclarationNameInfo NameInfo = C->getNameInfo();
9818   if (NameInfo.getName()) {
9819     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
9820     if (!NameInfo.getName())
9821       return nullptr;
9822   }
9823   // Build a list of all UDR decls with the same names ranged by the Scopes.
9824   // The Scope boundary is a duplication of the previous decl.
9825   llvm::SmallVector<Expr *, 16> UnresolvedReductions;
9826   for (auto *E : C->reduction_ops()) {
9827     // Transform all the decls.
9828     if (E) {
9829       auto *ULE = cast<UnresolvedLookupExpr>(E);
9830       UnresolvedSet<8> Decls;
9831       for (auto *D : ULE->decls()) {
9832         NamedDecl *InstD =
9833             cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D));
9834         Decls.addDecl(InstD, InstD->getAccess());
9835       }
9836       UnresolvedReductions.push_back(UnresolvedLookupExpr::Create(
9837           SemaRef.Context, /*NamingClass=*/nullptr,
9838           ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), NameInfo,
9839           /*ADL=*/true, ULE->isOverloaded(), Decls.begin(), Decls.end()));
9840     } else
9841       UnresolvedReductions.push_back(nullptr);
9842   }
9843   return getDerived().RebuildOMPInReductionClause(
9844       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(),
9845       C->getEndLoc(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions);
9846 }
9847 
9848 template <typename Derived>
9849 OMPClause *
9850 TreeTransform<Derived>::TransformOMPLinearClause(OMPLinearClause *C) {
9851   llvm::SmallVector<Expr *, 16> Vars;
9852   Vars.reserve(C->varlist_size());
9853   for (auto *VE : C->varlists()) {
9854     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9855     if (EVar.isInvalid())
9856       return nullptr;
9857     Vars.push_back(EVar.get());
9858   }
9859   ExprResult Step = getDerived().TransformExpr(C->getStep());
9860   if (Step.isInvalid())
9861     return nullptr;
9862   return getDerived().RebuildOMPLinearClause(
9863       Vars, Step.get(), C->getBeginLoc(), C->getLParenLoc(), C->getModifier(),
9864       C->getModifierLoc(), C->getColonLoc(), C->getEndLoc());
9865 }
9866 
9867 template <typename Derived>
9868 OMPClause *
9869 TreeTransform<Derived>::TransformOMPAlignedClause(OMPAlignedClause *C) {
9870   llvm::SmallVector<Expr *, 16> Vars;
9871   Vars.reserve(C->varlist_size());
9872   for (auto *VE : C->varlists()) {
9873     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9874     if (EVar.isInvalid())
9875       return nullptr;
9876     Vars.push_back(EVar.get());
9877   }
9878   ExprResult Alignment = getDerived().TransformExpr(C->getAlignment());
9879   if (Alignment.isInvalid())
9880     return nullptr;
9881   return getDerived().RebuildOMPAlignedClause(
9882       Vars, Alignment.get(), C->getBeginLoc(), C->getLParenLoc(),
9883       C->getColonLoc(), C->getEndLoc());
9884 }
9885 
9886 template <typename Derived>
9887 OMPClause *
9888 TreeTransform<Derived>::TransformOMPCopyinClause(OMPCopyinClause *C) {
9889   llvm::SmallVector<Expr *, 16> Vars;
9890   Vars.reserve(C->varlist_size());
9891   for (auto *VE : C->varlists()) {
9892     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9893     if (EVar.isInvalid())
9894       return nullptr;
9895     Vars.push_back(EVar.get());
9896   }
9897   return getDerived().RebuildOMPCopyinClause(Vars, C->getBeginLoc(),
9898                                              C->getLParenLoc(), C->getEndLoc());
9899 }
9900 
9901 template <typename Derived>
9902 OMPClause *
9903 TreeTransform<Derived>::TransformOMPCopyprivateClause(OMPCopyprivateClause *C) {
9904   llvm::SmallVector<Expr *, 16> Vars;
9905   Vars.reserve(C->varlist_size());
9906   for (auto *VE : C->varlists()) {
9907     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9908     if (EVar.isInvalid())
9909       return nullptr;
9910     Vars.push_back(EVar.get());
9911   }
9912   return getDerived().RebuildOMPCopyprivateClause(
9913       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9914 }
9915 
9916 template <typename Derived>
9917 OMPClause *TreeTransform<Derived>::TransformOMPFlushClause(OMPFlushClause *C) {
9918   llvm::SmallVector<Expr *, 16> Vars;
9919   Vars.reserve(C->varlist_size());
9920   for (auto *VE : C->varlists()) {
9921     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9922     if (EVar.isInvalid())
9923       return nullptr;
9924     Vars.push_back(EVar.get());
9925   }
9926   return getDerived().RebuildOMPFlushClause(Vars, C->getBeginLoc(),
9927                                             C->getLParenLoc(), C->getEndLoc());
9928 }
9929 
9930 template <typename Derived>
9931 OMPClause *
9932 TreeTransform<Derived>::TransformOMPDepobjClause(OMPDepobjClause *C) {
9933   ExprResult E = getDerived().TransformExpr(C->getDepobj());
9934   if (E.isInvalid())
9935     return nullptr;
9936   return getDerived().RebuildOMPDepobjClause(E.get(), C->getBeginLoc(),
9937                                              C->getLParenLoc(), C->getEndLoc());
9938 }
9939 
9940 template <typename Derived>
9941 OMPClause *
9942 TreeTransform<Derived>::TransformOMPDependClause(OMPDependClause *C) {
9943   llvm::SmallVector<Expr *, 16> Vars;
9944   Expr *DepModifier = C->getModifier();
9945   if (DepModifier) {
9946     ExprResult DepModRes = getDerived().TransformExpr(DepModifier);
9947     if (DepModRes.isInvalid())
9948       return nullptr;
9949     DepModifier = DepModRes.get();
9950   }
9951   Vars.reserve(C->varlist_size());
9952   for (auto *VE : C->varlists()) {
9953     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9954     if (EVar.isInvalid())
9955       return nullptr;
9956     Vars.push_back(EVar.get());
9957   }
9958   return getDerived().RebuildOMPDependClause(
9959       DepModifier, C->getDependencyKind(), C->getDependencyLoc(),
9960       C->getColonLoc(), Vars, C->getBeginLoc(), C->getLParenLoc(),
9961       C->getEndLoc());
9962 }
9963 
9964 template <typename Derived>
9965 OMPClause *
9966 TreeTransform<Derived>::TransformOMPDeviceClause(OMPDeviceClause *C) {
9967   ExprResult E = getDerived().TransformExpr(C->getDevice());
9968   if (E.isInvalid())
9969     return nullptr;
9970   return getDerived().RebuildOMPDeviceClause(
9971       C->getModifier(), E.get(), C->getBeginLoc(), C->getLParenLoc(),
9972       C->getModifierLoc(), C->getEndLoc());
9973 }
9974 
9975 template <typename Derived, class T>
9976 bool transformOMPMappableExprListClause(
9977     TreeTransform<Derived> &TT, OMPMappableExprListClause<T> *C,
9978     llvm::SmallVectorImpl<Expr *> &Vars, CXXScopeSpec &MapperIdScopeSpec,
9979     DeclarationNameInfo &MapperIdInfo,
9980     llvm::SmallVectorImpl<Expr *> &UnresolvedMappers) {
9981   // Transform expressions in the list.
9982   Vars.reserve(C->varlist_size());
9983   for (auto *VE : C->varlists()) {
9984     ExprResult EVar = TT.getDerived().TransformExpr(cast<Expr>(VE));
9985     if (EVar.isInvalid())
9986       return true;
9987     Vars.push_back(EVar.get());
9988   }
9989   // Transform mapper scope specifier and identifier.
9990   NestedNameSpecifierLoc QualifierLoc;
9991   if (C->getMapperQualifierLoc()) {
9992     QualifierLoc = TT.getDerived().TransformNestedNameSpecifierLoc(
9993         C->getMapperQualifierLoc());
9994     if (!QualifierLoc)
9995       return true;
9996   }
9997   MapperIdScopeSpec.Adopt(QualifierLoc);
9998   MapperIdInfo = C->getMapperIdInfo();
9999   if (MapperIdInfo.getName()) {
10000     MapperIdInfo = TT.getDerived().TransformDeclarationNameInfo(MapperIdInfo);
10001     if (!MapperIdInfo.getName())
10002       return true;
10003   }
10004   // Build a list of all candidate OMPDeclareMapperDecls, which is provided by
10005   // the previous user-defined mapper lookup in dependent environment.
10006   for (auto *E : C->mapperlists()) {
10007     // Transform all the decls.
10008     if (E) {
10009       auto *ULE = cast<UnresolvedLookupExpr>(E);
10010       UnresolvedSet<8> Decls;
10011       for (auto *D : ULE->decls()) {
10012         NamedDecl *InstD =
10013             cast<NamedDecl>(TT.getDerived().TransformDecl(E->getExprLoc(), D));
10014         Decls.addDecl(InstD, InstD->getAccess());
10015       }
10016       UnresolvedMappers.push_back(UnresolvedLookupExpr::Create(
10017           TT.getSema().Context, /*NamingClass=*/nullptr,
10018           MapperIdScopeSpec.getWithLocInContext(TT.getSema().Context),
10019           MapperIdInfo, /*ADL=*/true, ULE->isOverloaded(), Decls.begin(),
10020           Decls.end()));
10021     } else {
10022       UnresolvedMappers.push_back(nullptr);
10023     }
10024   }
10025   return false;
10026 }
10027 
10028 template <typename Derived>
10029 OMPClause *TreeTransform<Derived>::TransformOMPMapClause(OMPMapClause *C) {
10030   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10031   llvm::SmallVector<Expr *, 16> Vars;
10032   CXXScopeSpec MapperIdScopeSpec;
10033   DeclarationNameInfo MapperIdInfo;
10034   llvm::SmallVector<Expr *, 16> UnresolvedMappers;
10035   if (transformOMPMappableExprListClause<Derived, OMPMapClause>(
10036           *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers))
10037     return nullptr;
10038   return getDerived().RebuildOMPMapClause(
10039       C->getMapTypeModifiers(), C->getMapTypeModifiersLoc(), MapperIdScopeSpec,
10040       MapperIdInfo, C->getMapType(), C->isImplicitMapType(), C->getMapLoc(),
10041       C->getColonLoc(), Vars, Locs, UnresolvedMappers);
10042 }
10043 
10044 template <typename Derived>
10045 OMPClause *
10046 TreeTransform<Derived>::TransformOMPAllocateClause(OMPAllocateClause *C) {
10047   Expr *Allocator = C->getAllocator();
10048   if (Allocator) {
10049     ExprResult AllocatorRes = getDerived().TransformExpr(Allocator);
10050     if (AllocatorRes.isInvalid())
10051       return nullptr;
10052     Allocator = AllocatorRes.get();
10053   }
10054   llvm::SmallVector<Expr *, 16> Vars;
10055   Vars.reserve(C->varlist_size());
10056   for (auto *VE : C->varlists()) {
10057     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10058     if (EVar.isInvalid())
10059       return nullptr;
10060     Vars.push_back(EVar.get());
10061   }
10062   return getDerived().RebuildOMPAllocateClause(
10063       Allocator, Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(),
10064       C->getEndLoc());
10065 }
10066 
10067 template <typename Derived>
10068 OMPClause *
10069 TreeTransform<Derived>::TransformOMPNumTeamsClause(OMPNumTeamsClause *C) {
10070   ExprResult E = getDerived().TransformExpr(C->getNumTeams());
10071   if (E.isInvalid())
10072     return nullptr;
10073   return getDerived().RebuildOMPNumTeamsClause(
10074       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10075 }
10076 
10077 template <typename Derived>
10078 OMPClause *
10079 TreeTransform<Derived>::TransformOMPThreadLimitClause(OMPThreadLimitClause *C) {
10080   ExprResult E = getDerived().TransformExpr(C->getThreadLimit());
10081   if (E.isInvalid())
10082     return nullptr;
10083   return getDerived().RebuildOMPThreadLimitClause(
10084       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10085 }
10086 
10087 template <typename Derived>
10088 OMPClause *
10089 TreeTransform<Derived>::TransformOMPPriorityClause(OMPPriorityClause *C) {
10090   ExprResult E = getDerived().TransformExpr(C->getPriority());
10091   if (E.isInvalid())
10092     return nullptr;
10093   return getDerived().RebuildOMPPriorityClause(
10094       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10095 }
10096 
10097 template <typename Derived>
10098 OMPClause *
10099 TreeTransform<Derived>::TransformOMPGrainsizeClause(OMPGrainsizeClause *C) {
10100   ExprResult E = getDerived().TransformExpr(C->getGrainsize());
10101   if (E.isInvalid())
10102     return nullptr;
10103   return getDerived().RebuildOMPGrainsizeClause(
10104       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10105 }
10106 
10107 template <typename Derived>
10108 OMPClause *
10109 TreeTransform<Derived>::TransformOMPNumTasksClause(OMPNumTasksClause *C) {
10110   ExprResult E = getDerived().TransformExpr(C->getNumTasks());
10111   if (E.isInvalid())
10112     return nullptr;
10113   return getDerived().RebuildOMPNumTasksClause(
10114       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10115 }
10116 
10117 template <typename Derived>
10118 OMPClause *TreeTransform<Derived>::TransformOMPHintClause(OMPHintClause *C) {
10119   ExprResult E = getDerived().TransformExpr(C->getHint());
10120   if (E.isInvalid())
10121     return nullptr;
10122   return getDerived().RebuildOMPHintClause(E.get(), C->getBeginLoc(),
10123                                            C->getLParenLoc(), C->getEndLoc());
10124 }
10125 
10126 template <typename Derived>
10127 OMPClause *TreeTransform<Derived>::TransformOMPDistScheduleClause(
10128     OMPDistScheduleClause *C) {
10129   ExprResult E = getDerived().TransformExpr(C->getChunkSize());
10130   if (E.isInvalid())
10131     return nullptr;
10132   return getDerived().RebuildOMPDistScheduleClause(
10133       C->getDistScheduleKind(), E.get(), C->getBeginLoc(), C->getLParenLoc(),
10134       C->getDistScheduleKindLoc(), C->getCommaLoc(), C->getEndLoc());
10135 }
10136 
10137 template <typename Derived>
10138 OMPClause *
10139 TreeTransform<Derived>::TransformOMPDefaultmapClause(OMPDefaultmapClause *C) {
10140   // Rebuild Defaultmap Clause since we need to invoke the checking of
10141   // defaultmap(none:variable-category) after template initialization.
10142   return getDerived().RebuildOMPDefaultmapClause(C->getDefaultmapModifier(),
10143                                                  C->getDefaultmapKind(),
10144                                                  C->getBeginLoc(),
10145                                                  C->getLParenLoc(),
10146                                                  C->getDefaultmapModifierLoc(),
10147                                                  C->getDefaultmapKindLoc(),
10148                                                  C->getEndLoc());
10149 }
10150 
10151 template <typename Derived>
10152 OMPClause *TreeTransform<Derived>::TransformOMPToClause(OMPToClause *C) {
10153   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10154   llvm::SmallVector<Expr *, 16> Vars;
10155   CXXScopeSpec MapperIdScopeSpec;
10156   DeclarationNameInfo MapperIdInfo;
10157   llvm::SmallVector<Expr *, 16> UnresolvedMappers;
10158   if (transformOMPMappableExprListClause<Derived, OMPToClause>(
10159           *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers))
10160     return nullptr;
10161   return getDerived().RebuildOMPToClause(
10162       C->getMotionModifiers(), C->getMotionModifiersLoc(), MapperIdScopeSpec,
10163       MapperIdInfo, C->getColonLoc(), Vars, Locs, UnresolvedMappers);
10164 }
10165 
10166 template <typename Derived>
10167 OMPClause *TreeTransform<Derived>::TransformOMPFromClause(OMPFromClause *C) {
10168   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10169   llvm::SmallVector<Expr *, 16> Vars;
10170   CXXScopeSpec MapperIdScopeSpec;
10171   DeclarationNameInfo MapperIdInfo;
10172   llvm::SmallVector<Expr *, 16> UnresolvedMappers;
10173   if (transformOMPMappableExprListClause<Derived, OMPFromClause>(
10174           *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers))
10175     return nullptr;
10176   return getDerived().RebuildOMPFromClause(
10177       C->getMotionModifiers(), C->getMotionModifiersLoc(), MapperIdScopeSpec,
10178       MapperIdInfo, C->getColonLoc(), Vars, Locs, UnresolvedMappers);
10179 }
10180 
10181 template <typename Derived>
10182 OMPClause *TreeTransform<Derived>::TransformOMPUseDevicePtrClause(
10183     OMPUseDevicePtrClause *C) {
10184   llvm::SmallVector<Expr *, 16> Vars;
10185   Vars.reserve(C->varlist_size());
10186   for (auto *VE : C->varlists()) {
10187     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10188     if (EVar.isInvalid())
10189       return nullptr;
10190     Vars.push_back(EVar.get());
10191   }
10192   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10193   return getDerived().RebuildOMPUseDevicePtrClause(Vars, Locs);
10194 }
10195 
10196 template <typename Derived>
10197 OMPClause *TreeTransform<Derived>::TransformOMPUseDeviceAddrClause(
10198     OMPUseDeviceAddrClause *C) {
10199   llvm::SmallVector<Expr *, 16> Vars;
10200   Vars.reserve(C->varlist_size());
10201   for (auto *VE : C->varlists()) {
10202     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10203     if (EVar.isInvalid())
10204       return nullptr;
10205     Vars.push_back(EVar.get());
10206   }
10207   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10208   return getDerived().RebuildOMPUseDeviceAddrClause(Vars, Locs);
10209 }
10210 
10211 template <typename Derived>
10212 OMPClause *
10213 TreeTransform<Derived>::TransformOMPIsDevicePtrClause(OMPIsDevicePtrClause *C) {
10214   llvm::SmallVector<Expr *, 16> Vars;
10215   Vars.reserve(C->varlist_size());
10216   for (auto *VE : C->varlists()) {
10217     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10218     if (EVar.isInvalid())
10219       return nullptr;
10220     Vars.push_back(EVar.get());
10221   }
10222   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10223   return getDerived().RebuildOMPIsDevicePtrClause(Vars, Locs);
10224 }
10225 
10226 template <typename Derived>
10227 OMPClause *
10228 TreeTransform<Derived>::TransformOMPNontemporalClause(OMPNontemporalClause *C) {
10229   llvm::SmallVector<Expr *, 16> Vars;
10230   Vars.reserve(C->varlist_size());
10231   for (auto *VE : C->varlists()) {
10232     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10233     if (EVar.isInvalid())
10234       return nullptr;
10235     Vars.push_back(EVar.get());
10236   }
10237   return getDerived().RebuildOMPNontemporalClause(
10238       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10239 }
10240 
10241 template <typename Derived>
10242 OMPClause *
10243 TreeTransform<Derived>::TransformOMPInclusiveClause(OMPInclusiveClause *C) {
10244   llvm::SmallVector<Expr *, 16> Vars;
10245   Vars.reserve(C->varlist_size());
10246   for (auto *VE : C->varlists()) {
10247     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10248     if (EVar.isInvalid())
10249       return nullptr;
10250     Vars.push_back(EVar.get());
10251   }
10252   return getDerived().RebuildOMPInclusiveClause(
10253       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10254 }
10255 
10256 template <typename Derived>
10257 OMPClause *
10258 TreeTransform<Derived>::TransformOMPExclusiveClause(OMPExclusiveClause *C) {
10259   llvm::SmallVector<Expr *, 16> Vars;
10260   Vars.reserve(C->varlist_size());
10261   for (auto *VE : C->varlists()) {
10262     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10263     if (EVar.isInvalid())
10264       return nullptr;
10265     Vars.push_back(EVar.get());
10266   }
10267   return getDerived().RebuildOMPExclusiveClause(
10268       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10269 }
10270 
10271 template <typename Derived>
10272 OMPClause *TreeTransform<Derived>::TransformOMPUsesAllocatorsClause(
10273     OMPUsesAllocatorsClause *C) {
10274   SmallVector<Sema::UsesAllocatorsData, 16> Data;
10275   Data.reserve(C->getNumberOfAllocators());
10276   for (unsigned I = 0, E = C->getNumberOfAllocators(); I < E; ++I) {
10277     OMPUsesAllocatorsClause::Data D = C->getAllocatorData(I);
10278     ExprResult Allocator = getDerived().TransformExpr(D.Allocator);
10279     if (Allocator.isInvalid())
10280       continue;
10281     ExprResult AllocatorTraits;
10282     if (Expr *AT = D.AllocatorTraits) {
10283       AllocatorTraits = getDerived().TransformExpr(AT);
10284       if (AllocatorTraits.isInvalid())
10285         continue;
10286     }
10287     Sema::UsesAllocatorsData &NewD = Data.emplace_back();
10288     NewD.Allocator = Allocator.get();
10289     NewD.AllocatorTraits = AllocatorTraits.get();
10290     NewD.LParenLoc = D.LParenLoc;
10291     NewD.RParenLoc = D.RParenLoc;
10292   }
10293   return getDerived().RebuildOMPUsesAllocatorsClause(
10294       Data, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10295 }
10296 
10297 template <typename Derived>
10298 OMPClause *
10299 TreeTransform<Derived>::TransformOMPAffinityClause(OMPAffinityClause *C) {
10300   SmallVector<Expr *, 4> Locators;
10301   Locators.reserve(C->varlist_size());
10302   ExprResult ModifierRes;
10303   if (Expr *Modifier = C->getModifier()) {
10304     ModifierRes = getDerived().TransformExpr(Modifier);
10305     if (ModifierRes.isInvalid())
10306       return nullptr;
10307   }
10308   for (Expr *E : C->varlists()) {
10309     ExprResult Locator = getDerived().TransformExpr(E);
10310     if (Locator.isInvalid())
10311       continue;
10312     Locators.push_back(Locator.get());
10313   }
10314   return getDerived().RebuildOMPAffinityClause(
10315       C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(), C->getEndLoc(),
10316       ModifierRes.get(), Locators);
10317 }
10318 
10319 template <typename Derived>
10320 OMPClause *TreeTransform<Derived>::TransformOMPOrderClause(OMPOrderClause *C) {
10321   return getDerived().RebuildOMPOrderClause(C->getKind(), C->getKindKwLoc(),
10322                                             C->getBeginLoc(), C->getLParenLoc(),
10323                                             C->getEndLoc());
10324 }
10325 
10326 template <typename Derived>
10327 OMPClause *TreeTransform<Derived>::TransformOMPBindClause(OMPBindClause *C) {
10328   return getDerived().RebuildOMPBindClause(
10329       C->getBindKind(), C->getBindKindLoc(), C->getBeginLoc(),
10330       C->getLParenLoc(), C->getEndLoc());
10331 }
10332 
10333 //===----------------------------------------------------------------------===//
10334 // Expression transformation
10335 //===----------------------------------------------------------------------===//
10336 template<typename Derived>
10337 ExprResult
10338 TreeTransform<Derived>::TransformConstantExpr(ConstantExpr *E) {
10339   return TransformExpr(E->getSubExpr());
10340 }
10341 
10342 template <typename Derived>
10343 ExprResult TreeTransform<Derived>::TransformSYCLUniqueStableNameExpr(
10344     SYCLUniqueStableNameExpr *E) {
10345   if (!E->isTypeDependent())
10346     return E;
10347 
10348   TypeSourceInfo *NewT = getDerived().TransformType(E->getTypeSourceInfo());
10349 
10350   if (!NewT)
10351     return ExprError();
10352 
10353   if (!getDerived().AlwaysRebuild() && E->getTypeSourceInfo() == NewT)
10354     return E;
10355 
10356   return getDerived().RebuildSYCLUniqueStableNameExpr(
10357       E->getLocation(), E->getLParenLocation(), E->getRParenLocation(), NewT);
10358 }
10359 
10360 template<typename Derived>
10361 ExprResult
10362 TreeTransform<Derived>::TransformPredefinedExpr(PredefinedExpr *E) {
10363   if (!E->isTypeDependent())
10364     return E;
10365 
10366   return getDerived().RebuildPredefinedExpr(E->getLocation(),
10367                                             E->getIdentKind());
10368 }
10369 
10370 template<typename Derived>
10371 ExprResult
10372 TreeTransform<Derived>::TransformDeclRefExpr(DeclRefExpr *E) {
10373   NestedNameSpecifierLoc QualifierLoc;
10374   if (E->getQualifierLoc()) {
10375     QualifierLoc
10376       = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
10377     if (!QualifierLoc)
10378       return ExprError();
10379   }
10380 
10381   ValueDecl *ND
10382     = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getLocation(),
10383                                                          E->getDecl()));
10384   if (!ND)
10385     return ExprError();
10386 
10387   NamedDecl *Found = ND;
10388   if (E->getFoundDecl() != E->getDecl()) {
10389     Found = cast_or_null<NamedDecl>(
10390         getDerived().TransformDecl(E->getLocation(), E->getFoundDecl()));
10391     if (!Found)
10392       return ExprError();
10393   }
10394 
10395   DeclarationNameInfo NameInfo = E->getNameInfo();
10396   if (NameInfo.getName()) {
10397     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
10398     if (!NameInfo.getName())
10399       return ExprError();
10400   }
10401 
10402   if (!getDerived().AlwaysRebuild() &&
10403       QualifierLoc == E->getQualifierLoc() &&
10404       ND == E->getDecl() &&
10405       Found == E->getFoundDecl() &&
10406       NameInfo.getName() == E->getDecl()->getDeclName() &&
10407       !E->hasExplicitTemplateArgs()) {
10408 
10409     // Mark it referenced in the new context regardless.
10410     // FIXME: this is a bit instantiation-specific.
10411     SemaRef.MarkDeclRefReferenced(E);
10412 
10413     return E;
10414   }
10415 
10416   TemplateArgumentListInfo TransArgs, *TemplateArgs = nullptr;
10417   if (E->hasExplicitTemplateArgs()) {
10418     TemplateArgs = &TransArgs;
10419     TransArgs.setLAngleLoc(E->getLAngleLoc());
10420     TransArgs.setRAngleLoc(E->getRAngleLoc());
10421     if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
10422                                                 E->getNumTemplateArgs(),
10423                                                 TransArgs))
10424       return ExprError();
10425   }
10426 
10427   return getDerived().RebuildDeclRefExpr(QualifierLoc, ND, NameInfo,
10428                                          Found, TemplateArgs);
10429 }
10430 
10431 template<typename Derived>
10432 ExprResult
10433 TreeTransform<Derived>::TransformIntegerLiteral(IntegerLiteral *E) {
10434   return E;
10435 }
10436 
10437 template <typename Derived>
10438 ExprResult TreeTransform<Derived>::TransformFixedPointLiteral(
10439     FixedPointLiteral *E) {
10440   return E;
10441 }
10442 
10443 template<typename Derived>
10444 ExprResult
10445 TreeTransform<Derived>::TransformFloatingLiteral(FloatingLiteral *E) {
10446   return E;
10447 }
10448 
10449 template<typename Derived>
10450 ExprResult
10451 TreeTransform<Derived>::TransformImaginaryLiteral(ImaginaryLiteral *E) {
10452   return E;
10453 }
10454 
10455 template<typename Derived>
10456 ExprResult
10457 TreeTransform<Derived>::TransformStringLiteral(StringLiteral *E) {
10458   return E;
10459 }
10460 
10461 template<typename Derived>
10462 ExprResult
10463 TreeTransform<Derived>::TransformCharacterLiteral(CharacterLiteral *E) {
10464   return E;
10465 }
10466 
10467 template<typename Derived>
10468 ExprResult
10469 TreeTransform<Derived>::TransformUserDefinedLiteral(UserDefinedLiteral *E) {
10470   if (FunctionDecl *FD = E->getDirectCallee())
10471     SemaRef.MarkFunctionReferenced(E->getBeginLoc(), FD);
10472   return SemaRef.MaybeBindToTemporary(E);
10473 }
10474 
10475 template<typename Derived>
10476 ExprResult
10477 TreeTransform<Derived>::TransformGenericSelectionExpr(GenericSelectionExpr *E) {
10478   ExprResult ControllingExpr =
10479     getDerived().TransformExpr(E->getControllingExpr());
10480   if (ControllingExpr.isInvalid())
10481     return ExprError();
10482 
10483   SmallVector<Expr *, 4> AssocExprs;
10484   SmallVector<TypeSourceInfo *, 4> AssocTypes;
10485   for (const GenericSelectionExpr::Association Assoc : E->associations()) {
10486     TypeSourceInfo *TSI = Assoc.getTypeSourceInfo();
10487     if (TSI) {
10488       TypeSourceInfo *AssocType = getDerived().TransformType(TSI);
10489       if (!AssocType)
10490         return ExprError();
10491       AssocTypes.push_back(AssocType);
10492     } else {
10493       AssocTypes.push_back(nullptr);
10494     }
10495 
10496     ExprResult AssocExpr =
10497         getDerived().TransformExpr(Assoc.getAssociationExpr());
10498     if (AssocExpr.isInvalid())
10499       return ExprError();
10500     AssocExprs.push_back(AssocExpr.get());
10501   }
10502 
10503   return getDerived().RebuildGenericSelectionExpr(E->getGenericLoc(),
10504                                                   E->getDefaultLoc(),
10505                                                   E->getRParenLoc(),
10506                                                   ControllingExpr.get(),
10507                                                   AssocTypes,
10508                                                   AssocExprs);
10509 }
10510 
10511 template<typename Derived>
10512 ExprResult
10513 TreeTransform<Derived>::TransformParenExpr(ParenExpr *E) {
10514   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
10515   if (SubExpr.isInvalid())
10516     return ExprError();
10517 
10518   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr())
10519     return E;
10520 
10521   return getDerived().RebuildParenExpr(SubExpr.get(), E->getLParen(),
10522                                        E->getRParen());
10523 }
10524 
10525 /// The operand of a unary address-of operator has special rules: it's
10526 /// allowed to refer to a non-static member of a class even if there's no 'this'
10527 /// object available.
10528 template<typename Derived>
10529 ExprResult
10530 TreeTransform<Derived>::TransformAddressOfOperand(Expr *E) {
10531   if (DependentScopeDeclRefExpr *DRE = dyn_cast<DependentScopeDeclRefExpr>(E))
10532     return getDerived().TransformDependentScopeDeclRefExpr(DRE, true, nullptr);
10533   else
10534     return getDerived().TransformExpr(E);
10535 }
10536 
10537 template<typename Derived>
10538 ExprResult
10539 TreeTransform<Derived>::TransformUnaryOperator(UnaryOperator *E) {
10540   ExprResult SubExpr;
10541   if (E->getOpcode() == UO_AddrOf)
10542     SubExpr = TransformAddressOfOperand(E->getSubExpr());
10543   else
10544     SubExpr = TransformExpr(E->getSubExpr());
10545   if (SubExpr.isInvalid())
10546     return ExprError();
10547 
10548   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr())
10549     return E;
10550 
10551   return getDerived().RebuildUnaryOperator(E->getOperatorLoc(),
10552                                            E->getOpcode(),
10553                                            SubExpr.get());
10554 }
10555 
10556 template<typename Derived>
10557 ExprResult
10558 TreeTransform<Derived>::TransformOffsetOfExpr(OffsetOfExpr *E) {
10559   // Transform the type.
10560   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo());
10561   if (!Type)
10562     return ExprError();
10563 
10564   // Transform all of the components into components similar to what the
10565   // parser uses.
10566   // FIXME: It would be slightly more efficient in the non-dependent case to
10567   // just map FieldDecls, rather than requiring the rebuilder to look for
10568   // the fields again. However, __builtin_offsetof is rare enough in
10569   // template code that we don't care.
10570   bool ExprChanged = false;
10571   typedef Sema::OffsetOfComponent Component;
10572   SmallVector<Component, 4> Components;
10573   for (unsigned I = 0, N = E->getNumComponents(); I != N; ++I) {
10574     const OffsetOfNode &ON = E->getComponent(I);
10575     Component Comp;
10576     Comp.isBrackets = true;
10577     Comp.LocStart = ON.getSourceRange().getBegin();
10578     Comp.LocEnd = ON.getSourceRange().getEnd();
10579     switch (ON.getKind()) {
10580     case OffsetOfNode::Array: {
10581       Expr *FromIndex = E->getIndexExpr(ON.getArrayExprIndex());
10582       ExprResult Index = getDerived().TransformExpr(FromIndex);
10583       if (Index.isInvalid())
10584         return ExprError();
10585 
10586       ExprChanged = ExprChanged || Index.get() != FromIndex;
10587       Comp.isBrackets = true;
10588       Comp.U.E = Index.get();
10589       break;
10590     }
10591 
10592     case OffsetOfNode::Field:
10593     case OffsetOfNode::Identifier:
10594       Comp.isBrackets = false;
10595       Comp.U.IdentInfo = ON.getFieldName();
10596       if (!Comp.U.IdentInfo)
10597         continue;
10598 
10599       break;
10600 
10601     case OffsetOfNode::Base:
10602       // Will be recomputed during the rebuild.
10603       continue;
10604     }
10605 
10606     Components.push_back(Comp);
10607   }
10608 
10609   // If nothing changed, retain the existing expression.
10610   if (!getDerived().AlwaysRebuild() &&
10611       Type == E->getTypeSourceInfo() &&
10612       !ExprChanged)
10613     return E;
10614 
10615   // Build a new offsetof expression.
10616   return getDerived().RebuildOffsetOfExpr(E->getOperatorLoc(), Type,
10617                                           Components, E->getRParenLoc());
10618 }
10619 
10620 template<typename Derived>
10621 ExprResult
10622 TreeTransform<Derived>::TransformOpaqueValueExpr(OpaqueValueExpr *E) {
10623   assert((!E->getSourceExpr() || getDerived().AlreadyTransformed(E->getType())) &&
10624          "opaque value expression requires transformation");
10625   return E;
10626 }
10627 
10628 template<typename Derived>
10629 ExprResult
10630 TreeTransform<Derived>::TransformTypoExpr(TypoExpr *E) {
10631   return E;
10632 }
10633 
10634 template <typename Derived>
10635 ExprResult TreeTransform<Derived>::TransformRecoveryExpr(RecoveryExpr *E) {
10636   llvm::SmallVector<Expr *, 8> Children;
10637   bool Changed = false;
10638   for (Expr *C : E->subExpressions()) {
10639     ExprResult NewC = getDerived().TransformExpr(C);
10640     if (NewC.isInvalid())
10641       return ExprError();
10642     Children.push_back(NewC.get());
10643 
10644     Changed |= NewC.get() != C;
10645   }
10646   if (!getDerived().AlwaysRebuild() && !Changed)
10647     return E;
10648   return getDerived().RebuildRecoveryExpr(E->getBeginLoc(), E->getEndLoc(),
10649                                           Children, E->getType());
10650 }
10651 
10652 template<typename Derived>
10653 ExprResult
10654 TreeTransform<Derived>::TransformPseudoObjectExpr(PseudoObjectExpr *E) {
10655   // Rebuild the syntactic form.  The original syntactic form has
10656   // opaque-value expressions in it, so strip those away and rebuild
10657   // the result.  This is a really awful way of doing this, but the
10658   // better solution (rebuilding the semantic expressions and
10659   // rebinding OVEs as necessary) doesn't work; we'd need
10660   // TreeTransform to not strip away implicit conversions.
10661   Expr *newSyntacticForm = SemaRef.recreateSyntacticForm(E);
10662   ExprResult result = getDerived().TransformExpr(newSyntacticForm);
10663   if (result.isInvalid()) return ExprError();
10664 
10665   // If that gives us a pseudo-object result back, the pseudo-object
10666   // expression must have been an lvalue-to-rvalue conversion which we
10667   // should reapply.
10668   if (result.get()->hasPlaceholderType(BuiltinType::PseudoObject))
10669     result = SemaRef.checkPseudoObjectRValue(result.get());
10670 
10671   return result;
10672 }
10673 
10674 template<typename Derived>
10675 ExprResult
10676 TreeTransform<Derived>::TransformUnaryExprOrTypeTraitExpr(
10677                                                 UnaryExprOrTypeTraitExpr *E) {
10678   if (E->isArgumentType()) {
10679     TypeSourceInfo *OldT = E->getArgumentTypeInfo();
10680 
10681     TypeSourceInfo *NewT = getDerived().TransformType(OldT);
10682     if (!NewT)
10683       return ExprError();
10684 
10685     if (!getDerived().AlwaysRebuild() && OldT == NewT)
10686       return E;
10687 
10688     return getDerived().RebuildUnaryExprOrTypeTrait(NewT, E->getOperatorLoc(),
10689                                                     E->getKind(),
10690                                                     E->getSourceRange());
10691   }
10692 
10693   // C++0x [expr.sizeof]p1:
10694   //   The operand is either an expression, which is an unevaluated operand
10695   //   [...]
10696   EnterExpressionEvaluationContext Unevaluated(
10697       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated,
10698       Sema::ReuseLambdaContextDecl);
10699 
10700   // Try to recover if we have something like sizeof(T::X) where X is a type.
10701   // Notably, there must be *exactly* one set of parens if X is a type.
10702   TypeSourceInfo *RecoveryTSI = nullptr;
10703   ExprResult SubExpr;
10704   auto *PE = dyn_cast<ParenExpr>(E->getArgumentExpr());
10705   if (auto *DRE =
10706           PE ? dyn_cast<DependentScopeDeclRefExpr>(PE->getSubExpr()) : nullptr)
10707     SubExpr = getDerived().TransformParenDependentScopeDeclRefExpr(
10708         PE, DRE, false, &RecoveryTSI);
10709   else
10710     SubExpr = getDerived().TransformExpr(E->getArgumentExpr());
10711 
10712   if (RecoveryTSI) {
10713     return getDerived().RebuildUnaryExprOrTypeTrait(
10714         RecoveryTSI, E->getOperatorLoc(), E->getKind(), E->getSourceRange());
10715   } else if (SubExpr.isInvalid())
10716     return ExprError();
10717 
10718   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getArgumentExpr())
10719     return E;
10720 
10721   return getDerived().RebuildUnaryExprOrTypeTrait(SubExpr.get(),
10722                                                   E->getOperatorLoc(),
10723                                                   E->getKind(),
10724                                                   E->getSourceRange());
10725 }
10726 
10727 template<typename Derived>
10728 ExprResult
10729 TreeTransform<Derived>::TransformArraySubscriptExpr(ArraySubscriptExpr *E) {
10730   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
10731   if (LHS.isInvalid())
10732     return ExprError();
10733 
10734   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
10735   if (RHS.isInvalid())
10736     return ExprError();
10737 
10738 
10739   if (!getDerived().AlwaysRebuild() &&
10740       LHS.get() == E->getLHS() &&
10741       RHS.get() == E->getRHS())
10742     return E;
10743 
10744   return getDerived().RebuildArraySubscriptExpr(
10745       LHS.get(),
10746       /*FIXME:*/ E->getLHS()->getBeginLoc(), RHS.get(), E->getRBracketLoc());
10747 }
10748 
10749 template <typename Derived>
10750 ExprResult
10751 TreeTransform<Derived>::TransformMatrixSubscriptExpr(MatrixSubscriptExpr *E) {
10752   ExprResult Base = getDerived().TransformExpr(E->getBase());
10753   if (Base.isInvalid())
10754     return ExprError();
10755 
10756   ExprResult RowIdx = getDerived().TransformExpr(E->getRowIdx());
10757   if (RowIdx.isInvalid())
10758     return ExprError();
10759 
10760   ExprResult ColumnIdx = getDerived().TransformExpr(E->getColumnIdx());
10761   if (ColumnIdx.isInvalid())
10762     return ExprError();
10763 
10764   if (!getDerived().AlwaysRebuild() && Base.get() == E->getBase() &&
10765       RowIdx.get() == E->getRowIdx() && ColumnIdx.get() == E->getColumnIdx())
10766     return E;
10767 
10768   return getDerived().RebuildMatrixSubscriptExpr(
10769       Base.get(), RowIdx.get(), ColumnIdx.get(), E->getRBracketLoc());
10770 }
10771 
10772 template <typename Derived>
10773 ExprResult
10774 TreeTransform<Derived>::TransformOMPArraySectionExpr(OMPArraySectionExpr *E) {
10775   ExprResult Base = getDerived().TransformExpr(E->getBase());
10776   if (Base.isInvalid())
10777     return ExprError();
10778 
10779   ExprResult LowerBound;
10780   if (E->getLowerBound()) {
10781     LowerBound = getDerived().TransformExpr(E->getLowerBound());
10782     if (LowerBound.isInvalid())
10783       return ExprError();
10784   }
10785 
10786   ExprResult Length;
10787   if (E->getLength()) {
10788     Length = getDerived().TransformExpr(E->getLength());
10789     if (Length.isInvalid())
10790       return ExprError();
10791   }
10792 
10793   ExprResult Stride;
10794   if (Expr *Str = E->getStride()) {
10795     Stride = getDerived().TransformExpr(Str);
10796     if (Stride.isInvalid())
10797       return ExprError();
10798   }
10799 
10800   if (!getDerived().AlwaysRebuild() && Base.get() == E->getBase() &&
10801       LowerBound.get() == E->getLowerBound() && Length.get() == E->getLength())
10802     return E;
10803 
10804   return getDerived().RebuildOMPArraySectionExpr(
10805       Base.get(), E->getBase()->getEndLoc(), LowerBound.get(),
10806       E->getColonLocFirst(), E->getColonLocSecond(), Length.get(), Stride.get(),
10807       E->getRBracketLoc());
10808 }
10809 
10810 template <typename Derived>
10811 ExprResult
10812 TreeTransform<Derived>::TransformOMPArrayShapingExpr(OMPArrayShapingExpr *E) {
10813   ExprResult Base = getDerived().TransformExpr(E->getBase());
10814   if (Base.isInvalid())
10815     return ExprError();
10816 
10817   SmallVector<Expr *, 4> Dims;
10818   bool ErrorFound = false;
10819   for (Expr *Dim : E->getDimensions()) {
10820     ExprResult DimRes = getDerived().TransformExpr(Dim);
10821     if (DimRes.isInvalid()) {
10822       ErrorFound = true;
10823       continue;
10824     }
10825     Dims.push_back(DimRes.get());
10826   }
10827 
10828   if (ErrorFound)
10829     return ExprError();
10830   return getDerived().RebuildOMPArrayShapingExpr(Base.get(), E->getLParenLoc(),
10831                                                  E->getRParenLoc(), Dims,
10832                                                  E->getBracketsRanges());
10833 }
10834 
10835 template <typename Derived>
10836 ExprResult
10837 TreeTransform<Derived>::TransformOMPIteratorExpr(OMPIteratorExpr *E) {
10838   unsigned NumIterators = E->numOfIterators();
10839   SmallVector<Sema::OMPIteratorData, 4> Data(NumIterators);
10840 
10841   bool ErrorFound = false;
10842   bool NeedToRebuild = getDerived().AlwaysRebuild();
10843   for (unsigned I = 0; I < NumIterators; ++I) {
10844     auto *D = cast<VarDecl>(E->getIteratorDecl(I));
10845     Data[I].DeclIdent = D->getIdentifier();
10846     Data[I].DeclIdentLoc = D->getLocation();
10847     if (D->getLocation() == D->getBeginLoc()) {
10848       assert(SemaRef.Context.hasSameType(D->getType(), SemaRef.Context.IntTy) &&
10849              "Implicit type must be int.");
10850     } else {
10851       TypeSourceInfo *TSI = getDerived().TransformType(D->getTypeSourceInfo());
10852       QualType DeclTy = getDerived().TransformType(D->getType());
10853       Data[I].Type = SemaRef.CreateParsedType(DeclTy, TSI);
10854     }
10855     OMPIteratorExpr::IteratorRange Range = E->getIteratorRange(I);
10856     ExprResult Begin = getDerived().TransformExpr(Range.Begin);
10857     ExprResult End = getDerived().TransformExpr(Range.End);
10858     ExprResult Step = getDerived().TransformExpr(Range.Step);
10859     ErrorFound = ErrorFound ||
10860                  !(!D->getTypeSourceInfo() || (Data[I].Type.getAsOpaquePtr() &&
10861                                                !Data[I].Type.get().isNull())) ||
10862                  Begin.isInvalid() || End.isInvalid() || Step.isInvalid();
10863     if (ErrorFound)
10864       continue;
10865     Data[I].Range.Begin = Begin.get();
10866     Data[I].Range.End = End.get();
10867     Data[I].Range.Step = Step.get();
10868     Data[I].AssignLoc = E->getAssignLoc(I);
10869     Data[I].ColonLoc = E->getColonLoc(I);
10870     Data[I].SecColonLoc = E->getSecondColonLoc(I);
10871     NeedToRebuild =
10872         NeedToRebuild ||
10873         (D->getTypeSourceInfo() && Data[I].Type.get().getTypePtrOrNull() !=
10874                                        D->getType().getTypePtrOrNull()) ||
10875         Range.Begin != Data[I].Range.Begin || Range.End != Data[I].Range.End ||
10876         Range.Step != Data[I].Range.Step;
10877   }
10878   if (ErrorFound)
10879     return ExprError();
10880   if (!NeedToRebuild)
10881     return E;
10882 
10883   ExprResult Res = getDerived().RebuildOMPIteratorExpr(
10884       E->getIteratorKwLoc(), E->getLParenLoc(), E->getRParenLoc(), Data);
10885   if (!Res.isUsable())
10886     return Res;
10887   auto *IE = cast<OMPIteratorExpr>(Res.get());
10888   for (unsigned I = 0; I < NumIterators; ++I)
10889     getDerived().transformedLocalDecl(E->getIteratorDecl(I),
10890                                       IE->getIteratorDecl(I));
10891   return Res;
10892 }
10893 
10894 template<typename Derived>
10895 ExprResult
10896 TreeTransform<Derived>::TransformCallExpr(CallExpr *E) {
10897   // Transform the callee.
10898   ExprResult Callee = getDerived().TransformExpr(E->getCallee());
10899   if (Callee.isInvalid())
10900     return ExprError();
10901 
10902   // Transform arguments.
10903   bool ArgChanged = false;
10904   SmallVector<Expr*, 8> Args;
10905   if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
10906                                   &ArgChanged))
10907     return ExprError();
10908 
10909   if (!getDerived().AlwaysRebuild() &&
10910       Callee.get() == E->getCallee() &&
10911       !ArgChanged)
10912     return SemaRef.MaybeBindToTemporary(E);
10913 
10914   // FIXME: Wrong source location information for the '('.
10915   SourceLocation FakeLParenLoc
10916     = ((Expr *)Callee.get())->getSourceRange().getBegin();
10917 
10918   Sema::FPFeaturesStateRAII FPFeaturesState(getSema());
10919   if (E->hasStoredFPFeatures()) {
10920     FPOptionsOverride NewOverrides = E->getFPFeatures();
10921     getSema().CurFPFeatures =
10922         NewOverrides.applyOverrides(getSema().getLangOpts());
10923     getSema().FpPragmaStack.CurrentValue = NewOverrides;
10924   }
10925 
10926   return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc,
10927                                       Args,
10928                                       E->getRParenLoc());
10929 }
10930 
10931 template<typename Derived>
10932 ExprResult
10933 TreeTransform<Derived>::TransformMemberExpr(MemberExpr *E) {
10934   ExprResult Base = getDerived().TransformExpr(E->getBase());
10935   if (Base.isInvalid())
10936     return ExprError();
10937 
10938   NestedNameSpecifierLoc QualifierLoc;
10939   if (E->hasQualifier()) {
10940     QualifierLoc
10941       = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
10942 
10943     if (!QualifierLoc)
10944       return ExprError();
10945   }
10946   SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc();
10947 
10948   ValueDecl *Member
10949     = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getMemberLoc(),
10950                                                          E->getMemberDecl()));
10951   if (!Member)
10952     return ExprError();
10953 
10954   NamedDecl *FoundDecl = E->getFoundDecl();
10955   if (FoundDecl == E->getMemberDecl()) {
10956     FoundDecl = Member;
10957   } else {
10958     FoundDecl = cast_or_null<NamedDecl>(
10959                    getDerived().TransformDecl(E->getMemberLoc(), FoundDecl));
10960     if (!FoundDecl)
10961       return ExprError();
10962   }
10963 
10964   if (!getDerived().AlwaysRebuild() &&
10965       Base.get() == E->getBase() &&
10966       QualifierLoc == E->getQualifierLoc() &&
10967       Member == E->getMemberDecl() &&
10968       FoundDecl == E->getFoundDecl() &&
10969       !E->hasExplicitTemplateArgs()) {
10970 
10971     // Mark it referenced in the new context regardless.
10972     // FIXME: this is a bit instantiation-specific.
10973     SemaRef.MarkMemberReferenced(E);
10974 
10975     return E;
10976   }
10977 
10978   TemplateArgumentListInfo TransArgs;
10979   if (E->hasExplicitTemplateArgs()) {
10980     TransArgs.setLAngleLoc(E->getLAngleLoc());
10981     TransArgs.setRAngleLoc(E->getRAngleLoc());
10982     if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
10983                                                 E->getNumTemplateArgs(),
10984                                                 TransArgs))
10985       return ExprError();
10986   }
10987 
10988   // FIXME: Bogus source location for the operator
10989   SourceLocation FakeOperatorLoc =
10990       SemaRef.getLocForEndOfToken(E->getBase()->getSourceRange().getEnd());
10991 
10992   // FIXME: to do this check properly, we will need to preserve the
10993   // first-qualifier-in-scope here, just in case we had a dependent
10994   // base (and therefore couldn't do the check) and a
10995   // nested-name-qualifier (and therefore could do the lookup).
10996   NamedDecl *FirstQualifierInScope = nullptr;
10997   DeclarationNameInfo MemberNameInfo = E->getMemberNameInfo();
10998   if (MemberNameInfo.getName()) {
10999     MemberNameInfo = getDerived().TransformDeclarationNameInfo(MemberNameInfo);
11000     if (!MemberNameInfo.getName())
11001       return ExprError();
11002   }
11003 
11004   return getDerived().RebuildMemberExpr(Base.get(), FakeOperatorLoc,
11005                                         E->isArrow(),
11006                                         QualifierLoc,
11007                                         TemplateKWLoc,
11008                                         MemberNameInfo,
11009                                         Member,
11010                                         FoundDecl,
11011                                         (E->hasExplicitTemplateArgs()
11012                                            ? &TransArgs : nullptr),
11013                                         FirstQualifierInScope);
11014 }
11015 
11016 template<typename Derived>
11017 ExprResult
11018 TreeTransform<Derived>::TransformBinaryOperator(BinaryOperator *E) {
11019   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
11020   if (LHS.isInvalid())
11021     return ExprError();
11022 
11023   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
11024   if (RHS.isInvalid())
11025     return ExprError();
11026 
11027   if (!getDerived().AlwaysRebuild() &&
11028       LHS.get() == E->getLHS() &&
11029       RHS.get() == E->getRHS())
11030     return E;
11031 
11032   if (E->isCompoundAssignmentOp())
11033     // FPFeatures has already been established from trailing storage
11034     return getDerived().RebuildBinaryOperator(
11035         E->getOperatorLoc(), E->getOpcode(), LHS.get(), RHS.get());
11036   Sema::FPFeaturesStateRAII FPFeaturesState(getSema());
11037   FPOptionsOverride NewOverrides(E->getFPFeatures(getSema().getLangOpts()));
11038   getSema().CurFPFeatures =
11039       NewOverrides.applyOverrides(getSema().getLangOpts());
11040   getSema().FpPragmaStack.CurrentValue = NewOverrides;
11041   return getDerived().RebuildBinaryOperator(E->getOperatorLoc(), E->getOpcode(),
11042                                             LHS.get(), RHS.get());
11043 }
11044 
11045 template <typename Derived>
11046 ExprResult TreeTransform<Derived>::TransformCXXRewrittenBinaryOperator(
11047     CXXRewrittenBinaryOperator *E) {
11048   CXXRewrittenBinaryOperator::DecomposedForm Decomp = E->getDecomposedForm();
11049 
11050   ExprResult LHS = getDerived().TransformExpr(const_cast<Expr*>(Decomp.LHS));
11051   if (LHS.isInvalid())
11052     return ExprError();
11053 
11054   ExprResult RHS = getDerived().TransformExpr(const_cast<Expr*>(Decomp.RHS));
11055   if (RHS.isInvalid())
11056     return ExprError();
11057 
11058   // Extract the already-resolved callee declarations so that we can restrict
11059   // ourselves to using them as the unqualified lookup results when rebuilding.
11060   UnresolvedSet<2> UnqualLookups;
11061   bool ChangedAnyLookups = false;
11062   Expr *PossibleBinOps[] = {E->getSemanticForm(),
11063                             const_cast<Expr *>(Decomp.InnerBinOp)};
11064   for (Expr *PossibleBinOp : PossibleBinOps) {
11065     auto *Op = dyn_cast<CXXOperatorCallExpr>(PossibleBinOp->IgnoreImplicit());
11066     if (!Op)
11067       continue;
11068     auto *Callee = dyn_cast<DeclRefExpr>(Op->getCallee()->IgnoreImplicit());
11069     if (!Callee || isa<CXXMethodDecl>(Callee->getDecl()))
11070       continue;
11071 
11072     // Transform the callee in case we built a call to a local extern
11073     // declaration.
11074     NamedDecl *Found = cast_or_null<NamedDecl>(getDerived().TransformDecl(
11075         E->getOperatorLoc(), Callee->getFoundDecl()));
11076     if (!Found)
11077       return ExprError();
11078     if (Found != Callee->getFoundDecl())
11079       ChangedAnyLookups = true;
11080     UnqualLookups.addDecl(Found);
11081   }
11082 
11083   if (!getDerived().AlwaysRebuild() && !ChangedAnyLookups &&
11084       LHS.get() == Decomp.LHS && RHS.get() == Decomp.RHS) {
11085     // Mark all functions used in the rewrite as referenced. Note that when
11086     // a < b is rewritten to (a <=> b) < 0, both the <=> and the < might be
11087     // function calls, and/or there might be a user-defined conversion sequence
11088     // applied to the operands of the <.
11089     // FIXME: this is a bit instantiation-specific.
11090     const Expr *StopAt[] = {Decomp.LHS, Decomp.RHS};
11091     SemaRef.MarkDeclarationsReferencedInExpr(E, false, StopAt);
11092     return E;
11093   }
11094 
11095   return getDerived().RebuildCXXRewrittenBinaryOperator(
11096       E->getOperatorLoc(), Decomp.Opcode, UnqualLookups, LHS.get(), RHS.get());
11097 }
11098 
11099 template<typename Derived>
11100 ExprResult
11101 TreeTransform<Derived>::TransformCompoundAssignOperator(
11102                                                       CompoundAssignOperator *E) {
11103   Sema::FPFeaturesStateRAII FPFeaturesState(getSema());
11104   FPOptionsOverride NewOverrides(E->getFPFeatures(getSema().getLangOpts()));
11105   getSema().CurFPFeatures =
11106       NewOverrides.applyOverrides(getSema().getLangOpts());
11107   getSema().FpPragmaStack.CurrentValue = NewOverrides;
11108   return getDerived().TransformBinaryOperator(E);
11109 }
11110 
11111 template<typename Derived>
11112 ExprResult TreeTransform<Derived>::
11113 TransformBinaryConditionalOperator(BinaryConditionalOperator *e) {
11114   // Just rebuild the common and RHS expressions and see whether we
11115   // get any changes.
11116 
11117   ExprResult commonExpr = getDerived().TransformExpr(e->getCommon());
11118   if (commonExpr.isInvalid())
11119     return ExprError();
11120 
11121   ExprResult rhs = getDerived().TransformExpr(e->getFalseExpr());
11122   if (rhs.isInvalid())
11123     return ExprError();
11124 
11125   if (!getDerived().AlwaysRebuild() &&
11126       commonExpr.get() == e->getCommon() &&
11127       rhs.get() == e->getFalseExpr())
11128     return e;
11129 
11130   return getDerived().RebuildConditionalOperator(commonExpr.get(),
11131                                                  e->getQuestionLoc(),
11132                                                  nullptr,
11133                                                  e->getColonLoc(),
11134                                                  rhs.get());
11135 }
11136 
11137 template<typename Derived>
11138 ExprResult
11139 TreeTransform<Derived>::TransformConditionalOperator(ConditionalOperator *E) {
11140   ExprResult Cond = getDerived().TransformExpr(E->getCond());
11141   if (Cond.isInvalid())
11142     return ExprError();
11143 
11144   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
11145   if (LHS.isInvalid())
11146     return ExprError();
11147 
11148   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
11149   if (RHS.isInvalid())
11150     return ExprError();
11151 
11152   if (!getDerived().AlwaysRebuild() &&
11153       Cond.get() == E->getCond() &&
11154       LHS.get() == E->getLHS() &&
11155       RHS.get() == E->getRHS())
11156     return E;
11157 
11158   return getDerived().RebuildConditionalOperator(Cond.get(),
11159                                                  E->getQuestionLoc(),
11160                                                  LHS.get(),
11161                                                  E->getColonLoc(),
11162                                                  RHS.get());
11163 }
11164 
11165 template<typename Derived>
11166 ExprResult
11167 TreeTransform<Derived>::TransformImplicitCastExpr(ImplicitCastExpr *E) {
11168   // Implicit casts are eliminated during transformation, since they
11169   // will be recomputed by semantic analysis after transformation.
11170   return getDerived().TransformExpr(E->getSubExprAsWritten());
11171 }
11172 
11173 template<typename Derived>
11174 ExprResult
11175 TreeTransform<Derived>::TransformCStyleCastExpr(CStyleCastExpr *E) {
11176   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten());
11177   if (!Type)
11178     return ExprError();
11179 
11180   ExprResult SubExpr
11181     = getDerived().TransformExpr(E->getSubExprAsWritten());
11182   if (SubExpr.isInvalid())
11183     return ExprError();
11184 
11185   if (!getDerived().AlwaysRebuild() &&
11186       Type == E->getTypeInfoAsWritten() &&
11187       SubExpr.get() == E->getSubExpr())
11188     return E;
11189 
11190   return getDerived().RebuildCStyleCastExpr(E->getLParenLoc(),
11191                                             Type,
11192                                             E->getRParenLoc(),
11193                                             SubExpr.get());
11194 }
11195 
11196 template<typename Derived>
11197 ExprResult
11198 TreeTransform<Derived>::TransformCompoundLiteralExpr(CompoundLiteralExpr *E) {
11199   TypeSourceInfo *OldT = E->getTypeSourceInfo();
11200   TypeSourceInfo *NewT = getDerived().TransformType(OldT);
11201   if (!NewT)
11202     return ExprError();
11203 
11204   ExprResult Init = getDerived().TransformExpr(E->getInitializer());
11205   if (Init.isInvalid())
11206     return ExprError();
11207 
11208   if (!getDerived().AlwaysRebuild() &&
11209       OldT == NewT &&
11210       Init.get() == E->getInitializer())
11211     return SemaRef.MaybeBindToTemporary(E);
11212 
11213   // Note: the expression type doesn't necessarily match the
11214   // type-as-written, but that's okay, because it should always be
11215   // derivable from the initializer.
11216 
11217   return getDerived().RebuildCompoundLiteralExpr(
11218       E->getLParenLoc(), NewT,
11219       /*FIXME:*/ E->getInitializer()->getEndLoc(), Init.get());
11220 }
11221 
11222 template<typename Derived>
11223 ExprResult
11224 TreeTransform<Derived>::TransformExtVectorElementExpr(ExtVectorElementExpr *E) {
11225   ExprResult Base = getDerived().TransformExpr(E->getBase());
11226   if (Base.isInvalid())
11227     return ExprError();
11228 
11229   if (!getDerived().AlwaysRebuild() &&
11230       Base.get() == E->getBase())
11231     return E;
11232 
11233   // FIXME: Bad source location
11234   SourceLocation FakeOperatorLoc =
11235       SemaRef.getLocForEndOfToken(E->getBase()->getEndLoc());
11236   return getDerived().RebuildExtVectorElementExpr(Base.get(), FakeOperatorLoc,
11237                                                   E->getAccessorLoc(),
11238                                                   E->getAccessor());
11239 }
11240 
11241 template<typename Derived>
11242 ExprResult
11243 TreeTransform<Derived>::TransformInitListExpr(InitListExpr *E) {
11244   if (InitListExpr *Syntactic = E->getSyntacticForm())
11245     E = Syntactic;
11246 
11247   bool InitChanged = false;
11248 
11249   EnterExpressionEvaluationContext Context(
11250       getSema(), EnterExpressionEvaluationContext::InitList);
11251 
11252   SmallVector<Expr*, 4> Inits;
11253   if (getDerived().TransformExprs(E->getInits(), E->getNumInits(), false,
11254                                   Inits, &InitChanged))
11255     return ExprError();
11256 
11257   if (!getDerived().AlwaysRebuild() && !InitChanged) {
11258     // FIXME: Attempt to reuse the existing syntactic form of the InitListExpr
11259     // in some cases. We can't reuse it in general, because the syntactic and
11260     // semantic forms are linked, and we can't know that semantic form will
11261     // match even if the syntactic form does.
11262   }
11263 
11264   return getDerived().RebuildInitList(E->getLBraceLoc(), Inits,
11265                                       E->getRBraceLoc());
11266 }
11267 
11268 template<typename Derived>
11269 ExprResult
11270 TreeTransform<Derived>::TransformDesignatedInitExpr(DesignatedInitExpr *E) {
11271   Designation Desig;
11272 
11273   // transform the initializer value
11274   ExprResult Init = getDerived().TransformExpr(E->getInit());
11275   if (Init.isInvalid())
11276     return ExprError();
11277 
11278   // transform the designators.
11279   SmallVector<Expr*, 4> ArrayExprs;
11280   bool ExprChanged = false;
11281   for (const DesignatedInitExpr::Designator &D : E->designators()) {
11282     if (D.isFieldDesignator()) {
11283       Desig.AddDesignator(Designator::getField(D.getFieldName(),
11284                                                D.getDotLoc(),
11285                                                D.getFieldLoc()));
11286       if (D.getField()) {
11287         FieldDecl *Field = cast_or_null<FieldDecl>(
11288             getDerived().TransformDecl(D.getFieldLoc(), D.getField()));
11289         if (Field != D.getField())
11290           // Rebuild the expression when the transformed FieldDecl is
11291           // different to the already assigned FieldDecl.
11292           ExprChanged = true;
11293       } else {
11294         // Ensure that the designator expression is rebuilt when there isn't
11295         // a resolved FieldDecl in the designator as we don't want to assign
11296         // a FieldDecl to a pattern designator that will be instantiated again.
11297         ExprChanged = true;
11298       }
11299       continue;
11300     }
11301 
11302     if (D.isArrayDesignator()) {
11303       ExprResult Index = getDerived().TransformExpr(E->getArrayIndex(D));
11304       if (Index.isInvalid())
11305         return ExprError();
11306 
11307       Desig.AddDesignator(
11308           Designator::getArray(Index.get(), D.getLBracketLoc()));
11309 
11310       ExprChanged = ExprChanged || Init.get() != E->getArrayIndex(D);
11311       ArrayExprs.push_back(Index.get());
11312       continue;
11313     }
11314 
11315     assert(D.isArrayRangeDesignator() && "New kind of designator?");
11316     ExprResult Start
11317       = getDerived().TransformExpr(E->getArrayRangeStart(D));
11318     if (Start.isInvalid())
11319       return ExprError();
11320 
11321     ExprResult End = getDerived().TransformExpr(E->getArrayRangeEnd(D));
11322     if (End.isInvalid())
11323       return ExprError();
11324 
11325     Desig.AddDesignator(Designator::getArrayRange(Start.get(),
11326                                                   End.get(),
11327                                                   D.getLBracketLoc(),
11328                                                   D.getEllipsisLoc()));
11329 
11330     ExprChanged = ExprChanged || Start.get() != E->getArrayRangeStart(D) ||
11331                   End.get() != E->getArrayRangeEnd(D);
11332 
11333     ArrayExprs.push_back(Start.get());
11334     ArrayExprs.push_back(End.get());
11335   }
11336 
11337   if (!getDerived().AlwaysRebuild() &&
11338       Init.get() == E->getInit() &&
11339       !ExprChanged)
11340     return E;
11341 
11342   return getDerived().RebuildDesignatedInitExpr(Desig, ArrayExprs,
11343                                                 E->getEqualOrColonLoc(),
11344                                                 E->usesGNUSyntax(), Init.get());
11345 }
11346 
11347 // Seems that if TransformInitListExpr() only works on the syntactic form of an
11348 // InitListExpr, then a DesignatedInitUpdateExpr is not encountered.
11349 template<typename Derived>
11350 ExprResult
11351 TreeTransform<Derived>::TransformDesignatedInitUpdateExpr(
11352     DesignatedInitUpdateExpr *E) {
11353   llvm_unreachable("Unexpected DesignatedInitUpdateExpr in syntactic form of "
11354                    "initializer");
11355   return ExprError();
11356 }
11357 
11358 template<typename Derived>
11359 ExprResult
11360 TreeTransform<Derived>::TransformNoInitExpr(
11361     NoInitExpr *E) {
11362   llvm_unreachable("Unexpected NoInitExpr in syntactic form of initializer");
11363   return ExprError();
11364 }
11365 
11366 template<typename Derived>
11367 ExprResult
11368 TreeTransform<Derived>::TransformArrayInitLoopExpr(ArrayInitLoopExpr *E) {
11369   llvm_unreachable("Unexpected ArrayInitLoopExpr outside of initializer");
11370   return ExprError();
11371 }
11372 
11373 template<typename Derived>
11374 ExprResult
11375 TreeTransform<Derived>::TransformArrayInitIndexExpr(ArrayInitIndexExpr *E) {
11376   llvm_unreachable("Unexpected ArrayInitIndexExpr outside of initializer");
11377   return ExprError();
11378 }
11379 
11380 template<typename Derived>
11381 ExprResult
11382 TreeTransform<Derived>::TransformImplicitValueInitExpr(
11383                                                      ImplicitValueInitExpr *E) {
11384   TemporaryBase Rebase(*this, E->getBeginLoc(), DeclarationName());
11385 
11386   // FIXME: Will we ever have proper type location here? Will we actually
11387   // need to transform the type?
11388   QualType T = getDerived().TransformType(E->getType());
11389   if (T.isNull())
11390     return ExprError();
11391 
11392   if (!getDerived().AlwaysRebuild() &&
11393       T == E->getType())
11394     return E;
11395 
11396   return getDerived().RebuildImplicitValueInitExpr(T);
11397 }
11398 
11399 template<typename Derived>
11400 ExprResult
11401 TreeTransform<Derived>::TransformVAArgExpr(VAArgExpr *E) {
11402   TypeSourceInfo *TInfo = getDerived().TransformType(E->getWrittenTypeInfo());
11403   if (!TInfo)
11404     return ExprError();
11405 
11406   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
11407   if (SubExpr.isInvalid())
11408     return ExprError();
11409 
11410   if (!getDerived().AlwaysRebuild() &&
11411       TInfo == E->getWrittenTypeInfo() &&
11412       SubExpr.get() == E->getSubExpr())
11413     return E;
11414 
11415   return getDerived().RebuildVAArgExpr(E->getBuiltinLoc(), SubExpr.get(),
11416                                        TInfo, E->getRParenLoc());
11417 }
11418 
11419 template<typename Derived>
11420 ExprResult
11421 TreeTransform<Derived>::TransformParenListExpr(ParenListExpr *E) {
11422   bool ArgumentChanged = false;
11423   SmallVector<Expr*, 4> Inits;
11424   if (TransformExprs(E->getExprs(), E->getNumExprs(), true, Inits,
11425                      &ArgumentChanged))
11426     return ExprError();
11427 
11428   return getDerived().RebuildParenListExpr(E->getLParenLoc(),
11429                                            Inits,
11430                                            E->getRParenLoc());
11431 }
11432 
11433 /// Transform an address-of-label expression.
11434 ///
11435 /// By default, the transformation of an address-of-label expression always
11436 /// rebuilds the expression, so that the label identifier can be resolved to
11437 /// the corresponding label statement by semantic analysis.
11438 template<typename Derived>
11439 ExprResult
11440 TreeTransform<Derived>::TransformAddrLabelExpr(AddrLabelExpr *E) {
11441   Decl *LD = getDerived().TransformDecl(E->getLabel()->getLocation(),
11442                                         E->getLabel());
11443   if (!LD)
11444     return ExprError();
11445 
11446   return getDerived().RebuildAddrLabelExpr(E->getAmpAmpLoc(), E->getLabelLoc(),
11447                                            cast<LabelDecl>(LD));
11448 }
11449 
11450 template<typename Derived>
11451 ExprResult
11452 TreeTransform<Derived>::TransformStmtExpr(StmtExpr *E) {
11453   SemaRef.ActOnStartStmtExpr();
11454   StmtResult SubStmt
11455     = getDerived().TransformCompoundStmt(E->getSubStmt(), true);
11456   if (SubStmt.isInvalid()) {
11457     SemaRef.ActOnStmtExprError();
11458     return ExprError();
11459   }
11460 
11461   unsigned OldDepth = E->getTemplateDepth();
11462   unsigned NewDepth = getDerived().TransformTemplateDepth(OldDepth);
11463 
11464   if (!getDerived().AlwaysRebuild() && OldDepth == NewDepth &&
11465       SubStmt.get() == E->getSubStmt()) {
11466     // Calling this an 'error' is unintuitive, but it does the right thing.
11467     SemaRef.ActOnStmtExprError();
11468     return SemaRef.MaybeBindToTemporary(E);
11469   }
11470 
11471   return getDerived().RebuildStmtExpr(E->getLParenLoc(), SubStmt.get(),
11472                                       E->getRParenLoc(), NewDepth);
11473 }
11474 
11475 template<typename Derived>
11476 ExprResult
11477 TreeTransform<Derived>::TransformChooseExpr(ChooseExpr *E) {
11478   ExprResult Cond = getDerived().TransformExpr(E->getCond());
11479   if (Cond.isInvalid())
11480     return ExprError();
11481 
11482   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
11483   if (LHS.isInvalid())
11484     return ExprError();
11485 
11486   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
11487   if (RHS.isInvalid())
11488     return ExprError();
11489 
11490   if (!getDerived().AlwaysRebuild() &&
11491       Cond.get() == E->getCond() &&
11492       LHS.get() == E->getLHS() &&
11493       RHS.get() == E->getRHS())
11494     return E;
11495 
11496   return getDerived().RebuildChooseExpr(E->getBuiltinLoc(),
11497                                         Cond.get(), LHS.get(), RHS.get(),
11498                                         E->getRParenLoc());
11499 }
11500 
11501 template<typename Derived>
11502 ExprResult
11503 TreeTransform<Derived>::TransformGNUNullExpr(GNUNullExpr *E) {
11504   return E;
11505 }
11506 
11507 template<typename Derived>
11508 ExprResult
11509 TreeTransform<Derived>::TransformCXXOperatorCallExpr(CXXOperatorCallExpr *E) {
11510   switch (E->getOperator()) {
11511   case OO_New:
11512   case OO_Delete:
11513   case OO_Array_New:
11514   case OO_Array_Delete:
11515     llvm_unreachable("new and delete operators cannot use CXXOperatorCallExpr");
11516 
11517   case OO_Subscript:
11518   case OO_Call: {
11519     // This is a call to an object's operator().
11520     assert(E->getNumArgs() >= 1 && "Object call is missing arguments");
11521 
11522     // Transform the object itself.
11523     ExprResult Object = getDerived().TransformExpr(E->getArg(0));
11524     if (Object.isInvalid())
11525       return ExprError();
11526 
11527     // FIXME: Poor location information
11528     SourceLocation FakeLParenLoc = SemaRef.getLocForEndOfToken(
11529         static_cast<Expr *>(Object.get())->getEndLoc());
11530 
11531     // Transform the call arguments.
11532     SmallVector<Expr*, 8> Args;
11533     if (getDerived().TransformExprs(E->getArgs() + 1, E->getNumArgs() - 1, true,
11534                                     Args))
11535       return ExprError();
11536 
11537     if (E->getOperator() == OO_Subscript)
11538       return getDerived().RebuildCxxSubscriptExpr(Object.get(), FakeLParenLoc,
11539                                                   Args, E->getEndLoc());
11540 
11541     return getDerived().RebuildCallExpr(Object.get(), FakeLParenLoc, Args,
11542                                         E->getEndLoc());
11543   }
11544 
11545 #define OVERLOADED_OPERATOR(Name, Spelling, Token, Unary, Binary, MemberOnly)  \
11546   case OO_##Name:                                                              \
11547     break;
11548 
11549 #define OVERLOADED_OPERATOR_MULTI(Name,Spelling,Unary,Binary,MemberOnly)
11550 #include "clang/Basic/OperatorKinds.def"
11551 
11552   case OO_Conditional:
11553     llvm_unreachable("conditional operator is not actually overloadable");
11554 
11555   case OO_None:
11556   case NUM_OVERLOADED_OPERATORS:
11557     llvm_unreachable("not an overloaded operator?");
11558   }
11559 
11560   ExprResult Callee = getDerived().TransformExpr(E->getCallee());
11561   if (Callee.isInvalid())
11562     return ExprError();
11563 
11564   ExprResult First;
11565   if (E->getOperator() == OO_Amp)
11566     First = getDerived().TransformAddressOfOperand(E->getArg(0));
11567   else
11568     First = getDerived().TransformExpr(E->getArg(0));
11569   if (First.isInvalid())
11570     return ExprError();
11571 
11572   ExprResult Second;
11573   if (E->getNumArgs() == 2) {
11574     Second = getDerived().TransformExpr(E->getArg(1));
11575     if (Second.isInvalid())
11576       return ExprError();
11577   }
11578 
11579   if (!getDerived().AlwaysRebuild() &&
11580       Callee.get() == E->getCallee() &&
11581       First.get() == E->getArg(0) &&
11582       (E->getNumArgs() != 2 || Second.get() == E->getArg(1)))
11583     return SemaRef.MaybeBindToTemporary(E);
11584 
11585   Sema::FPFeaturesStateRAII FPFeaturesState(getSema());
11586   FPOptionsOverride NewOverrides(E->getFPFeatures());
11587   getSema().CurFPFeatures =
11588       NewOverrides.applyOverrides(getSema().getLangOpts());
11589   getSema().FpPragmaStack.CurrentValue = NewOverrides;
11590 
11591   return getDerived().RebuildCXXOperatorCallExpr(E->getOperator(),
11592                                                  E->getOperatorLoc(),
11593                                                  Callee.get(),
11594                                                  First.get(),
11595                                                  Second.get());
11596 }
11597 
11598 template<typename Derived>
11599 ExprResult
11600 TreeTransform<Derived>::TransformCXXMemberCallExpr(CXXMemberCallExpr *E) {
11601   return getDerived().TransformCallExpr(E);
11602 }
11603 
11604 template <typename Derived>
11605 ExprResult TreeTransform<Derived>::TransformSourceLocExpr(SourceLocExpr *E) {
11606   bool NeedRebuildFunc = E->getIdentKind() == SourceLocExpr::Function &&
11607                          getSema().CurContext != E->getParentContext();
11608 
11609   if (!getDerived().AlwaysRebuild() && !NeedRebuildFunc)
11610     return E;
11611 
11612   return getDerived().RebuildSourceLocExpr(E->getIdentKind(), E->getBeginLoc(),
11613                                            E->getEndLoc(),
11614                                            getSema().CurContext);
11615 }
11616 
11617 template<typename Derived>
11618 ExprResult
11619 TreeTransform<Derived>::TransformCUDAKernelCallExpr(CUDAKernelCallExpr *E) {
11620   // Transform the callee.
11621   ExprResult Callee = getDerived().TransformExpr(E->getCallee());
11622   if (Callee.isInvalid())
11623     return ExprError();
11624 
11625   // Transform exec config.
11626   ExprResult EC = getDerived().TransformCallExpr(E->getConfig());
11627   if (EC.isInvalid())
11628     return ExprError();
11629 
11630   // Transform arguments.
11631   bool ArgChanged = false;
11632   SmallVector<Expr*, 8> Args;
11633   if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
11634                                   &ArgChanged))
11635     return ExprError();
11636 
11637   if (!getDerived().AlwaysRebuild() &&
11638       Callee.get() == E->getCallee() &&
11639       !ArgChanged)
11640     return SemaRef.MaybeBindToTemporary(E);
11641 
11642   // FIXME: Wrong source location information for the '('.
11643   SourceLocation FakeLParenLoc
11644     = ((Expr *)Callee.get())->getSourceRange().getBegin();
11645   return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc,
11646                                       Args,
11647                                       E->getRParenLoc(), EC.get());
11648 }
11649 
11650 template<typename Derived>
11651 ExprResult
11652 TreeTransform<Derived>::TransformCXXNamedCastExpr(CXXNamedCastExpr *E) {
11653   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten());
11654   if (!Type)
11655     return ExprError();
11656 
11657   ExprResult SubExpr
11658     = getDerived().TransformExpr(E->getSubExprAsWritten());
11659   if (SubExpr.isInvalid())
11660     return ExprError();
11661 
11662   if (!getDerived().AlwaysRebuild() &&
11663       Type == E->getTypeInfoAsWritten() &&
11664       SubExpr.get() == E->getSubExpr())
11665     return E;
11666   return getDerived().RebuildCXXNamedCastExpr(
11667       E->getOperatorLoc(), E->getStmtClass(), E->getAngleBrackets().getBegin(),
11668       Type, E->getAngleBrackets().getEnd(),
11669       // FIXME. this should be '(' location
11670       E->getAngleBrackets().getEnd(), SubExpr.get(), E->getRParenLoc());
11671 }
11672 
11673 template<typename Derived>
11674 ExprResult
11675 TreeTransform<Derived>::TransformBuiltinBitCastExpr(BuiltinBitCastExpr *BCE) {
11676   TypeSourceInfo *TSI =
11677       getDerived().TransformType(BCE->getTypeInfoAsWritten());
11678   if (!TSI)
11679     return ExprError();
11680 
11681   ExprResult Sub = getDerived().TransformExpr(BCE->getSubExpr());
11682   if (Sub.isInvalid())
11683     return ExprError();
11684 
11685   return getDerived().RebuildBuiltinBitCastExpr(BCE->getBeginLoc(), TSI,
11686                                                 Sub.get(), BCE->getEndLoc());
11687 }
11688 
11689 template<typename Derived>
11690 ExprResult
11691 TreeTransform<Derived>::TransformCXXStaticCastExpr(CXXStaticCastExpr *E) {
11692   return getDerived().TransformCXXNamedCastExpr(E);
11693 }
11694 
11695 template<typename Derived>
11696 ExprResult
11697 TreeTransform<Derived>::TransformCXXDynamicCastExpr(CXXDynamicCastExpr *E) {
11698   return getDerived().TransformCXXNamedCastExpr(E);
11699 }
11700 
11701 template<typename Derived>
11702 ExprResult
11703 TreeTransform<Derived>::TransformCXXReinterpretCastExpr(
11704                                                       CXXReinterpretCastExpr *E) {
11705   return getDerived().TransformCXXNamedCastExpr(E);
11706 }
11707 
11708 template<typename Derived>
11709 ExprResult
11710 TreeTransform<Derived>::TransformCXXConstCastExpr(CXXConstCastExpr *E) {
11711   return getDerived().TransformCXXNamedCastExpr(E);
11712 }
11713 
11714 template<typename Derived>
11715 ExprResult
11716 TreeTransform<Derived>::TransformCXXAddrspaceCastExpr(CXXAddrspaceCastExpr *E) {
11717   return getDerived().TransformCXXNamedCastExpr(E);
11718 }
11719 
11720 template<typename Derived>
11721 ExprResult
11722 TreeTransform<Derived>::TransformCXXFunctionalCastExpr(
11723                                                      CXXFunctionalCastExpr *E) {
11724   TypeSourceInfo *Type =
11725       getDerived().TransformTypeWithDeducedTST(E->getTypeInfoAsWritten());
11726   if (!Type)
11727     return ExprError();
11728 
11729   ExprResult SubExpr
11730     = getDerived().TransformExpr(E->getSubExprAsWritten());
11731   if (SubExpr.isInvalid())
11732     return ExprError();
11733 
11734   if (!getDerived().AlwaysRebuild() &&
11735       Type == E->getTypeInfoAsWritten() &&
11736       SubExpr.get() == E->getSubExpr())
11737     return E;
11738 
11739   return getDerived().RebuildCXXFunctionalCastExpr(Type,
11740                                                    E->getLParenLoc(),
11741                                                    SubExpr.get(),
11742                                                    E->getRParenLoc(),
11743                                                    E->isListInitialization());
11744 }
11745 
11746 template<typename Derived>
11747 ExprResult
11748 TreeTransform<Derived>::TransformCXXTypeidExpr(CXXTypeidExpr *E) {
11749   if (E->isTypeOperand()) {
11750     TypeSourceInfo *TInfo
11751       = getDerived().TransformType(E->getTypeOperandSourceInfo());
11752     if (!TInfo)
11753       return ExprError();
11754 
11755     if (!getDerived().AlwaysRebuild() &&
11756         TInfo == E->getTypeOperandSourceInfo())
11757       return E;
11758 
11759     return getDerived().RebuildCXXTypeidExpr(E->getType(), E->getBeginLoc(),
11760                                              TInfo, E->getEndLoc());
11761   }
11762 
11763   // Typeid's operand is an unevaluated context, unless it's a polymorphic
11764   // type.  We must not unilaterally enter unevaluated context here, as then
11765   // semantic processing can re-transform an already transformed operand.
11766   Expr *Op = E->getExprOperand();
11767   auto EvalCtx = Sema::ExpressionEvaluationContext::Unevaluated;
11768   if (E->isGLValue())
11769     if (auto *RecordT = Op->getType()->getAs<RecordType>())
11770       if (cast<CXXRecordDecl>(RecordT->getDecl())->isPolymorphic())
11771         EvalCtx = SemaRef.ExprEvalContexts.back().Context;
11772 
11773   EnterExpressionEvaluationContext Unevaluated(SemaRef, EvalCtx,
11774                                                Sema::ReuseLambdaContextDecl);
11775 
11776   ExprResult SubExpr = getDerived().TransformExpr(Op);
11777   if (SubExpr.isInvalid())
11778     return ExprError();
11779 
11780   if (!getDerived().AlwaysRebuild() &&
11781       SubExpr.get() == E->getExprOperand())
11782     return E;
11783 
11784   return getDerived().RebuildCXXTypeidExpr(E->getType(), E->getBeginLoc(),
11785                                            SubExpr.get(), E->getEndLoc());
11786 }
11787 
11788 template<typename Derived>
11789 ExprResult
11790 TreeTransform<Derived>::TransformCXXUuidofExpr(CXXUuidofExpr *E) {
11791   if (E->isTypeOperand()) {
11792     TypeSourceInfo *TInfo
11793       = getDerived().TransformType(E->getTypeOperandSourceInfo());
11794     if (!TInfo)
11795       return ExprError();
11796 
11797     if (!getDerived().AlwaysRebuild() &&
11798         TInfo == E->getTypeOperandSourceInfo())
11799       return E;
11800 
11801     return getDerived().RebuildCXXUuidofExpr(E->getType(), E->getBeginLoc(),
11802                                              TInfo, E->getEndLoc());
11803   }
11804 
11805   EnterExpressionEvaluationContext Unevaluated(
11806       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
11807 
11808   ExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand());
11809   if (SubExpr.isInvalid())
11810     return ExprError();
11811 
11812   if (!getDerived().AlwaysRebuild() &&
11813       SubExpr.get() == E->getExprOperand())
11814     return E;
11815 
11816   return getDerived().RebuildCXXUuidofExpr(E->getType(), E->getBeginLoc(),
11817                                            SubExpr.get(), E->getEndLoc());
11818 }
11819 
11820 template<typename Derived>
11821 ExprResult
11822 TreeTransform<Derived>::TransformCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) {
11823   return E;
11824 }
11825 
11826 template<typename Derived>
11827 ExprResult
11828 TreeTransform<Derived>::TransformCXXNullPtrLiteralExpr(
11829                                                      CXXNullPtrLiteralExpr *E) {
11830   return E;
11831 }
11832 
11833 template<typename Derived>
11834 ExprResult
11835 TreeTransform<Derived>::TransformCXXThisExpr(CXXThisExpr *E) {
11836   QualType T = getSema().getCurrentThisType();
11837 
11838   if (!getDerived().AlwaysRebuild() && T == E->getType()) {
11839     // Mark it referenced in the new context regardless.
11840     // FIXME: this is a bit instantiation-specific.
11841     getSema().MarkThisReferenced(E);
11842     return E;
11843   }
11844 
11845   return getDerived().RebuildCXXThisExpr(E->getBeginLoc(), T, E->isImplicit());
11846 }
11847 
11848 template<typename Derived>
11849 ExprResult
11850 TreeTransform<Derived>::TransformCXXThrowExpr(CXXThrowExpr *E) {
11851   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
11852   if (SubExpr.isInvalid())
11853     return ExprError();
11854 
11855   if (!getDerived().AlwaysRebuild() &&
11856       SubExpr.get() == E->getSubExpr())
11857     return E;
11858 
11859   return getDerived().RebuildCXXThrowExpr(E->getThrowLoc(), SubExpr.get(),
11860                                           E->isThrownVariableInScope());
11861 }
11862 
11863 template<typename Derived>
11864 ExprResult
11865 TreeTransform<Derived>::TransformCXXDefaultArgExpr(CXXDefaultArgExpr *E) {
11866   ParmVarDecl *Param = cast_or_null<ParmVarDecl>(
11867       getDerived().TransformDecl(E->getBeginLoc(), E->getParam()));
11868   if (!Param)
11869     return ExprError();
11870 
11871   if (!getDerived().AlwaysRebuild() && Param == E->getParam() &&
11872       E->getUsedContext() == SemaRef.CurContext)
11873     return E;
11874 
11875   return getDerived().RebuildCXXDefaultArgExpr(E->getUsedLocation(), Param);
11876 }
11877 
11878 template<typename Derived>
11879 ExprResult
11880 TreeTransform<Derived>::TransformCXXDefaultInitExpr(CXXDefaultInitExpr *E) {
11881   FieldDecl *Field = cast_or_null<FieldDecl>(
11882       getDerived().TransformDecl(E->getBeginLoc(), E->getField()));
11883   if (!Field)
11884     return ExprError();
11885 
11886   if (!getDerived().AlwaysRebuild() && Field == E->getField() &&
11887       E->getUsedContext() == SemaRef.CurContext)
11888     return E;
11889 
11890   return getDerived().RebuildCXXDefaultInitExpr(E->getExprLoc(), Field);
11891 }
11892 
11893 template<typename Derived>
11894 ExprResult
11895 TreeTransform<Derived>::TransformCXXScalarValueInitExpr(
11896                                                     CXXScalarValueInitExpr *E) {
11897   TypeSourceInfo *T = getDerived().TransformType(E->getTypeSourceInfo());
11898   if (!T)
11899     return ExprError();
11900 
11901   if (!getDerived().AlwaysRebuild() &&
11902       T == E->getTypeSourceInfo())
11903     return E;
11904 
11905   return getDerived().RebuildCXXScalarValueInitExpr(T,
11906                                           /*FIXME:*/T->getTypeLoc().getEndLoc(),
11907                                                     E->getRParenLoc());
11908 }
11909 
11910 template<typename Derived>
11911 ExprResult
11912 TreeTransform<Derived>::TransformCXXNewExpr(CXXNewExpr *E) {
11913   // Transform the type that we're allocating
11914   TypeSourceInfo *AllocTypeInfo =
11915       getDerived().TransformTypeWithDeducedTST(E->getAllocatedTypeSourceInfo());
11916   if (!AllocTypeInfo)
11917     return ExprError();
11918 
11919   // Transform the size of the array we're allocating (if any).
11920   Optional<Expr *> ArraySize;
11921   if (Optional<Expr *> OldArraySize = E->getArraySize()) {
11922     ExprResult NewArraySize;
11923     if (*OldArraySize) {
11924       NewArraySize = getDerived().TransformExpr(*OldArraySize);
11925       if (NewArraySize.isInvalid())
11926         return ExprError();
11927     }
11928     ArraySize = NewArraySize.get();
11929   }
11930 
11931   // Transform the placement arguments (if any).
11932   bool ArgumentChanged = false;
11933   SmallVector<Expr*, 8> PlacementArgs;
11934   if (getDerived().TransformExprs(E->getPlacementArgs(),
11935                                   E->getNumPlacementArgs(), true,
11936                                   PlacementArgs, &ArgumentChanged))
11937     return ExprError();
11938 
11939   // Transform the initializer (if any).
11940   Expr *OldInit = E->getInitializer();
11941   ExprResult NewInit;
11942   if (OldInit)
11943     NewInit = getDerived().TransformInitializer(OldInit, true);
11944   if (NewInit.isInvalid())
11945     return ExprError();
11946 
11947   // Transform new operator and delete operator.
11948   FunctionDecl *OperatorNew = nullptr;
11949   if (E->getOperatorNew()) {
11950     OperatorNew = cast_or_null<FunctionDecl>(
11951         getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorNew()));
11952     if (!OperatorNew)
11953       return ExprError();
11954   }
11955 
11956   FunctionDecl *OperatorDelete = nullptr;
11957   if (E->getOperatorDelete()) {
11958     OperatorDelete = cast_or_null<FunctionDecl>(
11959         getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorDelete()));
11960     if (!OperatorDelete)
11961       return ExprError();
11962   }
11963 
11964   if (!getDerived().AlwaysRebuild() &&
11965       AllocTypeInfo == E->getAllocatedTypeSourceInfo() &&
11966       ArraySize == E->getArraySize() &&
11967       NewInit.get() == OldInit &&
11968       OperatorNew == E->getOperatorNew() &&
11969       OperatorDelete == E->getOperatorDelete() &&
11970       !ArgumentChanged) {
11971     // Mark any declarations we need as referenced.
11972     // FIXME: instantiation-specific.
11973     if (OperatorNew)
11974       SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorNew);
11975     if (OperatorDelete)
11976       SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorDelete);
11977 
11978     if (E->isArray() && !E->getAllocatedType()->isDependentType()) {
11979       QualType ElementType
11980         = SemaRef.Context.getBaseElementType(E->getAllocatedType());
11981       if (const RecordType *RecordT = ElementType->getAs<RecordType>()) {
11982         CXXRecordDecl *Record = cast<CXXRecordDecl>(RecordT->getDecl());
11983         if (CXXDestructorDecl *Destructor = SemaRef.LookupDestructor(Record)) {
11984           SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Destructor);
11985         }
11986       }
11987     }
11988 
11989     return E;
11990   }
11991 
11992   QualType AllocType = AllocTypeInfo->getType();
11993   if (!ArraySize) {
11994     // If no array size was specified, but the new expression was
11995     // instantiated with an array type (e.g., "new T" where T is
11996     // instantiated with "int[4]"), extract the outer bound from the
11997     // array type as our array size. We do this with constant and
11998     // dependently-sized array types.
11999     const ArrayType *ArrayT = SemaRef.Context.getAsArrayType(AllocType);
12000     if (!ArrayT) {
12001       // Do nothing
12002     } else if (const ConstantArrayType *ConsArrayT
12003                                      = dyn_cast<ConstantArrayType>(ArrayT)) {
12004       ArraySize = IntegerLiteral::Create(SemaRef.Context, ConsArrayT->getSize(),
12005                                          SemaRef.Context.getSizeType(),
12006                                          /*FIXME:*/ E->getBeginLoc());
12007       AllocType = ConsArrayT->getElementType();
12008     } else if (const DependentSizedArrayType *DepArrayT
12009                               = dyn_cast<DependentSizedArrayType>(ArrayT)) {
12010       if (DepArrayT->getSizeExpr()) {
12011         ArraySize = DepArrayT->getSizeExpr();
12012         AllocType = DepArrayT->getElementType();
12013       }
12014     }
12015   }
12016 
12017   return getDerived().RebuildCXXNewExpr(
12018       E->getBeginLoc(), E->isGlobalNew(),
12019       /*FIXME:*/ E->getBeginLoc(), PlacementArgs,
12020       /*FIXME:*/ E->getBeginLoc(), E->getTypeIdParens(), AllocType,
12021       AllocTypeInfo, ArraySize, E->getDirectInitRange(), NewInit.get());
12022 }
12023 
12024 template<typename Derived>
12025 ExprResult
12026 TreeTransform<Derived>::TransformCXXDeleteExpr(CXXDeleteExpr *E) {
12027   ExprResult Operand = getDerived().TransformExpr(E->getArgument());
12028   if (Operand.isInvalid())
12029     return ExprError();
12030 
12031   // Transform the delete operator, if known.
12032   FunctionDecl *OperatorDelete = nullptr;
12033   if (E->getOperatorDelete()) {
12034     OperatorDelete = cast_or_null<FunctionDecl>(
12035         getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorDelete()));
12036     if (!OperatorDelete)
12037       return ExprError();
12038   }
12039 
12040   if (!getDerived().AlwaysRebuild() &&
12041       Operand.get() == E->getArgument() &&
12042       OperatorDelete == E->getOperatorDelete()) {
12043     // Mark any declarations we need as referenced.
12044     // FIXME: instantiation-specific.
12045     if (OperatorDelete)
12046       SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorDelete);
12047 
12048     if (!E->getArgument()->isTypeDependent()) {
12049       QualType Destroyed = SemaRef.Context.getBaseElementType(
12050                                                          E->getDestroyedType());
12051       if (const RecordType *DestroyedRec = Destroyed->getAs<RecordType>()) {
12052         CXXRecordDecl *Record = cast<CXXRecordDecl>(DestroyedRec->getDecl());
12053         SemaRef.MarkFunctionReferenced(E->getBeginLoc(),
12054                                        SemaRef.LookupDestructor(Record));
12055       }
12056     }
12057 
12058     return E;
12059   }
12060 
12061   return getDerived().RebuildCXXDeleteExpr(
12062       E->getBeginLoc(), E->isGlobalDelete(), E->isArrayForm(), Operand.get());
12063 }
12064 
12065 template<typename Derived>
12066 ExprResult
12067 TreeTransform<Derived>::TransformCXXPseudoDestructorExpr(
12068                                                      CXXPseudoDestructorExpr *E) {
12069   ExprResult Base = getDerived().TransformExpr(E->getBase());
12070   if (Base.isInvalid())
12071     return ExprError();
12072 
12073   ParsedType ObjectTypePtr;
12074   bool MayBePseudoDestructor = false;
12075   Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(),
12076                                               E->getOperatorLoc(),
12077                                         E->isArrow()? tok::arrow : tok::period,
12078                                               ObjectTypePtr,
12079                                               MayBePseudoDestructor);
12080   if (Base.isInvalid())
12081     return ExprError();
12082 
12083   QualType ObjectType = ObjectTypePtr.get();
12084   NestedNameSpecifierLoc QualifierLoc = E->getQualifierLoc();
12085   if (QualifierLoc) {
12086     QualifierLoc
12087       = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc, ObjectType);
12088     if (!QualifierLoc)
12089       return ExprError();
12090   }
12091   CXXScopeSpec SS;
12092   SS.Adopt(QualifierLoc);
12093 
12094   PseudoDestructorTypeStorage Destroyed;
12095   if (E->getDestroyedTypeInfo()) {
12096     TypeSourceInfo *DestroyedTypeInfo
12097       = getDerived().TransformTypeInObjectScope(E->getDestroyedTypeInfo(),
12098                                                 ObjectType, nullptr, SS);
12099     if (!DestroyedTypeInfo)
12100       return ExprError();
12101     Destroyed = DestroyedTypeInfo;
12102   } else if (!ObjectType.isNull() && ObjectType->isDependentType()) {
12103     // We aren't likely to be able to resolve the identifier down to a type
12104     // now anyway, so just retain the identifier.
12105     Destroyed = PseudoDestructorTypeStorage(E->getDestroyedTypeIdentifier(),
12106                                             E->getDestroyedTypeLoc());
12107   } else {
12108     // Look for a destructor known with the given name.
12109     ParsedType T = SemaRef.getDestructorName(E->getTildeLoc(),
12110                                               *E->getDestroyedTypeIdentifier(),
12111                                                 E->getDestroyedTypeLoc(),
12112                                                 /*Scope=*/nullptr,
12113                                                 SS, ObjectTypePtr,
12114                                                 false);
12115     if (!T)
12116       return ExprError();
12117 
12118     Destroyed
12119       = SemaRef.Context.getTrivialTypeSourceInfo(SemaRef.GetTypeFromParser(T),
12120                                                  E->getDestroyedTypeLoc());
12121   }
12122 
12123   TypeSourceInfo *ScopeTypeInfo = nullptr;
12124   if (E->getScopeTypeInfo()) {
12125     CXXScopeSpec EmptySS;
12126     ScopeTypeInfo = getDerived().TransformTypeInObjectScope(
12127                       E->getScopeTypeInfo(), ObjectType, nullptr, EmptySS);
12128     if (!ScopeTypeInfo)
12129       return ExprError();
12130   }
12131 
12132   return getDerived().RebuildCXXPseudoDestructorExpr(Base.get(),
12133                                                      E->getOperatorLoc(),
12134                                                      E->isArrow(),
12135                                                      SS,
12136                                                      ScopeTypeInfo,
12137                                                      E->getColonColonLoc(),
12138                                                      E->getTildeLoc(),
12139                                                      Destroyed);
12140 }
12141 
12142 template <typename Derived>
12143 bool TreeTransform<Derived>::TransformOverloadExprDecls(OverloadExpr *Old,
12144                                                         bool RequiresADL,
12145                                                         LookupResult &R) {
12146   // Transform all the decls.
12147   bool AllEmptyPacks = true;
12148   for (auto *OldD : Old->decls()) {
12149     Decl *InstD = getDerived().TransformDecl(Old->getNameLoc(), OldD);
12150     if (!InstD) {
12151       // Silently ignore these if a UsingShadowDecl instantiated to nothing.
12152       // This can happen because of dependent hiding.
12153       if (isa<UsingShadowDecl>(OldD))
12154         continue;
12155       else {
12156         R.clear();
12157         return true;
12158       }
12159     }
12160 
12161     // Expand using pack declarations.
12162     NamedDecl *SingleDecl = cast<NamedDecl>(InstD);
12163     ArrayRef<NamedDecl*> Decls = SingleDecl;
12164     if (auto *UPD = dyn_cast<UsingPackDecl>(InstD))
12165       Decls = UPD->expansions();
12166 
12167     // Expand using declarations.
12168     for (auto *D : Decls) {
12169       if (auto *UD = dyn_cast<UsingDecl>(D)) {
12170         for (auto *SD : UD->shadows())
12171           R.addDecl(SD);
12172       } else {
12173         R.addDecl(D);
12174       }
12175     }
12176 
12177     AllEmptyPacks &= Decls.empty();
12178   };
12179 
12180   // C++ [temp.res]/8.4.2:
12181   //   The program is ill-formed, no diagnostic required, if [...] lookup for
12182   //   a name in the template definition found a using-declaration, but the
12183   //   lookup in the corresponding scope in the instantiation odoes not find
12184   //   any declarations because the using-declaration was a pack expansion and
12185   //   the corresponding pack is empty
12186   if (AllEmptyPacks && !RequiresADL) {
12187     getSema().Diag(Old->getNameLoc(), diag::err_using_pack_expansion_empty)
12188         << isa<UnresolvedMemberExpr>(Old) << Old->getName();
12189     return true;
12190   }
12191 
12192   // Resolve a kind, but don't do any further analysis.  If it's
12193   // ambiguous, the callee needs to deal with it.
12194   R.resolveKind();
12195   return false;
12196 }
12197 
12198 template<typename Derived>
12199 ExprResult
12200 TreeTransform<Derived>::TransformUnresolvedLookupExpr(
12201                                                   UnresolvedLookupExpr *Old) {
12202   LookupResult R(SemaRef, Old->getName(), Old->getNameLoc(),
12203                  Sema::LookupOrdinaryName);
12204 
12205   // Transform the declaration set.
12206   if (TransformOverloadExprDecls(Old, Old->requiresADL(), R))
12207     return ExprError();
12208 
12209   // Rebuild the nested-name qualifier, if present.
12210   CXXScopeSpec SS;
12211   if (Old->getQualifierLoc()) {
12212     NestedNameSpecifierLoc QualifierLoc
12213       = getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc());
12214     if (!QualifierLoc)
12215       return ExprError();
12216 
12217     SS.Adopt(QualifierLoc);
12218   }
12219 
12220   if (Old->getNamingClass()) {
12221     CXXRecordDecl *NamingClass
12222       = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl(
12223                                                             Old->getNameLoc(),
12224                                                         Old->getNamingClass()));
12225     if (!NamingClass) {
12226       R.clear();
12227       return ExprError();
12228     }
12229 
12230     R.setNamingClass(NamingClass);
12231   }
12232 
12233   SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc();
12234 
12235   // If we have neither explicit template arguments, nor the template keyword,
12236   // it's a normal declaration name or member reference.
12237   if (!Old->hasExplicitTemplateArgs() && !TemplateKWLoc.isValid()) {
12238     NamedDecl *D = R.getAsSingle<NamedDecl>();
12239     // In a C++11 unevaluated context, an UnresolvedLookupExpr might refer to an
12240     // instance member. In other contexts, BuildPossibleImplicitMemberExpr will
12241     // give a good diagnostic.
12242     if (D && D->isCXXInstanceMember()) {
12243       return SemaRef.BuildPossibleImplicitMemberExpr(SS, TemplateKWLoc, R,
12244                                                      /*TemplateArgs=*/nullptr,
12245                                                      /*Scope=*/nullptr);
12246     }
12247 
12248     return getDerived().RebuildDeclarationNameExpr(SS, R, Old->requiresADL());
12249   }
12250 
12251   // If we have template arguments, rebuild them, then rebuild the
12252   // templateid expression.
12253   TemplateArgumentListInfo TransArgs(Old->getLAngleLoc(), Old->getRAngleLoc());
12254   if (Old->hasExplicitTemplateArgs() &&
12255       getDerived().TransformTemplateArguments(Old->getTemplateArgs(),
12256                                               Old->getNumTemplateArgs(),
12257                                               TransArgs)) {
12258     R.clear();
12259     return ExprError();
12260   }
12261 
12262   return getDerived().RebuildTemplateIdExpr(SS, TemplateKWLoc, R,
12263                                             Old->requiresADL(), &TransArgs);
12264 }
12265 
12266 template<typename Derived>
12267 ExprResult
12268 TreeTransform<Derived>::TransformTypeTraitExpr(TypeTraitExpr *E) {
12269   bool ArgChanged = false;
12270   SmallVector<TypeSourceInfo *, 4> Args;
12271   for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) {
12272     TypeSourceInfo *From = E->getArg(I);
12273     TypeLoc FromTL = From->getTypeLoc();
12274     if (!FromTL.getAs<PackExpansionTypeLoc>()) {
12275       TypeLocBuilder TLB;
12276       TLB.reserve(FromTL.getFullDataSize());
12277       QualType To = getDerived().TransformType(TLB, FromTL);
12278       if (To.isNull())
12279         return ExprError();
12280 
12281       if (To == From->getType())
12282         Args.push_back(From);
12283       else {
12284         Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
12285         ArgChanged = true;
12286       }
12287       continue;
12288     }
12289 
12290     ArgChanged = true;
12291 
12292     // We have a pack expansion. Instantiate it.
12293     PackExpansionTypeLoc ExpansionTL = FromTL.castAs<PackExpansionTypeLoc>();
12294     TypeLoc PatternTL = ExpansionTL.getPatternLoc();
12295     SmallVector<UnexpandedParameterPack, 2> Unexpanded;
12296     SemaRef.collectUnexpandedParameterPacks(PatternTL, Unexpanded);
12297 
12298     // Determine whether the set of unexpanded parameter packs can and should
12299     // be expanded.
12300     bool Expand = true;
12301     bool RetainExpansion = false;
12302     Optional<unsigned> OrigNumExpansions =
12303         ExpansionTL.getTypePtr()->getNumExpansions();
12304     Optional<unsigned> NumExpansions = OrigNumExpansions;
12305     if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(),
12306                                              PatternTL.getSourceRange(),
12307                                              Unexpanded,
12308                                              Expand, RetainExpansion,
12309                                              NumExpansions))
12310       return ExprError();
12311 
12312     if (!Expand) {
12313       // The transform has determined that we should perform a simple
12314       // transformation on the pack expansion, producing another pack
12315       // expansion.
12316       Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
12317 
12318       TypeLocBuilder TLB;
12319       TLB.reserve(From->getTypeLoc().getFullDataSize());
12320 
12321       QualType To = getDerived().TransformType(TLB, PatternTL);
12322       if (To.isNull())
12323         return ExprError();
12324 
12325       To = getDerived().RebuildPackExpansionType(To,
12326                                                  PatternTL.getSourceRange(),
12327                                                  ExpansionTL.getEllipsisLoc(),
12328                                                  NumExpansions);
12329       if (To.isNull())
12330         return ExprError();
12331 
12332       PackExpansionTypeLoc ToExpansionTL
12333         = TLB.push<PackExpansionTypeLoc>(To);
12334       ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc());
12335       Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
12336       continue;
12337     }
12338 
12339     // Expand the pack expansion by substituting for each argument in the
12340     // pack(s).
12341     for (unsigned I = 0; I != *NumExpansions; ++I) {
12342       Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(SemaRef, I);
12343       TypeLocBuilder TLB;
12344       TLB.reserve(PatternTL.getFullDataSize());
12345       QualType To = getDerived().TransformType(TLB, PatternTL);
12346       if (To.isNull())
12347         return ExprError();
12348 
12349       if (To->containsUnexpandedParameterPack()) {
12350         To = getDerived().RebuildPackExpansionType(To,
12351                                                    PatternTL.getSourceRange(),
12352                                                    ExpansionTL.getEllipsisLoc(),
12353                                                    NumExpansions);
12354         if (To.isNull())
12355           return ExprError();
12356 
12357         PackExpansionTypeLoc ToExpansionTL
12358           = TLB.push<PackExpansionTypeLoc>(To);
12359         ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc());
12360       }
12361 
12362       Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
12363     }
12364 
12365     if (!RetainExpansion)
12366       continue;
12367 
12368     // If we're supposed to retain a pack expansion, do so by temporarily
12369     // forgetting the partially-substituted parameter pack.
12370     ForgetPartiallySubstitutedPackRAII Forget(getDerived());
12371 
12372     TypeLocBuilder TLB;
12373     TLB.reserve(From->getTypeLoc().getFullDataSize());
12374 
12375     QualType To = getDerived().TransformType(TLB, PatternTL);
12376     if (To.isNull())
12377       return ExprError();
12378 
12379     To = getDerived().RebuildPackExpansionType(To,
12380                                                PatternTL.getSourceRange(),
12381                                                ExpansionTL.getEllipsisLoc(),
12382                                                NumExpansions);
12383     if (To.isNull())
12384       return ExprError();
12385 
12386     PackExpansionTypeLoc ToExpansionTL
12387       = TLB.push<PackExpansionTypeLoc>(To);
12388     ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc());
12389     Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
12390   }
12391 
12392   if (!getDerived().AlwaysRebuild() && !ArgChanged)
12393     return E;
12394 
12395   return getDerived().RebuildTypeTrait(E->getTrait(), E->getBeginLoc(), Args,
12396                                        E->getEndLoc());
12397 }
12398 
12399 template<typename Derived>
12400 ExprResult
12401 TreeTransform<Derived>::TransformConceptSpecializationExpr(
12402                                                  ConceptSpecializationExpr *E) {
12403   const ASTTemplateArgumentListInfo *Old = E->getTemplateArgsAsWritten();
12404   TemplateArgumentListInfo TransArgs(Old->LAngleLoc, Old->RAngleLoc);
12405   if (getDerived().TransformTemplateArguments(Old->getTemplateArgs(),
12406                                               Old->NumTemplateArgs, TransArgs))
12407     return ExprError();
12408 
12409   return getDerived().RebuildConceptSpecializationExpr(
12410       E->getNestedNameSpecifierLoc(), E->getTemplateKWLoc(),
12411       E->getConceptNameInfo(), E->getFoundDecl(), E->getNamedConcept(),
12412       &TransArgs);
12413 }
12414 
12415 template<typename Derived>
12416 ExprResult
12417 TreeTransform<Derived>::TransformRequiresExpr(RequiresExpr *E) {
12418   SmallVector<ParmVarDecl*, 4> TransParams;
12419   SmallVector<QualType, 4> TransParamTypes;
12420   Sema::ExtParameterInfoBuilder ExtParamInfos;
12421 
12422   // C++2a [expr.prim.req]p2
12423   // Expressions appearing within a requirement-body are unevaluated operands.
12424   EnterExpressionEvaluationContext Ctx(
12425       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
12426 
12427   RequiresExprBodyDecl *Body = RequiresExprBodyDecl::Create(
12428       getSema().Context, getSema().CurContext,
12429       E->getBody()->getBeginLoc());
12430 
12431   Sema::ContextRAII SavedContext(getSema(), Body, /*NewThisContext*/false);
12432 
12433   if (getDerived().TransformFunctionTypeParams(E->getRequiresKWLoc(),
12434                                                E->getLocalParameters(),
12435                                                /*ParamTypes=*/nullptr,
12436                                                /*ParamInfos=*/nullptr,
12437                                                TransParamTypes, &TransParams,
12438                                                ExtParamInfos))
12439     return ExprError();
12440 
12441   for (ParmVarDecl *Param : TransParams)
12442     Param->setDeclContext(Body);
12443 
12444   SmallVector<concepts::Requirement *, 4> TransReqs;
12445   if (getDerived().TransformRequiresExprRequirements(E->getRequirements(),
12446                                                      TransReqs))
12447     return ExprError();
12448 
12449   for (concepts::Requirement *Req : TransReqs) {
12450     if (auto *ER = dyn_cast<concepts::ExprRequirement>(Req)) {
12451       if (ER->getReturnTypeRequirement().isTypeConstraint()) {
12452         ER->getReturnTypeRequirement()
12453                 .getTypeConstraintTemplateParameterList()->getParam(0)
12454                 ->setDeclContext(Body);
12455       }
12456     }
12457   }
12458 
12459   return getDerived().RebuildRequiresExpr(E->getRequiresKWLoc(), Body,
12460                                           TransParams, TransReqs,
12461                                           E->getRBraceLoc());
12462 }
12463 
12464 template<typename Derived>
12465 bool TreeTransform<Derived>::TransformRequiresExprRequirements(
12466     ArrayRef<concepts::Requirement *> Reqs,
12467     SmallVectorImpl<concepts::Requirement *> &Transformed) {
12468   for (concepts::Requirement *Req : Reqs) {
12469     concepts::Requirement *TransReq = nullptr;
12470     if (auto *TypeReq = dyn_cast<concepts::TypeRequirement>(Req))
12471       TransReq = getDerived().TransformTypeRequirement(TypeReq);
12472     else if (auto *ExprReq = dyn_cast<concepts::ExprRequirement>(Req))
12473       TransReq = getDerived().TransformExprRequirement(ExprReq);
12474     else
12475       TransReq = getDerived().TransformNestedRequirement(
12476                      cast<concepts::NestedRequirement>(Req));
12477     if (!TransReq)
12478       return true;
12479     Transformed.push_back(TransReq);
12480   }
12481   return false;
12482 }
12483 
12484 template<typename Derived>
12485 concepts::TypeRequirement *
12486 TreeTransform<Derived>::TransformTypeRequirement(
12487     concepts::TypeRequirement *Req) {
12488   if (Req->isSubstitutionFailure()) {
12489     if (getDerived().AlwaysRebuild())
12490       return getDerived().RebuildTypeRequirement(
12491               Req->getSubstitutionDiagnostic());
12492     return Req;
12493   }
12494   TypeSourceInfo *TransType = getDerived().TransformType(Req->getType());
12495   if (!TransType)
12496     return nullptr;
12497   return getDerived().RebuildTypeRequirement(TransType);
12498 }
12499 
12500 template<typename Derived>
12501 concepts::ExprRequirement *
12502 TreeTransform<Derived>::TransformExprRequirement(concepts::ExprRequirement *Req) {
12503   llvm::PointerUnion<Expr *, concepts::Requirement::SubstitutionDiagnostic *> TransExpr;
12504   if (Req->isExprSubstitutionFailure())
12505     TransExpr = Req->getExprSubstitutionDiagnostic();
12506   else {
12507     ExprResult TransExprRes = getDerived().TransformExpr(Req->getExpr());
12508     if (TransExprRes.isUsable() && TransExprRes.get()->hasPlaceholderType())
12509       TransExprRes = SemaRef.CheckPlaceholderExpr(TransExprRes.get());
12510     if (TransExprRes.isInvalid())
12511       return nullptr;
12512     TransExpr = TransExprRes.get();
12513   }
12514 
12515   llvm::Optional<concepts::ExprRequirement::ReturnTypeRequirement> TransRetReq;
12516   const auto &RetReq = Req->getReturnTypeRequirement();
12517   if (RetReq.isEmpty())
12518     TransRetReq.emplace();
12519   else if (RetReq.isSubstitutionFailure())
12520     TransRetReq.emplace(RetReq.getSubstitutionDiagnostic());
12521   else if (RetReq.isTypeConstraint()) {
12522     TemplateParameterList *OrigTPL =
12523         RetReq.getTypeConstraintTemplateParameterList();
12524     TemplateParameterList *TPL =
12525         getDerived().TransformTemplateParameterList(OrigTPL);
12526     if (!TPL)
12527       return nullptr;
12528     TransRetReq.emplace(TPL);
12529   }
12530   assert(TransRetReq.hasValue() &&
12531          "All code paths leading here must set TransRetReq");
12532   if (Expr *E = TransExpr.dyn_cast<Expr *>())
12533     return getDerived().RebuildExprRequirement(E, Req->isSimple(),
12534                                                Req->getNoexceptLoc(),
12535                                                std::move(*TransRetReq));
12536   return getDerived().RebuildExprRequirement(
12537       TransExpr.get<concepts::Requirement::SubstitutionDiagnostic *>(),
12538       Req->isSimple(), Req->getNoexceptLoc(), std::move(*TransRetReq));
12539 }
12540 
12541 template<typename Derived>
12542 concepts::NestedRequirement *
12543 TreeTransform<Derived>::TransformNestedRequirement(
12544     concepts::NestedRequirement *Req) {
12545   if (Req->isSubstitutionFailure()) {
12546     if (getDerived().AlwaysRebuild())
12547       return getDerived().RebuildNestedRequirement(
12548           Req->getSubstitutionDiagnostic());
12549     return Req;
12550   }
12551   ExprResult TransConstraint =
12552       getDerived().TransformExpr(Req->getConstraintExpr());
12553   if (TransConstraint.isInvalid())
12554     return nullptr;
12555   return getDerived().RebuildNestedRequirement(TransConstraint.get());
12556 }
12557 
12558 template<typename Derived>
12559 ExprResult
12560 TreeTransform<Derived>::TransformArrayTypeTraitExpr(ArrayTypeTraitExpr *E) {
12561   TypeSourceInfo *T = getDerived().TransformType(E->getQueriedTypeSourceInfo());
12562   if (!T)
12563     return ExprError();
12564 
12565   if (!getDerived().AlwaysRebuild() &&
12566       T == E->getQueriedTypeSourceInfo())
12567     return E;
12568 
12569   ExprResult SubExpr;
12570   {
12571     EnterExpressionEvaluationContext Unevaluated(
12572         SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
12573     SubExpr = getDerived().TransformExpr(E->getDimensionExpression());
12574     if (SubExpr.isInvalid())
12575       return ExprError();
12576 
12577     if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getDimensionExpression())
12578       return E;
12579   }
12580 
12581   return getDerived().RebuildArrayTypeTrait(E->getTrait(), E->getBeginLoc(), T,
12582                                             SubExpr.get(), E->getEndLoc());
12583 }
12584 
12585 template<typename Derived>
12586 ExprResult
12587 TreeTransform<Derived>::TransformExpressionTraitExpr(ExpressionTraitExpr *E) {
12588   ExprResult SubExpr;
12589   {
12590     EnterExpressionEvaluationContext Unevaluated(
12591         SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
12592     SubExpr = getDerived().TransformExpr(E->getQueriedExpression());
12593     if (SubExpr.isInvalid())
12594       return ExprError();
12595 
12596     if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getQueriedExpression())
12597       return E;
12598   }
12599 
12600   return getDerived().RebuildExpressionTrait(E->getTrait(), E->getBeginLoc(),
12601                                              SubExpr.get(), E->getEndLoc());
12602 }
12603 
12604 template <typename Derived>
12605 ExprResult TreeTransform<Derived>::TransformParenDependentScopeDeclRefExpr(
12606     ParenExpr *PE, DependentScopeDeclRefExpr *DRE, bool AddrTaken,
12607     TypeSourceInfo **RecoveryTSI) {
12608   ExprResult NewDRE = getDerived().TransformDependentScopeDeclRefExpr(
12609       DRE, AddrTaken, RecoveryTSI);
12610 
12611   // Propagate both errors and recovered types, which return ExprEmpty.
12612   if (!NewDRE.isUsable())
12613     return NewDRE;
12614 
12615   // We got an expr, wrap it up in parens.
12616   if (!getDerived().AlwaysRebuild() && NewDRE.get() == DRE)
12617     return PE;
12618   return getDerived().RebuildParenExpr(NewDRE.get(), PE->getLParen(),
12619                                        PE->getRParen());
12620 }
12621 
12622 template <typename Derived>
12623 ExprResult TreeTransform<Derived>::TransformDependentScopeDeclRefExpr(
12624     DependentScopeDeclRefExpr *E) {
12625   return TransformDependentScopeDeclRefExpr(E, /*IsAddressOfOperand=*/false,
12626                                             nullptr);
12627 }
12628 
12629 template <typename Derived>
12630 ExprResult TreeTransform<Derived>::TransformDependentScopeDeclRefExpr(
12631     DependentScopeDeclRefExpr *E, bool IsAddressOfOperand,
12632     TypeSourceInfo **RecoveryTSI) {
12633   assert(E->getQualifierLoc());
12634   NestedNameSpecifierLoc QualifierLoc =
12635       getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
12636   if (!QualifierLoc)
12637     return ExprError();
12638   SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc();
12639 
12640   // TODO: If this is a conversion-function-id, verify that the
12641   // destination type name (if present) resolves the same way after
12642   // instantiation as it did in the local scope.
12643 
12644   DeclarationNameInfo NameInfo =
12645       getDerived().TransformDeclarationNameInfo(E->getNameInfo());
12646   if (!NameInfo.getName())
12647     return ExprError();
12648 
12649   if (!E->hasExplicitTemplateArgs()) {
12650     if (!getDerived().AlwaysRebuild() && QualifierLoc == E->getQualifierLoc() &&
12651         // Note: it is sufficient to compare the Name component of NameInfo:
12652         // if name has not changed, DNLoc has not changed either.
12653         NameInfo.getName() == E->getDeclName())
12654       return E;
12655 
12656     return getDerived().RebuildDependentScopeDeclRefExpr(
12657         QualifierLoc, TemplateKWLoc, NameInfo, /*TemplateArgs=*/nullptr,
12658         IsAddressOfOperand, RecoveryTSI);
12659   }
12660 
12661   TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc());
12662   if (getDerived().TransformTemplateArguments(
12663           E->getTemplateArgs(), E->getNumTemplateArgs(), TransArgs))
12664     return ExprError();
12665 
12666   return getDerived().RebuildDependentScopeDeclRefExpr(
12667       QualifierLoc, TemplateKWLoc, NameInfo, &TransArgs, IsAddressOfOperand,
12668       RecoveryTSI);
12669 }
12670 
12671 template<typename Derived>
12672 ExprResult
12673 TreeTransform<Derived>::TransformCXXConstructExpr(CXXConstructExpr *E) {
12674   // CXXConstructExprs other than for list-initialization and
12675   // CXXTemporaryObjectExpr are always implicit, so when we have
12676   // a 1-argument construction we just transform that argument.
12677   if (getDerived().AllowSkippingCXXConstructExpr() &&
12678       ((E->getNumArgs() == 1 ||
12679         (E->getNumArgs() > 1 && getDerived().DropCallArgument(E->getArg(1)))) &&
12680        (!getDerived().DropCallArgument(E->getArg(0))) &&
12681        !E->isListInitialization()))
12682     return getDerived().TransformInitializer(E->getArg(0),
12683                                              /*DirectInit*/ false);
12684 
12685   TemporaryBase Rebase(*this, /*FIXME*/ E->getBeginLoc(), DeclarationName());
12686 
12687   QualType T = getDerived().TransformType(E->getType());
12688   if (T.isNull())
12689     return ExprError();
12690 
12691   CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>(
12692       getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor()));
12693   if (!Constructor)
12694     return ExprError();
12695 
12696   bool ArgumentChanged = false;
12697   SmallVector<Expr*, 8> Args;
12698   {
12699     EnterExpressionEvaluationContext Context(
12700         getSema(), EnterExpressionEvaluationContext::InitList,
12701         E->isListInitialization());
12702     if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
12703                                     &ArgumentChanged))
12704       return ExprError();
12705   }
12706 
12707   if (!getDerived().AlwaysRebuild() &&
12708       T == E->getType() &&
12709       Constructor == E->getConstructor() &&
12710       !ArgumentChanged) {
12711     // Mark the constructor as referenced.
12712     // FIXME: Instantiation-specific
12713     SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor);
12714     return E;
12715   }
12716 
12717   return getDerived().RebuildCXXConstructExpr(
12718       T, /*FIXME:*/ E->getBeginLoc(), Constructor, E->isElidable(), Args,
12719       E->hadMultipleCandidates(), E->isListInitialization(),
12720       E->isStdInitListInitialization(), E->requiresZeroInitialization(),
12721       E->getConstructionKind(), E->getParenOrBraceRange());
12722 }
12723 
12724 template<typename Derived>
12725 ExprResult TreeTransform<Derived>::TransformCXXInheritedCtorInitExpr(
12726     CXXInheritedCtorInitExpr *E) {
12727   QualType T = getDerived().TransformType(E->getType());
12728   if (T.isNull())
12729     return ExprError();
12730 
12731   CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>(
12732       getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor()));
12733   if (!Constructor)
12734     return ExprError();
12735 
12736   if (!getDerived().AlwaysRebuild() &&
12737       T == E->getType() &&
12738       Constructor == E->getConstructor()) {
12739     // Mark the constructor as referenced.
12740     // FIXME: Instantiation-specific
12741     SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor);
12742     return E;
12743   }
12744 
12745   return getDerived().RebuildCXXInheritedCtorInitExpr(
12746       T, E->getLocation(), Constructor,
12747       E->constructsVBase(), E->inheritedFromVBase());
12748 }
12749 
12750 /// Transform a C++ temporary-binding expression.
12751 ///
12752 /// Since CXXBindTemporaryExpr nodes are implicitly generated, we just
12753 /// transform the subexpression and return that.
12754 template<typename Derived>
12755 ExprResult
12756 TreeTransform<Derived>::TransformCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) {
12757   return getDerived().TransformExpr(E->getSubExpr());
12758 }
12759 
12760 /// Transform a C++ expression that contains cleanups that should
12761 /// be run after the expression is evaluated.
12762 ///
12763 /// Since ExprWithCleanups nodes are implicitly generated, we
12764 /// just transform the subexpression and return that.
12765 template<typename Derived>
12766 ExprResult
12767 TreeTransform<Derived>::TransformExprWithCleanups(ExprWithCleanups *E) {
12768   return getDerived().TransformExpr(E->getSubExpr());
12769 }
12770 
12771 template<typename Derived>
12772 ExprResult
12773 TreeTransform<Derived>::TransformCXXTemporaryObjectExpr(
12774                                                     CXXTemporaryObjectExpr *E) {
12775   TypeSourceInfo *T =
12776       getDerived().TransformTypeWithDeducedTST(E->getTypeSourceInfo());
12777   if (!T)
12778     return ExprError();
12779 
12780   CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>(
12781       getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor()));
12782   if (!Constructor)
12783     return ExprError();
12784 
12785   bool ArgumentChanged = false;
12786   SmallVector<Expr*, 8> Args;
12787   Args.reserve(E->getNumArgs());
12788   {
12789     EnterExpressionEvaluationContext Context(
12790         getSema(), EnterExpressionEvaluationContext::InitList,
12791         E->isListInitialization());
12792     if (TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
12793                        &ArgumentChanged))
12794       return ExprError();
12795   }
12796 
12797   if (!getDerived().AlwaysRebuild() &&
12798       T == E->getTypeSourceInfo() &&
12799       Constructor == E->getConstructor() &&
12800       !ArgumentChanged) {
12801     // FIXME: Instantiation-specific
12802     SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor);
12803     return SemaRef.MaybeBindToTemporary(E);
12804   }
12805 
12806   // FIXME: We should just pass E->isListInitialization(), but we're not
12807   // prepared to handle list-initialization without a child InitListExpr.
12808   SourceLocation LParenLoc = T->getTypeLoc().getEndLoc();
12809   return getDerived().RebuildCXXTemporaryObjectExpr(
12810       T, LParenLoc, Args, E->getEndLoc(),
12811       /*ListInitialization=*/LParenLoc.isInvalid());
12812 }
12813 
12814 template<typename Derived>
12815 ExprResult
12816 TreeTransform<Derived>::TransformLambdaExpr(LambdaExpr *E) {
12817   // Transform any init-capture expressions before entering the scope of the
12818   // lambda body, because they are not semantically within that scope.
12819   typedef std::pair<ExprResult, QualType> InitCaptureInfoTy;
12820   struct TransformedInitCapture {
12821     // The location of the ... if the result is retaining a pack expansion.
12822     SourceLocation EllipsisLoc;
12823     // Zero or more expansions of the init-capture.
12824     SmallVector<InitCaptureInfoTy, 4> Expansions;
12825   };
12826   SmallVector<TransformedInitCapture, 4> InitCaptures;
12827   InitCaptures.resize(E->explicit_capture_end() - E->explicit_capture_begin());
12828   for (LambdaExpr::capture_iterator C = E->capture_begin(),
12829                                     CEnd = E->capture_end();
12830        C != CEnd; ++C) {
12831     if (!E->isInitCapture(C))
12832       continue;
12833 
12834     TransformedInitCapture &Result = InitCaptures[C - E->capture_begin()];
12835     VarDecl *OldVD = C->getCapturedVar();
12836 
12837     auto SubstInitCapture = [&](SourceLocation EllipsisLoc,
12838                                 Optional<unsigned> NumExpansions) {
12839       ExprResult NewExprInitResult = getDerived().TransformInitializer(
12840           OldVD->getInit(), OldVD->getInitStyle() == VarDecl::CallInit);
12841 
12842       if (NewExprInitResult.isInvalid()) {
12843         Result.Expansions.push_back(InitCaptureInfoTy(ExprError(), QualType()));
12844         return;
12845       }
12846       Expr *NewExprInit = NewExprInitResult.get();
12847 
12848       QualType NewInitCaptureType =
12849           getSema().buildLambdaInitCaptureInitialization(
12850               C->getLocation(), OldVD->getType()->isReferenceType(),
12851               EllipsisLoc, NumExpansions, OldVD->getIdentifier(),
12852               C->getCapturedVar()->getInitStyle() != VarDecl::CInit,
12853               NewExprInit);
12854       Result.Expansions.push_back(
12855           InitCaptureInfoTy(NewExprInit, NewInitCaptureType));
12856     };
12857 
12858     // If this is an init-capture pack, consider expanding the pack now.
12859     if (OldVD->isParameterPack()) {
12860       PackExpansionTypeLoc ExpansionTL = OldVD->getTypeSourceInfo()
12861                                              ->getTypeLoc()
12862                                              .castAs<PackExpansionTypeLoc>();
12863       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
12864       SemaRef.collectUnexpandedParameterPacks(OldVD->getInit(), Unexpanded);
12865 
12866       // Determine whether the set of unexpanded parameter packs can and should
12867       // be expanded.
12868       bool Expand = true;
12869       bool RetainExpansion = false;
12870       Optional<unsigned> OrigNumExpansions =
12871           ExpansionTL.getTypePtr()->getNumExpansions();
12872       Optional<unsigned> NumExpansions = OrigNumExpansions;
12873       if (getDerived().TryExpandParameterPacks(
12874               ExpansionTL.getEllipsisLoc(),
12875               OldVD->getInit()->getSourceRange(), Unexpanded, Expand,
12876               RetainExpansion, NumExpansions))
12877         return ExprError();
12878       if (Expand) {
12879         for (unsigned I = 0; I != *NumExpansions; ++I) {
12880           Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
12881           SubstInitCapture(SourceLocation(), None);
12882         }
12883       }
12884       if (!Expand || RetainExpansion) {
12885         ForgetPartiallySubstitutedPackRAII Forget(getDerived());
12886         SubstInitCapture(ExpansionTL.getEllipsisLoc(), NumExpansions);
12887         Result.EllipsisLoc = ExpansionTL.getEllipsisLoc();
12888       }
12889     } else {
12890       SubstInitCapture(SourceLocation(), None);
12891     }
12892   }
12893 
12894   LambdaScopeInfo *LSI = getSema().PushLambdaScope();
12895   Sema::FunctionScopeRAII FuncScopeCleanup(getSema());
12896 
12897   // Transform the template parameters, and add them to the current
12898   // instantiation scope. The null case is handled correctly.
12899   auto TPL = getDerived().TransformTemplateParameterList(
12900       E->getTemplateParameterList());
12901   LSI->GLTemplateParameterList = TPL;
12902 
12903   // Transform the type of the original lambda's call operator.
12904   // The transformation MUST be done in the CurrentInstantiationScope since
12905   // it introduces a mapping of the original to the newly created
12906   // transformed parameters.
12907   TypeSourceInfo *NewCallOpTSI = nullptr;
12908   {
12909     TypeSourceInfo *OldCallOpTSI = E->getCallOperator()->getTypeSourceInfo();
12910     FunctionProtoTypeLoc OldCallOpFPTL =
12911         OldCallOpTSI->getTypeLoc().getAs<FunctionProtoTypeLoc>();
12912 
12913     TypeLocBuilder NewCallOpTLBuilder;
12914     SmallVector<QualType, 4> ExceptionStorage;
12915     TreeTransform *This = this; // Work around gcc.gnu.org/PR56135.
12916     QualType NewCallOpType = TransformFunctionProtoType(
12917         NewCallOpTLBuilder, OldCallOpFPTL, nullptr, Qualifiers(),
12918         [&](FunctionProtoType::ExceptionSpecInfo &ESI, bool &Changed) {
12919           return This->TransformExceptionSpec(OldCallOpFPTL.getBeginLoc(), ESI,
12920                                               ExceptionStorage, Changed);
12921         });
12922     if (NewCallOpType.isNull())
12923       return ExprError();
12924     NewCallOpTSI = NewCallOpTLBuilder.getTypeSourceInfo(getSema().Context,
12925                                                         NewCallOpType);
12926   }
12927 
12928   // Transform the trailing requires clause
12929   ExprResult NewTrailingRequiresClause;
12930   if (Expr *TRC = E->getCallOperator()->getTrailingRequiresClause())
12931     // FIXME: Concepts: Substitution into requires clause should only happen
12932     //                  when checking satisfaction.
12933     NewTrailingRequiresClause = getDerived().TransformExpr(TRC);
12934 
12935   // Create the local class that will describe the lambda.
12936   // FIXME: KnownDependent below is wrong when substituting inside a templated
12937   // context that isn't a DeclContext (such as a variable template).
12938   CXXRecordDecl *OldClass = E->getLambdaClass();
12939   CXXRecordDecl *Class
12940     = getSema().createLambdaClosureType(E->getIntroducerRange(),
12941                                         NewCallOpTSI,
12942                                         /*KnownDependent=*/false,
12943                                         E->getCaptureDefault());
12944   getDerived().transformedLocalDecl(OldClass, {Class});
12945 
12946   Optional<std::tuple<bool, unsigned, unsigned, Decl *>> Mangling;
12947   if (getDerived().ReplacingOriginal())
12948     Mangling = std::make_tuple(OldClass->hasKnownLambdaInternalLinkage(),
12949                                OldClass->getLambdaManglingNumber(),
12950                                OldClass->getDeviceLambdaManglingNumber(),
12951                                OldClass->getLambdaContextDecl());
12952 
12953   // Build the call operator.
12954   CXXMethodDecl *NewCallOperator = getSema().startLambdaDefinition(
12955       Class, E->getIntroducerRange(), NewCallOpTSI,
12956       E->getCallOperator()->getEndLoc(),
12957       NewCallOpTSI->getTypeLoc().castAs<FunctionProtoTypeLoc>().getParams(),
12958       E->getCallOperator()->getConstexprKind(),
12959       NewTrailingRequiresClause.get());
12960 
12961   LSI->CallOperator = NewCallOperator;
12962 
12963   getDerived().transformAttrs(E->getCallOperator(), NewCallOperator);
12964   getDerived().transformedLocalDecl(E->getCallOperator(), {NewCallOperator});
12965 
12966   // Number the lambda for linkage purposes if necessary.
12967   getSema().handleLambdaNumbering(Class, NewCallOperator, Mangling);
12968 
12969   // Introduce the context of the call operator.
12970   Sema::ContextRAII SavedContext(getSema(), NewCallOperator,
12971                                  /*NewThisContext*/false);
12972 
12973   // Enter the scope of the lambda.
12974   getSema().buildLambdaScope(LSI, NewCallOperator,
12975                              E->getIntroducerRange(),
12976                              E->getCaptureDefault(),
12977                              E->getCaptureDefaultLoc(),
12978                              E->hasExplicitParameters(),
12979                              E->hasExplicitResultType(),
12980                              E->isMutable());
12981 
12982   bool Invalid = false;
12983 
12984   // Transform captures.
12985   for (LambdaExpr::capture_iterator C = E->capture_begin(),
12986                                  CEnd = E->capture_end();
12987        C != CEnd; ++C) {
12988     // When we hit the first implicit capture, tell Sema that we've finished
12989     // the list of explicit captures.
12990     if (C->isImplicit())
12991       break;
12992 
12993     // Capturing 'this' is trivial.
12994     if (C->capturesThis()) {
12995       getSema().CheckCXXThisCapture(C->getLocation(), C->isExplicit(),
12996                                     /*BuildAndDiagnose*/ true, nullptr,
12997                                     C->getCaptureKind() == LCK_StarThis);
12998       continue;
12999     }
13000     // Captured expression will be recaptured during captured variables
13001     // rebuilding.
13002     if (C->capturesVLAType())
13003       continue;
13004 
13005     // Rebuild init-captures, including the implied field declaration.
13006     if (E->isInitCapture(C)) {
13007       TransformedInitCapture &NewC = InitCaptures[C - E->capture_begin()];
13008 
13009       VarDecl *OldVD = C->getCapturedVar();
13010       llvm::SmallVector<Decl*, 4> NewVDs;
13011 
13012       for (InitCaptureInfoTy &Info : NewC.Expansions) {
13013         ExprResult Init = Info.first;
13014         QualType InitQualType = Info.second;
13015         if (Init.isInvalid() || InitQualType.isNull()) {
13016           Invalid = true;
13017           break;
13018         }
13019         VarDecl *NewVD = getSema().createLambdaInitCaptureVarDecl(
13020             OldVD->getLocation(), InitQualType, NewC.EllipsisLoc,
13021             OldVD->getIdentifier(), OldVD->getInitStyle(), Init.get());
13022         if (!NewVD) {
13023           Invalid = true;
13024           break;
13025         }
13026         NewVDs.push_back(NewVD);
13027         getSema().addInitCapture(LSI, NewVD);
13028       }
13029 
13030       if (Invalid)
13031         break;
13032 
13033       getDerived().transformedLocalDecl(OldVD, NewVDs);
13034       continue;
13035     }
13036 
13037     assert(C->capturesVariable() && "unexpected kind of lambda capture");
13038 
13039     // Determine the capture kind for Sema.
13040     Sema::TryCaptureKind Kind
13041       = C->isImplicit()? Sema::TryCapture_Implicit
13042                        : C->getCaptureKind() == LCK_ByCopy
13043                            ? Sema::TryCapture_ExplicitByVal
13044                            : Sema::TryCapture_ExplicitByRef;
13045     SourceLocation EllipsisLoc;
13046     if (C->isPackExpansion()) {
13047       UnexpandedParameterPack Unexpanded(C->getCapturedVar(), C->getLocation());
13048       bool ShouldExpand = false;
13049       bool RetainExpansion = false;
13050       Optional<unsigned> NumExpansions;
13051       if (getDerived().TryExpandParameterPacks(C->getEllipsisLoc(),
13052                                                C->getLocation(),
13053                                                Unexpanded,
13054                                                ShouldExpand, RetainExpansion,
13055                                                NumExpansions)) {
13056         Invalid = true;
13057         continue;
13058       }
13059 
13060       if (ShouldExpand) {
13061         // The transform has determined that we should perform an expansion;
13062         // transform and capture each of the arguments.
13063         // expansion of the pattern. Do so.
13064         VarDecl *Pack = C->getCapturedVar();
13065         for (unsigned I = 0; I != *NumExpansions; ++I) {
13066           Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
13067           VarDecl *CapturedVar
13068             = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(),
13069                                                                Pack));
13070           if (!CapturedVar) {
13071             Invalid = true;
13072             continue;
13073           }
13074 
13075           // Capture the transformed variable.
13076           getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind);
13077         }
13078 
13079         // FIXME: Retain a pack expansion if RetainExpansion is true.
13080 
13081         continue;
13082       }
13083 
13084       EllipsisLoc = C->getEllipsisLoc();
13085     }
13086 
13087     // Transform the captured variable.
13088     VarDecl *CapturedVar
13089       = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(),
13090                                                          C->getCapturedVar()));
13091     if (!CapturedVar || CapturedVar->isInvalidDecl()) {
13092       Invalid = true;
13093       continue;
13094     }
13095 
13096     // Capture the transformed variable.
13097     getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind,
13098                                  EllipsisLoc);
13099   }
13100   getSema().finishLambdaExplicitCaptures(LSI);
13101 
13102   // FIXME: Sema's lambda-building mechanism expects us to push an expression
13103   // evaluation context even if we're not transforming the function body.
13104   getSema().PushExpressionEvaluationContext(
13105       Sema::ExpressionEvaluationContext::PotentiallyEvaluated);
13106 
13107   // Instantiate the body of the lambda expression.
13108   StmtResult Body =
13109       Invalid ? StmtError() : getDerived().TransformLambdaBody(E, E->getBody());
13110 
13111   // ActOnLambda* will pop the function scope for us.
13112   FuncScopeCleanup.disable();
13113 
13114   if (Body.isInvalid()) {
13115     SavedContext.pop();
13116     getSema().ActOnLambdaError(E->getBeginLoc(), /*CurScope=*/nullptr,
13117                                /*IsInstantiation=*/true);
13118     return ExprError();
13119   }
13120 
13121   // Copy the LSI before ActOnFinishFunctionBody removes it.
13122   // FIXME: This is dumb. Store the lambda information somewhere that outlives
13123   // the call operator.
13124   auto LSICopy = *LSI;
13125   getSema().ActOnFinishFunctionBody(NewCallOperator, Body.get(),
13126                                     /*IsInstantiation*/ true);
13127   SavedContext.pop();
13128 
13129   return getSema().BuildLambdaExpr(E->getBeginLoc(), Body.get()->getEndLoc(),
13130                                    &LSICopy);
13131 }
13132 
13133 template<typename Derived>
13134 StmtResult
13135 TreeTransform<Derived>::TransformLambdaBody(LambdaExpr *E, Stmt *S) {
13136   return TransformStmt(S);
13137 }
13138 
13139 template<typename Derived>
13140 StmtResult
13141 TreeTransform<Derived>::SkipLambdaBody(LambdaExpr *E, Stmt *S) {
13142   // Transform captures.
13143   for (LambdaExpr::capture_iterator C = E->capture_begin(),
13144                                  CEnd = E->capture_end();
13145        C != CEnd; ++C) {
13146     // When we hit the first implicit capture, tell Sema that we've finished
13147     // the list of explicit captures.
13148     if (!C->isImplicit())
13149       continue;
13150 
13151     // Capturing 'this' is trivial.
13152     if (C->capturesThis()) {
13153       getSema().CheckCXXThisCapture(C->getLocation(), C->isExplicit(),
13154                                     /*BuildAndDiagnose*/ true, nullptr,
13155                                     C->getCaptureKind() == LCK_StarThis);
13156       continue;
13157     }
13158     // Captured expression will be recaptured during captured variables
13159     // rebuilding.
13160     if (C->capturesVLAType())
13161       continue;
13162 
13163     assert(C->capturesVariable() && "unexpected kind of lambda capture");
13164     assert(!E->isInitCapture(C) && "implicit init-capture?");
13165 
13166     // Transform the captured variable.
13167     VarDecl *CapturedVar = cast_or_null<VarDecl>(
13168         getDerived().TransformDecl(C->getLocation(), C->getCapturedVar()));
13169     if (!CapturedVar || CapturedVar->isInvalidDecl())
13170       return StmtError();
13171 
13172     // Capture the transformed variable.
13173     getSema().tryCaptureVariable(CapturedVar, C->getLocation());
13174   }
13175 
13176   return S;
13177 }
13178 
13179 template<typename Derived>
13180 ExprResult
13181 TreeTransform<Derived>::TransformCXXUnresolvedConstructExpr(
13182                                                   CXXUnresolvedConstructExpr *E) {
13183   TypeSourceInfo *T =
13184       getDerived().TransformTypeWithDeducedTST(E->getTypeSourceInfo());
13185   if (!T)
13186     return ExprError();
13187 
13188   bool ArgumentChanged = false;
13189   SmallVector<Expr*, 8> Args;
13190   Args.reserve(E->getNumArgs());
13191   {
13192     EnterExpressionEvaluationContext Context(
13193         getSema(), EnterExpressionEvaluationContext::InitList,
13194         E->isListInitialization());
13195     if (getDerived().TransformExprs(E->arg_begin(), E->getNumArgs(), true, Args,
13196                                     &ArgumentChanged))
13197       return ExprError();
13198   }
13199 
13200   if (!getDerived().AlwaysRebuild() &&
13201       T == E->getTypeSourceInfo() &&
13202       !ArgumentChanged)
13203     return E;
13204 
13205   // FIXME: we're faking the locations of the commas
13206   return getDerived().RebuildCXXUnresolvedConstructExpr(
13207       T, E->getLParenLoc(), Args, E->getRParenLoc(), E->isListInitialization());
13208 }
13209 
13210 template<typename Derived>
13211 ExprResult
13212 TreeTransform<Derived>::TransformCXXDependentScopeMemberExpr(
13213                                              CXXDependentScopeMemberExpr *E) {
13214   // Transform the base of the expression.
13215   ExprResult Base((Expr*) nullptr);
13216   Expr *OldBase;
13217   QualType BaseType;
13218   QualType ObjectType;
13219   if (!E->isImplicitAccess()) {
13220     OldBase = E->getBase();
13221     Base = getDerived().TransformExpr(OldBase);
13222     if (Base.isInvalid())
13223       return ExprError();
13224 
13225     // Start the member reference and compute the object's type.
13226     ParsedType ObjectTy;
13227     bool MayBePseudoDestructor = false;
13228     Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(),
13229                                                 E->getOperatorLoc(),
13230                                       E->isArrow()? tok::arrow : tok::period,
13231                                                 ObjectTy,
13232                                                 MayBePseudoDestructor);
13233     if (Base.isInvalid())
13234       return ExprError();
13235 
13236     ObjectType = ObjectTy.get();
13237     BaseType = ((Expr*) Base.get())->getType();
13238   } else {
13239     OldBase = nullptr;
13240     BaseType = getDerived().TransformType(E->getBaseType());
13241     ObjectType = BaseType->castAs<PointerType>()->getPointeeType();
13242   }
13243 
13244   // Transform the first part of the nested-name-specifier that qualifies
13245   // the member name.
13246   NamedDecl *FirstQualifierInScope
13247     = getDerived().TransformFirstQualifierInScope(
13248                                             E->getFirstQualifierFoundInScope(),
13249                                             E->getQualifierLoc().getBeginLoc());
13250 
13251   NestedNameSpecifierLoc QualifierLoc;
13252   if (E->getQualifier()) {
13253     QualifierLoc
13254       = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc(),
13255                                                      ObjectType,
13256                                                      FirstQualifierInScope);
13257     if (!QualifierLoc)
13258       return ExprError();
13259   }
13260 
13261   SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc();
13262 
13263   // TODO: If this is a conversion-function-id, verify that the
13264   // destination type name (if present) resolves the same way after
13265   // instantiation as it did in the local scope.
13266 
13267   DeclarationNameInfo NameInfo
13268     = getDerived().TransformDeclarationNameInfo(E->getMemberNameInfo());
13269   if (!NameInfo.getName())
13270     return ExprError();
13271 
13272   if (!E->hasExplicitTemplateArgs()) {
13273     // This is a reference to a member without an explicitly-specified
13274     // template argument list. Optimize for this common case.
13275     if (!getDerived().AlwaysRebuild() &&
13276         Base.get() == OldBase &&
13277         BaseType == E->getBaseType() &&
13278         QualifierLoc == E->getQualifierLoc() &&
13279         NameInfo.getName() == E->getMember() &&
13280         FirstQualifierInScope == E->getFirstQualifierFoundInScope())
13281       return E;
13282 
13283     return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(),
13284                                                        BaseType,
13285                                                        E->isArrow(),
13286                                                        E->getOperatorLoc(),
13287                                                        QualifierLoc,
13288                                                        TemplateKWLoc,
13289                                                        FirstQualifierInScope,
13290                                                        NameInfo,
13291                                                        /*TemplateArgs*/nullptr);
13292   }
13293 
13294   TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc());
13295   if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
13296                                               E->getNumTemplateArgs(),
13297                                               TransArgs))
13298     return ExprError();
13299 
13300   return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(),
13301                                                      BaseType,
13302                                                      E->isArrow(),
13303                                                      E->getOperatorLoc(),
13304                                                      QualifierLoc,
13305                                                      TemplateKWLoc,
13306                                                      FirstQualifierInScope,
13307                                                      NameInfo,
13308                                                      &TransArgs);
13309 }
13310 
13311 template <typename Derived>
13312 ExprResult TreeTransform<Derived>::TransformUnresolvedMemberExpr(
13313     UnresolvedMemberExpr *Old) {
13314   // Transform the base of the expression.
13315   ExprResult Base((Expr *)nullptr);
13316   QualType BaseType;
13317   if (!Old->isImplicitAccess()) {
13318     Base = getDerived().TransformExpr(Old->getBase());
13319     if (Base.isInvalid())
13320       return ExprError();
13321     Base =
13322         getSema().PerformMemberExprBaseConversion(Base.get(), Old->isArrow());
13323     if (Base.isInvalid())
13324       return ExprError();
13325     BaseType = Base.get()->getType();
13326   } else {
13327     BaseType = getDerived().TransformType(Old->getBaseType());
13328   }
13329 
13330   NestedNameSpecifierLoc QualifierLoc;
13331   if (Old->getQualifierLoc()) {
13332     QualifierLoc =
13333         getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc());
13334     if (!QualifierLoc)
13335       return ExprError();
13336   }
13337 
13338   SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc();
13339 
13340   LookupResult R(SemaRef, Old->getMemberNameInfo(), Sema::LookupOrdinaryName);
13341 
13342   // Transform the declaration set.
13343   if (TransformOverloadExprDecls(Old, /*RequiresADL*/ false, R))
13344     return ExprError();
13345 
13346   // Determine the naming class.
13347   if (Old->getNamingClass()) {
13348     CXXRecordDecl *NamingClass = cast_or_null<CXXRecordDecl>(
13349         getDerived().TransformDecl(Old->getMemberLoc(), Old->getNamingClass()));
13350     if (!NamingClass)
13351       return ExprError();
13352 
13353     R.setNamingClass(NamingClass);
13354   }
13355 
13356   TemplateArgumentListInfo TransArgs;
13357   if (Old->hasExplicitTemplateArgs()) {
13358     TransArgs.setLAngleLoc(Old->getLAngleLoc());
13359     TransArgs.setRAngleLoc(Old->getRAngleLoc());
13360     if (getDerived().TransformTemplateArguments(
13361             Old->getTemplateArgs(), Old->getNumTemplateArgs(), TransArgs))
13362       return ExprError();
13363   }
13364 
13365   // FIXME: to do this check properly, we will need to preserve the
13366   // first-qualifier-in-scope here, just in case we had a dependent
13367   // base (and therefore couldn't do the check) and a
13368   // nested-name-qualifier (and therefore could do the lookup).
13369   NamedDecl *FirstQualifierInScope = nullptr;
13370 
13371   return getDerived().RebuildUnresolvedMemberExpr(
13372       Base.get(), BaseType, Old->getOperatorLoc(), Old->isArrow(), QualifierLoc,
13373       TemplateKWLoc, FirstQualifierInScope, R,
13374       (Old->hasExplicitTemplateArgs() ? &TransArgs : nullptr));
13375 }
13376 
13377 template<typename Derived>
13378 ExprResult
13379 TreeTransform<Derived>::TransformCXXNoexceptExpr(CXXNoexceptExpr *E) {
13380   EnterExpressionEvaluationContext Unevaluated(
13381       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
13382   ExprResult SubExpr = getDerived().TransformExpr(E->getOperand());
13383   if (SubExpr.isInvalid())
13384     return ExprError();
13385 
13386   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getOperand())
13387     return E;
13388 
13389   return getDerived().RebuildCXXNoexceptExpr(E->getSourceRange(),SubExpr.get());
13390 }
13391 
13392 template<typename Derived>
13393 ExprResult
13394 TreeTransform<Derived>::TransformPackExpansionExpr(PackExpansionExpr *E) {
13395   ExprResult Pattern = getDerived().TransformExpr(E->getPattern());
13396   if (Pattern.isInvalid())
13397     return ExprError();
13398 
13399   if (!getDerived().AlwaysRebuild() && Pattern.get() == E->getPattern())
13400     return E;
13401 
13402   return getDerived().RebuildPackExpansion(Pattern.get(), E->getEllipsisLoc(),
13403                                            E->getNumExpansions());
13404 }
13405 
13406 template<typename Derived>
13407 ExprResult
13408 TreeTransform<Derived>::TransformSizeOfPackExpr(SizeOfPackExpr *E) {
13409   // If E is not value-dependent, then nothing will change when we transform it.
13410   // Note: This is an instantiation-centric view.
13411   if (!E->isValueDependent())
13412     return E;
13413 
13414   EnterExpressionEvaluationContext Unevaluated(
13415       getSema(), Sema::ExpressionEvaluationContext::Unevaluated);
13416 
13417   ArrayRef<TemplateArgument> PackArgs;
13418   TemplateArgument ArgStorage;
13419 
13420   // Find the argument list to transform.
13421   if (E->isPartiallySubstituted()) {
13422     PackArgs = E->getPartialArguments();
13423   } else if (E->isValueDependent()) {
13424     UnexpandedParameterPack Unexpanded(E->getPack(), E->getPackLoc());
13425     bool ShouldExpand = false;
13426     bool RetainExpansion = false;
13427     Optional<unsigned> NumExpansions;
13428     if (getDerived().TryExpandParameterPacks(E->getOperatorLoc(), E->getPackLoc(),
13429                                              Unexpanded,
13430                                              ShouldExpand, RetainExpansion,
13431                                              NumExpansions))
13432       return ExprError();
13433 
13434     // If we need to expand the pack, build a template argument from it and
13435     // expand that.
13436     if (ShouldExpand) {
13437       auto *Pack = E->getPack();
13438       if (auto *TTPD = dyn_cast<TemplateTypeParmDecl>(Pack)) {
13439         ArgStorage = getSema().Context.getPackExpansionType(
13440             getSema().Context.getTypeDeclType(TTPD), None);
13441       } else if (auto *TTPD = dyn_cast<TemplateTemplateParmDecl>(Pack)) {
13442         ArgStorage = TemplateArgument(TemplateName(TTPD), None);
13443       } else {
13444         auto *VD = cast<ValueDecl>(Pack);
13445         ExprResult DRE = getSema().BuildDeclRefExpr(
13446             VD, VD->getType().getNonLValueExprType(getSema().Context),
13447             VD->getType()->isReferenceType() ? VK_LValue : VK_PRValue,
13448             E->getPackLoc());
13449         if (DRE.isInvalid())
13450           return ExprError();
13451         ArgStorage = new (getSema().Context) PackExpansionExpr(
13452             getSema().Context.DependentTy, DRE.get(), E->getPackLoc(), None);
13453       }
13454       PackArgs = ArgStorage;
13455     }
13456   }
13457 
13458   // If we're not expanding the pack, just transform the decl.
13459   if (!PackArgs.size()) {
13460     auto *Pack = cast_or_null<NamedDecl>(
13461         getDerived().TransformDecl(E->getPackLoc(), E->getPack()));
13462     if (!Pack)
13463       return ExprError();
13464     return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), Pack,
13465                                               E->getPackLoc(),
13466                                               E->getRParenLoc(), None, None);
13467   }
13468 
13469   // Try to compute the result without performing a partial substitution.
13470   Optional<unsigned> Result = 0;
13471   for (const TemplateArgument &Arg : PackArgs) {
13472     if (!Arg.isPackExpansion()) {
13473       Result = *Result + 1;
13474       continue;
13475     }
13476 
13477     TemplateArgumentLoc ArgLoc;
13478     InventTemplateArgumentLoc(Arg, ArgLoc);
13479 
13480     // Find the pattern of the pack expansion.
13481     SourceLocation Ellipsis;
13482     Optional<unsigned> OrigNumExpansions;
13483     TemplateArgumentLoc Pattern =
13484         getSema().getTemplateArgumentPackExpansionPattern(ArgLoc, Ellipsis,
13485                                                           OrigNumExpansions);
13486 
13487     // Substitute under the pack expansion. Do not expand the pack (yet).
13488     TemplateArgumentLoc OutPattern;
13489     Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
13490     if (getDerived().TransformTemplateArgument(Pattern, OutPattern,
13491                                                /*Uneval*/ true))
13492       return true;
13493 
13494     // See if we can determine the number of arguments from the result.
13495     Optional<unsigned> NumExpansions =
13496         getSema().getFullyPackExpandedSize(OutPattern.getArgument());
13497     if (!NumExpansions) {
13498       // No: we must be in an alias template expansion, and we're going to need
13499       // to actually expand the packs.
13500       Result = None;
13501       break;
13502     }
13503 
13504     Result = *Result + *NumExpansions;
13505   }
13506 
13507   // Common case: we could determine the number of expansions without
13508   // substituting.
13509   if (Result)
13510     return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(),
13511                                               E->getPackLoc(),
13512                                               E->getRParenLoc(), *Result, None);
13513 
13514   TemplateArgumentListInfo TransformedPackArgs(E->getPackLoc(),
13515                                                E->getPackLoc());
13516   {
13517     TemporaryBase Rebase(*this, E->getPackLoc(), getBaseEntity());
13518     typedef TemplateArgumentLocInventIterator<
13519         Derived, const TemplateArgument*> PackLocIterator;
13520     if (TransformTemplateArguments(PackLocIterator(*this, PackArgs.begin()),
13521                                    PackLocIterator(*this, PackArgs.end()),
13522                                    TransformedPackArgs, /*Uneval*/true))
13523       return ExprError();
13524   }
13525 
13526   // Check whether we managed to fully-expand the pack.
13527   // FIXME: Is it possible for us to do so and not hit the early exit path?
13528   SmallVector<TemplateArgument, 8> Args;
13529   bool PartialSubstitution = false;
13530   for (auto &Loc : TransformedPackArgs.arguments()) {
13531     Args.push_back(Loc.getArgument());
13532     if (Loc.getArgument().isPackExpansion())
13533       PartialSubstitution = true;
13534   }
13535 
13536   if (PartialSubstitution)
13537     return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(),
13538                                               E->getPackLoc(),
13539                                               E->getRParenLoc(), None, Args);
13540 
13541   return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(),
13542                                             E->getPackLoc(), E->getRParenLoc(),
13543                                             Args.size(), None);
13544 }
13545 
13546 template<typename Derived>
13547 ExprResult
13548 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmPackExpr(
13549                                           SubstNonTypeTemplateParmPackExpr *E) {
13550   // Default behavior is to do nothing with this transformation.
13551   return E;
13552 }
13553 
13554 template<typename Derived>
13555 ExprResult
13556 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmExpr(
13557                                           SubstNonTypeTemplateParmExpr *E) {
13558   // Default behavior is to do nothing with this transformation.
13559   return E;
13560 }
13561 
13562 template<typename Derived>
13563 ExprResult
13564 TreeTransform<Derived>::TransformFunctionParmPackExpr(FunctionParmPackExpr *E) {
13565   // Default behavior is to do nothing with this transformation.
13566   return E;
13567 }
13568 
13569 template<typename Derived>
13570 ExprResult
13571 TreeTransform<Derived>::TransformMaterializeTemporaryExpr(
13572                                                   MaterializeTemporaryExpr *E) {
13573   return getDerived().TransformExpr(E->getSubExpr());
13574 }
13575 
13576 template<typename Derived>
13577 ExprResult
13578 TreeTransform<Derived>::TransformCXXFoldExpr(CXXFoldExpr *E) {
13579   UnresolvedLookupExpr *Callee = nullptr;
13580   if (Expr *OldCallee = E->getCallee()) {
13581     ExprResult CalleeResult = getDerived().TransformExpr(OldCallee);
13582     if (CalleeResult.isInvalid())
13583       return ExprError();
13584     Callee = cast<UnresolvedLookupExpr>(CalleeResult.get());
13585   }
13586 
13587   Expr *Pattern = E->getPattern();
13588 
13589   SmallVector<UnexpandedParameterPack, 2> Unexpanded;
13590   getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
13591   assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
13592 
13593   // Determine whether the set of unexpanded parameter packs can and should
13594   // be expanded.
13595   bool Expand = true;
13596   bool RetainExpansion = false;
13597   Optional<unsigned> OrigNumExpansions = E->getNumExpansions(),
13598                      NumExpansions = OrigNumExpansions;
13599   if (getDerived().TryExpandParameterPacks(E->getEllipsisLoc(),
13600                                            Pattern->getSourceRange(),
13601                                            Unexpanded,
13602                                            Expand, RetainExpansion,
13603                                            NumExpansions))
13604     return true;
13605 
13606   if (!Expand) {
13607     // Do not expand any packs here, just transform and rebuild a fold
13608     // expression.
13609     Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
13610 
13611     ExprResult LHS =
13612         E->getLHS() ? getDerived().TransformExpr(E->getLHS()) : ExprResult();
13613     if (LHS.isInvalid())
13614       return true;
13615 
13616     ExprResult RHS =
13617         E->getRHS() ? getDerived().TransformExpr(E->getRHS()) : ExprResult();
13618     if (RHS.isInvalid())
13619       return true;
13620 
13621     if (!getDerived().AlwaysRebuild() &&
13622         LHS.get() == E->getLHS() && RHS.get() == E->getRHS())
13623       return E;
13624 
13625     return getDerived().RebuildCXXFoldExpr(
13626         Callee, E->getBeginLoc(), LHS.get(), E->getOperator(),
13627         E->getEllipsisLoc(), RHS.get(), E->getEndLoc(), NumExpansions);
13628   }
13629 
13630   // Formally a fold expression expands to nested parenthesized expressions.
13631   // Enforce this limit to avoid creating trees so deep we can't safely traverse
13632   // them.
13633   if (NumExpansions && SemaRef.getLangOpts().BracketDepth < NumExpansions) {
13634     SemaRef.Diag(E->getEllipsisLoc(),
13635                  clang::diag::err_fold_expression_limit_exceeded)
13636         << *NumExpansions << SemaRef.getLangOpts().BracketDepth
13637         << E->getSourceRange();
13638     SemaRef.Diag(E->getEllipsisLoc(), diag::note_bracket_depth);
13639     return ExprError();
13640   }
13641 
13642   // The transform has determined that we should perform an elementwise
13643   // expansion of the pattern. Do so.
13644   ExprResult Result = getDerived().TransformExpr(E->getInit());
13645   if (Result.isInvalid())
13646     return true;
13647   bool LeftFold = E->isLeftFold();
13648 
13649   // If we're retaining an expansion for a right fold, it is the innermost
13650   // component and takes the init (if any).
13651   if (!LeftFold && RetainExpansion) {
13652     ForgetPartiallySubstitutedPackRAII Forget(getDerived());
13653 
13654     ExprResult Out = getDerived().TransformExpr(Pattern);
13655     if (Out.isInvalid())
13656       return true;
13657 
13658     Result = getDerived().RebuildCXXFoldExpr(
13659         Callee, E->getBeginLoc(), Out.get(), E->getOperator(),
13660         E->getEllipsisLoc(), Result.get(), E->getEndLoc(), OrigNumExpansions);
13661     if (Result.isInvalid())
13662       return true;
13663   }
13664 
13665   for (unsigned I = 0; I != *NumExpansions; ++I) {
13666     Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(
13667         getSema(), LeftFold ? I : *NumExpansions - I - 1);
13668     ExprResult Out = getDerived().TransformExpr(Pattern);
13669     if (Out.isInvalid())
13670       return true;
13671 
13672     if (Out.get()->containsUnexpandedParameterPack()) {
13673       // We still have a pack; retain a pack expansion for this slice.
13674       Result = getDerived().RebuildCXXFoldExpr(
13675           Callee, E->getBeginLoc(), LeftFold ? Result.get() : Out.get(),
13676           E->getOperator(), E->getEllipsisLoc(),
13677           LeftFold ? Out.get() : Result.get(), E->getEndLoc(),
13678           OrigNumExpansions);
13679     } else if (Result.isUsable()) {
13680       // We've got down to a single element; build a binary operator.
13681       Expr *LHS = LeftFold ? Result.get() : Out.get();
13682       Expr *RHS = LeftFold ? Out.get() : Result.get();
13683       if (Callee)
13684         Result = getDerived().RebuildCXXOperatorCallExpr(
13685             BinaryOperator::getOverloadedOperator(E->getOperator()),
13686             E->getEllipsisLoc(), Callee, LHS, RHS);
13687       else
13688         Result = getDerived().RebuildBinaryOperator(E->getEllipsisLoc(),
13689                                                     E->getOperator(), LHS, RHS);
13690     } else
13691       Result = Out;
13692 
13693     if (Result.isInvalid())
13694       return true;
13695   }
13696 
13697   // If we're retaining an expansion for a left fold, it is the outermost
13698   // component and takes the complete expansion so far as its init (if any).
13699   if (LeftFold && RetainExpansion) {
13700     ForgetPartiallySubstitutedPackRAII Forget(getDerived());
13701 
13702     ExprResult Out = getDerived().TransformExpr(Pattern);
13703     if (Out.isInvalid())
13704       return true;
13705 
13706     Result = getDerived().RebuildCXXFoldExpr(
13707         Callee, E->getBeginLoc(), Result.get(), E->getOperator(),
13708         E->getEllipsisLoc(), Out.get(), E->getEndLoc(), OrigNumExpansions);
13709     if (Result.isInvalid())
13710       return true;
13711   }
13712 
13713   // If we had no init and an empty pack, and we're not retaining an expansion,
13714   // then produce a fallback value or error.
13715   if (Result.isUnset())
13716     return getDerived().RebuildEmptyCXXFoldExpr(E->getEllipsisLoc(),
13717                                                 E->getOperator());
13718 
13719   return Result;
13720 }
13721 
13722 template<typename Derived>
13723 ExprResult
13724 TreeTransform<Derived>::TransformCXXStdInitializerListExpr(
13725     CXXStdInitializerListExpr *E) {
13726   return getDerived().TransformExpr(E->getSubExpr());
13727 }
13728 
13729 template<typename Derived>
13730 ExprResult
13731 TreeTransform<Derived>::TransformObjCStringLiteral(ObjCStringLiteral *E) {
13732   return SemaRef.MaybeBindToTemporary(E);
13733 }
13734 
13735 template<typename Derived>
13736 ExprResult
13737 TreeTransform<Derived>::TransformObjCBoolLiteralExpr(ObjCBoolLiteralExpr *E) {
13738   return E;
13739 }
13740 
13741 template<typename Derived>
13742 ExprResult
13743 TreeTransform<Derived>::TransformObjCBoxedExpr(ObjCBoxedExpr *E) {
13744   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
13745   if (SubExpr.isInvalid())
13746     return ExprError();
13747 
13748   if (!getDerived().AlwaysRebuild() &&
13749       SubExpr.get() == E->getSubExpr())
13750     return E;
13751 
13752   return getDerived().RebuildObjCBoxedExpr(E->getSourceRange(), SubExpr.get());
13753 }
13754 
13755 template<typename Derived>
13756 ExprResult
13757 TreeTransform<Derived>::TransformObjCArrayLiteral(ObjCArrayLiteral *E) {
13758   // Transform each of the elements.
13759   SmallVector<Expr *, 8> Elements;
13760   bool ArgChanged = false;
13761   if (getDerived().TransformExprs(E->getElements(), E->getNumElements(),
13762                                   /*IsCall=*/false, Elements, &ArgChanged))
13763     return ExprError();
13764 
13765   if (!getDerived().AlwaysRebuild() && !ArgChanged)
13766     return SemaRef.MaybeBindToTemporary(E);
13767 
13768   return getDerived().RebuildObjCArrayLiteral(E->getSourceRange(),
13769                                               Elements.data(),
13770                                               Elements.size());
13771 }
13772 
13773 template<typename Derived>
13774 ExprResult
13775 TreeTransform<Derived>::TransformObjCDictionaryLiteral(
13776                                                     ObjCDictionaryLiteral *E) {
13777   // Transform each of the elements.
13778   SmallVector<ObjCDictionaryElement, 8> Elements;
13779   bool ArgChanged = false;
13780   for (unsigned I = 0, N = E->getNumElements(); I != N; ++I) {
13781     ObjCDictionaryElement OrigElement = E->getKeyValueElement(I);
13782 
13783     if (OrigElement.isPackExpansion()) {
13784       // This key/value element is a pack expansion.
13785       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
13786       getSema().collectUnexpandedParameterPacks(OrigElement.Key, Unexpanded);
13787       getSema().collectUnexpandedParameterPacks(OrigElement.Value, Unexpanded);
13788       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
13789 
13790       // Determine whether the set of unexpanded parameter packs can
13791       // and should be expanded.
13792       bool Expand = true;
13793       bool RetainExpansion = false;
13794       Optional<unsigned> OrigNumExpansions = OrigElement.NumExpansions;
13795       Optional<unsigned> NumExpansions = OrigNumExpansions;
13796       SourceRange PatternRange(OrigElement.Key->getBeginLoc(),
13797                                OrigElement.Value->getEndLoc());
13798       if (getDerived().TryExpandParameterPacks(OrigElement.EllipsisLoc,
13799                                                PatternRange, Unexpanded, Expand,
13800                                                RetainExpansion, NumExpansions))
13801         return ExprError();
13802 
13803       if (!Expand) {
13804         // The transform has determined that we should perform a simple
13805         // transformation on the pack expansion, producing another pack
13806         // expansion.
13807         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
13808         ExprResult Key = getDerived().TransformExpr(OrigElement.Key);
13809         if (Key.isInvalid())
13810           return ExprError();
13811 
13812         if (Key.get() != OrigElement.Key)
13813           ArgChanged = true;
13814 
13815         ExprResult Value = getDerived().TransformExpr(OrigElement.Value);
13816         if (Value.isInvalid())
13817           return ExprError();
13818 
13819         if (Value.get() != OrigElement.Value)
13820           ArgChanged = true;
13821 
13822         ObjCDictionaryElement Expansion = {
13823           Key.get(), Value.get(), OrigElement.EllipsisLoc, NumExpansions
13824         };
13825         Elements.push_back(Expansion);
13826         continue;
13827       }
13828 
13829       // Record right away that the argument was changed.  This needs
13830       // to happen even if the array expands to nothing.
13831       ArgChanged = true;
13832 
13833       // The transform has determined that we should perform an elementwise
13834       // expansion of the pattern. Do so.
13835       for (unsigned I = 0; I != *NumExpansions; ++I) {
13836         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
13837         ExprResult Key = getDerived().TransformExpr(OrigElement.Key);
13838         if (Key.isInvalid())
13839           return ExprError();
13840 
13841         ExprResult Value = getDerived().TransformExpr(OrigElement.Value);
13842         if (Value.isInvalid())
13843           return ExprError();
13844 
13845         ObjCDictionaryElement Element = {
13846           Key.get(), Value.get(), SourceLocation(), NumExpansions
13847         };
13848 
13849         // If any unexpanded parameter packs remain, we still have a
13850         // pack expansion.
13851         // FIXME: Can this really happen?
13852         if (Key.get()->containsUnexpandedParameterPack() ||
13853             Value.get()->containsUnexpandedParameterPack())
13854           Element.EllipsisLoc = OrigElement.EllipsisLoc;
13855 
13856         Elements.push_back(Element);
13857       }
13858 
13859       // FIXME: Retain a pack expansion if RetainExpansion is true.
13860 
13861       // We've finished with this pack expansion.
13862       continue;
13863     }
13864 
13865     // Transform and check key.
13866     ExprResult Key = getDerived().TransformExpr(OrigElement.Key);
13867     if (Key.isInvalid())
13868       return ExprError();
13869 
13870     if (Key.get() != OrigElement.Key)
13871       ArgChanged = true;
13872 
13873     // Transform and check value.
13874     ExprResult Value
13875       = getDerived().TransformExpr(OrigElement.Value);
13876     if (Value.isInvalid())
13877       return ExprError();
13878 
13879     if (Value.get() != OrigElement.Value)
13880       ArgChanged = true;
13881 
13882     ObjCDictionaryElement Element = {
13883       Key.get(), Value.get(), SourceLocation(), None
13884     };
13885     Elements.push_back(Element);
13886   }
13887 
13888   if (!getDerived().AlwaysRebuild() && !ArgChanged)
13889     return SemaRef.MaybeBindToTemporary(E);
13890 
13891   return getDerived().RebuildObjCDictionaryLiteral(E->getSourceRange(),
13892                                                    Elements);
13893 }
13894 
13895 template<typename Derived>
13896 ExprResult
13897 TreeTransform<Derived>::TransformObjCEncodeExpr(ObjCEncodeExpr *E) {
13898   TypeSourceInfo *EncodedTypeInfo
13899     = getDerived().TransformType(E->getEncodedTypeSourceInfo());
13900   if (!EncodedTypeInfo)
13901     return ExprError();
13902 
13903   if (!getDerived().AlwaysRebuild() &&
13904       EncodedTypeInfo == E->getEncodedTypeSourceInfo())
13905     return E;
13906 
13907   return getDerived().RebuildObjCEncodeExpr(E->getAtLoc(),
13908                                             EncodedTypeInfo,
13909                                             E->getRParenLoc());
13910 }
13911 
13912 template<typename Derived>
13913 ExprResult TreeTransform<Derived>::
13914 TransformObjCIndirectCopyRestoreExpr(ObjCIndirectCopyRestoreExpr *E) {
13915   // This is a kind of implicit conversion, and it needs to get dropped
13916   // and recomputed for the same general reasons that ImplicitCastExprs
13917   // do, as well a more specific one: this expression is only valid when
13918   // it appears *immediately* as an argument expression.
13919   return getDerived().TransformExpr(E->getSubExpr());
13920 }
13921 
13922 template<typename Derived>
13923 ExprResult TreeTransform<Derived>::
13924 TransformObjCBridgedCastExpr(ObjCBridgedCastExpr *E) {
13925   TypeSourceInfo *TSInfo
13926     = getDerived().TransformType(E->getTypeInfoAsWritten());
13927   if (!TSInfo)
13928     return ExprError();
13929 
13930   ExprResult Result = getDerived().TransformExpr(E->getSubExpr());
13931   if (Result.isInvalid())
13932     return ExprError();
13933 
13934   if (!getDerived().AlwaysRebuild() &&
13935       TSInfo == E->getTypeInfoAsWritten() &&
13936       Result.get() == E->getSubExpr())
13937     return E;
13938 
13939   return SemaRef.BuildObjCBridgedCast(E->getLParenLoc(), E->getBridgeKind(),
13940                                       E->getBridgeKeywordLoc(), TSInfo,
13941                                       Result.get());
13942 }
13943 
13944 template <typename Derived>
13945 ExprResult TreeTransform<Derived>::TransformObjCAvailabilityCheckExpr(
13946     ObjCAvailabilityCheckExpr *E) {
13947   return E;
13948 }
13949 
13950 template<typename Derived>
13951 ExprResult
13952 TreeTransform<Derived>::TransformObjCMessageExpr(ObjCMessageExpr *E) {
13953   // Transform arguments.
13954   bool ArgChanged = false;
13955   SmallVector<Expr*, 8> Args;
13956   Args.reserve(E->getNumArgs());
13957   if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), false, Args,
13958                                   &ArgChanged))
13959     return ExprError();
13960 
13961   if (E->getReceiverKind() == ObjCMessageExpr::Class) {
13962     // Class message: transform the receiver type.
13963     TypeSourceInfo *ReceiverTypeInfo
13964       = getDerived().TransformType(E->getClassReceiverTypeInfo());
13965     if (!ReceiverTypeInfo)
13966       return ExprError();
13967 
13968     // If nothing changed, just retain the existing message send.
13969     if (!getDerived().AlwaysRebuild() &&
13970         ReceiverTypeInfo == E->getClassReceiverTypeInfo() && !ArgChanged)
13971       return SemaRef.MaybeBindToTemporary(E);
13972 
13973     // Build a new class message send.
13974     SmallVector<SourceLocation, 16> SelLocs;
13975     E->getSelectorLocs(SelLocs);
13976     return getDerived().RebuildObjCMessageExpr(ReceiverTypeInfo,
13977                                                E->getSelector(),
13978                                                SelLocs,
13979                                                E->getMethodDecl(),
13980                                                E->getLeftLoc(),
13981                                                Args,
13982                                                E->getRightLoc());
13983   }
13984   else if (E->getReceiverKind() == ObjCMessageExpr::SuperClass ||
13985            E->getReceiverKind() == ObjCMessageExpr::SuperInstance) {
13986     if (!E->getMethodDecl())
13987       return ExprError();
13988 
13989     // Build a new class message send to 'super'.
13990     SmallVector<SourceLocation, 16> SelLocs;
13991     E->getSelectorLocs(SelLocs);
13992     return getDerived().RebuildObjCMessageExpr(E->getSuperLoc(),
13993                                                E->getSelector(),
13994                                                SelLocs,
13995                                                E->getReceiverType(),
13996                                                E->getMethodDecl(),
13997                                                E->getLeftLoc(),
13998                                                Args,
13999                                                E->getRightLoc());
14000   }
14001 
14002   // Instance message: transform the receiver
14003   assert(E->getReceiverKind() == ObjCMessageExpr::Instance &&
14004          "Only class and instance messages may be instantiated");
14005   ExprResult Receiver
14006     = getDerived().TransformExpr(E->getInstanceReceiver());
14007   if (Receiver.isInvalid())
14008     return ExprError();
14009 
14010   // If nothing changed, just retain the existing message send.
14011   if (!getDerived().AlwaysRebuild() &&
14012       Receiver.get() == E->getInstanceReceiver() && !ArgChanged)
14013     return SemaRef.MaybeBindToTemporary(E);
14014 
14015   // Build a new instance message send.
14016   SmallVector<SourceLocation, 16> SelLocs;
14017   E->getSelectorLocs(SelLocs);
14018   return getDerived().RebuildObjCMessageExpr(Receiver.get(),
14019                                              E->getSelector(),
14020                                              SelLocs,
14021                                              E->getMethodDecl(),
14022                                              E->getLeftLoc(),
14023                                              Args,
14024                                              E->getRightLoc());
14025 }
14026 
14027 template<typename Derived>
14028 ExprResult
14029 TreeTransform<Derived>::TransformObjCSelectorExpr(ObjCSelectorExpr *E) {
14030   return E;
14031 }
14032 
14033 template<typename Derived>
14034 ExprResult
14035 TreeTransform<Derived>::TransformObjCProtocolExpr(ObjCProtocolExpr *E) {
14036   return E;
14037 }
14038 
14039 template<typename Derived>
14040 ExprResult
14041 TreeTransform<Derived>::TransformObjCIvarRefExpr(ObjCIvarRefExpr *E) {
14042   // Transform the base expression.
14043   ExprResult Base = getDerived().TransformExpr(E->getBase());
14044   if (Base.isInvalid())
14045     return ExprError();
14046 
14047   // We don't need to transform the ivar; it will never change.
14048 
14049   // If nothing changed, just retain the existing expression.
14050   if (!getDerived().AlwaysRebuild() &&
14051       Base.get() == E->getBase())
14052     return E;
14053 
14054   return getDerived().RebuildObjCIvarRefExpr(Base.get(), E->getDecl(),
14055                                              E->getLocation(),
14056                                              E->isArrow(), E->isFreeIvar());
14057 }
14058 
14059 template<typename Derived>
14060 ExprResult
14061 TreeTransform<Derived>::TransformObjCPropertyRefExpr(ObjCPropertyRefExpr *E) {
14062   // 'super' and types never change. Property never changes. Just
14063   // retain the existing expression.
14064   if (!E->isObjectReceiver())
14065     return E;
14066 
14067   // Transform the base expression.
14068   ExprResult Base = getDerived().TransformExpr(E->getBase());
14069   if (Base.isInvalid())
14070     return ExprError();
14071 
14072   // We don't need to transform the property; it will never change.
14073 
14074   // If nothing changed, just retain the existing expression.
14075   if (!getDerived().AlwaysRebuild() &&
14076       Base.get() == E->getBase())
14077     return E;
14078 
14079   if (E->isExplicitProperty())
14080     return getDerived().RebuildObjCPropertyRefExpr(Base.get(),
14081                                                    E->getExplicitProperty(),
14082                                                    E->getLocation());
14083 
14084   return getDerived().RebuildObjCPropertyRefExpr(Base.get(),
14085                                                  SemaRef.Context.PseudoObjectTy,
14086                                                  E->getImplicitPropertyGetter(),
14087                                                  E->getImplicitPropertySetter(),
14088                                                  E->getLocation());
14089 }
14090 
14091 template<typename Derived>
14092 ExprResult
14093 TreeTransform<Derived>::TransformObjCSubscriptRefExpr(ObjCSubscriptRefExpr *E) {
14094   // Transform the base expression.
14095   ExprResult Base = getDerived().TransformExpr(E->getBaseExpr());
14096   if (Base.isInvalid())
14097     return ExprError();
14098 
14099   // Transform the key expression.
14100   ExprResult Key = getDerived().TransformExpr(E->getKeyExpr());
14101   if (Key.isInvalid())
14102     return ExprError();
14103 
14104   // If nothing changed, just retain the existing expression.
14105   if (!getDerived().AlwaysRebuild() &&
14106       Key.get() == E->getKeyExpr() && Base.get() == E->getBaseExpr())
14107     return E;
14108 
14109   return getDerived().RebuildObjCSubscriptRefExpr(E->getRBracket(),
14110                                                   Base.get(), Key.get(),
14111                                                   E->getAtIndexMethodDecl(),
14112                                                   E->setAtIndexMethodDecl());
14113 }
14114 
14115 template<typename Derived>
14116 ExprResult
14117 TreeTransform<Derived>::TransformObjCIsaExpr(ObjCIsaExpr *E) {
14118   // Transform the base expression.
14119   ExprResult Base = getDerived().TransformExpr(E->getBase());
14120   if (Base.isInvalid())
14121     return ExprError();
14122 
14123   // If nothing changed, just retain the existing expression.
14124   if (!getDerived().AlwaysRebuild() &&
14125       Base.get() == E->getBase())
14126     return E;
14127 
14128   return getDerived().RebuildObjCIsaExpr(Base.get(), E->getIsaMemberLoc(),
14129                                          E->getOpLoc(),
14130                                          E->isArrow());
14131 }
14132 
14133 template<typename Derived>
14134 ExprResult
14135 TreeTransform<Derived>::TransformShuffleVectorExpr(ShuffleVectorExpr *E) {
14136   bool ArgumentChanged = false;
14137   SmallVector<Expr*, 8> SubExprs;
14138   SubExprs.reserve(E->getNumSubExprs());
14139   if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false,
14140                                   SubExprs, &ArgumentChanged))
14141     return ExprError();
14142 
14143   if (!getDerived().AlwaysRebuild() &&
14144       !ArgumentChanged)
14145     return E;
14146 
14147   return getDerived().RebuildShuffleVectorExpr(E->getBuiltinLoc(),
14148                                                SubExprs,
14149                                                E->getRParenLoc());
14150 }
14151 
14152 template<typename Derived>
14153 ExprResult
14154 TreeTransform<Derived>::TransformConvertVectorExpr(ConvertVectorExpr *E) {
14155   ExprResult SrcExpr = getDerived().TransformExpr(E->getSrcExpr());
14156   if (SrcExpr.isInvalid())
14157     return ExprError();
14158 
14159   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo());
14160   if (!Type)
14161     return ExprError();
14162 
14163   if (!getDerived().AlwaysRebuild() &&
14164       Type == E->getTypeSourceInfo() &&
14165       SrcExpr.get() == E->getSrcExpr())
14166     return E;
14167 
14168   return getDerived().RebuildConvertVectorExpr(E->getBuiltinLoc(),
14169                                                SrcExpr.get(), Type,
14170                                                E->getRParenLoc());
14171 }
14172 
14173 template<typename Derived>
14174 ExprResult
14175 TreeTransform<Derived>::TransformBlockExpr(BlockExpr *E) {
14176   BlockDecl *oldBlock = E->getBlockDecl();
14177 
14178   SemaRef.ActOnBlockStart(E->getCaretLocation(), /*Scope=*/nullptr);
14179   BlockScopeInfo *blockScope = SemaRef.getCurBlock();
14180 
14181   blockScope->TheDecl->setIsVariadic(oldBlock->isVariadic());
14182   blockScope->TheDecl->setBlockMissingReturnType(
14183                          oldBlock->blockMissingReturnType());
14184 
14185   SmallVector<ParmVarDecl*, 4> params;
14186   SmallVector<QualType, 4> paramTypes;
14187 
14188   const FunctionProtoType *exprFunctionType = E->getFunctionType();
14189 
14190   // Parameter substitution.
14191   Sema::ExtParameterInfoBuilder extParamInfos;
14192   if (getDerived().TransformFunctionTypeParams(
14193           E->getCaretLocation(), oldBlock->parameters(), nullptr,
14194           exprFunctionType->getExtParameterInfosOrNull(), paramTypes, &params,
14195           extParamInfos)) {
14196     getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr);
14197     return ExprError();
14198   }
14199 
14200   QualType exprResultType =
14201       getDerived().TransformType(exprFunctionType->getReturnType());
14202 
14203   auto epi = exprFunctionType->getExtProtoInfo();
14204   epi.ExtParameterInfos = extParamInfos.getPointerOrNull(paramTypes.size());
14205 
14206   QualType functionType =
14207     getDerived().RebuildFunctionProtoType(exprResultType, paramTypes, epi);
14208   blockScope->FunctionType = functionType;
14209 
14210   // Set the parameters on the block decl.
14211   if (!params.empty())
14212     blockScope->TheDecl->setParams(params);
14213 
14214   if (!oldBlock->blockMissingReturnType()) {
14215     blockScope->HasImplicitReturnType = false;
14216     blockScope->ReturnType = exprResultType;
14217   }
14218 
14219   // Transform the body
14220   StmtResult body = getDerived().TransformStmt(E->getBody());
14221   if (body.isInvalid()) {
14222     getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr);
14223     return ExprError();
14224   }
14225 
14226 #ifndef NDEBUG
14227   // In builds with assertions, make sure that we captured everything we
14228   // captured before.
14229   if (!SemaRef.getDiagnostics().hasErrorOccurred()) {
14230     for (const auto &I : oldBlock->captures()) {
14231       VarDecl *oldCapture = I.getVariable();
14232 
14233       // Ignore parameter packs.
14234       if (oldCapture->isParameterPack())
14235         continue;
14236 
14237       VarDecl *newCapture =
14238         cast<VarDecl>(getDerived().TransformDecl(E->getCaretLocation(),
14239                                                  oldCapture));
14240       assert(blockScope->CaptureMap.count(newCapture));
14241     }
14242     assert(oldBlock->capturesCXXThis() == blockScope->isCXXThisCaptured());
14243   }
14244 #endif
14245 
14246   return SemaRef.ActOnBlockStmtExpr(E->getCaretLocation(), body.get(),
14247                                     /*Scope=*/nullptr);
14248 }
14249 
14250 template<typename Derived>
14251 ExprResult
14252 TreeTransform<Derived>::TransformAsTypeExpr(AsTypeExpr *E) {
14253   ExprResult SrcExpr = getDerived().TransformExpr(E->getSrcExpr());
14254   if (SrcExpr.isInvalid())
14255     return ExprError();
14256 
14257   QualType Type = getDerived().TransformType(E->getType());
14258 
14259   return SemaRef.BuildAsTypeExpr(SrcExpr.get(), Type, E->getBuiltinLoc(),
14260                                  E->getRParenLoc());
14261 }
14262 
14263 template<typename Derived>
14264 ExprResult
14265 TreeTransform<Derived>::TransformAtomicExpr(AtomicExpr *E) {
14266   bool ArgumentChanged = false;
14267   SmallVector<Expr*, 8> SubExprs;
14268   SubExprs.reserve(E->getNumSubExprs());
14269   if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false,
14270                                   SubExprs, &ArgumentChanged))
14271     return ExprError();
14272 
14273   if (!getDerived().AlwaysRebuild() &&
14274       !ArgumentChanged)
14275     return E;
14276 
14277   return getDerived().RebuildAtomicExpr(E->getBuiltinLoc(), SubExprs,
14278                                         E->getOp(), E->getRParenLoc());
14279 }
14280 
14281 //===----------------------------------------------------------------------===//
14282 // Type reconstruction
14283 //===----------------------------------------------------------------------===//
14284 
14285 template<typename Derived>
14286 QualType TreeTransform<Derived>::RebuildPointerType(QualType PointeeType,
14287                                                     SourceLocation Star) {
14288   return SemaRef.BuildPointerType(PointeeType, Star,
14289                                   getDerived().getBaseEntity());
14290 }
14291 
14292 template<typename Derived>
14293 QualType TreeTransform<Derived>::RebuildBlockPointerType(QualType PointeeType,
14294                                                          SourceLocation Star) {
14295   return SemaRef.BuildBlockPointerType(PointeeType, Star,
14296                                        getDerived().getBaseEntity());
14297 }
14298 
14299 template<typename Derived>
14300 QualType
14301 TreeTransform<Derived>::RebuildReferenceType(QualType ReferentType,
14302                                              bool WrittenAsLValue,
14303                                              SourceLocation Sigil) {
14304   return SemaRef.BuildReferenceType(ReferentType, WrittenAsLValue,
14305                                     Sigil, getDerived().getBaseEntity());
14306 }
14307 
14308 template<typename Derived>
14309 QualType
14310 TreeTransform<Derived>::RebuildMemberPointerType(QualType PointeeType,
14311                                                  QualType ClassType,
14312                                                  SourceLocation Sigil) {
14313   return SemaRef.BuildMemberPointerType(PointeeType, ClassType, Sigil,
14314                                         getDerived().getBaseEntity());
14315 }
14316 
14317 template<typename Derived>
14318 QualType TreeTransform<Derived>::RebuildObjCTypeParamType(
14319            const ObjCTypeParamDecl *Decl,
14320            SourceLocation ProtocolLAngleLoc,
14321            ArrayRef<ObjCProtocolDecl *> Protocols,
14322            ArrayRef<SourceLocation> ProtocolLocs,
14323            SourceLocation ProtocolRAngleLoc) {
14324   return SemaRef.BuildObjCTypeParamType(Decl,
14325                                         ProtocolLAngleLoc, Protocols,
14326                                         ProtocolLocs, ProtocolRAngleLoc,
14327                                         /*FailOnError=*/true);
14328 }
14329 
14330 template<typename Derived>
14331 QualType TreeTransform<Derived>::RebuildObjCObjectType(
14332            QualType BaseType,
14333            SourceLocation Loc,
14334            SourceLocation TypeArgsLAngleLoc,
14335            ArrayRef<TypeSourceInfo *> TypeArgs,
14336            SourceLocation TypeArgsRAngleLoc,
14337            SourceLocation ProtocolLAngleLoc,
14338            ArrayRef<ObjCProtocolDecl *> Protocols,
14339            ArrayRef<SourceLocation> ProtocolLocs,
14340            SourceLocation ProtocolRAngleLoc) {
14341   return SemaRef.BuildObjCObjectType(BaseType, Loc, TypeArgsLAngleLoc,
14342                                      TypeArgs, TypeArgsRAngleLoc,
14343                                      ProtocolLAngleLoc, Protocols, ProtocolLocs,
14344                                      ProtocolRAngleLoc,
14345                                      /*FailOnError=*/true);
14346 }
14347 
14348 template<typename Derived>
14349 QualType TreeTransform<Derived>::RebuildObjCObjectPointerType(
14350            QualType PointeeType,
14351            SourceLocation Star) {
14352   return SemaRef.Context.getObjCObjectPointerType(PointeeType);
14353 }
14354 
14355 template<typename Derived>
14356 QualType
14357 TreeTransform<Derived>::RebuildArrayType(QualType ElementType,
14358                                          ArrayType::ArraySizeModifier SizeMod,
14359                                          const llvm::APInt *Size,
14360                                          Expr *SizeExpr,
14361                                          unsigned IndexTypeQuals,
14362                                          SourceRange BracketsRange) {
14363   if (SizeExpr || !Size)
14364     return SemaRef.BuildArrayType(ElementType, SizeMod, SizeExpr,
14365                                   IndexTypeQuals, BracketsRange,
14366                                   getDerived().getBaseEntity());
14367 
14368   QualType Types[] = {
14369     SemaRef.Context.UnsignedCharTy, SemaRef.Context.UnsignedShortTy,
14370     SemaRef.Context.UnsignedIntTy, SemaRef.Context.UnsignedLongTy,
14371     SemaRef.Context.UnsignedLongLongTy, SemaRef.Context.UnsignedInt128Ty
14372   };
14373   const unsigned NumTypes = llvm::array_lengthof(Types);
14374   QualType SizeType;
14375   for (unsigned I = 0; I != NumTypes; ++I)
14376     if (Size->getBitWidth() == SemaRef.Context.getIntWidth(Types[I])) {
14377       SizeType = Types[I];
14378       break;
14379     }
14380 
14381   // Note that we can return a VariableArrayType here in the case where
14382   // the element type was a dependent VariableArrayType.
14383   IntegerLiteral *ArraySize
14384       = IntegerLiteral::Create(SemaRef.Context, *Size, SizeType,
14385                                /*FIXME*/BracketsRange.getBegin());
14386   return SemaRef.BuildArrayType(ElementType, SizeMod, ArraySize,
14387                                 IndexTypeQuals, BracketsRange,
14388                                 getDerived().getBaseEntity());
14389 }
14390 
14391 template<typename Derived>
14392 QualType
14393 TreeTransform<Derived>::RebuildConstantArrayType(QualType ElementType,
14394                                                  ArrayType::ArraySizeModifier SizeMod,
14395                                                  const llvm::APInt &Size,
14396                                                  Expr *SizeExpr,
14397                                                  unsigned IndexTypeQuals,
14398                                                  SourceRange BracketsRange) {
14399   return getDerived().RebuildArrayType(ElementType, SizeMod, &Size, SizeExpr,
14400                                         IndexTypeQuals, BracketsRange);
14401 }
14402 
14403 template<typename Derived>
14404 QualType
14405 TreeTransform<Derived>::RebuildIncompleteArrayType(QualType ElementType,
14406                                           ArrayType::ArraySizeModifier SizeMod,
14407                                                  unsigned IndexTypeQuals,
14408                                                    SourceRange BracketsRange) {
14409   return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr, nullptr,
14410                                        IndexTypeQuals, BracketsRange);
14411 }
14412 
14413 template<typename Derived>
14414 QualType
14415 TreeTransform<Derived>::RebuildVariableArrayType(QualType ElementType,
14416                                           ArrayType::ArraySizeModifier SizeMod,
14417                                                  Expr *SizeExpr,
14418                                                  unsigned IndexTypeQuals,
14419                                                  SourceRange BracketsRange) {
14420   return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr,
14421                                        SizeExpr,
14422                                        IndexTypeQuals, BracketsRange);
14423 }
14424 
14425 template<typename Derived>
14426 QualType
14427 TreeTransform<Derived>::RebuildDependentSizedArrayType(QualType ElementType,
14428                                           ArrayType::ArraySizeModifier SizeMod,
14429                                                        Expr *SizeExpr,
14430                                                        unsigned IndexTypeQuals,
14431                                                    SourceRange BracketsRange) {
14432   return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr,
14433                                        SizeExpr,
14434                                        IndexTypeQuals, BracketsRange);
14435 }
14436 
14437 template <typename Derived>
14438 QualType TreeTransform<Derived>::RebuildDependentAddressSpaceType(
14439     QualType PointeeType, Expr *AddrSpaceExpr, SourceLocation AttributeLoc) {
14440   return SemaRef.BuildAddressSpaceAttr(PointeeType, AddrSpaceExpr,
14441                                           AttributeLoc);
14442 }
14443 
14444 template <typename Derived>
14445 QualType
14446 TreeTransform<Derived>::RebuildVectorType(QualType ElementType,
14447                                           unsigned NumElements,
14448                                           VectorType::VectorKind VecKind) {
14449   // FIXME: semantic checking!
14450   return SemaRef.Context.getVectorType(ElementType, NumElements, VecKind);
14451 }
14452 
14453 template <typename Derived>
14454 QualType TreeTransform<Derived>::RebuildDependentVectorType(
14455     QualType ElementType, Expr *SizeExpr, SourceLocation AttributeLoc,
14456     VectorType::VectorKind VecKind) {
14457   return SemaRef.BuildVectorType(ElementType, SizeExpr, AttributeLoc);
14458 }
14459 
14460 template<typename Derived>
14461 QualType TreeTransform<Derived>::RebuildExtVectorType(QualType ElementType,
14462                                                       unsigned NumElements,
14463                                                  SourceLocation AttributeLoc) {
14464   llvm::APInt numElements(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy),
14465                           NumElements, true);
14466   IntegerLiteral *VectorSize
14467     = IntegerLiteral::Create(SemaRef.Context, numElements, SemaRef.Context.IntTy,
14468                              AttributeLoc);
14469   return SemaRef.BuildExtVectorType(ElementType, VectorSize, AttributeLoc);
14470 }
14471 
14472 template<typename Derived>
14473 QualType
14474 TreeTransform<Derived>::RebuildDependentSizedExtVectorType(QualType ElementType,
14475                                                            Expr *SizeExpr,
14476                                                   SourceLocation AttributeLoc) {
14477   return SemaRef.BuildExtVectorType(ElementType, SizeExpr, AttributeLoc);
14478 }
14479 
14480 template <typename Derived>
14481 QualType TreeTransform<Derived>::RebuildConstantMatrixType(
14482     QualType ElementType, unsigned NumRows, unsigned NumColumns) {
14483   return SemaRef.Context.getConstantMatrixType(ElementType, NumRows,
14484                                                NumColumns);
14485 }
14486 
14487 template <typename Derived>
14488 QualType TreeTransform<Derived>::RebuildDependentSizedMatrixType(
14489     QualType ElementType, Expr *RowExpr, Expr *ColumnExpr,
14490     SourceLocation AttributeLoc) {
14491   return SemaRef.BuildMatrixType(ElementType, RowExpr, ColumnExpr,
14492                                  AttributeLoc);
14493 }
14494 
14495 template<typename Derived>
14496 QualType TreeTransform<Derived>::RebuildFunctionProtoType(
14497     QualType T,
14498     MutableArrayRef<QualType> ParamTypes,
14499     const FunctionProtoType::ExtProtoInfo &EPI) {
14500   return SemaRef.BuildFunctionType(T, ParamTypes,
14501                                    getDerived().getBaseLocation(),
14502                                    getDerived().getBaseEntity(),
14503                                    EPI);
14504 }
14505 
14506 template<typename Derived>
14507 QualType TreeTransform<Derived>::RebuildFunctionNoProtoType(QualType T) {
14508   return SemaRef.Context.getFunctionNoProtoType(T);
14509 }
14510 
14511 template<typename Derived>
14512 QualType TreeTransform<Derived>::RebuildUnresolvedUsingType(SourceLocation Loc,
14513                                                             Decl *D) {
14514   assert(D && "no decl found");
14515   if (D->isInvalidDecl()) return QualType();
14516 
14517   // FIXME: Doesn't account for ObjCInterfaceDecl!
14518   if (auto *UPD = dyn_cast<UsingPackDecl>(D)) {
14519     // A valid resolved using typename pack expansion decl can have multiple
14520     // UsingDecls, but they must each have exactly one type, and it must be
14521     // the same type in every case. But we must have at least one expansion!
14522     if (UPD->expansions().empty()) {
14523       getSema().Diag(Loc, diag::err_using_pack_expansion_empty)
14524           << UPD->isCXXClassMember() << UPD;
14525       return QualType();
14526     }
14527 
14528     // We might still have some unresolved types. Try to pick a resolved type
14529     // if we can. The final instantiation will check that the remaining
14530     // unresolved types instantiate to the type we pick.
14531     QualType FallbackT;
14532     QualType T;
14533     for (auto *E : UPD->expansions()) {
14534       QualType ThisT = RebuildUnresolvedUsingType(Loc, E);
14535       if (ThisT.isNull())
14536         continue;
14537       else if (ThisT->getAs<UnresolvedUsingType>())
14538         FallbackT = ThisT;
14539       else if (T.isNull())
14540         T = ThisT;
14541       else
14542         assert(getSema().Context.hasSameType(ThisT, T) &&
14543                "mismatched resolved types in using pack expansion");
14544     }
14545     return T.isNull() ? FallbackT : T;
14546   } else if (auto *Using = dyn_cast<UsingDecl>(D)) {
14547     assert(Using->hasTypename() &&
14548            "UnresolvedUsingTypenameDecl transformed to non-typename using");
14549 
14550     // A valid resolved using typename decl points to exactly one type decl.
14551     assert(++Using->shadow_begin() == Using->shadow_end());
14552 
14553     UsingShadowDecl *Shadow = *Using->shadow_begin();
14554     if (SemaRef.DiagnoseUseOfDecl(Shadow->getTargetDecl(), Loc))
14555       return QualType();
14556     return SemaRef.Context.getUsingType(
14557         Shadow, SemaRef.Context.getTypeDeclType(
14558                     cast<TypeDecl>(Shadow->getTargetDecl())));
14559   } else {
14560     assert(isa<UnresolvedUsingTypenameDecl>(D) &&
14561            "UnresolvedUsingTypenameDecl transformed to non-using decl");
14562     return SemaRef.Context.getTypeDeclType(
14563         cast<UnresolvedUsingTypenameDecl>(D));
14564   }
14565 }
14566 
14567 template <typename Derived>
14568 QualType TreeTransform<Derived>::RebuildTypeOfExprType(Expr *E,
14569                                                        SourceLocation) {
14570   return SemaRef.BuildTypeofExprType(E);
14571 }
14572 
14573 template<typename Derived>
14574 QualType TreeTransform<Derived>::RebuildTypeOfType(QualType Underlying) {
14575   return SemaRef.Context.getTypeOfType(Underlying);
14576 }
14577 
14578 template <typename Derived>
14579 QualType TreeTransform<Derived>::RebuildDecltypeType(Expr *E, SourceLocation) {
14580   return SemaRef.BuildDecltypeType(E);
14581 }
14582 
14583 template<typename Derived>
14584 QualType TreeTransform<Derived>::RebuildUnaryTransformType(QualType BaseType,
14585                                             UnaryTransformType::UTTKind UKind,
14586                                             SourceLocation Loc) {
14587   return SemaRef.BuildUnaryTransformType(BaseType, UKind, Loc);
14588 }
14589 
14590 template<typename Derived>
14591 QualType TreeTransform<Derived>::RebuildTemplateSpecializationType(
14592                                                       TemplateName Template,
14593                                              SourceLocation TemplateNameLoc,
14594                                      TemplateArgumentListInfo &TemplateArgs) {
14595   return SemaRef.CheckTemplateIdType(Template, TemplateNameLoc, TemplateArgs);
14596 }
14597 
14598 template<typename Derived>
14599 QualType TreeTransform<Derived>::RebuildAtomicType(QualType ValueType,
14600                                                    SourceLocation KWLoc) {
14601   return SemaRef.BuildAtomicType(ValueType, KWLoc);
14602 }
14603 
14604 template<typename Derived>
14605 QualType TreeTransform<Derived>::RebuildPipeType(QualType ValueType,
14606                                                  SourceLocation KWLoc,
14607                                                  bool isReadPipe) {
14608   return isReadPipe ? SemaRef.BuildReadPipeType(ValueType, KWLoc)
14609                     : SemaRef.BuildWritePipeType(ValueType, KWLoc);
14610 }
14611 
14612 template <typename Derived>
14613 QualType TreeTransform<Derived>::RebuildBitIntType(bool IsUnsigned,
14614                                                    unsigned NumBits,
14615                                                    SourceLocation Loc) {
14616   llvm::APInt NumBitsAP(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy),
14617                         NumBits, true);
14618   IntegerLiteral *Bits = IntegerLiteral::Create(SemaRef.Context, NumBitsAP,
14619                                                 SemaRef.Context.IntTy, Loc);
14620   return SemaRef.BuildBitIntType(IsUnsigned, Bits, Loc);
14621 }
14622 
14623 template <typename Derived>
14624 QualType TreeTransform<Derived>::RebuildDependentBitIntType(
14625     bool IsUnsigned, Expr *NumBitsExpr, SourceLocation Loc) {
14626   return SemaRef.BuildBitIntType(IsUnsigned, NumBitsExpr, Loc);
14627 }
14628 
14629 template<typename Derived>
14630 TemplateName
14631 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS,
14632                                             bool TemplateKW,
14633                                             TemplateDecl *Template) {
14634   return SemaRef.Context.getQualifiedTemplateName(SS.getScopeRep(), TemplateKW,
14635                                                   Template);
14636 }
14637 
14638 template<typename Derived>
14639 TemplateName
14640 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS,
14641                                             SourceLocation TemplateKWLoc,
14642                                             const IdentifierInfo &Name,
14643                                             SourceLocation NameLoc,
14644                                             QualType ObjectType,
14645                                             NamedDecl *FirstQualifierInScope,
14646                                             bool AllowInjectedClassName) {
14647   UnqualifiedId TemplateName;
14648   TemplateName.setIdentifier(&Name, NameLoc);
14649   Sema::TemplateTy Template;
14650   getSema().ActOnTemplateName(/*Scope=*/nullptr, SS, TemplateKWLoc,
14651                               TemplateName, ParsedType::make(ObjectType),
14652                               /*EnteringContext=*/false, Template,
14653                               AllowInjectedClassName);
14654   return Template.get();
14655 }
14656 
14657 template<typename Derived>
14658 TemplateName
14659 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS,
14660                                             SourceLocation TemplateKWLoc,
14661                                             OverloadedOperatorKind Operator,
14662                                             SourceLocation NameLoc,
14663                                             QualType ObjectType,
14664                                             bool AllowInjectedClassName) {
14665   UnqualifiedId Name;
14666   // FIXME: Bogus location information.
14667   SourceLocation SymbolLocations[3] = { NameLoc, NameLoc, NameLoc };
14668   Name.setOperatorFunctionId(NameLoc, Operator, SymbolLocations);
14669   Sema::TemplateTy Template;
14670   getSema().ActOnTemplateName(
14671       /*Scope=*/nullptr, SS, TemplateKWLoc, Name, ParsedType::make(ObjectType),
14672       /*EnteringContext=*/false, Template, AllowInjectedClassName);
14673   return Template.get();
14674 }
14675 
14676 template<typename Derived>
14677 ExprResult
14678 TreeTransform<Derived>::RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op,
14679                                                    SourceLocation OpLoc,
14680                                                    Expr *OrigCallee,
14681                                                    Expr *First,
14682                                                    Expr *Second) {
14683   Expr *Callee = OrigCallee->IgnoreParenCasts();
14684   bool isPostIncDec = Second && (Op == OO_PlusPlus || Op == OO_MinusMinus);
14685 
14686   if (First->getObjectKind() == OK_ObjCProperty) {
14687     BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op);
14688     if (BinaryOperator::isAssignmentOp(Opc))
14689       return SemaRef.checkPseudoObjectAssignment(/*Scope=*/nullptr, OpLoc, Opc,
14690                                                  First, Second);
14691     ExprResult Result = SemaRef.CheckPlaceholderExpr(First);
14692     if (Result.isInvalid())
14693       return ExprError();
14694     First = Result.get();
14695   }
14696 
14697   if (Second && Second->getObjectKind() == OK_ObjCProperty) {
14698     ExprResult Result = SemaRef.CheckPlaceholderExpr(Second);
14699     if (Result.isInvalid())
14700       return ExprError();
14701     Second = Result.get();
14702   }
14703 
14704   // Determine whether this should be a builtin operation.
14705   if (Op == OO_Subscript) {
14706     if (!First->getType()->isOverloadableType() &&
14707         !Second->getType()->isOverloadableType())
14708       return getSema().CreateBuiltinArraySubscriptExpr(
14709           First, Callee->getBeginLoc(), Second, OpLoc);
14710   } else if (Op == OO_Arrow) {
14711     // -> is never a builtin operation.
14712     return SemaRef.BuildOverloadedArrowExpr(nullptr, First, OpLoc);
14713   } else if (Second == nullptr || isPostIncDec) {
14714     if (!First->getType()->isOverloadableType() ||
14715         (Op == OO_Amp && getSema().isQualifiedMemberAccess(First))) {
14716       // The argument is not of overloadable type, or this is an expression
14717       // of the form &Class::member, so try to create a built-in unary
14718       // operation.
14719       UnaryOperatorKind Opc
14720         = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec);
14721 
14722       return getSema().CreateBuiltinUnaryOp(OpLoc, Opc, First);
14723     }
14724   } else {
14725     if (!First->getType()->isOverloadableType() &&
14726         !Second->getType()->isOverloadableType()) {
14727       // Neither of the arguments is an overloadable type, so try to
14728       // create a built-in binary operation.
14729       BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op);
14730       ExprResult Result
14731         = SemaRef.CreateBuiltinBinOp(OpLoc, Opc, First, Second);
14732       if (Result.isInvalid())
14733         return ExprError();
14734 
14735       return Result;
14736     }
14737   }
14738 
14739   // Compute the transformed set of functions (and function templates) to be
14740   // used during overload resolution.
14741   UnresolvedSet<16> Functions;
14742   bool RequiresADL;
14743 
14744   if (UnresolvedLookupExpr *ULE = dyn_cast<UnresolvedLookupExpr>(Callee)) {
14745     Functions.append(ULE->decls_begin(), ULE->decls_end());
14746     // If the overload could not be resolved in the template definition
14747     // (because we had a dependent argument), ADL is performed as part of
14748     // template instantiation.
14749     RequiresADL = ULE->requiresADL();
14750   } else {
14751     // If we've resolved this to a particular non-member function, just call
14752     // that function. If we resolved it to a member function,
14753     // CreateOverloaded* will find that function for us.
14754     NamedDecl *ND = cast<DeclRefExpr>(Callee)->getDecl();
14755     if (!isa<CXXMethodDecl>(ND))
14756       Functions.addDecl(ND);
14757     RequiresADL = false;
14758   }
14759 
14760   // Add any functions found via argument-dependent lookup.
14761   Expr *Args[2] = { First, Second };
14762   unsigned NumArgs = 1 + (Second != nullptr);
14763 
14764   // Create the overloaded operator invocation for unary operators.
14765   if (NumArgs == 1 || isPostIncDec) {
14766     UnaryOperatorKind Opc
14767       = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec);
14768     return SemaRef.CreateOverloadedUnaryOp(OpLoc, Opc, Functions, First,
14769                                            RequiresADL);
14770   }
14771 
14772   if (Op == OO_Subscript) {
14773     SourceLocation LBrace;
14774     SourceLocation RBrace;
14775 
14776     if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Callee)) {
14777       DeclarationNameLoc NameLoc = DRE->getNameInfo().getInfo();
14778       LBrace = NameLoc.getCXXOperatorNameBeginLoc();
14779       RBrace = NameLoc.getCXXOperatorNameEndLoc();
14780     } else {
14781       LBrace = Callee->getBeginLoc();
14782       RBrace = OpLoc;
14783     }
14784 
14785     return SemaRef.CreateOverloadedArraySubscriptExpr(LBrace, RBrace,
14786                                                       First, Second);
14787   }
14788 
14789   // Create the overloaded operator invocation for binary operators.
14790   BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op);
14791   ExprResult Result = SemaRef.CreateOverloadedBinOp(
14792       OpLoc, Opc, Functions, Args[0], Args[1], RequiresADL);
14793   if (Result.isInvalid())
14794     return ExprError();
14795 
14796   return Result;
14797 }
14798 
14799 template<typename Derived>
14800 ExprResult
14801 TreeTransform<Derived>::RebuildCXXPseudoDestructorExpr(Expr *Base,
14802                                                      SourceLocation OperatorLoc,
14803                                                        bool isArrow,
14804                                                        CXXScopeSpec &SS,
14805                                                      TypeSourceInfo *ScopeType,
14806                                                        SourceLocation CCLoc,
14807                                                        SourceLocation TildeLoc,
14808                                         PseudoDestructorTypeStorage Destroyed) {
14809   QualType BaseType = Base->getType();
14810   if (Base->isTypeDependent() || Destroyed.getIdentifier() ||
14811       (!isArrow && !BaseType->getAs<RecordType>()) ||
14812       (isArrow && BaseType->getAs<PointerType>() &&
14813        !BaseType->castAs<PointerType>()->getPointeeType()
14814                                               ->template getAs<RecordType>())){
14815     // This pseudo-destructor expression is still a pseudo-destructor.
14816     return SemaRef.BuildPseudoDestructorExpr(
14817         Base, OperatorLoc, isArrow ? tok::arrow : tok::period, SS, ScopeType,
14818         CCLoc, TildeLoc, Destroyed);
14819   }
14820 
14821   TypeSourceInfo *DestroyedType = Destroyed.getTypeSourceInfo();
14822   DeclarationName Name(SemaRef.Context.DeclarationNames.getCXXDestructorName(
14823                  SemaRef.Context.getCanonicalType(DestroyedType->getType())));
14824   DeclarationNameInfo NameInfo(Name, Destroyed.getLocation());
14825   NameInfo.setNamedTypeInfo(DestroyedType);
14826 
14827   // The scope type is now known to be a valid nested name specifier
14828   // component. Tack it on to the end of the nested name specifier.
14829   if (ScopeType) {
14830     if (!ScopeType->getType()->getAs<TagType>()) {
14831       getSema().Diag(ScopeType->getTypeLoc().getBeginLoc(),
14832                      diag::err_expected_class_or_namespace)
14833           << ScopeType->getType() << getSema().getLangOpts().CPlusPlus;
14834       return ExprError();
14835     }
14836     SS.Extend(SemaRef.Context, SourceLocation(), ScopeType->getTypeLoc(),
14837               CCLoc);
14838   }
14839 
14840   SourceLocation TemplateKWLoc; // FIXME: retrieve it from caller.
14841   return getSema().BuildMemberReferenceExpr(Base, BaseType,
14842                                             OperatorLoc, isArrow,
14843                                             SS, TemplateKWLoc,
14844                                             /*FIXME: FirstQualifier*/ nullptr,
14845                                             NameInfo,
14846                                             /*TemplateArgs*/ nullptr,
14847                                             /*S*/nullptr);
14848 }
14849 
14850 template<typename Derived>
14851 StmtResult
14852 TreeTransform<Derived>::TransformCapturedStmt(CapturedStmt *S) {
14853   SourceLocation Loc = S->getBeginLoc();
14854   CapturedDecl *CD = S->getCapturedDecl();
14855   unsigned NumParams = CD->getNumParams();
14856   unsigned ContextParamPos = CD->getContextParamPosition();
14857   SmallVector<Sema::CapturedParamNameType, 4> Params;
14858   for (unsigned I = 0; I < NumParams; ++I) {
14859     if (I != ContextParamPos) {
14860       Params.push_back(
14861              std::make_pair(
14862                   CD->getParam(I)->getName(),
14863                   getDerived().TransformType(CD->getParam(I)->getType())));
14864     } else {
14865       Params.push_back(std::make_pair(StringRef(), QualType()));
14866     }
14867   }
14868   getSema().ActOnCapturedRegionStart(Loc, /*CurScope*/nullptr,
14869                                      S->getCapturedRegionKind(), Params);
14870   StmtResult Body;
14871   {
14872     Sema::CompoundScopeRAII CompoundScope(getSema());
14873     Body = getDerived().TransformStmt(S->getCapturedStmt());
14874   }
14875 
14876   if (Body.isInvalid()) {
14877     getSema().ActOnCapturedRegionError();
14878     return StmtError();
14879   }
14880 
14881   return getSema().ActOnCapturedRegionEnd(Body.get());
14882 }
14883 
14884 } // end namespace clang
14885 
14886 #endif // LLVM_CLANG_LIB_SEMA_TREETRANSFORM_H
14887