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     if (auto *ReturnStmt = S->getReturnStmt()) {
7907       StmtResult Res = getDerived().TransformStmt(ReturnStmt);
7908       if (Res.isInvalid())
7909         return StmtError();
7910       Builder.ReturnStmt = Res.get();
7911     }
7912   }
7913 
7914   return getDerived().RebuildCoroutineBodyStmt(Builder);
7915 }
7916 
7917 template<typename Derived>
7918 StmtResult
7919 TreeTransform<Derived>::TransformCoreturnStmt(CoreturnStmt *S) {
7920   ExprResult Result = getDerived().TransformInitializer(S->getOperand(),
7921                                                         /*NotCopyInit*/false);
7922   if (Result.isInvalid())
7923     return StmtError();
7924 
7925   // Always rebuild; we don't know if this needs to be injected into a new
7926   // context or if the promise type has changed.
7927   return getDerived().RebuildCoreturnStmt(S->getKeywordLoc(), Result.get(),
7928                                           S->isImplicit());
7929 }
7930 
7931 template<typename Derived>
7932 ExprResult
7933 TreeTransform<Derived>::TransformCoawaitExpr(CoawaitExpr *E) {
7934   ExprResult Result = getDerived().TransformInitializer(E->getOperand(),
7935                                                         /*NotCopyInit*/false);
7936   if (Result.isInvalid())
7937     return ExprError();
7938 
7939   // Always rebuild; we don't know if this needs to be injected into a new
7940   // context or if the promise type has changed.
7941   return getDerived().RebuildCoawaitExpr(E->getKeywordLoc(), Result.get(),
7942                                          E->isImplicit());
7943 }
7944 
7945 template <typename Derived>
7946 ExprResult
7947 TreeTransform<Derived>::TransformDependentCoawaitExpr(DependentCoawaitExpr *E) {
7948   ExprResult OperandResult = getDerived().TransformInitializer(E->getOperand(),
7949                                                         /*NotCopyInit*/ false);
7950   if (OperandResult.isInvalid())
7951     return ExprError();
7952 
7953   ExprResult LookupResult = getDerived().TransformUnresolvedLookupExpr(
7954           E->getOperatorCoawaitLookup());
7955 
7956   if (LookupResult.isInvalid())
7957     return ExprError();
7958 
7959   // Always rebuild; we don't know if this needs to be injected into a new
7960   // context or if the promise type has changed.
7961   return getDerived().RebuildDependentCoawaitExpr(
7962       E->getKeywordLoc(), OperandResult.get(),
7963       cast<UnresolvedLookupExpr>(LookupResult.get()));
7964 }
7965 
7966 template<typename Derived>
7967 ExprResult
7968 TreeTransform<Derived>::TransformCoyieldExpr(CoyieldExpr *E) {
7969   ExprResult Result = getDerived().TransformInitializer(E->getOperand(),
7970                                                         /*NotCopyInit*/false);
7971   if (Result.isInvalid())
7972     return ExprError();
7973 
7974   // Always rebuild; we don't know if this needs to be injected into a new
7975   // context or if the promise type has changed.
7976   return getDerived().RebuildCoyieldExpr(E->getKeywordLoc(), Result.get());
7977 }
7978 
7979 // Objective-C Statements.
7980 
7981 template<typename Derived>
7982 StmtResult
7983 TreeTransform<Derived>::TransformObjCAtTryStmt(ObjCAtTryStmt *S) {
7984   // Transform the body of the @try.
7985   StmtResult TryBody = getDerived().TransformStmt(S->getTryBody());
7986   if (TryBody.isInvalid())
7987     return StmtError();
7988 
7989   // Transform the @catch statements (if present).
7990   bool AnyCatchChanged = false;
7991   SmallVector<Stmt*, 8> CatchStmts;
7992   for (unsigned I = 0, N = S->getNumCatchStmts(); I != N; ++I) {
7993     StmtResult Catch = getDerived().TransformStmt(S->getCatchStmt(I));
7994     if (Catch.isInvalid())
7995       return StmtError();
7996     if (Catch.get() != S->getCatchStmt(I))
7997       AnyCatchChanged = true;
7998     CatchStmts.push_back(Catch.get());
7999   }
8000 
8001   // Transform the @finally statement (if present).
8002   StmtResult Finally;
8003   if (S->getFinallyStmt()) {
8004     Finally = getDerived().TransformStmt(S->getFinallyStmt());
8005     if (Finally.isInvalid())
8006       return StmtError();
8007   }
8008 
8009   // If nothing changed, just retain this statement.
8010   if (!getDerived().AlwaysRebuild() &&
8011       TryBody.get() == S->getTryBody() &&
8012       !AnyCatchChanged &&
8013       Finally.get() == S->getFinallyStmt())
8014     return S;
8015 
8016   // Build a new statement.
8017   return getDerived().RebuildObjCAtTryStmt(S->getAtTryLoc(), TryBody.get(),
8018                                            CatchStmts, Finally.get());
8019 }
8020 
8021 template<typename Derived>
8022 StmtResult
8023 TreeTransform<Derived>::TransformObjCAtCatchStmt(ObjCAtCatchStmt *S) {
8024   // Transform the @catch parameter, if there is one.
8025   VarDecl *Var = nullptr;
8026   if (VarDecl *FromVar = S->getCatchParamDecl()) {
8027     TypeSourceInfo *TSInfo = nullptr;
8028     if (FromVar->getTypeSourceInfo()) {
8029       TSInfo = getDerived().TransformType(FromVar->getTypeSourceInfo());
8030       if (!TSInfo)
8031         return StmtError();
8032     }
8033 
8034     QualType T;
8035     if (TSInfo)
8036       T = TSInfo->getType();
8037     else {
8038       T = getDerived().TransformType(FromVar->getType());
8039       if (T.isNull())
8040         return StmtError();
8041     }
8042 
8043     Var = getDerived().RebuildObjCExceptionDecl(FromVar, TSInfo, T);
8044     if (!Var)
8045       return StmtError();
8046   }
8047 
8048   StmtResult Body = getDerived().TransformStmt(S->getCatchBody());
8049   if (Body.isInvalid())
8050     return StmtError();
8051 
8052   return getDerived().RebuildObjCAtCatchStmt(S->getAtCatchLoc(),
8053                                              S->getRParenLoc(),
8054                                              Var, Body.get());
8055 }
8056 
8057 template<typename Derived>
8058 StmtResult
8059 TreeTransform<Derived>::TransformObjCAtFinallyStmt(ObjCAtFinallyStmt *S) {
8060   // Transform the body.
8061   StmtResult Body = getDerived().TransformStmt(S->getFinallyBody());
8062   if (Body.isInvalid())
8063     return StmtError();
8064 
8065   // If nothing changed, just retain this statement.
8066   if (!getDerived().AlwaysRebuild() &&
8067       Body.get() == S->getFinallyBody())
8068     return S;
8069 
8070   // Build a new statement.
8071   return getDerived().RebuildObjCAtFinallyStmt(S->getAtFinallyLoc(),
8072                                                Body.get());
8073 }
8074 
8075 template<typename Derived>
8076 StmtResult
8077 TreeTransform<Derived>::TransformObjCAtThrowStmt(ObjCAtThrowStmt *S) {
8078   ExprResult Operand;
8079   if (S->getThrowExpr()) {
8080     Operand = getDerived().TransformExpr(S->getThrowExpr());
8081     if (Operand.isInvalid())
8082       return StmtError();
8083   }
8084 
8085   if (!getDerived().AlwaysRebuild() &&
8086       Operand.get() == S->getThrowExpr())
8087     return S;
8088 
8089   return getDerived().RebuildObjCAtThrowStmt(S->getThrowLoc(), Operand.get());
8090 }
8091 
8092 template<typename Derived>
8093 StmtResult
8094 TreeTransform<Derived>::TransformObjCAtSynchronizedStmt(
8095                                                   ObjCAtSynchronizedStmt *S) {
8096   // Transform the object we are locking.
8097   ExprResult Object = getDerived().TransformExpr(S->getSynchExpr());
8098   if (Object.isInvalid())
8099     return StmtError();
8100   Object =
8101     getDerived().RebuildObjCAtSynchronizedOperand(S->getAtSynchronizedLoc(),
8102                                                   Object.get());
8103   if (Object.isInvalid())
8104     return StmtError();
8105 
8106   // Transform the body.
8107   StmtResult Body = getDerived().TransformStmt(S->getSynchBody());
8108   if (Body.isInvalid())
8109     return StmtError();
8110 
8111   // If nothing change, just retain the current statement.
8112   if (!getDerived().AlwaysRebuild() &&
8113       Object.get() == S->getSynchExpr() &&
8114       Body.get() == S->getSynchBody())
8115     return S;
8116 
8117   // Build a new statement.
8118   return getDerived().RebuildObjCAtSynchronizedStmt(S->getAtSynchronizedLoc(),
8119                                                     Object.get(), Body.get());
8120 }
8121 
8122 template<typename Derived>
8123 StmtResult
8124 TreeTransform<Derived>::TransformObjCAutoreleasePoolStmt(
8125                                               ObjCAutoreleasePoolStmt *S) {
8126   // Transform the body.
8127   StmtResult Body = getDerived().TransformStmt(S->getSubStmt());
8128   if (Body.isInvalid())
8129     return StmtError();
8130 
8131   // If nothing changed, just retain this statement.
8132   if (!getDerived().AlwaysRebuild() &&
8133       Body.get() == S->getSubStmt())
8134     return S;
8135 
8136   // Build a new statement.
8137   return getDerived().RebuildObjCAutoreleasePoolStmt(
8138                         S->getAtLoc(), Body.get());
8139 }
8140 
8141 template<typename Derived>
8142 StmtResult
8143 TreeTransform<Derived>::TransformObjCForCollectionStmt(
8144                                                   ObjCForCollectionStmt *S) {
8145   // Transform the element statement.
8146   StmtResult Element =
8147       getDerived().TransformStmt(S->getElement(), SDK_NotDiscarded);
8148   if (Element.isInvalid())
8149     return StmtError();
8150 
8151   // Transform the collection expression.
8152   ExprResult Collection = getDerived().TransformExpr(S->getCollection());
8153   if (Collection.isInvalid())
8154     return StmtError();
8155 
8156   // Transform the body.
8157   StmtResult Body = getDerived().TransformStmt(S->getBody());
8158   if (Body.isInvalid())
8159     return StmtError();
8160 
8161   // If nothing changed, just retain this statement.
8162   if (!getDerived().AlwaysRebuild() &&
8163       Element.get() == S->getElement() &&
8164       Collection.get() == S->getCollection() &&
8165       Body.get() == S->getBody())
8166     return S;
8167 
8168   // Build a new statement.
8169   return getDerived().RebuildObjCForCollectionStmt(S->getForLoc(),
8170                                                    Element.get(),
8171                                                    Collection.get(),
8172                                                    S->getRParenLoc(),
8173                                                    Body.get());
8174 }
8175 
8176 template <typename Derived>
8177 StmtResult TreeTransform<Derived>::TransformCXXCatchStmt(CXXCatchStmt *S) {
8178   // Transform the exception declaration, if any.
8179   VarDecl *Var = nullptr;
8180   if (VarDecl *ExceptionDecl = S->getExceptionDecl()) {
8181     TypeSourceInfo *T =
8182         getDerived().TransformType(ExceptionDecl->getTypeSourceInfo());
8183     if (!T)
8184       return StmtError();
8185 
8186     Var = getDerived().RebuildExceptionDecl(
8187         ExceptionDecl, T, ExceptionDecl->getInnerLocStart(),
8188         ExceptionDecl->getLocation(), ExceptionDecl->getIdentifier());
8189     if (!Var || Var->isInvalidDecl())
8190       return StmtError();
8191   }
8192 
8193   // Transform the actual exception handler.
8194   StmtResult Handler = getDerived().TransformStmt(S->getHandlerBlock());
8195   if (Handler.isInvalid())
8196     return StmtError();
8197 
8198   if (!getDerived().AlwaysRebuild() && !Var &&
8199       Handler.get() == S->getHandlerBlock())
8200     return S;
8201 
8202   return getDerived().RebuildCXXCatchStmt(S->getCatchLoc(), Var, Handler.get());
8203 }
8204 
8205 template <typename Derived>
8206 StmtResult TreeTransform<Derived>::TransformCXXTryStmt(CXXTryStmt *S) {
8207   // Transform the try block itself.
8208   StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock());
8209   if (TryBlock.isInvalid())
8210     return StmtError();
8211 
8212   // Transform the handlers.
8213   bool HandlerChanged = false;
8214   SmallVector<Stmt *, 8> Handlers;
8215   for (unsigned I = 0, N = S->getNumHandlers(); I != N; ++I) {
8216     StmtResult Handler = getDerived().TransformCXXCatchStmt(S->getHandler(I));
8217     if (Handler.isInvalid())
8218       return StmtError();
8219 
8220     HandlerChanged = HandlerChanged || Handler.get() != S->getHandler(I);
8221     Handlers.push_back(Handler.getAs<Stmt>());
8222   }
8223 
8224   if (!getDerived().AlwaysRebuild() && TryBlock.get() == S->getTryBlock() &&
8225       !HandlerChanged)
8226     return S;
8227 
8228   return getDerived().RebuildCXXTryStmt(S->getTryLoc(), TryBlock.get(),
8229                                         Handlers);
8230 }
8231 
8232 template<typename Derived>
8233 StmtResult
8234 TreeTransform<Derived>::TransformCXXForRangeStmt(CXXForRangeStmt *S) {
8235   StmtResult Init =
8236       S->getInit() ? getDerived().TransformStmt(S->getInit()) : StmtResult();
8237   if (Init.isInvalid())
8238     return StmtError();
8239 
8240   StmtResult Range = getDerived().TransformStmt(S->getRangeStmt());
8241   if (Range.isInvalid())
8242     return StmtError();
8243 
8244   StmtResult Begin = getDerived().TransformStmt(S->getBeginStmt());
8245   if (Begin.isInvalid())
8246     return StmtError();
8247   StmtResult End = getDerived().TransformStmt(S->getEndStmt());
8248   if (End.isInvalid())
8249     return StmtError();
8250 
8251   ExprResult Cond = getDerived().TransformExpr(S->getCond());
8252   if (Cond.isInvalid())
8253     return StmtError();
8254   if (Cond.get())
8255     Cond = SemaRef.CheckBooleanCondition(S->getColonLoc(), Cond.get());
8256   if (Cond.isInvalid())
8257     return StmtError();
8258   if (Cond.get())
8259     Cond = SemaRef.MaybeCreateExprWithCleanups(Cond.get());
8260 
8261   ExprResult Inc = getDerived().TransformExpr(S->getInc());
8262   if (Inc.isInvalid())
8263     return StmtError();
8264   if (Inc.get())
8265     Inc = SemaRef.MaybeCreateExprWithCleanups(Inc.get());
8266 
8267   StmtResult LoopVar = getDerived().TransformStmt(S->getLoopVarStmt());
8268   if (LoopVar.isInvalid())
8269     return StmtError();
8270 
8271   StmtResult NewStmt = S;
8272   if (getDerived().AlwaysRebuild() ||
8273       Init.get() != S->getInit() ||
8274       Range.get() != S->getRangeStmt() ||
8275       Begin.get() != S->getBeginStmt() ||
8276       End.get() != S->getEndStmt() ||
8277       Cond.get() != S->getCond() ||
8278       Inc.get() != S->getInc() ||
8279       LoopVar.get() != S->getLoopVarStmt()) {
8280     NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(),
8281                                                   S->getCoawaitLoc(), Init.get(),
8282                                                   S->getColonLoc(), Range.get(),
8283                                                   Begin.get(), End.get(),
8284                                                   Cond.get(),
8285                                                   Inc.get(), LoopVar.get(),
8286                                                   S->getRParenLoc());
8287     if (NewStmt.isInvalid() && LoopVar.get() != S->getLoopVarStmt()) {
8288       // Might not have attached any initializer to the loop variable.
8289       getSema().ActOnInitializerError(
8290           cast<DeclStmt>(LoopVar.get())->getSingleDecl());
8291       return StmtError();
8292     }
8293   }
8294 
8295   StmtResult Body = getDerived().TransformStmt(S->getBody());
8296   if (Body.isInvalid())
8297     return StmtError();
8298 
8299   // Body has changed but we didn't rebuild the for-range statement. Rebuild
8300   // it now so we have a new statement to attach the body to.
8301   if (Body.get() != S->getBody() && NewStmt.get() == S) {
8302     NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(),
8303                                                   S->getCoawaitLoc(), Init.get(),
8304                                                   S->getColonLoc(), Range.get(),
8305                                                   Begin.get(), End.get(),
8306                                                   Cond.get(),
8307                                                   Inc.get(), LoopVar.get(),
8308                                                   S->getRParenLoc());
8309     if (NewStmt.isInvalid())
8310       return StmtError();
8311   }
8312 
8313   if (NewStmt.get() == S)
8314     return S;
8315 
8316   return FinishCXXForRangeStmt(NewStmt.get(), Body.get());
8317 }
8318 
8319 template<typename Derived>
8320 StmtResult
8321 TreeTransform<Derived>::TransformMSDependentExistsStmt(
8322                                                     MSDependentExistsStmt *S) {
8323   // Transform the nested-name-specifier, if any.
8324   NestedNameSpecifierLoc QualifierLoc;
8325   if (S->getQualifierLoc()) {
8326     QualifierLoc
8327       = getDerived().TransformNestedNameSpecifierLoc(S->getQualifierLoc());
8328     if (!QualifierLoc)
8329       return StmtError();
8330   }
8331 
8332   // Transform the declaration name.
8333   DeclarationNameInfo NameInfo = S->getNameInfo();
8334   if (NameInfo.getName()) {
8335     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
8336     if (!NameInfo.getName())
8337       return StmtError();
8338   }
8339 
8340   // Check whether anything changed.
8341   if (!getDerived().AlwaysRebuild() &&
8342       QualifierLoc == S->getQualifierLoc() &&
8343       NameInfo.getName() == S->getNameInfo().getName())
8344     return S;
8345 
8346   // Determine whether this name exists, if we can.
8347   CXXScopeSpec SS;
8348   SS.Adopt(QualifierLoc);
8349   bool Dependent = false;
8350   switch (getSema().CheckMicrosoftIfExistsSymbol(/*S=*/nullptr, SS, NameInfo)) {
8351   case Sema::IER_Exists:
8352     if (S->isIfExists())
8353       break;
8354 
8355     return new (getSema().Context) NullStmt(S->getKeywordLoc());
8356 
8357   case Sema::IER_DoesNotExist:
8358     if (S->isIfNotExists())
8359       break;
8360 
8361     return new (getSema().Context) NullStmt(S->getKeywordLoc());
8362 
8363   case Sema::IER_Dependent:
8364     Dependent = true;
8365     break;
8366 
8367   case Sema::IER_Error:
8368     return StmtError();
8369   }
8370 
8371   // We need to continue with the instantiation, so do so now.
8372   StmtResult SubStmt = getDerived().TransformCompoundStmt(S->getSubStmt());
8373   if (SubStmt.isInvalid())
8374     return StmtError();
8375 
8376   // If we have resolved the name, just transform to the substatement.
8377   if (!Dependent)
8378     return SubStmt;
8379 
8380   // The name is still dependent, so build a dependent expression again.
8381   return getDerived().RebuildMSDependentExistsStmt(S->getKeywordLoc(),
8382                                                    S->isIfExists(),
8383                                                    QualifierLoc,
8384                                                    NameInfo,
8385                                                    SubStmt.get());
8386 }
8387 
8388 template<typename Derived>
8389 ExprResult
8390 TreeTransform<Derived>::TransformMSPropertyRefExpr(MSPropertyRefExpr *E) {
8391   NestedNameSpecifierLoc QualifierLoc;
8392   if (E->getQualifierLoc()) {
8393     QualifierLoc
8394     = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
8395     if (!QualifierLoc)
8396       return ExprError();
8397   }
8398 
8399   MSPropertyDecl *PD = cast_or_null<MSPropertyDecl>(
8400     getDerived().TransformDecl(E->getMemberLoc(), E->getPropertyDecl()));
8401   if (!PD)
8402     return ExprError();
8403 
8404   ExprResult Base = getDerived().TransformExpr(E->getBaseExpr());
8405   if (Base.isInvalid())
8406     return ExprError();
8407 
8408   return new (SemaRef.getASTContext())
8409       MSPropertyRefExpr(Base.get(), PD, E->isArrow(),
8410                         SemaRef.getASTContext().PseudoObjectTy, VK_LValue,
8411                         QualifierLoc, E->getMemberLoc());
8412 }
8413 
8414 template <typename Derived>
8415 ExprResult TreeTransform<Derived>::TransformMSPropertySubscriptExpr(
8416     MSPropertySubscriptExpr *E) {
8417   auto BaseRes = getDerived().TransformExpr(E->getBase());
8418   if (BaseRes.isInvalid())
8419     return ExprError();
8420   auto IdxRes = getDerived().TransformExpr(E->getIdx());
8421   if (IdxRes.isInvalid())
8422     return ExprError();
8423 
8424   if (!getDerived().AlwaysRebuild() &&
8425       BaseRes.get() == E->getBase() &&
8426       IdxRes.get() == E->getIdx())
8427     return E;
8428 
8429   return getDerived().RebuildArraySubscriptExpr(
8430       BaseRes.get(), SourceLocation(), IdxRes.get(), E->getRBracketLoc());
8431 }
8432 
8433 template <typename Derived>
8434 StmtResult TreeTransform<Derived>::TransformSEHTryStmt(SEHTryStmt *S) {
8435   StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock());
8436   if (TryBlock.isInvalid())
8437     return StmtError();
8438 
8439   StmtResult Handler = getDerived().TransformSEHHandler(S->getHandler());
8440   if (Handler.isInvalid())
8441     return StmtError();
8442 
8443   if (!getDerived().AlwaysRebuild() && TryBlock.get() == S->getTryBlock() &&
8444       Handler.get() == S->getHandler())
8445     return S;
8446 
8447   return getDerived().RebuildSEHTryStmt(S->getIsCXXTry(), S->getTryLoc(),
8448                                         TryBlock.get(), Handler.get());
8449 }
8450 
8451 template <typename Derived>
8452 StmtResult TreeTransform<Derived>::TransformSEHFinallyStmt(SEHFinallyStmt *S) {
8453   StmtResult Block = getDerived().TransformCompoundStmt(S->getBlock());
8454   if (Block.isInvalid())
8455     return StmtError();
8456 
8457   return getDerived().RebuildSEHFinallyStmt(S->getFinallyLoc(), Block.get());
8458 }
8459 
8460 template <typename Derived>
8461 StmtResult TreeTransform<Derived>::TransformSEHExceptStmt(SEHExceptStmt *S) {
8462   ExprResult FilterExpr = getDerived().TransformExpr(S->getFilterExpr());
8463   if (FilterExpr.isInvalid())
8464     return StmtError();
8465 
8466   StmtResult Block = getDerived().TransformCompoundStmt(S->getBlock());
8467   if (Block.isInvalid())
8468     return StmtError();
8469 
8470   return getDerived().RebuildSEHExceptStmt(S->getExceptLoc(), FilterExpr.get(),
8471                                            Block.get());
8472 }
8473 
8474 template <typename Derived>
8475 StmtResult TreeTransform<Derived>::TransformSEHHandler(Stmt *Handler) {
8476   if (isa<SEHFinallyStmt>(Handler))
8477     return getDerived().TransformSEHFinallyStmt(cast<SEHFinallyStmt>(Handler));
8478   else
8479     return getDerived().TransformSEHExceptStmt(cast<SEHExceptStmt>(Handler));
8480 }
8481 
8482 template<typename Derived>
8483 StmtResult
8484 TreeTransform<Derived>::TransformSEHLeaveStmt(SEHLeaveStmt *S) {
8485   return S;
8486 }
8487 
8488 //===----------------------------------------------------------------------===//
8489 // OpenMP directive transformation
8490 //===----------------------------------------------------------------------===//
8491 
8492 template <typename Derived>
8493 StmtResult
8494 TreeTransform<Derived>::TransformOMPCanonicalLoop(OMPCanonicalLoop *L) {
8495   // OMPCanonicalLoops are eliminated during transformation, since they will be
8496   // recomputed by semantic analysis of the associated OMPLoopBasedDirective
8497   // after transformation.
8498   return getDerived().TransformStmt(L->getLoopStmt());
8499 }
8500 
8501 template <typename Derived>
8502 StmtResult TreeTransform<Derived>::TransformOMPExecutableDirective(
8503     OMPExecutableDirective *D) {
8504 
8505   // Transform the clauses
8506   llvm::SmallVector<OMPClause *, 16> TClauses;
8507   ArrayRef<OMPClause *> Clauses = D->clauses();
8508   TClauses.reserve(Clauses.size());
8509   for (ArrayRef<OMPClause *>::iterator I = Clauses.begin(), E = Clauses.end();
8510        I != E; ++I) {
8511     if (*I) {
8512       getDerived().getSema().StartOpenMPClause((*I)->getClauseKind());
8513       OMPClause *Clause = getDerived().TransformOMPClause(*I);
8514       getDerived().getSema().EndOpenMPClause();
8515       if (Clause)
8516         TClauses.push_back(Clause);
8517     } else {
8518       TClauses.push_back(nullptr);
8519     }
8520   }
8521   StmtResult AssociatedStmt;
8522   if (D->hasAssociatedStmt() && D->getAssociatedStmt()) {
8523     getDerived().getSema().ActOnOpenMPRegionStart(D->getDirectiveKind(),
8524                                                   /*CurScope=*/nullptr);
8525     StmtResult Body;
8526     {
8527       Sema::CompoundScopeRAII CompoundScope(getSema());
8528       Stmt *CS;
8529       if (D->getDirectiveKind() == OMPD_atomic ||
8530           D->getDirectiveKind() == OMPD_critical ||
8531           D->getDirectiveKind() == OMPD_section ||
8532           D->getDirectiveKind() == OMPD_master)
8533         CS = D->getAssociatedStmt();
8534       else
8535         CS = D->getRawStmt();
8536       Body = getDerived().TransformStmt(CS);
8537       if (Body.isUsable() && isOpenMPLoopDirective(D->getDirectiveKind()) &&
8538           getSema().getLangOpts().OpenMPIRBuilder)
8539         Body = getDerived().RebuildOMPCanonicalLoop(Body.get());
8540     }
8541     AssociatedStmt =
8542         getDerived().getSema().ActOnOpenMPRegionEnd(Body, TClauses);
8543     if (AssociatedStmt.isInvalid()) {
8544       return StmtError();
8545     }
8546   }
8547   if (TClauses.size() != Clauses.size()) {
8548     return StmtError();
8549   }
8550 
8551   // Transform directive name for 'omp critical' directive.
8552   DeclarationNameInfo DirName;
8553   if (D->getDirectiveKind() == OMPD_critical) {
8554     DirName = cast<OMPCriticalDirective>(D)->getDirectiveName();
8555     DirName = getDerived().TransformDeclarationNameInfo(DirName);
8556   }
8557   OpenMPDirectiveKind CancelRegion = OMPD_unknown;
8558   if (D->getDirectiveKind() == OMPD_cancellation_point) {
8559     CancelRegion = cast<OMPCancellationPointDirective>(D)->getCancelRegion();
8560   } else if (D->getDirectiveKind() == OMPD_cancel) {
8561     CancelRegion = cast<OMPCancelDirective>(D)->getCancelRegion();
8562   }
8563 
8564   return getDerived().RebuildOMPExecutableDirective(
8565       D->getDirectiveKind(), DirName, CancelRegion, TClauses,
8566       AssociatedStmt.get(), D->getBeginLoc(), D->getEndLoc());
8567 }
8568 
8569 template <typename Derived>
8570 StmtResult
8571 TreeTransform<Derived>::TransformOMPMetaDirective(OMPMetaDirective *D) {
8572   // TODO: Fix This
8573   SemaRef.Diag(D->getBeginLoc(), diag::err_omp_instantiation_not_supported)
8574       << getOpenMPDirectiveName(D->getDirectiveKind());
8575   return StmtError();
8576 }
8577 
8578 template <typename Derived>
8579 StmtResult
8580 TreeTransform<Derived>::TransformOMPParallelDirective(OMPParallelDirective *D) {
8581   DeclarationNameInfo DirName;
8582   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel, DirName, nullptr,
8583                                              D->getBeginLoc());
8584   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8585   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8586   return Res;
8587 }
8588 
8589 template <typename Derived>
8590 StmtResult
8591 TreeTransform<Derived>::TransformOMPSimdDirective(OMPSimdDirective *D) {
8592   DeclarationNameInfo DirName;
8593   getDerived().getSema().StartOpenMPDSABlock(OMPD_simd, DirName, nullptr,
8594                                              D->getBeginLoc());
8595   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8596   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8597   return Res;
8598 }
8599 
8600 template <typename Derived>
8601 StmtResult
8602 TreeTransform<Derived>::TransformOMPTileDirective(OMPTileDirective *D) {
8603   DeclarationNameInfo DirName;
8604   getDerived().getSema().StartOpenMPDSABlock(D->getDirectiveKind(), DirName,
8605                                              nullptr, D->getBeginLoc());
8606   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8607   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8608   return Res;
8609 }
8610 
8611 template <typename Derived>
8612 StmtResult
8613 TreeTransform<Derived>::TransformOMPUnrollDirective(OMPUnrollDirective *D) {
8614   DeclarationNameInfo DirName;
8615   getDerived().getSema().StartOpenMPDSABlock(D->getDirectiveKind(), DirName,
8616                                              nullptr, D->getBeginLoc());
8617   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8618   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8619   return Res;
8620 }
8621 
8622 template <typename Derived>
8623 StmtResult
8624 TreeTransform<Derived>::TransformOMPForDirective(OMPForDirective *D) {
8625   DeclarationNameInfo DirName;
8626   getDerived().getSema().StartOpenMPDSABlock(OMPD_for, DirName, nullptr,
8627                                              D->getBeginLoc());
8628   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8629   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8630   return Res;
8631 }
8632 
8633 template <typename Derived>
8634 StmtResult
8635 TreeTransform<Derived>::TransformOMPForSimdDirective(OMPForSimdDirective *D) {
8636   DeclarationNameInfo DirName;
8637   getDerived().getSema().StartOpenMPDSABlock(OMPD_for_simd, DirName, nullptr,
8638                                              D->getBeginLoc());
8639   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8640   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8641   return Res;
8642 }
8643 
8644 template <typename Derived>
8645 StmtResult
8646 TreeTransform<Derived>::TransformOMPSectionsDirective(OMPSectionsDirective *D) {
8647   DeclarationNameInfo DirName;
8648   getDerived().getSema().StartOpenMPDSABlock(OMPD_sections, DirName, nullptr,
8649                                              D->getBeginLoc());
8650   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8651   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8652   return Res;
8653 }
8654 
8655 template <typename Derived>
8656 StmtResult
8657 TreeTransform<Derived>::TransformOMPSectionDirective(OMPSectionDirective *D) {
8658   DeclarationNameInfo DirName;
8659   getDerived().getSema().StartOpenMPDSABlock(OMPD_section, DirName, nullptr,
8660                                              D->getBeginLoc());
8661   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8662   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8663   return Res;
8664 }
8665 
8666 template <typename Derived>
8667 StmtResult
8668 TreeTransform<Derived>::TransformOMPSingleDirective(OMPSingleDirective *D) {
8669   DeclarationNameInfo DirName;
8670   getDerived().getSema().StartOpenMPDSABlock(OMPD_single, DirName, nullptr,
8671                                              D->getBeginLoc());
8672   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8673   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8674   return Res;
8675 }
8676 
8677 template <typename Derived>
8678 StmtResult
8679 TreeTransform<Derived>::TransformOMPMasterDirective(OMPMasterDirective *D) {
8680   DeclarationNameInfo DirName;
8681   getDerived().getSema().StartOpenMPDSABlock(OMPD_master, DirName, nullptr,
8682                                              D->getBeginLoc());
8683   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8684   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8685   return Res;
8686 }
8687 
8688 template <typename Derived>
8689 StmtResult
8690 TreeTransform<Derived>::TransformOMPCriticalDirective(OMPCriticalDirective *D) {
8691   getDerived().getSema().StartOpenMPDSABlock(
8692       OMPD_critical, D->getDirectiveName(), nullptr, D->getBeginLoc());
8693   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8694   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8695   return Res;
8696 }
8697 
8698 template <typename Derived>
8699 StmtResult TreeTransform<Derived>::TransformOMPParallelForDirective(
8700     OMPParallelForDirective *D) {
8701   DeclarationNameInfo DirName;
8702   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_for, DirName,
8703                                              nullptr, D->getBeginLoc());
8704   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8705   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8706   return Res;
8707 }
8708 
8709 template <typename Derived>
8710 StmtResult TreeTransform<Derived>::TransformOMPParallelForSimdDirective(
8711     OMPParallelForSimdDirective *D) {
8712   DeclarationNameInfo DirName;
8713   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_for_simd, DirName,
8714                                              nullptr, D->getBeginLoc());
8715   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8716   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8717   return Res;
8718 }
8719 
8720 template <typename Derived>
8721 StmtResult TreeTransform<Derived>::TransformOMPParallelMasterDirective(
8722     OMPParallelMasterDirective *D) {
8723   DeclarationNameInfo DirName;
8724   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_master, DirName,
8725                                              nullptr, D->getBeginLoc());
8726   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8727   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8728   return Res;
8729 }
8730 
8731 template <typename Derived>
8732 StmtResult TreeTransform<Derived>::TransformOMPParallelSectionsDirective(
8733     OMPParallelSectionsDirective *D) {
8734   DeclarationNameInfo DirName;
8735   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_sections, DirName,
8736                                              nullptr, D->getBeginLoc());
8737   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8738   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8739   return Res;
8740 }
8741 
8742 template <typename Derived>
8743 StmtResult
8744 TreeTransform<Derived>::TransformOMPTaskDirective(OMPTaskDirective *D) {
8745   DeclarationNameInfo DirName;
8746   getDerived().getSema().StartOpenMPDSABlock(OMPD_task, DirName, nullptr,
8747                                              D->getBeginLoc());
8748   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8749   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8750   return Res;
8751 }
8752 
8753 template <typename Derived>
8754 StmtResult TreeTransform<Derived>::TransformOMPTaskyieldDirective(
8755     OMPTaskyieldDirective *D) {
8756   DeclarationNameInfo DirName;
8757   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskyield, DirName, nullptr,
8758                                              D->getBeginLoc());
8759   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8760   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8761   return Res;
8762 }
8763 
8764 template <typename Derived>
8765 StmtResult
8766 TreeTransform<Derived>::TransformOMPBarrierDirective(OMPBarrierDirective *D) {
8767   DeclarationNameInfo DirName;
8768   getDerived().getSema().StartOpenMPDSABlock(OMPD_barrier, DirName, nullptr,
8769                                              D->getBeginLoc());
8770   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8771   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8772   return Res;
8773 }
8774 
8775 template <typename Derived>
8776 StmtResult
8777 TreeTransform<Derived>::TransformOMPTaskwaitDirective(OMPTaskwaitDirective *D) {
8778   DeclarationNameInfo DirName;
8779   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskwait, DirName, nullptr,
8780                                              D->getBeginLoc());
8781   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8782   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8783   return Res;
8784 }
8785 
8786 template <typename Derived>
8787 StmtResult TreeTransform<Derived>::TransformOMPTaskgroupDirective(
8788     OMPTaskgroupDirective *D) {
8789   DeclarationNameInfo DirName;
8790   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskgroup, DirName, nullptr,
8791                                              D->getBeginLoc());
8792   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8793   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8794   return Res;
8795 }
8796 
8797 template <typename Derived>
8798 StmtResult
8799 TreeTransform<Derived>::TransformOMPFlushDirective(OMPFlushDirective *D) {
8800   DeclarationNameInfo DirName;
8801   getDerived().getSema().StartOpenMPDSABlock(OMPD_flush, DirName, nullptr,
8802                                              D->getBeginLoc());
8803   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8804   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8805   return Res;
8806 }
8807 
8808 template <typename Derived>
8809 StmtResult
8810 TreeTransform<Derived>::TransformOMPDepobjDirective(OMPDepobjDirective *D) {
8811   DeclarationNameInfo DirName;
8812   getDerived().getSema().StartOpenMPDSABlock(OMPD_depobj, DirName, nullptr,
8813                                              D->getBeginLoc());
8814   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8815   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8816   return Res;
8817 }
8818 
8819 template <typename Derived>
8820 StmtResult
8821 TreeTransform<Derived>::TransformOMPScanDirective(OMPScanDirective *D) {
8822   DeclarationNameInfo DirName;
8823   getDerived().getSema().StartOpenMPDSABlock(OMPD_scan, DirName, nullptr,
8824                                              D->getBeginLoc());
8825   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8826   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8827   return Res;
8828 }
8829 
8830 template <typename Derived>
8831 StmtResult
8832 TreeTransform<Derived>::TransformOMPOrderedDirective(OMPOrderedDirective *D) {
8833   DeclarationNameInfo DirName;
8834   getDerived().getSema().StartOpenMPDSABlock(OMPD_ordered, DirName, nullptr,
8835                                              D->getBeginLoc());
8836   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8837   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8838   return Res;
8839 }
8840 
8841 template <typename Derived>
8842 StmtResult
8843 TreeTransform<Derived>::TransformOMPAtomicDirective(OMPAtomicDirective *D) {
8844   DeclarationNameInfo DirName;
8845   getDerived().getSema().StartOpenMPDSABlock(OMPD_atomic, DirName, nullptr,
8846                                              D->getBeginLoc());
8847   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8848   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8849   return Res;
8850 }
8851 
8852 template <typename Derived>
8853 StmtResult
8854 TreeTransform<Derived>::TransformOMPTargetDirective(OMPTargetDirective *D) {
8855   DeclarationNameInfo DirName;
8856   getDerived().getSema().StartOpenMPDSABlock(OMPD_target, DirName, nullptr,
8857                                              D->getBeginLoc());
8858   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8859   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8860   return Res;
8861 }
8862 
8863 template <typename Derived>
8864 StmtResult TreeTransform<Derived>::TransformOMPTargetDataDirective(
8865     OMPTargetDataDirective *D) {
8866   DeclarationNameInfo DirName;
8867   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_data, DirName, nullptr,
8868                                              D->getBeginLoc());
8869   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8870   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8871   return Res;
8872 }
8873 
8874 template <typename Derived>
8875 StmtResult TreeTransform<Derived>::TransformOMPTargetEnterDataDirective(
8876     OMPTargetEnterDataDirective *D) {
8877   DeclarationNameInfo DirName;
8878   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_enter_data, DirName,
8879                                              nullptr, D->getBeginLoc());
8880   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8881   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8882   return Res;
8883 }
8884 
8885 template <typename Derived>
8886 StmtResult TreeTransform<Derived>::TransformOMPTargetExitDataDirective(
8887     OMPTargetExitDataDirective *D) {
8888   DeclarationNameInfo DirName;
8889   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_exit_data, DirName,
8890                                              nullptr, D->getBeginLoc());
8891   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8892   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8893   return Res;
8894 }
8895 
8896 template <typename Derived>
8897 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelDirective(
8898     OMPTargetParallelDirective *D) {
8899   DeclarationNameInfo DirName;
8900   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel, DirName,
8901                                              nullptr, D->getBeginLoc());
8902   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8903   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8904   return Res;
8905 }
8906 
8907 template <typename Derived>
8908 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelForDirective(
8909     OMPTargetParallelForDirective *D) {
8910   DeclarationNameInfo DirName;
8911   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel_for, DirName,
8912                                              nullptr, D->getBeginLoc());
8913   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8914   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8915   return Res;
8916 }
8917 
8918 template <typename Derived>
8919 StmtResult TreeTransform<Derived>::TransformOMPTargetUpdateDirective(
8920     OMPTargetUpdateDirective *D) {
8921   DeclarationNameInfo DirName;
8922   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_update, DirName,
8923                                              nullptr, D->getBeginLoc());
8924   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8925   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8926   return Res;
8927 }
8928 
8929 template <typename Derived>
8930 StmtResult
8931 TreeTransform<Derived>::TransformOMPTeamsDirective(OMPTeamsDirective *D) {
8932   DeclarationNameInfo DirName;
8933   getDerived().getSema().StartOpenMPDSABlock(OMPD_teams, DirName, nullptr,
8934                                              D->getBeginLoc());
8935   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8936   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8937   return Res;
8938 }
8939 
8940 template <typename Derived>
8941 StmtResult TreeTransform<Derived>::TransformOMPCancellationPointDirective(
8942     OMPCancellationPointDirective *D) {
8943   DeclarationNameInfo DirName;
8944   getDerived().getSema().StartOpenMPDSABlock(OMPD_cancellation_point, DirName,
8945                                              nullptr, D->getBeginLoc());
8946   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8947   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8948   return Res;
8949 }
8950 
8951 template <typename Derived>
8952 StmtResult
8953 TreeTransform<Derived>::TransformOMPCancelDirective(OMPCancelDirective *D) {
8954   DeclarationNameInfo DirName;
8955   getDerived().getSema().StartOpenMPDSABlock(OMPD_cancel, DirName, nullptr,
8956                                              D->getBeginLoc());
8957   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8958   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8959   return Res;
8960 }
8961 
8962 template <typename Derived>
8963 StmtResult
8964 TreeTransform<Derived>::TransformOMPTaskLoopDirective(OMPTaskLoopDirective *D) {
8965   DeclarationNameInfo DirName;
8966   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskloop, DirName, nullptr,
8967                                              D->getBeginLoc());
8968   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8969   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8970   return Res;
8971 }
8972 
8973 template <typename Derived>
8974 StmtResult TreeTransform<Derived>::TransformOMPTaskLoopSimdDirective(
8975     OMPTaskLoopSimdDirective *D) {
8976   DeclarationNameInfo DirName;
8977   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskloop_simd, DirName,
8978                                              nullptr, D->getBeginLoc());
8979   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8980   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8981   return Res;
8982 }
8983 
8984 template <typename Derived>
8985 StmtResult TreeTransform<Derived>::TransformOMPMasterTaskLoopDirective(
8986     OMPMasterTaskLoopDirective *D) {
8987   DeclarationNameInfo DirName;
8988   getDerived().getSema().StartOpenMPDSABlock(OMPD_master_taskloop, DirName,
8989                                              nullptr, D->getBeginLoc());
8990   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8991   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8992   return Res;
8993 }
8994 
8995 template <typename Derived>
8996 StmtResult TreeTransform<Derived>::TransformOMPMasterTaskLoopSimdDirective(
8997     OMPMasterTaskLoopSimdDirective *D) {
8998   DeclarationNameInfo DirName;
8999   getDerived().getSema().StartOpenMPDSABlock(OMPD_master_taskloop_simd, DirName,
9000                                              nullptr, D->getBeginLoc());
9001   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9002   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9003   return Res;
9004 }
9005 
9006 template <typename Derived>
9007 StmtResult TreeTransform<Derived>::TransformOMPParallelMasterTaskLoopDirective(
9008     OMPParallelMasterTaskLoopDirective *D) {
9009   DeclarationNameInfo DirName;
9010   getDerived().getSema().StartOpenMPDSABlock(
9011       OMPD_parallel_master_taskloop, DirName, nullptr, D->getBeginLoc());
9012   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9013   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9014   return Res;
9015 }
9016 
9017 template <typename Derived>
9018 StmtResult
9019 TreeTransform<Derived>::TransformOMPParallelMasterTaskLoopSimdDirective(
9020     OMPParallelMasterTaskLoopSimdDirective *D) {
9021   DeclarationNameInfo DirName;
9022   getDerived().getSema().StartOpenMPDSABlock(
9023       OMPD_parallel_master_taskloop_simd, DirName, nullptr, D->getBeginLoc());
9024   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9025   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9026   return Res;
9027 }
9028 
9029 template <typename Derived>
9030 StmtResult TreeTransform<Derived>::TransformOMPDistributeDirective(
9031     OMPDistributeDirective *D) {
9032   DeclarationNameInfo DirName;
9033   getDerived().getSema().StartOpenMPDSABlock(OMPD_distribute, DirName, nullptr,
9034                                              D->getBeginLoc());
9035   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9036   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9037   return Res;
9038 }
9039 
9040 template <typename Derived>
9041 StmtResult TreeTransform<Derived>::TransformOMPDistributeParallelForDirective(
9042     OMPDistributeParallelForDirective *D) {
9043   DeclarationNameInfo DirName;
9044   getDerived().getSema().StartOpenMPDSABlock(
9045       OMPD_distribute_parallel_for, DirName, nullptr, D->getBeginLoc());
9046   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9047   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9048   return Res;
9049 }
9050 
9051 template <typename Derived>
9052 StmtResult
9053 TreeTransform<Derived>::TransformOMPDistributeParallelForSimdDirective(
9054     OMPDistributeParallelForSimdDirective *D) {
9055   DeclarationNameInfo DirName;
9056   getDerived().getSema().StartOpenMPDSABlock(
9057       OMPD_distribute_parallel_for_simd, DirName, nullptr, D->getBeginLoc());
9058   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9059   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9060   return Res;
9061 }
9062 
9063 template <typename Derived>
9064 StmtResult TreeTransform<Derived>::TransformOMPDistributeSimdDirective(
9065     OMPDistributeSimdDirective *D) {
9066   DeclarationNameInfo DirName;
9067   getDerived().getSema().StartOpenMPDSABlock(OMPD_distribute_simd, DirName,
9068                                              nullptr, D->getBeginLoc());
9069   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9070   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9071   return Res;
9072 }
9073 
9074 template <typename Derived>
9075 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelForSimdDirective(
9076     OMPTargetParallelForSimdDirective *D) {
9077   DeclarationNameInfo DirName;
9078   getDerived().getSema().StartOpenMPDSABlock(
9079       OMPD_target_parallel_for_simd, DirName, nullptr, D->getBeginLoc());
9080   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9081   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9082   return Res;
9083 }
9084 
9085 template <typename Derived>
9086 StmtResult TreeTransform<Derived>::TransformOMPTargetSimdDirective(
9087     OMPTargetSimdDirective *D) {
9088   DeclarationNameInfo DirName;
9089   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_simd, DirName, nullptr,
9090                                              D->getBeginLoc());
9091   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9092   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9093   return Res;
9094 }
9095 
9096 template <typename Derived>
9097 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeDirective(
9098     OMPTeamsDistributeDirective *D) {
9099   DeclarationNameInfo DirName;
9100   getDerived().getSema().StartOpenMPDSABlock(OMPD_teams_distribute, DirName,
9101                                              nullptr, D->getBeginLoc());
9102   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9103   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9104   return Res;
9105 }
9106 
9107 template <typename Derived>
9108 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeSimdDirective(
9109     OMPTeamsDistributeSimdDirective *D) {
9110   DeclarationNameInfo DirName;
9111   getDerived().getSema().StartOpenMPDSABlock(
9112       OMPD_teams_distribute_simd, DirName, nullptr, D->getBeginLoc());
9113   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9114   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9115   return Res;
9116 }
9117 
9118 template <typename Derived>
9119 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeParallelForSimdDirective(
9120     OMPTeamsDistributeParallelForSimdDirective *D) {
9121   DeclarationNameInfo DirName;
9122   getDerived().getSema().StartOpenMPDSABlock(
9123       OMPD_teams_distribute_parallel_for_simd, DirName, nullptr,
9124       D->getBeginLoc());
9125   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9126   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9127   return Res;
9128 }
9129 
9130 template <typename Derived>
9131 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeParallelForDirective(
9132     OMPTeamsDistributeParallelForDirective *D) {
9133   DeclarationNameInfo DirName;
9134   getDerived().getSema().StartOpenMPDSABlock(
9135       OMPD_teams_distribute_parallel_for, DirName, nullptr, D->getBeginLoc());
9136   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9137   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9138   return Res;
9139 }
9140 
9141 template <typename Derived>
9142 StmtResult TreeTransform<Derived>::TransformOMPTargetTeamsDirective(
9143     OMPTargetTeamsDirective *D) {
9144   DeclarationNameInfo DirName;
9145   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_teams, DirName,
9146                                              nullptr, D->getBeginLoc());
9147   auto Res = getDerived().TransformOMPExecutableDirective(D);
9148   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9149   return Res;
9150 }
9151 
9152 template <typename Derived>
9153 StmtResult TreeTransform<Derived>::TransformOMPTargetTeamsDistributeDirective(
9154     OMPTargetTeamsDistributeDirective *D) {
9155   DeclarationNameInfo DirName;
9156   getDerived().getSema().StartOpenMPDSABlock(
9157       OMPD_target_teams_distribute, DirName, nullptr, D->getBeginLoc());
9158   auto Res = getDerived().TransformOMPExecutableDirective(D);
9159   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9160   return Res;
9161 }
9162 
9163 template <typename Derived>
9164 StmtResult
9165 TreeTransform<Derived>::TransformOMPTargetTeamsDistributeParallelForDirective(
9166     OMPTargetTeamsDistributeParallelForDirective *D) {
9167   DeclarationNameInfo DirName;
9168   getDerived().getSema().StartOpenMPDSABlock(
9169       OMPD_target_teams_distribute_parallel_for, DirName, nullptr,
9170       D->getBeginLoc());
9171   auto Res = getDerived().TransformOMPExecutableDirective(D);
9172   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9173   return Res;
9174 }
9175 
9176 template <typename Derived>
9177 StmtResult TreeTransform<Derived>::
9178     TransformOMPTargetTeamsDistributeParallelForSimdDirective(
9179         OMPTargetTeamsDistributeParallelForSimdDirective *D) {
9180   DeclarationNameInfo DirName;
9181   getDerived().getSema().StartOpenMPDSABlock(
9182       OMPD_target_teams_distribute_parallel_for_simd, DirName, nullptr,
9183       D->getBeginLoc());
9184   auto Res = getDerived().TransformOMPExecutableDirective(D);
9185   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9186   return Res;
9187 }
9188 
9189 template <typename Derived>
9190 StmtResult
9191 TreeTransform<Derived>::TransformOMPTargetTeamsDistributeSimdDirective(
9192     OMPTargetTeamsDistributeSimdDirective *D) {
9193   DeclarationNameInfo DirName;
9194   getDerived().getSema().StartOpenMPDSABlock(
9195       OMPD_target_teams_distribute_simd, DirName, nullptr, D->getBeginLoc());
9196   auto Res = getDerived().TransformOMPExecutableDirective(D);
9197   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9198   return Res;
9199 }
9200 
9201 template <typename Derived>
9202 StmtResult
9203 TreeTransform<Derived>::TransformOMPInteropDirective(OMPInteropDirective *D) {
9204   DeclarationNameInfo DirName;
9205   getDerived().getSema().StartOpenMPDSABlock(OMPD_interop, DirName, nullptr,
9206                                              D->getBeginLoc());
9207   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9208   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9209   return Res;
9210 }
9211 
9212 template <typename Derived>
9213 StmtResult
9214 TreeTransform<Derived>::TransformOMPDispatchDirective(OMPDispatchDirective *D) {
9215   DeclarationNameInfo DirName;
9216   getDerived().getSema().StartOpenMPDSABlock(OMPD_dispatch, DirName, nullptr,
9217                                              D->getBeginLoc());
9218   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9219   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9220   return Res;
9221 }
9222 
9223 template <typename Derived>
9224 StmtResult
9225 TreeTransform<Derived>::TransformOMPMaskedDirective(OMPMaskedDirective *D) {
9226   DeclarationNameInfo DirName;
9227   getDerived().getSema().StartOpenMPDSABlock(OMPD_masked, DirName, nullptr,
9228                                              D->getBeginLoc());
9229   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9230   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9231   return Res;
9232 }
9233 
9234 template <typename Derived>
9235 StmtResult TreeTransform<Derived>::TransformOMPGenericLoopDirective(
9236     OMPGenericLoopDirective *D) {
9237   DeclarationNameInfo DirName;
9238   getDerived().getSema().StartOpenMPDSABlock(OMPD_loop, DirName, nullptr,
9239                                              D->getBeginLoc());
9240   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9241   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9242   return Res;
9243 }
9244 
9245 //===----------------------------------------------------------------------===//
9246 // OpenMP clause transformation
9247 //===----------------------------------------------------------------------===//
9248 template <typename Derived>
9249 OMPClause *TreeTransform<Derived>::TransformOMPIfClause(OMPIfClause *C) {
9250   ExprResult Cond = getDerived().TransformExpr(C->getCondition());
9251   if (Cond.isInvalid())
9252     return nullptr;
9253   return getDerived().RebuildOMPIfClause(
9254       C->getNameModifier(), Cond.get(), C->getBeginLoc(), C->getLParenLoc(),
9255       C->getNameModifierLoc(), C->getColonLoc(), C->getEndLoc());
9256 }
9257 
9258 template <typename Derived>
9259 OMPClause *TreeTransform<Derived>::TransformOMPFinalClause(OMPFinalClause *C) {
9260   ExprResult Cond = getDerived().TransformExpr(C->getCondition());
9261   if (Cond.isInvalid())
9262     return nullptr;
9263   return getDerived().RebuildOMPFinalClause(Cond.get(), C->getBeginLoc(),
9264                                             C->getLParenLoc(), C->getEndLoc());
9265 }
9266 
9267 template <typename Derived>
9268 OMPClause *
9269 TreeTransform<Derived>::TransformOMPNumThreadsClause(OMPNumThreadsClause *C) {
9270   ExprResult NumThreads = getDerived().TransformExpr(C->getNumThreads());
9271   if (NumThreads.isInvalid())
9272     return nullptr;
9273   return getDerived().RebuildOMPNumThreadsClause(
9274       NumThreads.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9275 }
9276 
9277 template <typename Derived>
9278 OMPClause *
9279 TreeTransform<Derived>::TransformOMPSafelenClause(OMPSafelenClause *C) {
9280   ExprResult E = getDerived().TransformExpr(C->getSafelen());
9281   if (E.isInvalid())
9282     return nullptr;
9283   return getDerived().RebuildOMPSafelenClause(
9284       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9285 }
9286 
9287 template <typename Derived>
9288 OMPClause *
9289 TreeTransform<Derived>::TransformOMPAllocatorClause(OMPAllocatorClause *C) {
9290   ExprResult E = getDerived().TransformExpr(C->getAllocator());
9291   if (E.isInvalid())
9292     return nullptr;
9293   return getDerived().RebuildOMPAllocatorClause(
9294       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9295 }
9296 
9297 template <typename Derived>
9298 OMPClause *
9299 TreeTransform<Derived>::TransformOMPSimdlenClause(OMPSimdlenClause *C) {
9300   ExprResult E = getDerived().TransformExpr(C->getSimdlen());
9301   if (E.isInvalid())
9302     return nullptr;
9303   return getDerived().RebuildOMPSimdlenClause(
9304       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9305 }
9306 
9307 template <typename Derived>
9308 OMPClause *TreeTransform<Derived>::TransformOMPSizesClause(OMPSizesClause *C) {
9309   SmallVector<Expr *, 4> TransformedSizes;
9310   TransformedSizes.reserve(C->getNumSizes());
9311   bool Changed = false;
9312   for (Expr *E : C->getSizesRefs()) {
9313     if (!E) {
9314       TransformedSizes.push_back(nullptr);
9315       continue;
9316     }
9317 
9318     ExprResult T = getDerived().TransformExpr(E);
9319     if (T.isInvalid())
9320       return nullptr;
9321     if (E != T.get())
9322       Changed = true;
9323     TransformedSizes.push_back(T.get());
9324   }
9325 
9326   if (!Changed && !getDerived().AlwaysRebuild())
9327     return C;
9328   return RebuildOMPSizesClause(TransformedSizes, C->getBeginLoc(),
9329                                C->getLParenLoc(), C->getEndLoc());
9330 }
9331 
9332 template <typename Derived>
9333 OMPClause *TreeTransform<Derived>::TransformOMPFullClause(OMPFullClause *C) {
9334   if (!getDerived().AlwaysRebuild())
9335     return C;
9336   return RebuildOMPFullClause(C->getBeginLoc(), C->getEndLoc());
9337 }
9338 
9339 template <typename Derived>
9340 OMPClause *
9341 TreeTransform<Derived>::TransformOMPPartialClause(OMPPartialClause *C) {
9342   ExprResult T = getDerived().TransformExpr(C->getFactor());
9343   if (T.isInvalid())
9344     return nullptr;
9345   Expr *Factor = T.get();
9346   bool Changed = Factor != C->getFactor();
9347 
9348   if (!Changed && !getDerived().AlwaysRebuild())
9349     return C;
9350   return RebuildOMPPartialClause(Factor, C->getBeginLoc(), C->getLParenLoc(),
9351                                  C->getEndLoc());
9352 }
9353 
9354 template <typename Derived>
9355 OMPClause *
9356 TreeTransform<Derived>::TransformOMPCollapseClause(OMPCollapseClause *C) {
9357   ExprResult E = getDerived().TransformExpr(C->getNumForLoops());
9358   if (E.isInvalid())
9359     return nullptr;
9360   return getDerived().RebuildOMPCollapseClause(
9361       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9362 }
9363 
9364 template <typename Derived>
9365 OMPClause *
9366 TreeTransform<Derived>::TransformOMPDefaultClause(OMPDefaultClause *C) {
9367   return getDerived().RebuildOMPDefaultClause(
9368       C->getDefaultKind(), C->getDefaultKindKwLoc(), C->getBeginLoc(),
9369       C->getLParenLoc(), C->getEndLoc());
9370 }
9371 
9372 template <typename Derived>
9373 OMPClause *
9374 TreeTransform<Derived>::TransformOMPProcBindClause(OMPProcBindClause *C) {
9375   return getDerived().RebuildOMPProcBindClause(
9376       C->getProcBindKind(), C->getProcBindKindKwLoc(), C->getBeginLoc(),
9377       C->getLParenLoc(), C->getEndLoc());
9378 }
9379 
9380 template <typename Derived>
9381 OMPClause *
9382 TreeTransform<Derived>::TransformOMPScheduleClause(OMPScheduleClause *C) {
9383   ExprResult E = getDerived().TransformExpr(C->getChunkSize());
9384   if (E.isInvalid())
9385     return nullptr;
9386   return getDerived().RebuildOMPScheduleClause(
9387       C->getFirstScheduleModifier(), C->getSecondScheduleModifier(),
9388       C->getScheduleKind(), E.get(), C->getBeginLoc(), C->getLParenLoc(),
9389       C->getFirstScheduleModifierLoc(), C->getSecondScheduleModifierLoc(),
9390       C->getScheduleKindLoc(), C->getCommaLoc(), C->getEndLoc());
9391 }
9392 
9393 template <typename Derived>
9394 OMPClause *
9395 TreeTransform<Derived>::TransformOMPOrderedClause(OMPOrderedClause *C) {
9396   ExprResult E;
9397   if (auto *Num = C->getNumForLoops()) {
9398     E = getDerived().TransformExpr(Num);
9399     if (E.isInvalid())
9400       return nullptr;
9401   }
9402   return getDerived().RebuildOMPOrderedClause(C->getBeginLoc(), C->getEndLoc(),
9403                                               C->getLParenLoc(), E.get());
9404 }
9405 
9406 template <typename Derived>
9407 OMPClause *
9408 TreeTransform<Derived>::TransformOMPDetachClause(OMPDetachClause *C) {
9409   ExprResult E;
9410   if (Expr *Evt = C->getEventHandler()) {
9411     E = getDerived().TransformExpr(Evt);
9412     if (E.isInvalid())
9413       return nullptr;
9414   }
9415   return getDerived().RebuildOMPDetachClause(E.get(), C->getBeginLoc(),
9416                                              C->getLParenLoc(), C->getEndLoc());
9417 }
9418 
9419 template <typename Derived>
9420 OMPClause *
9421 TreeTransform<Derived>::TransformOMPNowaitClause(OMPNowaitClause *C) {
9422   // No need to rebuild this clause, no template-dependent parameters.
9423   return C;
9424 }
9425 
9426 template <typename Derived>
9427 OMPClause *
9428 TreeTransform<Derived>::TransformOMPUntiedClause(OMPUntiedClause *C) {
9429   // No need to rebuild this clause, no template-dependent parameters.
9430   return C;
9431 }
9432 
9433 template <typename Derived>
9434 OMPClause *
9435 TreeTransform<Derived>::TransformOMPMergeableClause(OMPMergeableClause *C) {
9436   // No need to rebuild this clause, no template-dependent parameters.
9437   return C;
9438 }
9439 
9440 template <typename Derived>
9441 OMPClause *TreeTransform<Derived>::TransformOMPReadClause(OMPReadClause *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>::TransformOMPWriteClause(OMPWriteClause *C) {
9448   // No need to rebuild this clause, no template-dependent parameters.
9449   return C;
9450 }
9451 
9452 template <typename Derived>
9453 OMPClause *
9454 TreeTransform<Derived>::TransformOMPUpdateClause(OMPUpdateClause *C) {
9455   // No need to rebuild this clause, no template-dependent parameters.
9456   return C;
9457 }
9458 
9459 template <typename Derived>
9460 OMPClause *
9461 TreeTransform<Derived>::TransformOMPCaptureClause(OMPCaptureClause *C) {
9462   // No need to rebuild this clause, no template-dependent parameters.
9463   return C;
9464 }
9465 
9466 template <typename Derived>
9467 OMPClause *
9468 TreeTransform<Derived>::TransformOMPCompareClause(OMPCompareClause *C) {
9469   // No need to rebuild this clause, no template-dependent parameters.
9470   return C;
9471 }
9472 
9473 template <typename Derived>
9474 OMPClause *
9475 TreeTransform<Derived>::TransformOMPSeqCstClause(OMPSeqCstClause *C) {
9476   // No need to rebuild this clause, no template-dependent parameters.
9477   return C;
9478 }
9479 
9480 template <typename Derived>
9481 OMPClause *
9482 TreeTransform<Derived>::TransformOMPAcqRelClause(OMPAcqRelClause *C) {
9483   // No need to rebuild this clause, no template-dependent parameters.
9484   return C;
9485 }
9486 
9487 template <typename Derived>
9488 OMPClause *
9489 TreeTransform<Derived>::TransformOMPAcquireClause(OMPAcquireClause *C) {
9490   // No need to rebuild this clause, no template-dependent parameters.
9491   return C;
9492 }
9493 
9494 template <typename Derived>
9495 OMPClause *
9496 TreeTransform<Derived>::TransformOMPReleaseClause(OMPReleaseClause *C) {
9497   // No need to rebuild this clause, no template-dependent parameters.
9498   return C;
9499 }
9500 
9501 template <typename Derived>
9502 OMPClause *
9503 TreeTransform<Derived>::TransformOMPRelaxedClause(OMPRelaxedClause *C) {
9504   // No need to rebuild this clause, no template-dependent parameters.
9505   return C;
9506 }
9507 
9508 template <typename Derived>
9509 OMPClause *
9510 TreeTransform<Derived>::TransformOMPThreadsClause(OMPThreadsClause *C) {
9511   // No need to rebuild this clause, no template-dependent parameters.
9512   return C;
9513 }
9514 
9515 template <typename Derived>
9516 OMPClause *TreeTransform<Derived>::TransformOMPSIMDClause(OMPSIMDClause *C) {
9517   // No need to rebuild this clause, no template-dependent parameters.
9518   return C;
9519 }
9520 
9521 template <typename Derived>
9522 OMPClause *
9523 TreeTransform<Derived>::TransformOMPNogroupClause(OMPNogroupClause *C) {
9524   // No need to rebuild this clause, no template-dependent parameters.
9525   return C;
9526 }
9527 
9528 template <typename Derived>
9529 OMPClause *TreeTransform<Derived>::TransformOMPInitClause(OMPInitClause *C) {
9530   ExprResult IVR = getDerived().TransformExpr(C->getInteropVar());
9531   if (IVR.isInvalid())
9532     return nullptr;
9533 
9534   llvm::SmallVector<Expr *, 8> PrefExprs;
9535   PrefExprs.reserve(C->varlist_size() - 1);
9536   for (Expr *E : llvm::drop_begin(C->varlists())) {
9537     ExprResult ER = getDerived().TransformExpr(cast<Expr>(E));
9538     if (ER.isInvalid())
9539       return nullptr;
9540     PrefExprs.push_back(ER.get());
9541   }
9542   return getDerived().RebuildOMPInitClause(
9543       IVR.get(), PrefExprs, C->getIsTarget(), C->getIsTargetSync(),
9544       C->getBeginLoc(), C->getLParenLoc(), C->getVarLoc(), C->getEndLoc());
9545 }
9546 
9547 template <typename Derived>
9548 OMPClause *TreeTransform<Derived>::TransformOMPUseClause(OMPUseClause *C) {
9549   ExprResult ER = getDerived().TransformExpr(C->getInteropVar());
9550   if (ER.isInvalid())
9551     return nullptr;
9552   return getDerived().RebuildOMPUseClause(ER.get(), C->getBeginLoc(),
9553                                           C->getLParenLoc(), C->getVarLoc(),
9554                                           C->getEndLoc());
9555 }
9556 
9557 template <typename Derived>
9558 OMPClause *
9559 TreeTransform<Derived>::TransformOMPDestroyClause(OMPDestroyClause *C) {
9560   ExprResult ER;
9561   if (Expr *IV = C->getInteropVar()) {
9562     ER = getDerived().TransformExpr(IV);
9563     if (ER.isInvalid())
9564       return nullptr;
9565   }
9566   return getDerived().RebuildOMPDestroyClause(ER.get(), C->getBeginLoc(),
9567                                               C->getLParenLoc(), C->getVarLoc(),
9568                                               C->getEndLoc());
9569 }
9570 
9571 template <typename Derived>
9572 OMPClause *
9573 TreeTransform<Derived>::TransformOMPNovariantsClause(OMPNovariantsClause *C) {
9574   ExprResult Cond = getDerived().TransformExpr(C->getCondition());
9575   if (Cond.isInvalid())
9576     return nullptr;
9577   return getDerived().RebuildOMPNovariantsClause(
9578       Cond.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9579 }
9580 
9581 template <typename Derived>
9582 OMPClause *
9583 TreeTransform<Derived>::TransformOMPNocontextClause(OMPNocontextClause *C) {
9584   ExprResult Cond = getDerived().TransformExpr(C->getCondition());
9585   if (Cond.isInvalid())
9586     return nullptr;
9587   return getDerived().RebuildOMPNocontextClause(
9588       Cond.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9589 }
9590 
9591 template <typename Derived>
9592 OMPClause *
9593 TreeTransform<Derived>::TransformOMPFilterClause(OMPFilterClause *C) {
9594   ExprResult ThreadID = getDerived().TransformExpr(C->getThreadID());
9595   if (ThreadID.isInvalid())
9596     return nullptr;
9597   return getDerived().RebuildOMPFilterClause(ThreadID.get(), C->getBeginLoc(),
9598                                              C->getLParenLoc(), C->getEndLoc());
9599 }
9600 
9601 template <typename Derived>
9602 OMPClause *TreeTransform<Derived>::TransformOMPAlignClause(OMPAlignClause *C) {
9603   ExprResult E = getDerived().TransformExpr(C->getAlignment());
9604   if (E.isInvalid())
9605     return nullptr;
9606   return getDerived().RebuildOMPAlignClause(E.get(), C->getBeginLoc(),
9607                                             C->getLParenLoc(), C->getEndLoc());
9608 }
9609 
9610 template <typename Derived>
9611 OMPClause *TreeTransform<Derived>::TransformOMPUnifiedAddressClause(
9612     OMPUnifiedAddressClause *C) {
9613   llvm_unreachable("unified_address clause cannot appear in dependent context");
9614 }
9615 
9616 template <typename Derived>
9617 OMPClause *TreeTransform<Derived>::TransformOMPUnifiedSharedMemoryClause(
9618     OMPUnifiedSharedMemoryClause *C) {
9619   llvm_unreachable(
9620       "unified_shared_memory clause cannot appear in dependent context");
9621 }
9622 
9623 template <typename Derived>
9624 OMPClause *TreeTransform<Derived>::TransformOMPReverseOffloadClause(
9625     OMPReverseOffloadClause *C) {
9626   llvm_unreachable("reverse_offload clause cannot appear in dependent context");
9627 }
9628 
9629 template <typename Derived>
9630 OMPClause *TreeTransform<Derived>::TransformOMPDynamicAllocatorsClause(
9631     OMPDynamicAllocatorsClause *C) {
9632   llvm_unreachable(
9633       "dynamic_allocators clause cannot appear in dependent context");
9634 }
9635 
9636 template <typename Derived>
9637 OMPClause *TreeTransform<Derived>::TransformOMPAtomicDefaultMemOrderClause(
9638     OMPAtomicDefaultMemOrderClause *C) {
9639   llvm_unreachable(
9640       "atomic_default_mem_order clause cannot appear in dependent context");
9641 }
9642 
9643 template <typename Derived>
9644 OMPClause *
9645 TreeTransform<Derived>::TransformOMPPrivateClause(OMPPrivateClause *C) {
9646   llvm::SmallVector<Expr *, 16> Vars;
9647   Vars.reserve(C->varlist_size());
9648   for (auto *VE : C->varlists()) {
9649     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9650     if (EVar.isInvalid())
9651       return nullptr;
9652     Vars.push_back(EVar.get());
9653   }
9654   return getDerived().RebuildOMPPrivateClause(
9655       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9656 }
9657 
9658 template <typename Derived>
9659 OMPClause *TreeTransform<Derived>::TransformOMPFirstprivateClause(
9660     OMPFirstprivateClause *C) {
9661   llvm::SmallVector<Expr *, 16> Vars;
9662   Vars.reserve(C->varlist_size());
9663   for (auto *VE : C->varlists()) {
9664     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9665     if (EVar.isInvalid())
9666       return nullptr;
9667     Vars.push_back(EVar.get());
9668   }
9669   return getDerived().RebuildOMPFirstprivateClause(
9670       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9671 }
9672 
9673 template <typename Derived>
9674 OMPClause *
9675 TreeTransform<Derived>::TransformOMPLastprivateClause(OMPLastprivateClause *C) {
9676   llvm::SmallVector<Expr *, 16> Vars;
9677   Vars.reserve(C->varlist_size());
9678   for (auto *VE : C->varlists()) {
9679     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9680     if (EVar.isInvalid())
9681       return nullptr;
9682     Vars.push_back(EVar.get());
9683   }
9684   return getDerived().RebuildOMPLastprivateClause(
9685       Vars, C->getKind(), C->getKindLoc(), C->getColonLoc(), C->getBeginLoc(),
9686       C->getLParenLoc(), C->getEndLoc());
9687 }
9688 
9689 template <typename Derived>
9690 OMPClause *
9691 TreeTransform<Derived>::TransformOMPSharedClause(OMPSharedClause *C) {
9692   llvm::SmallVector<Expr *, 16> Vars;
9693   Vars.reserve(C->varlist_size());
9694   for (auto *VE : C->varlists()) {
9695     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9696     if (EVar.isInvalid())
9697       return nullptr;
9698     Vars.push_back(EVar.get());
9699   }
9700   return getDerived().RebuildOMPSharedClause(Vars, C->getBeginLoc(),
9701                                              C->getLParenLoc(), C->getEndLoc());
9702 }
9703 
9704 template <typename Derived>
9705 OMPClause *
9706 TreeTransform<Derived>::TransformOMPReductionClause(OMPReductionClause *C) {
9707   llvm::SmallVector<Expr *, 16> Vars;
9708   Vars.reserve(C->varlist_size());
9709   for (auto *VE : C->varlists()) {
9710     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9711     if (EVar.isInvalid())
9712       return nullptr;
9713     Vars.push_back(EVar.get());
9714   }
9715   CXXScopeSpec ReductionIdScopeSpec;
9716   ReductionIdScopeSpec.Adopt(C->getQualifierLoc());
9717 
9718   DeclarationNameInfo NameInfo = C->getNameInfo();
9719   if (NameInfo.getName()) {
9720     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
9721     if (!NameInfo.getName())
9722       return nullptr;
9723   }
9724   // Build a list of all UDR decls with the same names ranged by the Scopes.
9725   // The Scope boundary is a duplication of the previous decl.
9726   llvm::SmallVector<Expr *, 16> UnresolvedReductions;
9727   for (auto *E : C->reduction_ops()) {
9728     // Transform all the decls.
9729     if (E) {
9730       auto *ULE = cast<UnresolvedLookupExpr>(E);
9731       UnresolvedSet<8> Decls;
9732       for (auto *D : ULE->decls()) {
9733         NamedDecl *InstD =
9734             cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D));
9735         Decls.addDecl(InstD, InstD->getAccess());
9736       }
9737       UnresolvedReductions.push_back(
9738        UnresolvedLookupExpr::Create(
9739           SemaRef.Context, /*NamingClass=*/nullptr,
9740           ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context),
9741           NameInfo, /*ADL=*/true, ULE->isOverloaded(),
9742           Decls.begin(), Decls.end()));
9743     } else
9744       UnresolvedReductions.push_back(nullptr);
9745   }
9746   return getDerived().RebuildOMPReductionClause(
9747       Vars, C->getModifier(), C->getBeginLoc(), C->getLParenLoc(),
9748       C->getModifierLoc(), C->getColonLoc(), C->getEndLoc(),
9749       ReductionIdScopeSpec, NameInfo, UnresolvedReductions);
9750 }
9751 
9752 template <typename Derived>
9753 OMPClause *TreeTransform<Derived>::TransformOMPTaskReductionClause(
9754     OMPTaskReductionClause *C) {
9755   llvm::SmallVector<Expr *, 16> Vars;
9756   Vars.reserve(C->varlist_size());
9757   for (auto *VE : C->varlists()) {
9758     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9759     if (EVar.isInvalid())
9760       return nullptr;
9761     Vars.push_back(EVar.get());
9762   }
9763   CXXScopeSpec ReductionIdScopeSpec;
9764   ReductionIdScopeSpec.Adopt(C->getQualifierLoc());
9765 
9766   DeclarationNameInfo NameInfo = C->getNameInfo();
9767   if (NameInfo.getName()) {
9768     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
9769     if (!NameInfo.getName())
9770       return nullptr;
9771   }
9772   // Build a list of all UDR decls with the same names ranged by the Scopes.
9773   // The Scope boundary is a duplication of the previous decl.
9774   llvm::SmallVector<Expr *, 16> UnresolvedReductions;
9775   for (auto *E : C->reduction_ops()) {
9776     // Transform all the decls.
9777     if (E) {
9778       auto *ULE = cast<UnresolvedLookupExpr>(E);
9779       UnresolvedSet<8> Decls;
9780       for (auto *D : ULE->decls()) {
9781         NamedDecl *InstD =
9782             cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D));
9783         Decls.addDecl(InstD, InstD->getAccess());
9784       }
9785       UnresolvedReductions.push_back(UnresolvedLookupExpr::Create(
9786           SemaRef.Context, /*NamingClass=*/nullptr,
9787           ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), NameInfo,
9788           /*ADL=*/true, ULE->isOverloaded(), Decls.begin(), Decls.end()));
9789     } else
9790       UnresolvedReductions.push_back(nullptr);
9791   }
9792   return getDerived().RebuildOMPTaskReductionClause(
9793       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(),
9794       C->getEndLoc(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions);
9795 }
9796 
9797 template <typename Derived>
9798 OMPClause *
9799 TreeTransform<Derived>::TransformOMPInReductionClause(OMPInReductionClause *C) {
9800   llvm::SmallVector<Expr *, 16> Vars;
9801   Vars.reserve(C->varlist_size());
9802   for (auto *VE : C->varlists()) {
9803     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9804     if (EVar.isInvalid())
9805       return nullptr;
9806     Vars.push_back(EVar.get());
9807   }
9808   CXXScopeSpec ReductionIdScopeSpec;
9809   ReductionIdScopeSpec.Adopt(C->getQualifierLoc());
9810 
9811   DeclarationNameInfo NameInfo = C->getNameInfo();
9812   if (NameInfo.getName()) {
9813     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
9814     if (!NameInfo.getName())
9815       return nullptr;
9816   }
9817   // Build a list of all UDR decls with the same names ranged by the Scopes.
9818   // The Scope boundary is a duplication of the previous decl.
9819   llvm::SmallVector<Expr *, 16> UnresolvedReductions;
9820   for (auto *E : C->reduction_ops()) {
9821     // Transform all the decls.
9822     if (E) {
9823       auto *ULE = cast<UnresolvedLookupExpr>(E);
9824       UnresolvedSet<8> Decls;
9825       for (auto *D : ULE->decls()) {
9826         NamedDecl *InstD =
9827             cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D));
9828         Decls.addDecl(InstD, InstD->getAccess());
9829       }
9830       UnresolvedReductions.push_back(UnresolvedLookupExpr::Create(
9831           SemaRef.Context, /*NamingClass=*/nullptr,
9832           ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), NameInfo,
9833           /*ADL=*/true, ULE->isOverloaded(), Decls.begin(), Decls.end()));
9834     } else
9835       UnresolvedReductions.push_back(nullptr);
9836   }
9837   return getDerived().RebuildOMPInReductionClause(
9838       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(),
9839       C->getEndLoc(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions);
9840 }
9841 
9842 template <typename Derived>
9843 OMPClause *
9844 TreeTransform<Derived>::TransformOMPLinearClause(OMPLinearClause *C) {
9845   llvm::SmallVector<Expr *, 16> Vars;
9846   Vars.reserve(C->varlist_size());
9847   for (auto *VE : C->varlists()) {
9848     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9849     if (EVar.isInvalid())
9850       return nullptr;
9851     Vars.push_back(EVar.get());
9852   }
9853   ExprResult Step = getDerived().TransformExpr(C->getStep());
9854   if (Step.isInvalid())
9855     return nullptr;
9856   return getDerived().RebuildOMPLinearClause(
9857       Vars, Step.get(), C->getBeginLoc(), C->getLParenLoc(), C->getModifier(),
9858       C->getModifierLoc(), C->getColonLoc(), C->getEndLoc());
9859 }
9860 
9861 template <typename Derived>
9862 OMPClause *
9863 TreeTransform<Derived>::TransformOMPAlignedClause(OMPAlignedClause *C) {
9864   llvm::SmallVector<Expr *, 16> Vars;
9865   Vars.reserve(C->varlist_size());
9866   for (auto *VE : C->varlists()) {
9867     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9868     if (EVar.isInvalid())
9869       return nullptr;
9870     Vars.push_back(EVar.get());
9871   }
9872   ExprResult Alignment = getDerived().TransformExpr(C->getAlignment());
9873   if (Alignment.isInvalid())
9874     return nullptr;
9875   return getDerived().RebuildOMPAlignedClause(
9876       Vars, Alignment.get(), C->getBeginLoc(), C->getLParenLoc(),
9877       C->getColonLoc(), C->getEndLoc());
9878 }
9879 
9880 template <typename Derived>
9881 OMPClause *
9882 TreeTransform<Derived>::TransformOMPCopyinClause(OMPCopyinClause *C) {
9883   llvm::SmallVector<Expr *, 16> Vars;
9884   Vars.reserve(C->varlist_size());
9885   for (auto *VE : C->varlists()) {
9886     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9887     if (EVar.isInvalid())
9888       return nullptr;
9889     Vars.push_back(EVar.get());
9890   }
9891   return getDerived().RebuildOMPCopyinClause(Vars, C->getBeginLoc(),
9892                                              C->getLParenLoc(), C->getEndLoc());
9893 }
9894 
9895 template <typename Derived>
9896 OMPClause *
9897 TreeTransform<Derived>::TransformOMPCopyprivateClause(OMPCopyprivateClause *C) {
9898   llvm::SmallVector<Expr *, 16> Vars;
9899   Vars.reserve(C->varlist_size());
9900   for (auto *VE : C->varlists()) {
9901     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9902     if (EVar.isInvalid())
9903       return nullptr;
9904     Vars.push_back(EVar.get());
9905   }
9906   return getDerived().RebuildOMPCopyprivateClause(
9907       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9908 }
9909 
9910 template <typename Derived>
9911 OMPClause *TreeTransform<Derived>::TransformOMPFlushClause(OMPFlushClause *C) {
9912   llvm::SmallVector<Expr *, 16> Vars;
9913   Vars.reserve(C->varlist_size());
9914   for (auto *VE : C->varlists()) {
9915     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9916     if (EVar.isInvalid())
9917       return nullptr;
9918     Vars.push_back(EVar.get());
9919   }
9920   return getDerived().RebuildOMPFlushClause(Vars, C->getBeginLoc(),
9921                                             C->getLParenLoc(), C->getEndLoc());
9922 }
9923 
9924 template <typename Derived>
9925 OMPClause *
9926 TreeTransform<Derived>::TransformOMPDepobjClause(OMPDepobjClause *C) {
9927   ExprResult E = getDerived().TransformExpr(C->getDepobj());
9928   if (E.isInvalid())
9929     return nullptr;
9930   return getDerived().RebuildOMPDepobjClause(E.get(), C->getBeginLoc(),
9931                                              C->getLParenLoc(), C->getEndLoc());
9932 }
9933 
9934 template <typename Derived>
9935 OMPClause *
9936 TreeTransform<Derived>::TransformOMPDependClause(OMPDependClause *C) {
9937   llvm::SmallVector<Expr *, 16> Vars;
9938   Expr *DepModifier = C->getModifier();
9939   if (DepModifier) {
9940     ExprResult DepModRes = getDerived().TransformExpr(DepModifier);
9941     if (DepModRes.isInvalid())
9942       return nullptr;
9943     DepModifier = DepModRes.get();
9944   }
9945   Vars.reserve(C->varlist_size());
9946   for (auto *VE : C->varlists()) {
9947     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9948     if (EVar.isInvalid())
9949       return nullptr;
9950     Vars.push_back(EVar.get());
9951   }
9952   return getDerived().RebuildOMPDependClause(
9953       DepModifier, C->getDependencyKind(), C->getDependencyLoc(),
9954       C->getColonLoc(), Vars, C->getBeginLoc(), C->getLParenLoc(),
9955       C->getEndLoc());
9956 }
9957 
9958 template <typename Derived>
9959 OMPClause *
9960 TreeTransform<Derived>::TransformOMPDeviceClause(OMPDeviceClause *C) {
9961   ExprResult E = getDerived().TransformExpr(C->getDevice());
9962   if (E.isInvalid())
9963     return nullptr;
9964   return getDerived().RebuildOMPDeviceClause(
9965       C->getModifier(), E.get(), C->getBeginLoc(), C->getLParenLoc(),
9966       C->getModifierLoc(), C->getEndLoc());
9967 }
9968 
9969 template <typename Derived, class T>
9970 bool transformOMPMappableExprListClause(
9971     TreeTransform<Derived> &TT, OMPMappableExprListClause<T> *C,
9972     llvm::SmallVectorImpl<Expr *> &Vars, CXXScopeSpec &MapperIdScopeSpec,
9973     DeclarationNameInfo &MapperIdInfo,
9974     llvm::SmallVectorImpl<Expr *> &UnresolvedMappers) {
9975   // Transform expressions in the list.
9976   Vars.reserve(C->varlist_size());
9977   for (auto *VE : C->varlists()) {
9978     ExprResult EVar = TT.getDerived().TransformExpr(cast<Expr>(VE));
9979     if (EVar.isInvalid())
9980       return true;
9981     Vars.push_back(EVar.get());
9982   }
9983   // Transform mapper scope specifier and identifier.
9984   NestedNameSpecifierLoc QualifierLoc;
9985   if (C->getMapperQualifierLoc()) {
9986     QualifierLoc = TT.getDerived().TransformNestedNameSpecifierLoc(
9987         C->getMapperQualifierLoc());
9988     if (!QualifierLoc)
9989       return true;
9990   }
9991   MapperIdScopeSpec.Adopt(QualifierLoc);
9992   MapperIdInfo = C->getMapperIdInfo();
9993   if (MapperIdInfo.getName()) {
9994     MapperIdInfo = TT.getDerived().TransformDeclarationNameInfo(MapperIdInfo);
9995     if (!MapperIdInfo.getName())
9996       return true;
9997   }
9998   // Build a list of all candidate OMPDeclareMapperDecls, which is provided by
9999   // the previous user-defined mapper lookup in dependent environment.
10000   for (auto *E : C->mapperlists()) {
10001     // Transform all the decls.
10002     if (E) {
10003       auto *ULE = cast<UnresolvedLookupExpr>(E);
10004       UnresolvedSet<8> Decls;
10005       for (auto *D : ULE->decls()) {
10006         NamedDecl *InstD =
10007             cast<NamedDecl>(TT.getDerived().TransformDecl(E->getExprLoc(), D));
10008         Decls.addDecl(InstD, InstD->getAccess());
10009       }
10010       UnresolvedMappers.push_back(UnresolvedLookupExpr::Create(
10011           TT.getSema().Context, /*NamingClass=*/nullptr,
10012           MapperIdScopeSpec.getWithLocInContext(TT.getSema().Context),
10013           MapperIdInfo, /*ADL=*/true, ULE->isOverloaded(), Decls.begin(),
10014           Decls.end()));
10015     } else {
10016       UnresolvedMappers.push_back(nullptr);
10017     }
10018   }
10019   return false;
10020 }
10021 
10022 template <typename Derived>
10023 OMPClause *TreeTransform<Derived>::TransformOMPMapClause(OMPMapClause *C) {
10024   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10025   llvm::SmallVector<Expr *, 16> Vars;
10026   CXXScopeSpec MapperIdScopeSpec;
10027   DeclarationNameInfo MapperIdInfo;
10028   llvm::SmallVector<Expr *, 16> UnresolvedMappers;
10029   if (transformOMPMappableExprListClause<Derived, OMPMapClause>(
10030           *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers))
10031     return nullptr;
10032   return getDerived().RebuildOMPMapClause(
10033       C->getMapTypeModifiers(), C->getMapTypeModifiersLoc(), MapperIdScopeSpec,
10034       MapperIdInfo, C->getMapType(), C->isImplicitMapType(), C->getMapLoc(),
10035       C->getColonLoc(), Vars, Locs, UnresolvedMappers);
10036 }
10037 
10038 template <typename Derived>
10039 OMPClause *
10040 TreeTransform<Derived>::TransformOMPAllocateClause(OMPAllocateClause *C) {
10041   Expr *Allocator = C->getAllocator();
10042   if (Allocator) {
10043     ExprResult AllocatorRes = getDerived().TransformExpr(Allocator);
10044     if (AllocatorRes.isInvalid())
10045       return nullptr;
10046     Allocator = AllocatorRes.get();
10047   }
10048   llvm::SmallVector<Expr *, 16> Vars;
10049   Vars.reserve(C->varlist_size());
10050   for (auto *VE : C->varlists()) {
10051     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10052     if (EVar.isInvalid())
10053       return nullptr;
10054     Vars.push_back(EVar.get());
10055   }
10056   return getDerived().RebuildOMPAllocateClause(
10057       Allocator, Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(),
10058       C->getEndLoc());
10059 }
10060 
10061 template <typename Derived>
10062 OMPClause *
10063 TreeTransform<Derived>::TransformOMPNumTeamsClause(OMPNumTeamsClause *C) {
10064   ExprResult E = getDerived().TransformExpr(C->getNumTeams());
10065   if (E.isInvalid())
10066     return nullptr;
10067   return getDerived().RebuildOMPNumTeamsClause(
10068       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10069 }
10070 
10071 template <typename Derived>
10072 OMPClause *
10073 TreeTransform<Derived>::TransformOMPThreadLimitClause(OMPThreadLimitClause *C) {
10074   ExprResult E = getDerived().TransformExpr(C->getThreadLimit());
10075   if (E.isInvalid())
10076     return nullptr;
10077   return getDerived().RebuildOMPThreadLimitClause(
10078       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10079 }
10080 
10081 template <typename Derived>
10082 OMPClause *
10083 TreeTransform<Derived>::TransformOMPPriorityClause(OMPPriorityClause *C) {
10084   ExprResult E = getDerived().TransformExpr(C->getPriority());
10085   if (E.isInvalid())
10086     return nullptr;
10087   return getDerived().RebuildOMPPriorityClause(
10088       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10089 }
10090 
10091 template <typename Derived>
10092 OMPClause *
10093 TreeTransform<Derived>::TransformOMPGrainsizeClause(OMPGrainsizeClause *C) {
10094   ExprResult E = getDerived().TransformExpr(C->getGrainsize());
10095   if (E.isInvalid())
10096     return nullptr;
10097   return getDerived().RebuildOMPGrainsizeClause(
10098       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10099 }
10100 
10101 template <typename Derived>
10102 OMPClause *
10103 TreeTransform<Derived>::TransformOMPNumTasksClause(OMPNumTasksClause *C) {
10104   ExprResult E = getDerived().TransformExpr(C->getNumTasks());
10105   if (E.isInvalid())
10106     return nullptr;
10107   return getDerived().RebuildOMPNumTasksClause(
10108       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10109 }
10110 
10111 template <typename Derived>
10112 OMPClause *TreeTransform<Derived>::TransformOMPHintClause(OMPHintClause *C) {
10113   ExprResult E = getDerived().TransformExpr(C->getHint());
10114   if (E.isInvalid())
10115     return nullptr;
10116   return getDerived().RebuildOMPHintClause(E.get(), C->getBeginLoc(),
10117                                            C->getLParenLoc(), C->getEndLoc());
10118 }
10119 
10120 template <typename Derived>
10121 OMPClause *TreeTransform<Derived>::TransformOMPDistScheduleClause(
10122     OMPDistScheduleClause *C) {
10123   ExprResult E = getDerived().TransformExpr(C->getChunkSize());
10124   if (E.isInvalid())
10125     return nullptr;
10126   return getDerived().RebuildOMPDistScheduleClause(
10127       C->getDistScheduleKind(), E.get(), C->getBeginLoc(), C->getLParenLoc(),
10128       C->getDistScheduleKindLoc(), C->getCommaLoc(), C->getEndLoc());
10129 }
10130 
10131 template <typename Derived>
10132 OMPClause *
10133 TreeTransform<Derived>::TransformOMPDefaultmapClause(OMPDefaultmapClause *C) {
10134   // Rebuild Defaultmap Clause since we need to invoke the checking of
10135   // defaultmap(none:variable-category) after template initialization.
10136   return getDerived().RebuildOMPDefaultmapClause(C->getDefaultmapModifier(),
10137                                                  C->getDefaultmapKind(),
10138                                                  C->getBeginLoc(),
10139                                                  C->getLParenLoc(),
10140                                                  C->getDefaultmapModifierLoc(),
10141                                                  C->getDefaultmapKindLoc(),
10142                                                  C->getEndLoc());
10143 }
10144 
10145 template <typename Derived>
10146 OMPClause *TreeTransform<Derived>::TransformOMPToClause(OMPToClause *C) {
10147   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10148   llvm::SmallVector<Expr *, 16> Vars;
10149   CXXScopeSpec MapperIdScopeSpec;
10150   DeclarationNameInfo MapperIdInfo;
10151   llvm::SmallVector<Expr *, 16> UnresolvedMappers;
10152   if (transformOMPMappableExprListClause<Derived, OMPToClause>(
10153           *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers))
10154     return nullptr;
10155   return getDerived().RebuildOMPToClause(
10156       C->getMotionModifiers(), C->getMotionModifiersLoc(), MapperIdScopeSpec,
10157       MapperIdInfo, C->getColonLoc(), Vars, Locs, UnresolvedMappers);
10158 }
10159 
10160 template <typename Derived>
10161 OMPClause *TreeTransform<Derived>::TransformOMPFromClause(OMPFromClause *C) {
10162   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10163   llvm::SmallVector<Expr *, 16> Vars;
10164   CXXScopeSpec MapperIdScopeSpec;
10165   DeclarationNameInfo MapperIdInfo;
10166   llvm::SmallVector<Expr *, 16> UnresolvedMappers;
10167   if (transformOMPMappableExprListClause<Derived, OMPFromClause>(
10168           *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers))
10169     return nullptr;
10170   return getDerived().RebuildOMPFromClause(
10171       C->getMotionModifiers(), C->getMotionModifiersLoc(), MapperIdScopeSpec,
10172       MapperIdInfo, C->getColonLoc(), Vars, Locs, UnresolvedMappers);
10173 }
10174 
10175 template <typename Derived>
10176 OMPClause *TreeTransform<Derived>::TransformOMPUseDevicePtrClause(
10177     OMPUseDevicePtrClause *C) {
10178   llvm::SmallVector<Expr *, 16> Vars;
10179   Vars.reserve(C->varlist_size());
10180   for (auto *VE : C->varlists()) {
10181     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10182     if (EVar.isInvalid())
10183       return nullptr;
10184     Vars.push_back(EVar.get());
10185   }
10186   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10187   return getDerived().RebuildOMPUseDevicePtrClause(Vars, Locs);
10188 }
10189 
10190 template <typename Derived>
10191 OMPClause *TreeTransform<Derived>::TransformOMPUseDeviceAddrClause(
10192     OMPUseDeviceAddrClause *C) {
10193   llvm::SmallVector<Expr *, 16> Vars;
10194   Vars.reserve(C->varlist_size());
10195   for (auto *VE : C->varlists()) {
10196     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10197     if (EVar.isInvalid())
10198       return nullptr;
10199     Vars.push_back(EVar.get());
10200   }
10201   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10202   return getDerived().RebuildOMPUseDeviceAddrClause(Vars, Locs);
10203 }
10204 
10205 template <typename Derived>
10206 OMPClause *
10207 TreeTransform<Derived>::TransformOMPIsDevicePtrClause(OMPIsDevicePtrClause *C) {
10208   llvm::SmallVector<Expr *, 16> Vars;
10209   Vars.reserve(C->varlist_size());
10210   for (auto *VE : C->varlists()) {
10211     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10212     if (EVar.isInvalid())
10213       return nullptr;
10214     Vars.push_back(EVar.get());
10215   }
10216   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10217   return getDerived().RebuildOMPIsDevicePtrClause(Vars, Locs);
10218 }
10219 
10220 template <typename Derived>
10221 OMPClause *
10222 TreeTransform<Derived>::TransformOMPNontemporalClause(OMPNontemporalClause *C) {
10223   llvm::SmallVector<Expr *, 16> Vars;
10224   Vars.reserve(C->varlist_size());
10225   for (auto *VE : C->varlists()) {
10226     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10227     if (EVar.isInvalid())
10228       return nullptr;
10229     Vars.push_back(EVar.get());
10230   }
10231   return getDerived().RebuildOMPNontemporalClause(
10232       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10233 }
10234 
10235 template <typename Derived>
10236 OMPClause *
10237 TreeTransform<Derived>::TransformOMPInclusiveClause(OMPInclusiveClause *C) {
10238   llvm::SmallVector<Expr *, 16> Vars;
10239   Vars.reserve(C->varlist_size());
10240   for (auto *VE : C->varlists()) {
10241     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10242     if (EVar.isInvalid())
10243       return nullptr;
10244     Vars.push_back(EVar.get());
10245   }
10246   return getDerived().RebuildOMPInclusiveClause(
10247       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10248 }
10249 
10250 template <typename Derived>
10251 OMPClause *
10252 TreeTransform<Derived>::TransformOMPExclusiveClause(OMPExclusiveClause *C) {
10253   llvm::SmallVector<Expr *, 16> Vars;
10254   Vars.reserve(C->varlist_size());
10255   for (auto *VE : C->varlists()) {
10256     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10257     if (EVar.isInvalid())
10258       return nullptr;
10259     Vars.push_back(EVar.get());
10260   }
10261   return getDerived().RebuildOMPExclusiveClause(
10262       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10263 }
10264 
10265 template <typename Derived>
10266 OMPClause *TreeTransform<Derived>::TransformOMPUsesAllocatorsClause(
10267     OMPUsesAllocatorsClause *C) {
10268   SmallVector<Sema::UsesAllocatorsData, 16> Data;
10269   Data.reserve(C->getNumberOfAllocators());
10270   for (unsigned I = 0, E = C->getNumberOfAllocators(); I < E; ++I) {
10271     OMPUsesAllocatorsClause::Data D = C->getAllocatorData(I);
10272     ExprResult Allocator = getDerived().TransformExpr(D.Allocator);
10273     if (Allocator.isInvalid())
10274       continue;
10275     ExprResult AllocatorTraits;
10276     if (Expr *AT = D.AllocatorTraits) {
10277       AllocatorTraits = getDerived().TransformExpr(AT);
10278       if (AllocatorTraits.isInvalid())
10279         continue;
10280     }
10281     Sema::UsesAllocatorsData &NewD = Data.emplace_back();
10282     NewD.Allocator = Allocator.get();
10283     NewD.AllocatorTraits = AllocatorTraits.get();
10284     NewD.LParenLoc = D.LParenLoc;
10285     NewD.RParenLoc = D.RParenLoc;
10286   }
10287   return getDerived().RebuildOMPUsesAllocatorsClause(
10288       Data, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10289 }
10290 
10291 template <typename Derived>
10292 OMPClause *
10293 TreeTransform<Derived>::TransformOMPAffinityClause(OMPAffinityClause *C) {
10294   SmallVector<Expr *, 4> Locators;
10295   Locators.reserve(C->varlist_size());
10296   ExprResult ModifierRes;
10297   if (Expr *Modifier = C->getModifier()) {
10298     ModifierRes = getDerived().TransformExpr(Modifier);
10299     if (ModifierRes.isInvalid())
10300       return nullptr;
10301   }
10302   for (Expr *E : C->varlists()) {
10303     ExprResult Locator = getDerived().TransformExpr(E);
10304     if (Locator.isInvalid())
10305       continue;
10306     Locators.push_back(Locator.get());
10307   }
10308   return getDerived().RebuildOMPAffinityClause(
10309       C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(), C->getEndLoc(),
10310       ModifierRes.get(), Locators);
10311 }
10312 
10313 template <typename Derived>
10314 OMPClause *TreeTransform<Derived>::TransformOMPOrderClause(OMPOrderClause *C) {
10315   return getDerived().RebuildOMPOrderClause(C->getKind(), C->getKindKwLoc(),
10316                                             C->getBeginLoc(), C->getLParenLoc(),
10317                                             C->getEndLoc());
10318 }
10319 
10320 template <typename Derived>
10321 OMPClause *TreeTransform<Derived>::TransformOMPBindClause(OMPBindClause *C) {
10322   return getDerived().RebuildOMPBindClause(
10323       C->getBindKind(), C->getBindKindLoc(), C->getBeginLoc(),
10324       C->getLParenLoc(), C->getEndLoc());
10325 }
10326 
10327 //===----------------------------------------------------------------------===//
10328 // Expression transformation
10329 //===----------------------------------------------------------------------===//
10330 template<typename Derived>
10331 ExprResult
10332 TreeTransform<Derived>::TransformConstantExpr(ConstantExpr *E) {
10333   return TransformExpr(E->getSubExpr());
10334 }
10335 
10336 template <typename Derived>
10337 ExprResult TreeTransform<Derived>::TransformSYCLUniqueStableNameExpr(
10338     SYCLUniqueStableNameExpr *E) {
10339   if (!E->isTypeDependent())
10340     return E;
10341 
10342   TypeSourceInfo *NewT = getDerived().TransformType(E->getTypeSourceInfo());
10343 
10344   if (!NewT)
10345     return ExprError();
10346 
10347   if (!getDerived().AlwaysRebuild() && E->getTypeSourceInfo() == NewT)
10348     return E;
10349 
10350   return getDerived().RebuildSYCLUniqueStableNameExpr(
10351       E->getLocation(), E->getLParenLocation(), E->getRParenLocation(), NewT);
10352 }
10353 
10354 template<typename Derived>
10355 ExprResult
10356 TreeTransform<Derived>::TransformPredefinedExpr(PredefinedExpr *E) {
10357   if (!E->isTypeDependent())
10358     return E;
10359 
10360   return getDerived().RebuildPredefinedExpr(E->getLocation(),
10361                                             E->getIdentKind());
10362 }
10363 
10364 template<typename Derived>
10365 ExprResult
10366 TreeTransform<Derived>::TransformDeclRefExpr(DeclRefExpr *E) {
10367   NestedNameSpecifierLoc QualifierLoc;
10368   if (E->getQualifierLoc()) {
10369     QualifierLoc
10370       = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
10371     if (!QualifierLoc)
10372       return ExprError();
10373   }
10374 
10375   ValueDecl *ND
10376     = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getLocation(),
10377                                                          E->getDecl()));
10378   if (!ND)
10379     return ExprError();
10380 
10381   NamedDecl *Found = ND;
10382   if (E->getFoundDecl() != E->getDecl()) {
10383     Found = cast_or_null<NamedDecl>(
10384         getDerived().TransformDecl(E->getLocation(), E->getFoundDecl()));
10385     if (!Found)
10386       return ExprError();
10387   }
10388 
10389   DeclarationNameInfo NameInfo = E->getNameInfo();
10390   if (NameInfo.getName()) {
10391     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
10392     if (!NameInfo.getName())
10393       return ExprError();
10394   }
10395 
10396   if (!getDerived().AlwaysRebuild() &&
10397       QualifierLoc == E->getQualifierLoc() &&
10398       ND == E->getDecl() &&
10399       Found == E->getFoundDecl() &&
10400       NameInfo.getName() == E->getDecl()->getDeclName() &&
10401       !E->hasExplicitTemplateArgs()) {
10402 
10403     // Mark it referenced in the new context regardless.
10404     // FIXME: this is a bit instantiation-specific.
10405     SemaRef.MarkDeclRefReferenced(E);
10406 
10407     return E;
10408   }
10409 
10410   TemplateArgumentListInfo TransArgs, *TemplateArgs = nullptr;
10411   if (E->hasExplicitTemplateArgs()) {
10412     TemplateArgs = &TransArgs;
10413     TransArgs.setLAngleLoc(E->getLAngleLoc());
10414     TransArgs.setRAngleLoc(E->getRAngleLoc());
10415     if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
10416                                                 E->getNumTemplateArgs(),
10417                                                 TransArgs))
10418       return ExprError();
10419   }
10420 
10421   return getDerived().RebuildDeclRefExpr(QualifierLoc, ND, NameInfo,
10422                                          Found, TemplateArgs);
10423 }
10424 
10425 template<typename Derived>
10426 ExprResult
10427 TreeTransform<Derived>::TransformIntegerLiteral(IntegerLiteral *E) {
10428   return E;
10429 }
10430 
10431 template <typename Derived>
10432 ExprResult TreeTransform<Derived>::TransformFixedPointLiteral(
10433     FixedPointLiteral *E) {
10434   return E;
10435 }
10436 
10437 template<typename Derived>
10438 ExprResult
10439 TreeTransform<Derived>::TransformFloatingLiteral(FloatingLiteral *E) {
10440   return E;
10441 }
10442 
10443 template<typename Derived>
10444 ExprResult
10445 TreeTransform<Derived>::TransformImaginaryLiteral(ImaginaryLiteral *E) {
10446   return E;
10447 }
10448 
10449 template<typename Derived>
10450 ExprResult
10451 TreeTransform<Derived>::TransformStringLiteral(StringLiteral *E) {
10452   return E;
10453 }
10454 
10455 template<typename Derived>
10456 ExprResult
10457 TreeTransform<Derived>::TransformCharacterLiteral(CharacterLiteral *E) {
10458   return E;
10459 }
10460 
10461 template<typename Derived>
10462 ExprResult
10463 TreeTransform<Derived>::TransformUserDefinedLiteral(UserDefinedLiteral *E) {
10464   if (FunctionDecl *FD = E->getDirectCallee())
10465     SemaRef.MarkFunctionReferenced(E->getBeginLoc(), FD);
10466   return SemaRef.MaybeBindToTemporary(E);
10467 }
10468 
10469 template<typename Derived>
10470 ExprResult
10471 TreeTransform<Derived>::TransformGenericSelectionExpr(GenericSelectionExpr *E) {
10472   ExprResult ControllingExpr =
10473     getDerived().TransformExpr(E->getControllingExpr());
10474   if (ControllingExpr.isInvalid())
10475     return ExprError();
10476 
10477   SmallVector<Expr *, 4> AssocExprs;
10478   SmallVector<TypeSourceInfo *, 4> AssocTypes;
10479   for (const GenericSelectionExpr::Association Assoc : E->associations()) {
10480     TypeSourceInfo *TSI = Assoc.getTypeSourceInfo();
10481     if (TSI) {
10482       TypeSourceInfo *AssocType = getDerived().TransformType(TSI);
10483       if (!AssocType)
10484         return ExprError();
10485       AssocTypes.push_back(AssocType);
10486     } else {
10487       AssocTypes.push_back(nullptr);
10488     }
10489 
10490     ExprResult AssocExpr =
10491         getDerived().TransformExpr(Assoc.getAssociationExpr());
10492     if (AssocExpr.isInvalid())
10493       return ExprError();
10494     AssocExprs.push_back(AssocExpr.get());
10495   }
10496 
10497   return getDerived().RebuildGenericSelectionExpr(E->getGenericLoc(),
10498                                                   E->getDefaultLoc(),
10499                                                   E->getRParenLoc(),
10500                                                   ControllingExpr.get(),
10501                                                   AssocTypes,
10502                                                   AssocExprs);
10503 }
10504 
10505 template<typename Derived>
10506 ExprResult
10507 TreeTransform<Derived>::TransformParenExpr(ParenExpr *E) {
10508   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
10509   if (SubExpr.isInvalid())
10510     return ExprError();
10511 
10512   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr())
10513     return E;
10514 
10515   return getDerived().RebuildParenExpr(SubExpr.get(), E->getLParen(),
10516                                        E->getRParen());
10517 }
10518 
10519 /// The operand of a unary address-of operator has special rules: it's
10520 /// allowed to refer to a non-static member of a class even if there's no 'this'
10521 /// object available.
10522 template<typename Derived>
10523 ExprResult
10524 TreeTransform<Derived>::TransformAddressOfOperand(Expr *E) {
10525   if (DependentScopeDeclRefExpr *DRE = dyn_cast<DependentScopeDeclRefExpr>(E))
10526     return getDerived().TransformDependentScopeDeclRefExpr(DRE, true, nullptr);
10527   else
10528     return getDerived().TransformExpr(E);
10529 }
10530 
10531 template<typename Derived>
10532 ExprResult
10533 TreeTransform<Derived>::TransformUnaryOperator(UnaryOperator *E) {
10534   ExprResult SubExpr;
10535   if (E->getOpcode() == UO_AddrOf)
10536     SubExpr = TransformAddressOfOperand(E->getSubExpr());
10537   else
10538     SubExpr = TransformExpr(E->getSubExpr());
10539   if (SubExpr.isInvalid())
10540     return ExprError();
10541 
10542   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr())
10543     return E;
10544 
10545   return getDerived().RebuildUnaryOperator(E->getOperatorLoc(),
10546                                            E->getOpcode(),
10547                                            SubExpr.get());
10548 }
10549 
10550 template<typename Derived>
10551 ExprResult
10552 TreeTransform<Derived>::TransformOffsetOfExpr(OffsetOfExpr *E) {
10553   // Transform the type.
10554   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo());
10555   if (!Type)
10556     return ExprError();
10557 
10558   // Transform all of the components into components similar to what the
10559   // parser uses.
10560   // FIXME: It would be slightly more efficient in the non-dependent case to
10561   // just map FieldDecls, rather than requiring the rebuilder to look for
10562   // the fields again. However, __builtin_offsetof is rare enough in
10563   // template code that we don't care.
10564   bool ExprChanged = false;
10565   typedef Sema::OffsetOfComponent Component;
10566   SmallVector<Component, 4> Components;
10567   for (unsigned I = 0, N = E->getNumComponents(); I != N; ++I) {
10568     const OffsetOfNode &ON = E->getComponent(I);
10569     Component Comp;
10570     Comp.isBrackets = true;
10571     Comp.LocStart = ON.getSourceRange().getBegin();
10572     Comp.LocEnd = ON.getSourceRange().getEnd();
10573     switch (ON.getKind()) {
10574     case OffsetOfNode::Array: {
10575       Expr *FromIndex = E->getIndexExpr(ON.getArrayExprIndex());
10576       ExprResult Index = getDerived().TransformExpr(FromIndex);
10577       if (Index.isInvalid())
10578         return ExprError();
10579 
10580       ExprChanged = ExprChanged || Index.get() != FromIndex;
10581       Comp.isBrackets = true;
10582       Comp.U.E = Index.get();
10583       break;
10584     }
10585 
10586     case OffsetOfNode::Field:
10587     case OffsetOfNode::Identifier:
10588       Comp.isBrackets = false;
10589       Comp.U.IdentInfo = ON.getFieldName();
10590       if (!Comp.U.IdentInfo)
10591         continue;
10592 
10593       break;
10594 
10595     case OffsetOfNode::Base:
10596       // Will be recomputed during the rebuild.
10597       continue;
10598     }
10599 
10600     Components.push_back(Comp);
10601   }
10602 
10603   // If nothing changed, retain the existing expression.
10604   if (!getDerived().AlwaysRebuild() &&
10605       Type == E->getTypeSourceInfo() &&
10606       !ExprChanged)
10607     return E;
10608 
10609   // Build a new offsetof expression.
10610   return getDerived().RebuildOffsetOfExpr(E->getOperatorLoc(), Type,
10611                                           Components, E->getRParenLoc());
10612 }
10613 
10614 template<typename Derived>
10615 ExprResult
10616 TreeTransform<Derived>::TransformOpaqueValueExpr(OpaqueValueExpr *E) {
10617   assert((!E->getSourceExpr() || getDerived().AlreadyTransformed(E->getType())) &&
10618          "opaque value expression requires transformation");
10619   return E;
10620 }
10621 
10622 template<typename Derived>
10623 ExprResult
10624 TreeTransform<Derived>::TransformTypoExpr(TypoExpr *E) {
10625   return E;
10626 }
10627 
10628 template <typename Derived>
10629 ExprResult TreeTransform<Derived>::TransformRecoveryExpr(RecoveryExpr *E) {
10630   llvm::SmallVector<Expr *, 8> Children;
10631   bool Changed = false;
10632   for (Expr *C : E->subExpressions()) {
10633     ExprResult NewC = getDerived().TransformExpr(C);
10634     if (NewC.isInvalid())
10635       return ExprError();
10636     Children.push_back(NewC.get());
10637 
10638     Changed |= NewC.get() != C;
10639   }
10640   if (!getDerived().AlwaysRebuild() && !Changed)
10641     return E;
10642   return getDerived().RebuildRecoveryExpr(E->getBeginLoc(), E->getEndLoc(),
10643                                           Children, E->getType());
10644 }
10645 
10646 template<typename Derived>
10647 ExprResult
10648 TreeTransform<Derived>::TransformPseudoObjectExpr(PseudoObjectExpr *E) {
10649   // Rebuild the syntactic form.  The original syntactic form has
10650   // opaque-value expressions in it, so strip those away and rebuild
10651   // the result.  This is a really awful way of doing this, but the
10652   // better solution (rebuilding the semantic expressions and
10653   // rebinding OVEs as necessary) doesn't work; we'd need
10654   // TreeTransform to not strip away implicit conversions.
10655   Expr *newSyntacticForm = SemaRef.recreateSyntacticForm(E);
10656   ExprResult result = getDerived().TransformExpr(newSyntacticForm);
10657   if (result.isInvalid()) return ExprError();
10658 
10659   // If that gives us a pseudo-object result back, the pseudo-object
10660   // expression must have been an lvalue-to-rvalue conversion which we
10661   // should reapply.
10662   if (result.get()->hasPlaceholderType(BuiltinType::PseudoObject))
10663     result = SemaRef.checkPseudoObjectRValue(result.get());
10664 
10665   return result;
10666 }
10667 
10668 template<typename Derived>
10669 ExprResult
10670 TreeTransform<Derived>::TransformUnaryExprOrTypeTraitExpr(
10671                                                 UnaryExprOrTypeTraitExpr *E) {
10672   if (E->isArgumentType()) {
10673     TypeSourceInfo *OldT = E->getArgumentTypeInfo();
10674 
10675     TypeSourceInfo *NewT = getDerived().TransformType(OldT);
10676     if (!NewT)
10677       return ExprError();
10678 
10679     if (!getDerived().AlwaysRebuild() && OldT == NewT)
10680       return E;
10681 
10682     return getDerived().RebuildUnaryExprOrTypeTrait(NewT, E->getOperatorLoc(),
10683                                                     E->getKind(),
10684                                                     E->getSourceRange());
10685   }
10686 
10687   // C++0x [expr.sizeof]p1:
10688   //   The operand is either an expression, which is an unevaluated operand
10689   //   [...]
10690   EnterExpressionEvaluationContext Unevaluated(
10691       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated,
10692       Sema::ReuseLambdaContextDecl);
10693 
10694   // Try to recover if we have something like sizeof(T::X) where X is a type.
10695   // Notably, there must be *exactly* one set of parens if X is a type.
10696   TypeSourceInfo *RecoveryTSI = nullptr;
10697   ExprResult SubExpr;
10698   auto *PE = dyn_cast<ParenExpr>(E->getArgumentExpr());
10699   if (auto *DRE =
10700           PE ? dyn_cast<DependentScopeDeclRefExpr>(PE->getSubExpr()) : nullptr)
10701     SubExpr = getDerived().TransformParenDependentScopeDeclRefExpr(
10702         PE, DRE, false, &RecoveryTSI);
10703   else
10704     SubExpr = getDerived().TransformExpr(E->getArgumentExpr());
10705 
10706   if (RecoveryTSI) {
10707     return getDerived().RebuildUnaryExprOrTypeTrait(
10708         RecoveryTSI, E->getOperatorLoc(), E->getKind(), E->getSourceRange());
10709   } else if (SubExpr.isInvalid())
10710     return ExprError();
10711 
10712   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getArgumentExpr())
10713     return E;
10714 
10715   return getDerived().RebuildUnaryExprOrTypeTrait(SubExpr.get(),
10716                                                   E->getOperatorLoc(),
10717                                                   E->getKind(),
10718                                                   E->getSourceRange());
10719 }
10720 
10721 template<typename Derived>
10722 ExprResult
10723 TreeTransform<Derived>::TransformArraySubscriptExpr(ArraySubscriptExpr *E) {
10724   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
10725   if (LHS.isInvalid())
10726     return ExprError();
10727 
10728   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
10729   if (RHS.isInvalid())
10730     return ExprError();
10731 
10732 
10733   if (!getDerived().AlwaysRebuild() &&
10734       LHS.get() == E->getLHS() &&
10735       RHS.get() == E->getRHS())
10736     return E;
10737 
10738   return getDerived().RebuildArraySubscriptExpr(
10739       LHS.get(),
10740       /*FIXME:*/ E->getLHS()->getBeginLoc(), RHS.get(), E->getRBracketLoc());
10741 }
10742 
10743 template <typename Derived>
10744 ExprResult
10745 TreeTransform<Derived>::TransformMatrixSubscriptExpr(MatrixSubscriptExpr *E) {
10746   ExprResult Base = getDerived().TransformExpr(E->getBase());
10747   if (Base.isInvalid())
10748     return ExprError();
10749 
10750   ExprResult RowIdx = getDerived().TransformExpr(E->getRowIdx());
10751   if (RowIdx.isInvalid())
10752     return ExprError();
10753 
10754   ExprResult ColumnIdx = getDerived().TransformExpr(E->getColumnIdx());
10755   if (ColumnIdx.isInvalid())
10756     return ExprError();
10757 
10758   if (!getDerived().AlwaysRebuild() && Base.get() == E->getBase() &&
10759       RowIdx.get() == E->getRowIdx() && ColumnIdx.get() == E->getColumnIdx())
10760     return E;
10761 
10762   return getDerived().RebuildMatrixSubscriptExpr(
10763       Base.get(), RowIdx.get(), ColumnIdx.get(), E->getRBracketLoc());
10764 }
10765 
10766 template <typename Derived>
10767 ExprResult
10768 TreeTransform<Derived>::TransformOMPArraySectionExpr(OMPArraySectionExpr *E) {
10769   ExprResult Base = getDerived().TransformExpr(E->getBase());
10770   if (Base.isInvalid())
10771     return ExprError();
10772 
10773   ExprResult LowerBound;
10774   if (E->getLowerBound()) {
10775     LowerBound = getDerived().TransformExpr(E->getLowerBound());
10776     if (LowerBound.isInvalid())
10777       return ExprError();
10778   }
10779 
10780   ExprResult Length;
10781   if (E->getLength()) {
10782     Length = getDerived().TransformExpr(E->getLength());
10783     if (Length.isInvalid())
10784       return ExprError();
10785   }
10786 
10787   ExprResult Stride;
10788   if (Expr *Str = E->getStride()) {
10789     Stride = getDerived().TransformExpr(Str);
10790     if (Stride.isInvalid())
10791       return ExprError();
10792   }
10793 
10794   if (!getDerived().AlwaysRebuild() && Base.get() == E->getBase() &&
10795       LowerBound.get() == E->getLowerBound() && Length.get() == E->getLength())
10796     return E;
10797 
10798   return getDerived().RebuildOMPArraySectionExpr(
10799       Base.get(), E->getBase()->getEndLoc(), LowerBound.get(),
10800       E->getColonLocFirst(), E->getColonLocSecond(), Length.get(), Stride.get(),
10801       E->getRBracketLoc());
10802 }
10803 
10804 template <typename Derived>
10805 ExprResult
10806 TreeTransform<Derived>::TransformOMPArrayShapingExpr(OMPArrayShapingExpr *E) {
10807   ExprResult Base = getDerived().TransformExpr(E->getBase());
10808   if (Base.isInvalid())
10809     return ExprError();
10810 
10811   SmallVector<Expr *, 4> Dims;
10812   bool ErrorFound = false;
10813   for (Expr *Dim : E->getDimensions()) {
10814     ExprResult DimRes = getDerived().TransformExpr(Dim);
10815     if (DimRes.isInvalid()) {
10816       ErrorFound = true;
10817       continue;
10818     }
10819     Dims.push_back(DimRes.get());
10820   }
10821 
10822   if (ErrorFound)
10823     return ExprError();
10824   return getDerived().RebuildOMPArrayShapingExpr(Base.get(), E->getLParenLoc(),
10825                                                  E->getRParenLoc(), Dims,
10826                                                  E->getBracketsRanges());
10827 }
10828 
10829 template <typename Derived>
10830 ExprResult
10831 TreeTransform<Derived>::TransformOMPIteratorExpr(OMPIteratorExpr *E) {
10832   unsigned NumIterators = E->numOfIterators();
10833   SmallVector<Sema::OMPIteratorData, 4> Data(NumIterators);
10834 
10835   bool ErrorFound = false;
10836   bool NeedToRebuild = getDerived().AlwaysRebuild();
10837   for (unsigned I = 0; I < NumIterators; ++I) {
10838     auto *D = cast<VarDecl>(E->getIteratorDecl(I));
10839     Data[I].DeclIdent = D->getIdentifier();
10840     Data[I].DeclIdentLoc = D->getLocation();
10841     if (D->getLocation() == D->getBeginLoc()) {
10842       assert(SemaRef.Context.hasSameType(D->getType(), SemaRef.Context.IntTy) &&
10843              "Implicit type must be int.");
10844     } else {
10845       TypeSourceInfo *TSI = getDerived().TransformType(D->getTypeSourceInfo());
10846       QualType DeclTy = getDerived().TransformType(D->getType());
10847       Data[I].Type = SemaRef.CreateParsedType(DeclTy, TSI);
10848     }
10849     OMPIteratorExpr::IteratorRange Range = E->getIteratorRange(I);
10850     ExprResult Begin = getDerived().TransformExpr(Range.Begin);
10851     ExprResult End = getDerived().TransformExpr(Range.End);
10852     ExprResult Step = getDerived().TransformExpr(Range.Step);
10853     ErrorFound = ErrorFound ||
10854                  !(!D->getTypeSourceInfo() || (Data[I].Type.getAsOpaquePtr() &&
10855                                                !Data[I].Type.get().isNull())) ||
10856                  Begin.isInvalid() || End.isInvalid() || Step.isInvalid();
10857     if (ErrorFound)
10858       continue;
10859     Data[I].Range.Begin = Begin.get();
10860     Data[I].Range.End = End.get();
10861     Data[I].Range.Step = Step.get();
10862     Data[I].AssignLoc = E->getAssignLoc(I);
10863     Data[I].ColonLoc = E->getColonLoc(I);
10864     Data[I].SecColonLoc = E->getSecondColonLoc(I);
10865     NeedToRebuild =
10866         NeedToRebuild ||
10867         (D->getTypeSourceInfo() && Data[I].Type.get().getTypePtrOrNull() !=
10868                                        D->getType().getTypePtrOrNull()) ||
10869         Range.Begin != Data[I].Range.Begin || Range.End != Data[I].Range.End ||
10870         Range.Step != Data[I].Range.Step;
10871   }
10872   if (ErrorFound)
10873     return ExprError();
10874   if (!NeedToRebuild)
10875     return E;
10876 
10877   ExprResult Res = getDerived().RebuildOMPIteratorExpr(
10878       E->getIteratorKwLoc(), E->getLParenLoc(), E->getRParenLoc(), Data);
10879   if (!Res.isUsable())
10880     return Res;
10881   auto *IE = cast<OMPIteratorExpr>(Res.get());
10882   for (unsigned I = 0; I < NumIterators; ++I)
10883     getDerived().transformedLocalDecl(E->getIteratorDecl(I),
10884                                       IE->getIteratorDecl(I));
10885   return Res;
10886 }
10887 
10888 template<typename Derived>
10889 ExprResult
10890 TreeTransform<Derived>::TransformCallExpr(CallExpr *E) {
10891   // Transform the callee.
10892   ExprResult Callee = getDerived().TransformExpr(E->getCallee());
10893   if (Callee.isInvalid())
10894     return ExprError();
10895 
10896   // Transform arguments.
10897   bool ArgChanged = false;
10898   SmallVector<Expr*, 8> Args;
10899   if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
10900                                   &ArgChanged))
10901     return ExprError();
10902 
10903   if (!getDerived().AlwaysRebuild() &&
10904       Callee.get() == E->getCallee() &&
10905       !ArgChanged)
10906     return SemaRef.MaybeBindToTemporary(E);
10907 
10908   // FIXME: Wrong source location information for the '('.
10909   SourceLocation FakeLParenLoc
10910     = ((Expr *)Callee.get())->getSourceRange().getBegin();
10911 
10912   Sema::FPFeaturesStateRAII FPFeaturesState(getSema());
10913   if (E->hasStoredFPFeatures()) {
10914     FPOptionsOverride NewOverrides = E->getFPFeatures();
10915     getSema().CurFPFeatures =
10916         NewOverrides.applyOverrides(getSema().getLangOpts());
10917     getSema().FpPragmaStack.CurrentValue = NewOverrides;
10918   }
10919 
10920   return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc,
10921                                       Args,
10922                                       E->getRParenLoc());
10923 }
10924 
10925 template<typename Derived>
10926 ExprResult
10927 TreeTransform<Derived>::TransformMemberExpr(MemberExpr *E) {
10928   ExprResult Base = getDerived().TransformExpr(E->getBase());
10929   if (Base.isInvalid())
10930     return ExprError();
10931 
10932   NestedNameSpecifierLoc QualifierLoc;
10933   if (E->hasQualifier()) {
10934     QualifierLoc
10935       = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
10936 
10937     if (!QualifierLoc)
10938       return ExprError();
10939   }
10940   SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc();
10941 
10942   ValueDecl *Member
10943     = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getMemberLoc(),
10944                                                          E->getMemberDecl()));
10945   if (!Member)
10946     return ExprError();
10947 
10948   NamedDecl *FoundDecl = E->getFoundDecl();
10949   if (FoundDecl == E->getMemberDecl()) {
10950     FoundDecl = Member;
10951   } else {
10952     FoundDecl = cast_or_null<NamedDecl>(
10953                    getDerived().TransformDecl(E->getMemberLoc(), FoundDecl));
10954     if (!FoundDecl)
10955       return ExprError();
10956   }
10957 
10958   if (!getDerived().AlwaysRebuild() &&
10959       Base.get() == E->getBase() &&
10960       QualifierLoc == E->getQualifierLoc() &&
10961       Member == E->getMemberDecl() &&
10962       FoundDecl == E->getFoundDecl() &&
10963       !E->hasExplicitTemplateArgs()) {
10964 
10965     // Mark it referenced in the new context regardless.
10966     // FIXME: this is a bit instantiation-specific.
10967     SemaRef.MarkMemberReferenced(E);
10968 
10969     return E;
10970   }
10971 
10972   TemplateArgumentListInfo TransArgs;
10973   if (E->hasExplicitTemplateArgs()) {
10974     TransArgs.setLAngleLoc(E->getLAngleLoc());
10975     TransArgs.setRAngleLoc(E->getRAngleLoc());
10976     if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
10977                                                 E->getNumTemplateArgs(),
10978                                                 TransArgs))
10979       return ExprError();
10980   }
10981 
10982   // FIXME: Bogus source location for the operator
10983   SourceLocation FakeOperatorLoc =
10984       SemaRef.getLocForEndOfToken(E->getBase()->getSourceRange().getEnd());
10985 
10986   // FIXME: to do this check properly, we will need to preserve the
10987   // first-qualifier-in-scope here, just in case we had a dependent
10988   // base (and therefore couldn't do the check) and a
10989   // nested-name-qualifier (and therefore could do the lookup).
10990   NamedDecl *FirstQualifierInScope = nullptr;
10991   DeclarationNameInfo MemberNameInfo = E->getMemberNameInfo();
10992   if (MemberNameInfo.getName()) {
10993     MemberNameInfo = getDerived().TransformDeclarationNameInfo(MemberNameInfo);
10994     if (!MemberNameInfo.getName())
10995       return ExprError();
10996   }
10997 
10998   return getDerived().RebuildMemberExpr(Base.get(), FakeOperatorLoc,
10999                                         E->isArrow(),
11000                                         QualifierLoc,
11001                                         TemplateKWLoc,
11002                                         MemberNameInfo,
11003                                         Member,
11004                                         FoundDecl,
11005                                         (E->hasExplicitTemplateArgs()
11006                                            ? &TransArgs : nullptr),
11007                                         FirstQualifierInScope);
11008 }
11009 
11010 template<typename Derived>
11011 ExprResult
11012 TreeTransform<Derived>::TransformBinaryOperator(BinaryOperator *E) {
11013   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
11014   if (LHS.isInvalid())
11015     return ExprError();
11016 
11017   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
11018   if (RHS.isInvalid())
11019     return ExprError();
11020 
11021   if (!getDerived().AlwaysRebuild() &&
11022       LHS.get() == E->getLHS() &&
11023       RHS.get() == E->getRHS())
11024     return E;
11025 
11026   if (E->isCompoundAssignmentOp())
11027     // FPFeatures has already been established from trailing storage
11028     return getDerived().RebuildBinaryOperator(
11029         E->getOperatorLoc(), E->getOpcode(), LHS.get(), RHS.get());
11030   Sema::FPFeaturesStateRAII FPFeaturesState(getSema());
11031   FPOptionsOverride NewOverrides(E->getFPFeatures(getSema().getLangOpts()));
11032   getSema().CurFPFeatures =
11033       NewOverrides.applyOverrides(getSema().getLangOpts());
11034   getSema().FpPragmaStack.CurrentValue = NewOverrides;
11035   return getDerived().RebuildBinaryOperator(E->getOperatorLoc(), E->getOpcode(),
11036                                             LHS.get(), RHS.get());
11037 }
11038 
11039 template <typename Derived>
11040 ExprResult TreeTransform<Derived>::TransformCXXRewrittenBinaryOperator(
11041     CXXRewrittenBinaryOperator *E) {
11042   CXXRewrittenBinaryOperator::DecomposedForm Decomp = E->getDecomposedForm();
11043 
11044   ExprResult LHS = getDerived().TransformExpr(const_cast<Expr*>(Decomp.LHS));
11045   if (LHS.isInvalid())
11046     return ExprError();
11047 
11048   ExprResult RHS = getDerived().TransformExpr(const_cast<Expr*>(Decomp.RHS));
11049   if (RHS.isInvalid())
11050     return ExprError();
11051 
11052   // Extract the already-resolved callee declarations so that we can restrict
11053   // ourselves to using them as the unqualified lookup results when rebuilding.
11054   UnresolvedSet<2> UnqualLookups;
11055   bool ChangedAnyLookups = false;
11056   Expr *PossibleBinOps[] = {E->getSemanticForm(),
11057                             const_cast<Expr *>(Decomp.InnerBinOp)};
11058   for (Expr *PossibleBinOp : PossibleBinOps) {
11059     auto *Op = dyn_cast<CXXOperatorCallExpr>(PossibleBinOp->IgnoreImplicit());
11060     if (!Op)
11061       continue;
11062     auto *Callee = dyn_cast<DeclRefExpr>(Op->getCallee()->IgnoreImplicit());
11063     if (!Callee || isa<CXXMethodDecl>(Callee->getDecl()))
11064       continue;
11065 
11066     // Transform the callee in case we built a call to a local extern
11067     // declaration.
11068     NamedDecl *Found = cast_or_null<NamedDecl>(getDerived().TransformDecl(
11069         E->getOperatorLoc(), Callee->getFoundDecl()));
11070     if (!Found)
11071       return ExprError();
11072     if (Found != Callee->getFoundDecl())
11073       ChangedAnyLookups = true;
11074     UnqualLookups.addDecl(Found);
11075   }
11076 
11077   if (!getDerived().AlwaysRebuild() && !ChangedAnyLookups &&
11078       LHS.get() == Decomp.LHS && RHS.get() == Decomp.RHS) {
11079     // Mark all functions used in the rewrite as referenced. Note that when
11080     // a < b is rewritten to (a <=> b) < 0, both the <=> and the < might be
11081     // function calls, and/or there might be a user-defined conversion sequence
11082     // applied to the operands of the <.
11083     // FIXME: this is a bit instantiation-specific.
11084     const Expr *StopAt[] = {Decomp.LHS, Decomp.RHS};
11085     SemaRef.MarkDeclarationsReferencedInExpr(E, false, StopAt);
11086     return E;
11087   }
11088 
11089   return getDerived().RebuildCXXRewrittenBinaryOperator(
11090       E->getOperatorLoc(), Decomp.Opcode, UnqualLookups, LHS.get(), RHS.get());
11091 }
11092 
11093 template<typename Derived>
11094 ExprResult
11095 TreeTransform<Derived>::TransformCompoundAssignOperator(
11096                                                       CompoundAssignOperator *E) {
11097   Sema::FPFeaturesStateRAII FPFeaturesState(getSema());
11098   FPOptionsOverride NewOverrides(E->getFPFeatures(getSema().getLangOpts()));
11099   getSema().CurFPFeatures =
11100       NewOverrides.applyOverrides(getSema().getLangOpts());
11101   getSema().FpPragmaStack.CurrentValue = NewOverrides;
11102   return getDerived().TransformBinaryOperator(E);
11103 }
11104 
11105 template<typename Derived>
11106 ExprResult TreeTransform<Derived>::
11107 TransformBinaryConditionalOperator(BinaryConditionalOperator *e) {
11108   // Just rebuild the common and RHS expressions and see whether we
11109   // get any changes.
11110 
11111   ExprResult commonExpr = getDerived().TransformExpr(e->getCommon());
11112   if (commonExpr.isInvalid())
11113     return ExprError();
11114 
11115   ExprResult rhs = getDerived().TransformExpr(e->getFalseExpr());
11116   if (rhs.isInvalid())
11117     return ExprError();
11118 
11119   if (!getDerived().AlwaysRebuild() &&
11120       commonExpr.get() == e->getCommon() &&
11121       rhs.get() == e->getFalseExpr())
11122     return e;
11123 
11124   return getDerived().RebuildConditionalOperator(commonExpr.get(),
11125                                                  e->getQuestionLoc(),
11126                                                  nullptr,
11127                                                  e->getColonLoc(),
11128                                                  rhs.get());
11129 }
11130 
11131 template<typename Derived>
11132 ExprResult
11133 TreeTransform<Derived>::TransformConditionalOperator(ConditionalOperator *E) {
11134   ExprResult Cond = getDerived().TransformExpr(E->getCond());
11135   if (Cond.isInvalid())
11136     return ExprError();
11137 
11138   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
11139   if (LHS.isInvalid())
11140     return ExprError();
11141 
11142   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
11143   if (RHS.isInvalid())
11144     return ExprError();
11145 
11146   if (!getDerived().AlwaysRebuild() &&
11147       Cond.get() == E->getCond() &&
11148       LHS.get() == E->getLHS() &&
11149       RHS.get() == E->getRHS())
11150     return E;
11151 
11152   return getDerived().RebuildConditionalOperator(Cond.get(),
11153                                                  E->getQuestionLoc(),
11154                                                  LHS.get(),
11155                                                  E->getColonLoc(),
11156                                                  RHS.get());
11157 }
11158 
11159 template<typename Derived>
11160 ExprResult
11161 TreeTransform<Derived>::TransformImplicitCastExpr(ImplicitCastExpr *E) {
11162   // Implicit casts are eliminated during transformation, since they
11163   // will be recomputed by semantic analysis after transformation.
11164   return getDerived().TransformExpr(E->getSubExprAsWritten());
11165 }
11166 
11167 template<typename Derived>
11168 ExprResult
11169 TreeTransform<Derived>::TransformCStyleCastExpr(CStyleCastExpr *E) {
11170   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten());
11171   if (!Type)
11172     return ExprError();
11173 
11174   ExprResult SubExpr
11175     = getDerived().TransformExpr(E->getSubExprAsWritten());
11176   if (SubExpr.isInvalid())
11177     return ExprError();
11178 
11179   if (!getDerived().AlwaysRebuild() &&
11180       Type == E->getTypeInfoAsWritten() &&
11181       SubExpr.get() == E->getSubExpr())
11182     return E;
11183 
11184   return getDerived().RebuildCStyleCastExpr(E->getLParenLoc(),
11185                                             Type,
11186                                             E->getRParenLoc(),
11187                                             SubExpr.get());
11188 }
11189 
11190 template<typename Derived>
11191 ExprResult
11192 TreeTransform<Derived>::TransformCompoundLiteralExpr(CompoundLiteralExpr *E) {
11193   TypeSourceInfo *OldT = E->getTypeSourceInfo();
11194   TypeSourceInfo *NewT = getDerived().TransformType(OldT);
11195   if (!NewT)
11196     return ExprError();
11197 
11198   ExprResult Init = getDerived().TransformExpr(E->getInitializer());
11199   if (Init.isInvalid())
11200     return ExprError();
11201 
11202   if (!getDerived().AlwaysRebuild() &&
11203       OldT == NewT &&
11204       Init.get() == E->getInitializer())
11205     return SemaRef.MaybeBindToTemporary(E);
11206 
11207   // Note: the expression type doesn't necessarily match the
11208   // type-as-written, but that's okay, because it should always be
11209   // derivable from the initializer.
11210 
11211   return getDerived().RebuildCompoundLiteralExpr(
11212       E->getLParenLoc(), NewT,
11213       /*FIXME:*/ E->getInitializer()->getEndLoc(), Init.get());
11214 }
11215 
11216 template<typename Derived>
11217 ExprResult
11218 TreeTransform<Derived>::TransformExtVectorElementExpr(ExtVectorElementExpr *E) {
11219   ExprResult Base = getDerived().TransformExpr(E->getBase());
11220   if (Base.isInvalid())
11221     return ExprError();
11222 
11223   if (!getDerived().AlwaysRebuild() &&
11224       Base.get() == E->getBase())
11225     return E;
11226 
11227   // FIXME: Bad source location
11228   SourceLocation FakeOperatorLoc =
11229       SemaRef.getLocForEndOfToken(E->getBase()->getEndLoc());
11230   return getDerived().RebuildExtVectorElementExpr(Base.get(), FakeOperatorLoc,
11231                                                   E->getAccessorLoc(),
11232                                                   E->getAccessor());
11233 }
11234 
11235 template<typename Derived>
11236 ExprResult
11237 TreeTransform<Derived>::TransformInitListExpr(InitListExpr *E) {
11238   if (InitListExpr *Syntactic = E->getSyntacticForm())
11239     E = Syntactic;
11240 
11241   bool InitChanged = false;
11242 
11243   EnterExpressionEvaluationContext Context(
11244       getSema(), EnterExpressionEvaluationContext::InitList);
11245 
11246   SmallVector<Expr*, 4> Inits;
11247   if (getDerived().TransformExprs(E->getInits(), E->getNumInits(), false,
11248                                   Inits, &InitChanged))
11249     return ExprError();
11250 
11251   if (!getDerived().AlwaysRebuild() && !InitChanged) {
11252     // FIXME: Attempt to reuse the existing syntactic form of the InitListExpr
11253     // in some cases. We can't reuse it in general, because the syntactic and
11254     // semantic forms are linked, and we can't know that semantic form will
11255     // match even if the syntactic form does.
11256   }
11257 
11258   return getDerived().RebuildInitList(E->getLBraceLoc(), Inits,
11259                                       E->getRBraceLoc());
11260 }
11261 
11262 template<typename Derived>
11263 ExprResult
11264 TreeTransform<Derived>::TransformDesignatedInitExpr(DesignatedInitExpr *E) {
11265   Designation Desig;
11266 
11267   // transform the initializer value
11268   ExprResult Init = getDerived().TransformExpr(E->getInit());
11269   if (Init.isInvalid())
11270     return ExprError();
11271 
11272   // transform the designators.
11273   SmallVector<Expr*, 4> ArrayExprs;
11274   bool ExprChanged = false;
11275   for (const DesignatedInitExpr::Designator &D : E->designators()) {
11276     if (D.isFieldDesignator()) {
11277       Desig.AddDesignator(Designator::getField(D.getFieldName(),
11278                                                D.getDotLoc(),
11279                                                D.getFieldLoc()));
11280       if (D.getField()) {
11281         FieldDecl *Field = cast_or_null<FieldDecl>(
11282             getDerived().TransformDecl(D.getFieldLoc(), D.getField()));
11283         if (Field != D.getField())
11284           // Rebuild the expression when the transformed FieldDecl is
11285           // different to the already assigned FieldDecl.
11286           ExprChanged = true;
11287       } else {
11288         // Ensure that the designator expression is rebuilt when there isn't
11289         // a resolved FieldDecl in the designator as we don't want to assign
11290         // a FieldDecl to a pattern designator that will be instantiated again.
11291         ExprChanged = true;
11292       }
11293       continue;
11294     }
11295 
11296     if (D.isArrayDesignator()) {
11297       ExprResult Index = getDerived().TransformExpr(E->getArrayIndex(D));
11298       if (Index.isInvalid())
11299         return ExprError();
11300 
11301       Desig.AddDesignator(
11302           Designator::getArray(Index.get(), D.getLBracketLoc()));
11303 
11304       ExprChanged = ExprChanged || Init.get() != E->getArrayIndex(D);
11305       ArrayExprs.push_back(Index.get());
11306       continue;
11307     }
11308 
11309     assert(D.isArrayRangeDesignator() && "New kind of designator?");
11310     ExprResult Start
11311       = getDerived().TransformExpr(E->getArrayRangeStart(D));
11312     if (Start.isInvalid())
11313       return ExprError();
11314 
11315     ExprResult End = getDerived().TransformExpr(E->getArrayRangeEnd(D));
11316     if (End.isInvalid())
11317       return ExprError();
11318 
11319     Desig.AddDesignator(Designator::getArrayRange(Start.get(),
11320                                                   End.get(),
11321                                                   D.getLBracketLoc(),
11322                                                   D.getEllipsisLoc()));
11323 
11324     ExprChanged = ExprChanged || Start.get() != E->getArrayRangeStart(D) ||
11325                   End.get() != E->getArrayRangeEnd(D);
11326 
11327     ArrayExprs.push_back(Start.get());
11328     ArrayExprs.push_back(End.get());
11329   }
11330 
11331   if (!getDerived().AlwaysRebuild() &&
11332       Init.get() == E->getInit() &&
11333       !ExprChanged)
11334     return E;
11335 
11336   return getDerived().RebuildDesignatedInitExpr(Desig, ArrayExprs,
11337                                                 E->getEqualOrColonLoc(),
11338                                                 E->usesGNUSyntax(), Init.get());
11339 }
11340 
11341 // Seems that if TransformInitListExpr() only works on the syntactic form of an
11342 // InitListExpr, then a DesignatedInitUpdateExpr is not encountered.
11343 template<typename Derived>
11344 ExprResult
11345 TreeTransform<Derived>::TransformDesignatedInitUpdateExpr(
11346     DesignatedInitUpdateExpr *E) {
11347   llvm_unreachable("Unexpected DesignatedInitUpdateExpr in syntactic form of "
11348                    "initializer");
11349   return ExprError();
11350 }
11351 
11352 template<typename Derived>
11353 ExprResult
11354 TreeTransform<Derived>::TransformNoInitExpr(
11355     NoInitExpr *E) {
11356   llvm_unreachable("Unexpected NoInitExpr in syntactic form of initializer");
11357   return ExprError();
11358 }
11359 
11360 template<typename Derived>
11361 ExprResult
11362 TreeTransform<Derived>::TransformArrayInitLoopExpr(ArrayInitLoopExpr *E) {
11363   llvm_unreachable("Unexpected ArrayInitLoopExpr outside of initializer");
11364   return ExprError();
11365 }
11366 
11367 template<typename Derived>
11368 ExprResult
11369 TreeTransform<Derived>::TransformArrayInitIndexExpr(ArrayInitIndexExpr *E) {
11370   llvm_unreachable("Unexpected ArrayInitIndexExpr outside of initializer");
11371   return ExprError();
11372 }
11373 
11374 template<typename Derived>
11375 ExprResult
11376 TreeTransform<Derived>::TransformImplicitValueInitExpr(
11377                                                      ImplicitValueInitExpr *E) {
11378   TemporaryBase Rebase(*this, E->getBeginLoc(), DeclarationName());
11379 
11380   // FIXME: Will we ever have proper type location here? Will we actually
11381   // need to transform the type?
11382   QualType T = getDerived().TransformType(E->getType());
11383   if (T.isNull())
11384     return ExprError();
11385 
11386   if (!getDerived().AlwaysRebuild() &&
11387       T == E->getType())
11388     return E;
11389 
11390   return getDerived().RebuildImplicitValueInitExpr(T);
11391 }
11392 
11393 template<typename Derived>
11394 ExprResult
11395 TreeTransform<Derived>::TransformVAArgExpr(VAArgExpr *E) {
11396   TypeSourceInfo *TInfo = getDerived().TransformType(E->getWrittenTypeInfo());
11397   if (!TInfo)
11398     return ExprError();
11399 
11400   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
11401   if (SubExpr.isInvalid())
11402     return ExprError();
11403 
11404   if (!getDerived().AlwaysRebuild() &&
11405       TInfo == E->getWrittenTypeInfo() &&
11406       SubExpr.get() == E->getSubExpr())
11407     return E;
11408 
11409   return getDerived().RebuildVAArgExpr(E->getBuiltinLoc(), SubExpr.get(),
11410                                        TInfo, E->getRParenLoc());
11411 }
11412 
11413 template<typename Derived>
11414 ExprResult
11415 TreeTransform<Derived>::TransformParenListExpr(ParenListExpr *E) {
11416   bool ArgumentChanged = false;
11417   SmallVector<Expr*, 4> Inits;
11418   if (TransformExprs(E->getExprs(), E->getNumExprs(), true, Inits,
11419                      &ArgumentChanged))
11420     return ExprError();
11421 
11422   return getDerived().RebuildParenListExpr(E->getLParenLoc(),
11423                                            Inits,
11424                                            E->getRParenLoc());
11425 }
11426 
11427 /// Transform an address-of-label expression.
11428 ///
11429 /// By default, the transformation of an address-of-label expression always
11430 /// rebuilds the expression, so that the label identifier can be resolved to
11431 /// the corresponding label statement by semantic analysis.
11432 template<typename Derived>
11433 ExprResult
11434 TreeTransform<Derived>::TransformAddrLabelExpr(AddrLabelExpr *E) {
11435   Decl *LD = getDerived().TransformDecl(E->getLabel()->getLocation(),
11436                                         E->getLabel());
11437   if (!LD)
11438     return ExprError();
11439 
11440   return getDerived().RebuildAddrLabelExpr(E->getAmpAmpLoc(), E->getLabelLoc(),
11441                                            cast<LabelDecl>(LD));
11442 }
11443 
11444 template<typename Derived>
11445 ExprResult
11446 TreeTransform<Derived>::TransformStmtExpr(StmtExpr *E) {
11447   SemaRef.ActOnStartStmtExpr();
11448   StmtResult SubStmt
11449     = getDerived().TransformCompoundStmt(E->getSubStmt(), true);
11450   if (SubStmt.isInvalid()) {
11451     SemaRef.ActOnStmtExprError();
11452     return ExprError();
11453   }
11454 
11455   unsigned OldDepth = E->getTemplateDepth();
11456   unsigned NewDepth = getDerived().TransformTemplateDepth(OldDepth);
11457 
11458   if (!getDerived().AlwaysRebuild() && OldDepth == NewDepth &&
11459       SubStmt.get() == E->getSubStmt()) {
11460     // Calling this an 'error' is unintuitive, but it does the right thing.
11461     SemaRef.ActOnStmtExprError();
11462     return SemaRef.MaybeBindToTemporary(E);
11463   }
11464 
11465   return getDerived().RebuildStmtExpr(E->getLParenLoc(), SubStmt.get(),
11466                                       E->getRParenLoc(), NewDepth);
11467 }
11468 
11469 template<typename Derived>
11470 ExprResult
11471 TreeTransform<Derived>::TransformChooseExpr(ChooseExpr *E) {
11472   ExprResult Cond = getDerived().TransformExpr(E->getCond());
11473   if (Cond.isInvalid())
11474     return ExprError();
11475 
11476   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
11477   if (LHS.isInvalid())
11478     return ExprError();
11479 
11480   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
11481   if (RHS.isInvalid())
11482     return ExprError();
11483 
11484   if (!getDerived().AlwaysRebuild() &&
11485       Cond.get() == E->getCond() &&
11486       LHS.get() == E->getLHS() &&
11487       RHS.get() == E->getRHS())
11488     return E;
11489 
11490   return getDerived().RebuildChooseExpr(E->getBuiltinLoc(),
11491                                         Cond.get(), LHS.get(), RHS.get(),
11492                                         E->getRParenLoc());
11493 }
11494 
11495 template<typename Derived>
11496 ExprResult
11497 TreeTransform<Derived>::TransformGNUNullExpr(GNUNullExpr *E) {
11498   return E;
11499 }
11500 
11501 template<typename Derived>
11502 ExprResult
11503 TreeTransform<Derived>::TransformCXXOperatorCallExpr(CXXOperatorCallExpr *E) {
11504   switch (E->getOperator()) {
11505   case OO_New:
11506   case OO_Delete:
11507   case OO_Array_New:
11508   case OO_Array_Delete:
11509     llvm_unreachable("new and delete operators cannot use CXXOperatorCallExpr");
11510 
11511   case OO_Subscript:
11512   case OO_Call: {
11513     // This is a call to an object's operator().
11514     assert(E->getNumArgs() >= 1 && "Object call is missing arguments");
11515 
11516     // Transform the object itself.
11517     ExprResult Object = getDerived().TransformExpr(E->getArg(0));
11518     if (Object.isInvalid())
11519       return ExprError();
11520 
11521     // FIXME: Poor location information
11522     SourceLocation FakeLParenLoc = SemaRef.getLocForEndOfToken(
11523         static_cast<Expr *>(Object.get())->getEndLoc());
11524 
11525     // Transform the call arguments.
11526     SmallVector<Expr*, 8> Args;
11527     if (getDerived().TransformExprs(E->getArgs() + 1, E->getNumArgs() - 1, true,
11528                                     Args))
11529       return ExprError();
11530 
11531     if (E->getOperator() == OO_Subscript)
11532       return getDerived().RebuildCxxSubscriptExpr(Object.get(), FakeLParenLoc,
11533                                                   Args, E->getEndLoc());
11534 
11535     return getDerived().RebuildCallExpr(Object.get(), FakeLParenLoc, Args,
11536                                         E->getEndLoc());
11537   }
11538 
11539 #define OVERLOADED_OPERATOR(Name, Spelling, Token, Unary, Binary, MemberOnly)  \
11540   case OO_##Name:                                                              \
11541     break;
11542 
11543 #define OVERLOADED_OPERATOR_MULTI(Name,Spelling,Unary,Binary,MemberOnly)
11544 #include "clang/Basic/OperatorKinds.def"
11545 
11546   case OO_Conditional:
11547     llvm_unreachable("conditional operator is not actually overloadable");
11548 
11549   case OO_None:
11550   case NUM_OVERLOADED_OPERATORS:
11551     llvm_unreachable("not an overloaded operator?");
11552   }
11553 
11554   ExprResult Callee = getDerived().TransformExpr(E->getCallee());
11555   if (Callee.isInvalid())
11556     return ExprError();
11557 
11558   ExprResult First;
11559   if (E->getOperator() == OO_Amp)
11560     First = getDerived().TransformAddressOfOperand(E->getArg(0));
11561   else
11562     First = getDerived().TransformExpr(E->getArg(0));
11563   if (First.isInvalid())
11564     return ExprError();
11565 
11566   ExprResult Second;
11567   if (E->getNumArgs() == 2) {
11568     Second = getDerived().TransformExpr(E->getArg(1));
11569     if (Second.isInvalid())
11570       return ExprError();
11571   }
11572 
11573   if (!getDerived().AlwaysRebuild() &&
11574       Callee.get() == E->getCallee() &&
11575       First.get() == E->getArg(0) &&
11576       (E->getNumArgs() != 2 || Second.get() == E->getArg(1)))
11577     return SemaRef.MaybeBindToTemporary(E);
11578 
11579   Sema::FPFeaturesStateRAII FPFeaturesState(getSema());
11580   FPOptionsOverride NewOverrides(E->getFPFeatures());
11581   getSema().CurFPFeatures =
11582       NewOverrides.applyOverrides(getSema().getLangOpts());
11583   getSema().FpPragmaStack.CurrentValue = NewOverrides;
11584 
11585   return getDerived().RebuildCXXOperatorCallExpr(E->getOperator(),
11586                                                  E->getOperatorLoc(),
11587                                                  Callee.get(),
11588                                                  First.get(),
11589                                                  Second.get());
11590 }
11591 
11592 template<typename Derived>
11593 ExprResult
11594 TreeTransform<Derived>::TransformCXXMemberCallExpr(CXXMemberCallExpr *E) {
11595   return getDerived().TransformCallExpr(E);
11596 }
11597 
11598 template <typename Derived>
11599 ExprResult TreeTransform<Derived>::TransformSourceLocExpr(SourceLocExpr *E) {
11600   bool NeedRebuildFunc = E->getIdentKind() == SourceLocExpr::Function &&
11601                          getSema().CurContext != E->getParentContext();
11602 
11603   if (!getDerived().AlwaysRebuild() && !NeedRebuildFunc)
11604     return E;
11605 
11606   return getDerived().RebuildSourceLocExpr(E->getIdentKind(), E->getBeginLoc(),
11607                                            E->getEndLoc(),
11608                                            getSema().CurContext);
11609 }
11610 
11611 template<typename Derived>
11612 ExprResult
11613 TreeTransform<Derived>::TransformCUDAKernelCallExpr(CUDAKernelCallExpr *E) {
11614   // Transform the callee.
11615   ExprResult Callee = getDerived().TransformExpr(E->getCallee());
11616   if (Callee.isInvalid())
11617     return ExprError();
11618 
11619   // Transform exec config.
11620   ExprResult EC = getDerived().TransformCallExpr(E->getConfig());
11621   if (EC.isInvalid())
11622     return ExprError();
11623 
11624   // Transform arguments.
11625   bool ArgChanged = false;
11626   SmallVector<Expr*, 8> Args;
11627   if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
11628                                   &ArgChanged))
11629     return ExprError();
11630 
11631   if (!getDerived().AlwaysRebuild() &&
11632       Callee.get() == E->getCallee() &&
11633       !ArgChanged)
11634     return SemaRef.MaybeBindToTemporary(E);
11635 
11636   // FIXME: Wrong source location information for the '('.
11637   SourceLocation FakeLParenLoc
11638     = ((Expr *)Callee.get())->getSourceRange().getBegin();
11639   return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc,
11640                                       Args,
11641                                       E->getRParenLoc(), EC.get());
11642 }
11643 
11644 template<typename Derived>
11645 ExprResult
11646 TreeTransform<Derived>::TransformCXXNamedCastExpr(CXXNamedCastExpr *E) {
11647   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten());
11648   if (!Type)
11649     return ExprError();
11650 
11651   ExprResult SubExpr
11652     = getDerived().TransformExpr(E->getSubExprAsWritten());
11653   if (SubExpr.isInvalid())
11654     return ExprError();
11655 
11656   if (!getDerived().AlwaysRebuild() &&
11657       Type == E->getTypeInfoAsWritten() &&
11658       SubExpr.get() == E->getSubExpr())
11659     return E;
11660   return getDerived().RebuildCXXNamedCastExpr(
11661       E->getOperatorLoc(), E->getStmtClass(), E->getAngleBrackets().getBegin(),
11662       Type, E->getAngleBrackets().getEnd(),
11663       // FIXME. this should be '(' location
11664       E->getAngleBrackets().getEnd(), SubExpr.get(), E->getRParenLoc());
11665 }
11666 
11667 template<typename Derived>
11668 ExprResult
11669 TreeTransform<Derived>::TransformBuiltinBitCastExpr(BuiltinBitCastExpr *BCE) {
11670   TypeSourceInfo *TSI =
11671       getDerived().TransformType(BCE->getTypeInfoAsWritten());
11672   if (!TSI)
11673     return ExprError();
11674 
11675   ExprResult Sub = getDerived().TransformExpr(BCE->getSubExpr());
11676   if (Sub.isInvalid())
11677     return ExprError();
11678 
11679   return getDerived().RebuildBuiltinBitCastExpr(BCE->getBeginLoc(), TSI,
11680                                                 Sub.get(), BCE->getEndLoc());
11681 }
11682 
11683 template<typename Derived>
11684 ExprResult
11685 TreeTransform<Derived>::TransformCXXStaticCastExpr(CXXStaticCastExpr *E) {
11686   return getDerived().TransformCXXNamedCastExpr(E);
11687 }
11688 
11689 template<typename Derived>
11690 ExprResult
11691 TreeTransform<Derived>::TransformCXXDynamicCastExpr(CXXDynamicCastExpr *E) {
11692   return getDerived().TransformCXXNamedCastExpr(E);
11693 }
11694 
11695 template<typename Derived>
11696 ExprResult
11697 TreeTransform<Derived>::TransformCXXReinterpretCastExpr(
11698                                                       CXXReinterpretCastExpr *E) {
11699   return getDerived().TransformCXXNamedCastExpr(E);
11700 }
11701 
11702 template<typename Derived>
11703 ExprResult
11704 TreeTransform<Derived>::TransformCXXConstCastExpr(CXXConstCastExpr *E) {
11705   return getDerived().TransformCXXNamedCastExpr(E);
11706 }
11707 
11708 template<typename Derived>
11709 ExprResult
11710 TreeTransform<Derived>::TransformCXXAddrspaceCastExpr(CXXAddrspaceCastExpr *E) {
11711   return getDerived().TransformCXXNamedCastExpr(E);
11712 }
11713 
11714 template<typename Derived>
11715 ExprResult
11716 TreeTransform<Derived>::TransformCXXFunctionalCastExpr(
11717                                                      CXXFunctionalCastExpr *E) {
11718   TypeSourceInfo *Type =
11719       getDerived().TransformTypeWithDeducedTST(E->getTypeInfoAsWritten());
11720   if (!Type)
11721     return ExprError();
11722 
11723   ExprResult SubExpr
11724     = getDerived().TransformExpr(E->getSubExprAsWritten());
11725   if (SubExpr.isInvalid())
11726     return ExprError();
11727 
11728   if (!getDerived().AlwaysRebuild() &&
11729       Type == E->getTypeInfoAsWritten() &&
11730       SubExpr.get() == E->getSubExpr())
11731     return E;
11732 
11733   return getDerived().RebuildCXXFunctionalCastExpr(Type,
11734                                                    E->getLParenLoc(),
11735                                                    SubExpr.get(),
11736                                                    E->getRParenLoc(),
11737                                                    E->isListInitialization());
11738 }
11739 
11740 template<typename Derived>
11741 ExprResult
11742 TreeTransform<Derived>::TransformCXXTypeidExpr(CXXTypeidExpr *E) {
11743   if (E->isTypeOperand()) {
11744     TypeSourceInfo *TInfo
11745       = getDerived().TransformType(E->getTypeOperandSourceInfo());
11746     if (!TInfo)
11747       return ExprError();
11748 
11749     if (!getDerived().AlwaysRebuild() &&
11750         TInfo == E->getTypeOperandSourceInfo())
11751       return E;
11752 
11753     return getDerived().RebuildCXXTypeidExpr(E->getType(), E->getBeginLoc(),
11754                                              TInfo, E->getEndLoc());
11755   }
11756 
11757   // Typeid's operand is an unevaluated context, unless it's a polymorphic
11758   // type.  We must not unilaterally enter unevaluated context here, as then
11759   // semantic processing can re-transform an already transformed operand.
11760   Expr *Op = E->getExprOperand();
11761   auto EvalCtx = Sema::ExpressionEvaluationContext::Unevaluated;
11762   if (E->isGLValue())
11763     if (auto *RecordT = Op->getType()->getAs<RecordType>())
11764       if (cast<CXXRecordDecl>(RecordT->getDecl())->isPolymorphic())
11765         EvalCtx = SemaRef.ExprEvalContexts.back().Context;
11766 
11767   EnterExpressionEvaluationContext Unevaluated(SemaRef, EvalCtx,
11768                                                Sema::ReuseLambdaContextDecl);
11769 
11770   ExprResult SubExpr = getDerived().TransformExpr(Op);
11771   if (SubExpr.isInvalid())
11772     return ExprError();
11773 
11774   if (!getDerived().AlwaysRebuild() &&
11775       SubExpr.get() == E->getExprOperand())
11776     return E;
11777 
11778   return getDerived().RebuildCXXTypeidExpr(E->getType(), E->getBeginLoc(),
11779                                            SubExpr.get(), E->getEndLoc());
11780 }
11781 
11782 template<typename Derived>
11783 ExprResult
11784 TreeTransform<Derived>::TransformCXXUuidofExpr(CXXUuidofExpr *E) {
11785   if (E->isTypeOperand()) {
11786     TypeSourceInfo *TInfo
11787       = getDerived().TransformType(E->getTypeOperandSourceInfo());
11788     if (!TInfo)
11789       return ExprError();
11790 
11791     if (!getDerived().AlwaysRebuild() &&
11792         TInfo == E->getTypeOperandSourceInfo())
11793       return E;
11794 
11795     return getDerived().RebuildCXXUuidofExpr(E->getType(), E->getBeginLoc(),
11796                                              TInfo, E->getEndLoc());
11797   }
11798 
11799   EnterExpressionEvaluationContext Unevaluated(
11800       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
11801 
11802   ExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand());
11803   if (SubExpr.isInvalid())
11804     return ExprError();
11805 
11806   if (!getDerived().AlwaysRebuild() &&
11807       SubExpr.get() == E->getExprOperand())
11808     return E;
11809 
11810   return getDerived().RebuildCXXUuidofExpr(E->getType(), E->getBeginLoc(),
11811                                            SubExpr.get(), E->getEndLoc());
11812 }
11813 
11814 template<typename Derived>
11815 ExprResult
11816 TreeTransform<Derived>::TransformCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) {
11817   return E;
11818 }
11819 
11820 template<typename Derived>
11821 ExprResult
11822 TreeTransform<Derived>::TransformCXXNullPtrLiteralExpr(
11823                                                      CXXNullPtrLiteralExpr *E) {
11824   return E;
11825 }
11826 
11827 template<typename Derived>
11828 ExprResult
11829 TreeTransform<Derived>::TransformCXXThisExpr(CXXThisExpr *E) {
11830   QualType T = getSema().getCurrentThisType();
11831 
11832   if (!getDerived().AlwaysRebuild() && T == E->getType()) {
11833     // Mark it referenced in the new context regardless.
11834     // FIXME: this is a bit instantiation-specific.
11835     getSema().MarkThisReferenced(E);
11836     return E;
11837   }
11838 
11839   return getDerived().RebuildCXXThisExpr(E->getBeginLoc(), T, E->isImplicit());
11840 }
11841 
11842 template<typename Derived>
11843 ExprResult
11844 TreeTransform<Derived>::TransformCXXThrowExpr(CXXThrowExpr *E) {
11845   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
11846   if (SubExpr.isInvalid())
11847     return ExprError();
11848 
11849   if (!getDerived().AlwaysRebuild() &&
11850       SubExpr.get() == E->getSubExpr())
11851     return E;
11852 
11853   return getDerived().RebuildCXXThrowExpr(E->getThrowLoc(), SubExpr.get(),
11854                                           E->isThrownVariableInScope());
11855 }
11856 
11857 template<typename Derived>
11858 ExprResult
11859 TreeTransform<Derived>::TransformCXXDefaultArgExpr(CXXDefaultArgExpr *E) {
11860   ParmVarDecl *Param = cast_or_null<ParmVarDecl>(
11861       getDerived().TransformDecl(E->getBeginLoc(), E->getParam()));
11862   if (!Param)
11863     return ExprError();
11864 
11865   if (!getDerived().AlwaysRebuild() && Param == E->getParam() &&
11866       E->getUsedContext() == SemaRef.CurContext)
11867     return E;
11868 
11869   return getDerived().RebuildCXXDefaultArgExpr(E->getUsedLocation(), Param);
11870 }
11871 
11872 template<typename Derived>
11873 ExprResult
11874 TreeTransform<Derived>::TransformCXXDefaultInitExpr(CXXDefaultInitExpr *E) {
11875   FieldDecl *Field = cast_or_null<FieldDecl>(
11876       getDerived().TransformDecl(E->getBeginLoc(), E->getField()));
11877   if (!Field)
11878     return ExprError();
11879 
11880   if (!getDerived().AlwaysRebuild() && Field == E->getField() &&
11881       E->getUsedContext() == SemaRef.CurContext)
11882     return E;
11883 
11884   return getDerived().RebuildCXXDefaultInitExpr(E->getExprLoc(), Field);
11885 }
11886 
11887 template<typename Derived>
11888 ExprResult
11889 TreeTransform<Derived>::TransformCXXScalarValueInitExpr(
11890                                                     CXXScalarValueInitExpr *E) {
11891   TypeSourceInfo *T = getDerived().TransformType(E->getTypeSourceInfo());
11892   if (!T)
11893     return ExprError();
11894 
11895   if (!getDerived().AlwaysRebuild() &&
11896       T == E->getTypeSourceInfo())
11897     return E;
11898 
11899   return getDerived().RebuildCXXScalarValueInitExpr(T,
11900                                           /*FIXME:*/T->getTypeLoc().getEndLoc(),
11901                                                     E->getRParenLoc());
11902 }
11903 
11904 template<typename Derived>
11905 ExprResult
11906 TreeTransform<Derived>::TransformCXXNewExpr(CXXNewExpr *E) {
11907   // Transform the type that we're allocating
11908   TypeSourceInfo *AllocTypeInfo =
11909       getDerived().TransformTypeWithDeducedTST(E->getAllocatedTypeSourceInfo());
11910   if (!AllocTypeInfo)
11911     return ExprError();
11912 
11913   // Transform the size of the array we're allocating (if any).
11914   Optional<Expr *> ArraySize;
11915   if (Optional<Expr *> OldArraySize = E->getArraySize()) {
11916     ExprResult NewArraySize;
11917     if (*OldArraySize) {
11918       NewArraySize = getDerived().TransformExpr(*OldArraySize);
11919       if (NewArraySize.isInvalid())
11920         return ExprError();
11921     }
11922     ArraySize = NewArraySize.get();
11923   }
11924 
11925   // Transform the placement arguments (if any).
11926   bool ArgumentChanged = false;
11927   SmallVector<Expr*, 8> PlacementArgs;
11928   if (getDerived().TransformExprs(E->getPlacementArgs(),
11929                                   E->getNumPlacementArgs(), true,
11930                                   PlacementArgs, &ArgumentChanged))
11931     return ExprError();
11932 
11933   // Transform the initializer (if any).
11934   Expr *OldInit = E->getInitializer();
11935   ExprResult NewInit;
11936   if (OldInit)
11937     NewInit = getDerived().TransformInitializer(OldInit, true);
11938   if (NewInit.isInvalid())
11939     return ExprError();
11940 
11941   // Transform new operator and delete operator.
11942   FunctionDecl *OperatorNew = nullptr;
11943   if (E->getOperatorNew()) {
11944     OperatorNew = cast_or_null<FunctionDecl>(
11945         getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorNew()));
11946     if (!OperatorNew)
11947       return ExprError();
11948   }
11949 
11950   FunctionDecl *OperatorDelete = nullptr;
11951   if (E->getOperatorDelete()) {
11952     OperatorDelete = cast_or_null<FunctionDecl>(
11953         getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorDelete()));
11954     if (!OperatorDelete)
11955       return ExprError();
11956   }
11957 
11958   if (!getDerived().AlwaysRebuild() &&
11959       AllocTypeInfo == E->getAllocatedTypeSourceInfo() &&
11960       ArraySize == E->getArraySize() &&
11961       NewInit.get() == OldInit &&
11962       OperatorNew == E->getOperatorNew() &&
11963       OperatorDelete == E->getOperatorDelete() &&
11964       !ArgumentChanged) {
11965     // Mark any declarations we need as referenced.
11966     // FIXME: instantiation-specific.
11967     if (OperatorNew)
11968       SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorNew);
11969     if (OperatorDelete)
11970       SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorDelete);
11971 
11972     if (E->isArray() && !E->getAllocatedType()->isDependentType()) {
11973       QualType ElementType
11974         = SemaRef.Context.getBaseElementType(E->getAllocatedType());
11975       if (const RecordType *RecordT = ElementType->getAs<RecordType>()) {
11976         CXXRecordDecl *Record = cast<CXXRecordDecl>(RecordT->getDecl());
11977         if (CXXDestructorDecl *Destructor = SemaRef.LookupDestructor(Record)) {
11978           SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Destructor);
11979         }
11980       }
11981     }
11982 
11983     return E;
11984   }
11985 
11986   QualType AllocType = AllocTypeInfo->getType();
11987   if (!ArraySize) {
11988     // If no array size was specified, but the new expression was
11989     // instantiated with an array type (e.g., "new T" where T is
11990     // instantiated with "int[4]"), extract the outer bound from the
11991     // array type as our array size. We do this with constant and
11992     // dependently-sized array types.
11993     const ArrayType *ArrayT = SemaRef.Context.getAsArrayType(AllocType);
11994     if (!ArrayT) {
11995       // Do nothing
11996     } else if (const ConstantArrayType *ConsArrayT
11997                                      = dyn_cast<ConstantArrayType>(ArrayT)) {
11998       ArraySize = IntegerLiteral::Create(SemaRef.Context, ConsArrayT->getSize(),
11999                                          SemaRef.Context.getSizeType(),
12000                                          /*FIXME:*/ E->getBeginLoc());
12001       AllocType = ConsArrayT->getElementType();
12002     } else if (const DependentSizedArrayType *DepArrayT
12003                               = dyn_cast<DependentSizedArrayType>(ArrayT)) {
12004       if (DepArrayT->getSizeExpr()) {
12005         ArraySize = DepArrayT->getSizeExpr();
12006         AllocType = DepArrayT->getElementType();
12007       }
12008     }
12009   }
12010 
12011   return getDerived().RebuildCXXNewExpr(
12012       E->getBeginLoc(), E->isGlobalNew(),
12013       /*FIXME:*/ E->getBeginLoc(), PlacementArgs,
12014       /*FIXME:*/ E->getBeginLoc(), E->getTypeIdParens(), AllocType,
12015       AllocTypeInfo, ArraySize, E->getDirectInitRange(), NewInit.get());
12016 }
12017 
12018 template<typename Derived>
12019 ExprResult
12020 TreeTransform<Derived>::TransformCXXDeleteExpr(CXXDeleteExpr *E) {
12021   ExprResult Operand = getDerived().TransformExpr(E->getArgument());
12022   if (Operand.isInvalid())
12023     return ExprError();
12024 
12025   // Transform the delete operator, if known.
12026   FunctionDecl *OperatorDelete = nullptr;
12027   if (E->getOperatorDelete()) {
12028     OperatorDelete = cast_or_null<FunctionDecl>(
12029         getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorDelete()));
12030     if (!OperatorDelete)
12031       return ExprError();
12032   }
12033 
12034   if (!getDerived().AlwaysRebuild() &&
12035       Operand.get() == E->getArgument() &&
12036       OperatorDelete == E->getOperatorDelete()) {
12037     // Mark any declarations we need as referenced.
12038     // FIXME: instantiation-specific.
12039     if (OperatorDelete)
12040       SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorDelete);
12041 
12042     if (!E->getArgument()->isTypeDependent()) {
12043       QualType Destroyed = SemaRef.Context.getBaseElementType(
12044                                                          E->getDestroyedType());
12045       if (const RecordType *DestroyedRec = Destroyed->getAs<RecordType>()) {
12046         CXXRecordDecl *Record = cast<CXXRecordDecl>(DestroyedRec->getDecl());
12047         SemaRef.MarkFunctionReferenced(E->getBeginLoc(),
12048                                        SemaRef.LookupDestructor(Record));
12049       }
12050     }
12051 
12052     return E;
12053   }
12054 
12055   return getDerived().RebuildCXXDeleteExpr(
12056       E->getBeginLoc(), E->isGlobalDelete(), E->isArrayForm(), Operand.get());
12057 }
12058 
12059 template<typename Derived>
12060 ExprResult
12061 TreeTransform<Derived>::TransformCXXPseudoDestructorExpr(
12062                                                      CXXPseudoDestructorExpr *E) {
12063   ExprResult Base = getDerived().TransformExpr(E->getBase());
12064   if (Base.isInvalid())
12065     return ExprError();
12066 
12067   ParsedType ObjectTypePtr;
12068   bool MayBePseudoDestructor = false;
12069   Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(),
12070                                               E->getOperatorLoc(),
12071                                         E->isArrow()? tok::arrow : tok::period,
12072                                               ObjectTypePtr,
12073                                               MayBePseudoDestructor);
12074   if (Base.isInvalid())
12075     return ExprError();
12076 
12077   QualType ObjectType = ObjectTypePtr.get();
12078   NestedNameSpecifierLoc QualifierLoc = E->getQualifierLoc();
12079   if (QualifierLoc) {
12080     QualifierLoc
12081       = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc, ObjectType);
12082     if (!QualifierLoc)
12083       return ExprError();
12084   }
12085   CXXScopeSpec SS;
12086   SS.Adopt(QualifierLoc);
12087 
12088   PseudoDestructorTypeStorage Destroyed;
12089   if (E->getDestroyedTypeInfo()) {
12090     TypeSourceInfo *DestroyedTypeInfo
12091       = getDerived().TransformTypeInObjectScope(E->getDestroyedTypeInfo(),
12092                                                 ObjectType, nullptr, SS);
12093     if (!DestroyedTypeInfo)
12094       return ExprError();
12095     Destroyed = DestroyedTypeInfo;
12096   } else if (!ObjectType.isNull() && ObjectType->isDependentType()) {
12097     // We aren't likely to be able to resolve the identifier down to a type
12098     // now anyway, so just retain the identifier.
12099     Destroyed = PseudoDestructorTypeStorage(E->getDestroyedTypeIdentifier(),
12100                                             E->getDestroyedTypeLoc());
12101   } else {
12102     // Look for a destructor known with the given name.
12103     ParsedType T = SemaRef.getDestructorName(E->getTildeLoc(),
12104                                               *E->getDestroyedTypeIdentifier(),
12105                                                 E->getDestroyedTypeLoc(),
12106                                                 /*Scope=*/nullptr,
12107                                                 SS, ObjectTypePtr,
12108                                                 false);
12109     if (!T)
12110       return ExprError();
12111 
12112     Destroyed
12113       = SemaRef.Context.getTrivialTypeSourceInfo(SemaRef.GetTypeFromParser(T),
12114                                                  E->getDestroyedTypeLoc());
12115   }
12116 
12117   TypeSourceInfo *ScopeTypeInfo = nullptr;
12118   if (E->getScopeTypeInfo()) {
12119     CXXScopeSpec EmptySS;
12120     ScopeTypeInfo = getDerived().TransformTypeInObjectScope(
12121                       E->getScopeTypeInfo(), ObjectType, nullptr, EmptySS);
12122     if (!ScopeTypeInfo)
12123       return ExprError();
12124   }
12125 
12126   return getDerived().RebuildCXXPseudoDestructorExpr(Base.get(),
12127                                                      E->getOperatorLoc(),
12128                                                      E->isArrow(),
12129                                                      SS,
12130                                                      ScopeTypeInfo,
12131                                                      E->getColonColonLoc(),
12132                                                      E->getTildeLoc(),
12133                                                      Destroyed);
12134 }
12135 
12136 template <typename Derived>
12137 bool TreeTransform<Derived>::TransformOverloadExprDecls(OverloadExpr *Old,
12138                                                         bool RequiresADL,
12139                                                         LookupResult &R) {
12140   // Transform all the decls.
12141   bool AllEmptyPacks = true;
12142   for (auto *OldD : Old->decls()) {
12143     Decl *InstD = getDerived().TransformDecl(Old->getNameLoc(), OldD);
12144     if (!InstD) {
12145       // Silently ignore these if a UsingShadowDecl instantiated to nothing.
12146       // This can happen because of dependent hiding.
12147       if (isa<UsingShadowDecl>(OldD))
12148         continue;
12149       else {
12150         R.clear();
12151         return true;
12152       }
12153     }
12154 
12155     // Expand using pack declarations.
12156     NamedDecl *SingleDecl = cast<NamedDecl>(InstD);
12157     ArrayRef<NamedDecl*> Decls = SingleDecl;
12158     if (auto *UPD = dyn_cast<UsingPackDecl>(InstD))
12159       Decls = UPD->expansions();
12160 
12161     // Expand using declarations.
12162     for (auto *D : Decls) {
12163       if (auto *UD = dyn_cast<UsingDecl>(D)) {
12164         for (auto *SD : UD->shadows())
12165           R.addDecl(SD);
12166       } else {
12167         R.addDecl(D);
12168       }
12169     }
12170 
12171     AllEmptyPacks &= Decls.empty();
12172   };
12173 
12174   // C++ [temp.res]/8.4.2:
12175   //   The program is ill-formed, no diagnostic required, if [...] lookup for
12176   //   a name in the template definition found a using-declaration, but the
12177   //   lookup in the corresponding scope in the instantiation odoes not find
12178   //   any declarations because the using-declaration was a pack expansion and
12179   //   the corresponding pack is empty
12180   if (AllEmptyPacks && !RequiresADL) {
12181     getSema().Diag(Old->getNameLoc(), diag::err_using_pack_expansion_empty)
12182         << isa<UnresolvedMemberExpr>(Old) << Old->getName();
12183     return true;
12184   }
12185 
12186   // Resolve a kind, but don't do any further analysis.  If it's
12187   // ambiguous, the callee needs to deal with it.
12188   R.resolveKind();
12189   return false;
12190 }
12191 
12192 template<typename Derived>
12193 ExprResult
12194 TreeTransform<Derived>::TransformUnresolvedLookupExpr(
12195                                                   UnresolvedLookupExpr *Old) {
12196   LookupResult R(SemaRef, Old->getName(), Old->getNameLoc(),
12197                  Sema::LookupOrdinaryName);
12198 
12199   // Transform the declaration set.
12200   if (TransformOverloadExprDecls(Old, Old->requiresADL(), R))
12201     return ExprError();
12202 
12203   // Rebuild the nested-name qualifier, if present.
12204   CXXScopeSpec SS;
12205   if (Old->getQualifierLoc()) {
12206     NestedNameSpecifierLoc QualifierLoc
12207       = getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc());
12208     if (!QualifierLoc)
12209       return ExprError();
12210 
12211     SS.Adopt(QualifierLoc);
12212   }
12213 
12214   if (Old->getNamingClass()) {
12215     CXXRecordDecl *NamingClass
12216       = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl(
12217                                                             Old->getNameLoc(),
12218                                                         Old->getNamingClass()));
12219     if (!NamingClass) {
12220       R.clear();
12221       return ExprError();
12222     }
12223 
12224     R.setNamingClass(NamingClass);
12225   }
12226 
12227   SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc();
12228 
12229   // If we have neither explicit template arguments, nor the template keyword,
12230   // it's a normal declaration name or member reference.
12231   if (!Old->hasExplicitTemplateArgs() && !TemplateKWLoc.isValid()) {
12232     NamedDecl *D = R.getAsSingle<NamedDecl>();
12233     // In a C++11 unevaluated context, an UnresolvedLookupExpr might refer to an
12234     // instance member. In other contexts, BuildPossibleImplicitMemberExpr will
12235     // give a good diagnostic.
12236     if (D && D->isCXXInstanceMember()) {
12237       return SemaRef.BuildPossibleImplicitMemberExpr(SS, TemplateKWLoc, R,
12238                                                      /*TemplateArgs=*/nullptr,
12239                                                      /*Scope=*/nullptr);
12240     }
12241 
12242     return getDerived().RebuildDeclarationNameExpr(SS, R, Old->requiresADL());
12243   }
12244 
12245   // If we have template arguments, rebuild them, then rebuild the
12246   // templateid expression.
12247   TemplateArgumentListInfo TransArgs(Old->getLAngleLoc(), Old->getRAngleLoc());
12248   if (Old->hasExplicitTemplateArgs() &&
12249       getDerived().TransformTemplateArguments(Old->getTemplateArgs(),
12250                                               Old->getNumTemplateArgs(),
12251                                               TransArgs)) {
12252     R.clear();
12253     return ExprError();
12254   }
12255 
12256   return getDerived().RebuildTemplateIdExpr(SS, TemplateKWLoc, R,
12257                                             Old->requiresADL(), &TransArgs);
12258 }
12259 
12260 template<typename Derived>
12261 ExprResult
12262 TreeTransform<Derived>::TransformTypeTraitExpr(TypeTraitExpr *E) {
12263   bool ArgChanged = false;
12264   SmallVector<TypeSourceInfo *, 4> Args;
12265   for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) {
12266     TypeSourceInfo *From = E->getArg(I);
12267     TypeLoc FromTL = From->getTypeLoc();
12268     if (!FromTL.getAs<PackExpansionTypeLoc>()) {
12269       TypeLocBuilder TLB;
12270       TLB.reserve(FromTL.getFullDataSize());
12271       QualType To = getDerived().TransformType(TLB, FromTL);
12272       if (To.isNull())
12273         return ExprError();
12274 
12275       if (To == From->getType())
12276         Args.push_back(From);
12277       else {
12278         Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
12279         ArgChanged = true;
12280       }
12281       continue;
12282     }
12283 
12284     ArgChanged = true;
12285 
12286     // We have a pack expansion. Instantiate it.
12287     PackExpansionTypeLoc ExpansionTL = FromTL.castAs<PackExpansionTypeLoc>();
12288     TypeLoc PatternTL = ExpansionTL.getPatternLoc();
12289     SmallVector<UnexpandedParameterPack, 2> Unexpanded;
12290     SemaRef.collectUnexpandedParameterPacks(PatternTL, Unexpanded);
12291 
12292     // Determine whether the set of unexpanded parameter packs can and should
12293     // be expanded.
12294     bool Expand = true;
12295     bool RetainExpansion = false;
12296     Optional<unsigned> OrigNumExpansions =
12297         ExpansionTL.getTypePtr()->getNumExpansions();
12298     Optional<unsigned> NumExpansions = OrigNumExpansions;
12299     if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(),
12300                                              PatternTL.getSourceRange(),
12301                                              Unexpanded,
12302                                              Expand, RetainExpansion,
12303                                              NumExpansions))
12304       return ExprError();
12305 
12306     if (!Expand) {
12307       // The transform has determined that we should perform a simple
12308       // transformation on the pack expansion, producing another pack
12309       // expansion.
12310       Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
12311 
12312       TypeLocBuilder TLB;
12313       TLB.reserve(From->getTypeLoc().getFullDataSize());
12314 
12315       QualType To = getDerived().TransformType(TLB, PatternTL);
12316       if (To.isNull())
12317         return ExprError();
12318 
12319       To = getDerived().RebuildPackExpansionType(To,
12320                                                  PatternTL.getSourceRange(),
12321                                                  ExpansionTL.getEllipsisLoc(),
12322                                                  NumExpansions);
12323       if (To.isNull())
12324         return ExprError();
12325 
12326       PackExpansionTypeLoc ToExpansionTL
12327         = TLB.push<PackExpansionTypeLoc>(To);
12328       ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc());
12329       Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
12330       continue;
12331     }
12332 
12333     // Expand the pack expansion by substituting for each argument in the
12334     // pack(s).
12335     for (unsigned I = 0; I != *NumExpansions; ++I) {
12336       Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(SemaRef, I);
12337       TypeLocBuilder TLB;
12338       TLB.reserve(PatternTL.getFullDataSize());
12339       QualType To = getDerived().TransformType(TLB, PatternTL);
12340       if (To.isNull())
12341         return ExprError();
12342 
12343       if (To->containsUnexpandedParameterPack()) {
12344         To = getDerived().RebuildPackExpansionType(To,
12345                                                    PatternTL.getSourceRange(),
12346                                                    ExpansionTL.getEllipsisLoc(),
12347                                                    NumExpansions);
12348         if (To.isNull())
12349           return ExprError();
12350 
12351         PackExpansionTypeLoc ToExpansionTL
12352           = TLB.push<PackExpansionTypeLoc>(To);
12353         ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc());
12354       }
12355 
12356       Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
12357     }
12358 
12359     if (!RetainExpansion)
12360       continue;
12361 
12362     // If we're supposed to retain a pack expansion, do so by temporarily
12363     // forgetting the partially-substituted parameter pack.
12364     ForgetPartiallySubstitutedPackRAII Forget(getDerived());
12365 
12366     TypeLocBuilder TLB;
12367     TLB.reserve(From->getTypeLoc().getFullDataSize());
12368 
12369     QualType To = getDerived().TransformType(TLB, PatternTL);
12370     if (To.isNull())
12371       return ExprError();
12372 
12373     To = getDerived().RebuildPackExpansionType(To,
12374                                                PatternTL.getSourceRange(),
12375                                                ExpansionTL.getEllipsisLoc(),
12376                                                NumExpansions);
12377     if (To.isNull())
12378       return ExprError();
12379 
12380     PackExpansionTypeLoc ToExpansionTL
12381       = TLB.push<PackExpansionTypeLoc>(To);
12382     ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc());
12383     Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
12384   }
12385 
12386   if (!getDerived().AlwaysRebuild() && !ArgChanged)
12387     return E;
12388 
12389   return getDerived().RebuildTypeTrait(E->getTrait(), E->getBeginLoc(), Args,
12390                                        E->getEndLoc());
12391 }
12392 
12393 template<typename Derived>
12394 ExprResult
12395 TreeTransform<Derived>::TransformConceptSpecializationExpr(
12396                                                  ConceptSpecializationExpr *E) {
12397   const ASTTemplateArgumentListInfo *Old = E->getTemplateArgsAsWritten();
12398   TemplateArgumentListInfo TransArgs(Old->LAngleLoc, Old->RAngleLoc);
12399   if (getDerived().TransformTemplateArguments(Old->getTemplateArgs(),
12400                                               Old->NumTemplateArgs, TransArgs))
12401     return ExprError();
12402 
12403   return getDerived().RebuildConceptSpecializationExpr(
12404       E->getNestedNameSpecifierLoc(), E->getTemplateKWLoc(),
12405       E->getConceptNameInfo(), E->getFoundDecl(), E->getNamedConcept(),
12406       &TransArgs);
12407 }
12408 
12409 template<typename Derived>
12410 ExprResult
12411 TreeTransform<Derived>::TransformRequiresExpr(RequiresExpr *E) {
12412   SmallVector<ParmVarDecl*, 4> TransParams;
12413   SmallVector<QualType, 4> TransParamTypes;
12414   Sema::ExtParameterInfoBuilder ExtParamInfos;
12415 
12416   // C++2a [expr.prim.req]p2
12417   // Expressions appearing within a requirement-body are unevaluated operands.
12418   EnterExpressionEvaluationContext Ctx(
12419       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
12420 
12421   RequiresExprBodyDecl *Body = RequiresExprBodyDecl::Create(
12422       getSema().Context, getSema().CurContext,
12423       E->getBody()->getBeginLoc());
12424 
12425   Sema::ContextRAII SavedContext(getSema(), Body, /*NewThisContext*/false);
12426 
12427   if (getDerived().TransformFunctionTypeParams(E->getRequiresKWLoc(),
12428                                                E->getLocalParameters(),
12429                                                /*ParamTypes=*/nullptr,
12430                                                /*ParamInfos=*/nullptr,
12431                                                TransParamTypes, &TransParams,
12432                                                ExtParamInfos))
12433     return ExprError();
12434 
12435   for (ParmVarDecl *Param : TransParams)
12436     Param->setDeclContext(Body);
12437 
12438   SmallVector<concepts::Requirement *, 4> TransReqs;
12439   if (getDerived().TransformRequiresExprRequirements(E->getRequirements(),
12440                                                      TransReqs))
12441     return ExprError();
12442 
12443   for (concepts::Requirement *Req : TransReqs) {
12444     if (auto *ER = dyn_cast<concepts::ExprRequirement>(Req)) {
12445       if (ER->getReturnTypeRequirement().isTypeConstraint()) {
12446         ER->getReturnTypeRequirement()
12447                 .getTypeConstraintTemplateParameterList()->getParam(0)
12448                 ->setDeclContext(Body);
12449       }
12450     }
12451   }
12452 
12453   return getDerived().RebuildRequiresExpr(E->getRequiresKWLoc(), Body,
12454                                           TransParams, TransReqs,
12455                                           E->getRBraceLoc());
12456 }
12457 
12458 template<typename Derived>
12459 bool TreeTransform<Derived>::TransformRequiresExprRequirements(
12460     ArrayRef<concepts::Requirement *> Reqs,
12461     SmallVectorImpl<concepts::Requirement *> &Transformed) {
12462   for (concepts::Requirement *Req : Reqs) {
12463     concepts::Requirement *TransReq = nullptr;
12464     if (auto *TypeReq = dyn_cast<concepts::TypeRequirement>(Req))
12465       TransReq = getDerived().TransformTypeRequirement(TypeReq);
12466     else if (auto *ExprReq = dyn_cast<concepts::ExprRequirement>(Req))
12467       TransReq = getDerived().TransformExprRequirement(ExprReq);
12468     else
12469       TransReq = getDerived().TransformNestedRequirement(
12470                      cast<concepts::NestedRequirement>(Req));
12471     if (!TransReq)
12472       return true;
12473     Transformed.push_back(TransReq);
12474   }
12475   return false;
12476 }
12477 
12478 template<typename Derived>
12479 concepts::TypeRequirement *
12480 TreeTransform<Derived>::TransformTypeRequirement(
12481     concepts::TypeRequirement *Req) {
12482   if (Req->isSubstitutionFailure()) {
12483     if (getDerived().AlwaysRebuild())
12484       return getDerived().RebuildTypeRequirement(
12485               Req->getSubstitutionDiagnostic());
12486     return Req;
12487   }
12488   TypeSourceInfo *TransType = getDerived().TransformType(Req->getType());
12489   if (!TransType)
12490     return nullptr;
12491   return getDerived().RebuildTypeRequirement(TransType);
12492 }
12493 
12494 template<typename Derived>
12495 concepts::ExprRequirement *
12496 TreeTransform<Derived>::TransformExprRequirement(concepts::ExprRequirement *Req) {
12497   llvm::PointerUnion<Expr *, concepts::Requirement::SubstitutionDiagnostic *> TransExpr;
12498   if (Req->isExprSubstitutionFailure())
12499     TransExpr = Req->getExprSubstitutionDiagnostic();
12500   else {
12501     ExprResult TransExprRes = getDerived().TransformExpr(Req->getExpr());
12502     if (TransExprRes.isUsable() && TransExprRes.get()->hasPlaceholderType())
12503       TransExprRes = SemaRef.CheckPlaceholderExpr(TransExprRes.get());
12504     if (TransExprRes.isInvalid())
12505       return nullptr;
12506     TransExpr = TransExprRes.get();
12507   }
12508 
12509   llvm::Optional<concepts::ExprRequirement::ReturnTypeRequirement> TransRetReq;
12510   const auto &RetReq = Req->getReturnTypeRequirement();
12511   if (RetReq.isEmpty())
12512     TransRetReq.emplace();
12513   else if (RetReq.isSubstitutionFailure())
12514     TransRetReq.emplace(RetReq.getSubstitutionDiagnostic());
12515   else if (RetReq.isTypeConstraint()) {
12516     TemplateParameterList *OrigTPL =
12517         RetReq.getTypeConstraintTemplateParameterList();
12518     TemplateParameterList *TPL =
12519         getDerived().TransformTemplateParameterList(OrigTPL);
12520     if (!TPL)
12521       return nullptr;
12522     TransRetReq.emplace(TPL);
12523   }
12524   assert(TransRetReq.hasValue() &&
12525          "All code paths leading here must set TransRetReq");
12526   if (Expr *E = TransExpr.dyn_cast<Expr *>())
12527     return getDerived().RebuildExprRequirement(E, Req->isSimple(),
12528                                                Req->getNoexceptLoc(),
12529                                                std::move(*TransRetReq));
12530   return getDerived().RebuildExprRequirement(
12531       TransExpr.get<concepts::Requirement::SubstitutionDiagnostic *>(),
12532       Req->isSimple(), Req->getNoexceptLoc(), std::move(*TransRetReq));
12533 }
12534 
12535 template<typename Derived>
12536 concepts::NestedRequirement *
12537 TreeTransform<Derived>::TransformNestedRequirement(
12538     concepts::NestedRequirement *Req) {
12539   if (Req->isSubstitutionFailure()) {
12540     if (getDerived().AlwaysRebuild())
12541       return getDerived().RebuildNestedRequirement(
12542           Req->getSubstitutionDiagnostic());
12543     return Req;
12544   }
12545   ExprResult TransConstraint =
12546       getDerived().TransformExpr(Req->getConstraintExpr());
12547   if (TransConstraint.isInvalid())
12548     return nullptr;
12549   return getDerived().RebuildNestedRequirement(TransConstraint.get());
12550 }
12551 
12552 template<typename Derived>
12553 ExprResult
12554 TreeTransform<Derived>::TransformArrayTypeTraitExpr(ArrayTypeTraitExpr *E) {
12555   TypeSourceInfo *T = getDerived().TransformType(E->getQueriedTypeSourceInfo());
12556   if (!T)
12557     return ExprError();
12558 
12559   if (!getDerived().AlwaysRebuild() &&
12560       T == E->getQueriedTypeSourceInfo())
12561     return E;
12562 
12563   ExprResult SubExpr;
12564   {
12565     EnterExpressionEvaluationContext Unevaluated(
12566         SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
12567     SubExpr = getDerived().TransformExpr(E->getDimensionExpression());
12568     if (SubExpr.isInvalid())
12569       return ExprError();
12570 
12571     if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getDimensionExpression())
12572       return E;
12573   }
12574 
12575   return getDerived().RebuildArrayTypeTrait(E->getTrait(), E->getBeginLoc(), T,
12576                                             SubExpr.get(), E->getEndLoc());
12577 }
12578 
12579 template<typename Derived>
12580 ExprResult
12581 TreeTransform<Derived>::TransformExpressionTraitExpr(ExpressionTraitExpr *E) {
12582   ExprResult SubExpr;
12583   {
12584     EnterExpressionEvaluationContext Unevaluated(
12585         SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
12586     SubExpr = getDerived().TransformExpr(E->getQueriedExpression());
12587     if (SubExpr.isInvalid())
12588       return ExprError();
12589 
12590     if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getQueriedExpression())
12591       return E;
12592   }
12593 
12594   return getDerived().RebuildExpressionTrait(E->getTrait(), E->getBeginLoc(),
12595                                              SubExpr.get(), E->getEndLoc());
12596 }
12597 
12598 template <typename Derived>
12599 ExprResult TreeTransform<Derived>::TransformParenDependentScopeDeclRefExpr(
12600     ParenExpr *PE, DependentScopeDeclRefExpr *DRE, bool AddrTaken,
12601     TypeSourceInfo **RecoveryTSI) {
12602   ExprResult NewDRE = getDerived().TransformDependentScopeDeclRefExpr(
12603       DRE, AddrTaken, RecoveryTSI);
12604 
12605   // Propagate both errors and recovered types, which return ExprEmpty.
12606   if (!NewDRE.isUsable())
12607     return NewDRE;
12608 
12609   // We got an expr, wrap it up in parens.
12610   if (!getDerived().AlwaysRebuild() && NewDRE.get() == DRE)
12611     return PE;
12612   return getDerived().RebuildParenExpr(NewDRE.get(), PE->getLParen(),
12613                                        PE->getRParen());
12614 }
12615 
12616 template <typename Derived>
12617 ExprResult TreeTransform<Derived>::TransformDependentScopeDeclRefExpr(
12618     DependentScopeDeclRefExpr *E) {
12619   return TransformDependentScopeDeclRefExpr(E, /*IsAddressOfOperand=*/false,
12620                                             nullptr);
12621 }
12622 
12623 template <typename Derived>
12624 ExprResult TreeTransform<Derived>::TransformDependentScopeDeclRefExpr(
12625     DependentScopeDeclRefExpr *E, bool IsAddressOfOperand,
12626     TypeSourceInfo **RecoveryTSI) {
12627   assert(E->getQualifierLoc());
12628   NestedNameSpecifierLoc QualifierLoc =
12629       getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
12630   if (!QualifierLoc)
12631     return ExprError();
12632   SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc();
12633 
12634   // TODO: If this is a conversion-function-id, verify that the
12635   // destination type name (if present) resolves the same way after
12636   // instantiation as it did in the local scope.
12637 
12638   DeclarationNameInfo NameInfo =
12639       getDerived().TransformDeclarationNameInfo(E->getNameInfo());
12640   if (!NameInfo.getName())
12641     return ExprError();
12642 
12643   if (!E->hasExplicitTemplateArgs()) {
12644     if (!getDerived().AlwaysRebuild() && QualifierLoc == E->getQualifierLoc() &&
12645         // Note: it is sufficient to compare the Name component of NameInfo:
12646         // if name has not changed, DNLoc has not changed either.
12647         NameInfo.getName() == E->getDeclName())
12648       return E;
12649 
12650     return getDerived().RebuildDependentScopeDeclRefExpr(
12651         QualifierLoc, TemplateKWLoc, NameInfo, /*TemplateArgs=*/nullptr,
12652         IsAddressOfOperand, RecoveryTSI);
12653   }
12654 
12655   TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc());
12656   if (getDerived().TransformTemplateArguments(
12657           E->getTemplateArgs(), E->getNumTemplateArgs(), TransArgs))
12658     return ExprError();
12659 
12660   return getDerived().RebuildDependentScopeDeclRefExpr(
12661       QualifierLoc, TemplateKWLoc, NameInfo, &TransArgs, IsAddressOfOperand,
12662       RecoveryTSI);
12663 }
12664 
12665 template<typename Derived>
12666 ExprResult
12667 TreeTransform<Derived>::TransformCXXConstructExpr(CXXConstructExpr *E) {
12668   // CXXConstructExprs other than for list-initialization and
12669   // CXXTemporaryObjectExpr are always implicit, so when we have
12670   // a 1-argument construction we just transform that argument.
12671   if (getDerived().AllowSkippingCXXConstructExpr() &&
12672       ((E->getNumArgs() == 1 ||
12673         (E->getNumArgs() > 1 && getDerived().DropCallArgument(E->getArg(1)))) &&
12674        (!getDerived().DropCallArgument(E->getArg(0))) &&
12675        !E->isListInitialization()))
12676     return getDerived().TransformInitializer(E->getArg(0),
12677                                              /*DirectInit*/ false);
12678 
12679   TemporaryBase Rebase(*this, /*FIXME*/ E->getBeginLoc(), DeclarationName());
12680 
12681   QualType T = getDerived().TransformType(E->getType());
12682   if (T.isNull())
12683     return ExprError();
12684 
12685   CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>(
12686       getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor()));
12687   if (!Constructor)
12688     return ExprError();
12689 
12690   bool ArgumentChanged = false;
12691   SmallVector<Expr*, 8> Args;
12692   {
12693     EnterExpressionEvaluationContext Context(
12694         getSema(), EnterExpressionEvaluationContext::InitList,
12695         E->isListInitialization());
12696     if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
12697                                     &ArgumentChanged))
12698       return ExprError();
12699   }
12700 
12701   if (!getDerived().AlwaysRebuild() &&
12702       T == E->getType() &&
12703       Constructor == E->getConstructor() &&
12704       !ArgumentChanged) {
12705     // Mark the constructor as referenced.
12706     // FIXME: Instantiation-specific
12707     SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor);
12708     return E;
12709   }
12710 
12711   return getDerived().RebuildCXXConstructExpr(
12712       T, /*FIXME:*/ E->getBeginLoc(), Constructor, E->isElidable(), Args,
12713       E->hadMultipleCandidates(), E->isListInitialization(),
12714       E->isStdInitListInitialization(), E->requiresZeroInitialization(),
12715       E->getConstructionKind(), E->getParenOrBraceRange());
12716 }
12717 
12718 template<typename Derived>
12719 ExprResult TreeTransform<Derived>::TransformCXXInheritedCtorInitExpr(
12720     CXXInheritedCtorInitExpr *E) {
12721   QualType T = getDerived().TransformType(E->getType());
12722   if (T.isNull())
12723     return ExprError();
12724 
12725   CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>(
12726       getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor()));
12727   if (!Constructor)
12728     return ExprError();
12729 
12730   if (!getDerived().AlwaysRebuild() &&
12731       T == E->getType() &&
12732       Constructor == E->getConstructor()) {
12733     // Mark the constructor as referenced.
12734     // FIXME: Instantiation-specific
12735     SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor);
12736     return E;
12737   }
12738 
12739   return getDerived().RebuildCXXInheritedCtorInitExpr(
12740       T, E->getLocation(), Constructor,
12741       E->constructsVBase(), E->inheritedFromVBase());
12742 }
12743 
12744 /// Transform a C++ temporary-binding expression.
12745 ///
12746 /// Since CXXBindTemporaryExpr nodes are implicitly generated, we just
12747 /// transform the subexpression and return that.
12748 template<typename Derived>
12749 ExprResult
12750 TreeTransform<Derived>::TransformCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) {
12751   return getDerived().TransformExpr(E->getSubExpr());
12752 }
12753 
12754 /// Transform a C++ expression that contains cleanups that should
12755 /// be run after the expression is evaluated.
12756 ///
12757 /// Since ExprWithCleanups nodes are implicitly generated, we
12758 /// just transform the subexpression and return that.
12759 template<typename Derived>
12760 ExprResult
12761 TreeTransform<Derived>::TransformExprWithCleanups(ExprWithCleanups *E) {
12762   return getDerived().TransformExpr(E->getSubExpr());
12763 }
12764 
12765 template<typename Derived>
12766 ExprResult
12767 TreeTransform<Derived>::TransformCXXTemporaryObjectExpr(
12768                                                     CXXTemporaryObjectExpr *E) {
12769   TypeSourceInfo *T =
12770       getDerived().TransformTypeWithDeducedTST(E->getTypeSourceInfo());
12771   if (!T)
12772     return ExprError();
12773 
12774   CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>(
12775       getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor()));
12776   if (!Constructor)
12777     return ExprError();
12778 
12779   bool ArgumentChanged = false;
12780   SmallVector<Expr*, 8> Args;
12781   Args.reserve(E->getNumArgs());
12782   {
12783     EnterExpressionEvaluationContext Context(
12784         getSema(), EnterExpressionEvaluationContext::InitList,
12785         E->isListInitialization());
12786     if (TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
12787                        &ArgumentChanged))
12788       return ExprError();
12789   }
12790 
12791   if (!getDerived().AlwaysRebuild() &&
12792       T == E->getTypeSourceInfo() &&
12793       Constructor == E->getConstructor() &&
12794       !ArgumentChanged) {
12795     // FIXME: Instantiation-specific
12796     SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor);
12797     return SemaRef.MaybeBindToTemporary(E);
12798   }
12799 
12800   // FIXME: We should just pass E->isListInitialization(), but we're not
12801   // prepared to handle list-initialization without a child InitListExpr.
12802   SourceLocation LParenLoc = T->getTypeLoc().getEndLoc();
12803   return getDerived().RebuildCXXTemporaryObjectExpr(
12804       T, LParenLoc, Args, E->getEndLoc(),
12805       /*ListInitialization=*/LParenLoc.isInvalid());
12806 }
12807 
12808 template<typename Derived>
12809 ExprResult
12810 TreeTransform<Derived>::TransformLambdaExpr(LambdaExpr *E) {
12811   // Transform any init-capture expressions before entering the scope of the
12812   // lambda body, because they are not semantically within that scope.
12813   typedef std::pair<ExprResult, QualType> InitCaptureInfoTy;
12814   struct TransformedInitCapture {
12815     // The location of the ... if the result is retaining a pack expansion.
12816     SourceLocation EllipsisLoc;
12817     // Zero or more expansions of the init-capture.
12818     SmallVector<InitCaptureInfoTy, 4> Expansions;
12819   };
12820   SmallVector<TransformedInitCapture, 4> InitCaptures;
12821   InitCaptures.resize(E->explicit_capture_end() - E->explicit_capture_begin());
12822   for (LambdaExpr::capture_iterator C = E->capture_begin(),
12823                                     CEnd = E->capture_end();
12824        C != CEnd; ++C) {
12825     if (!E->isInitCapture(C))
12826       continue;
12827 
12828     TransformedInitCapture &Result = InitCaptures[C - E->capture_begin()];
12829     VarDecl *OldVD = C->getCapturedVar();
12830 
12831     auto SubstInitCapture = [&](SourceLocation EllipsisLoc,
12832                                 Optional<unsigned> NumExpansions) {
12833       ExprResult NewExprInitResult = getDerived().TransformInitializer(
12834           OldVD->getInit(), OldVD->getInitStyle() == VarDecl::CallInit);
12835 
12836       if (NewExprInitResult.isInvalid()) {
12837         Result.Expansions.push_back(InitCaptureInfoTy(ExprError(), QualType()));
12838         return;
12839       }
12840       Expr *NewExprInit = NewExprInitResult.get();
12841 
12842       QualType NewInitCaptureType =
12843           getSema().buildLambdaInitCaptureInitialization(
12844               C->getLocation(), OldVD->getType()->isReferenceType(),
12845               EllipsisLoc, NumExpansions, OldVD->getIdentifier(),
12846               C->getCapturedVar()->getInitStyle() != VarDecl::CInit,
12847               NewExprInit);
12848       Result.Expansions.push_back(
12849           InitCaptureInfoTy(NewExprInit, NewInitCaptureType));
12850     };
12851 
12852     // If this is an init-capture pack, consider expanding the pack now.
12853     if (OldVD->isParameterPack()) {
12854       PackExpansionTypeLoc ExpansionTL = OldVD->getTypeSourceInfo()
12855                                              ->getTypeLoc()
12856                                              .castAs<PackExpansionTypeLoc>();
12857       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
12858       SemaRef.collectUnexpandedParameterPacks(OldVD->getInit(), Unexpanded);
12859 
12860       // Determine whether the set of unexpanded parameter packs can and should
12861       // be expanded.
12862       bool Expand = true;
12863       bool RetainExpansion = false;
12864       Optional<unsigned> OrigNumExpansions =
12865           ExpansionTL.getTypePtr()->getNumExpansions();
12866       Optional<unsigned> NumExpansions = OrigNumExpansions;
12867       if (getDerived().TryExpandParameterPacks(
12868               ExpansionTL.getEllipsisLoc(),
12869               OldVD->getInit()->getSourceRange(), Unexpanded, Expand,
12870               RetainExpansion, NumExpansions))
12871         return ExprError();
12872       if (Expand) {
12873         for (unsigned I = 0; I != *NumExpansions; ++I) {
12874           Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
12875           SubstInitCapture(SourceLocation(), None);
12876         }
12877       }
12878       if (!Expand || RetainExpansion) {
12879         ForgetPartiallySubstitutedPackRAII Forget(getDerived());
12880         SubstInitCapture(ExpansionTL.getEllipsisLoc(), NumExpansions);
12881         Result.EllipsisLoc = ExpansionTL.getEllipsisLoc();
12882       }
12883     } else {
12884       SubstInitCapture(SourceLocation(), None);
12885     }
12886   }
12887 
12888   LambdaScopeInfo *LSI = getSema().PushLambdaScope();
12889   Sema::FunctionScopeRAII FuncScopeCleanup(getSema());
12890 
12891   // Transform the template parameters, and add them to the current
12892   // instantiation scope. The null case is handled correctly.
12893   auto TPL = getDerived().TransformTemplateParameterList(
12894       E->getTemplateParameterList());
12895   LSI->GLTemplateParameterList = TPL;
12896 
12897   // Transform the type of the original lambda's call operator.
12898   // The transformation MUST be done in the CurrentInstantiationScope since
12899   // it introduces a mapping of the original to the newly created
12900   // transformed parameters.
12901   TypeSourceInfo *NewCallOpTSI = nullptr;
12902   {
12903     TypeSourceInfo *OldCallOpTSI = E->getCallOperator()->getTypeSourceInfo();
12904     FunctionProtoTypeLoc OldCallOpFPTL =
12905         OldCallOpTSI->getTypeLoc().getAs<FunctionProtoTypeLoc>();
12906 
12907     TypeLocBuilder NewCallOpTLBuilder;
12908     SmallVector<QualType, 4> ExceptionStorage;
12909     TreeTransform *This = this; // Work around gcc.gnu.org/PR56135.
12910     QualType NewCallOpType = TransformFunctionProtoType(
12911         NewCallOpTLBuilder, OldCallOpFPTL, nullptr, Qualifiers(),
12912         [&](FunctionProtoType::ExceptionSpecInfo &ESI, bool &Changed) {
12913           return This->TransformExceptionSpec(OldCallOpFPTL.getBeginLoc(), ESI,
12914                                               ExceptionStorage, Changed);
12915         });
12916     if (NewCallOpType.isNull())
12917       return ExprError();
12918     NewCallOpTSI = NewCallOpTLBuilder.getTypeSourceInfo(getSema().Context,
12919                                                         NewCallOpType);
12920   }
12921 
12922   // Transform the trailing requires clause
12923   ExprResult NewTrailingRequiresClause;
12924   if (Expr *TRC = E->getCallOperator()->getTrailingRequiresClause())
12925     // FIXME: Concepts: Substitution into requires clause should only happen
12926     //                  when checking satisfaction.
12927     NewTrailingRequiresClause = getDerived().TransformExpr(TRC);
12928 
12929   // Create the local class that will describe the lambda.
12930   // FIXME: KnownDependent below is wrong when substituting inside a templated
12931   // context that isn't a DeclContext (such as a variable template).
12932   CXXRecordDecl *OldClass = E->getLambdaClass();
12933   CXXRecordDecl *Class
12934     = getSema().createLambdaClosureType(E->getIntroducerRange(),
12935                                         NewCallOpTSI,
12936                                         /*KnownDependent=*/false,
12937                                         E->getCaptureDefault());
12938   getDerived().transformedLocalDecl(OldClass, {Class});
12939 
12940   Optional<std::tuple<bool, unsigned, unsigned, Decl *>> Mangling;
12941   if (getDerived().ReplacingOriginal())
12942     Mangling = std::make_tuple(OldClass->hasKnownLambdaInternalLinkage(),
12943                                OldClass->getLambdaManglingNumber(),
12944                                OldClass->getDeviceLambdaManglingNumber(),
12945                                OldClass->getLambdaContextDecl());
12946 
12947   // Build the call operator.
12948   CXXMethodDecl *NewCallOperator = getSema().startLambdaDefinition(
12949       Class, E->getIntroducerRange(), NewCallOpTSI,
12950       E->getCallOperator()->getEndLoc(),
12951       NewCallOpTSI->getTypeLoc().castAs<FunctionProtoTypeLoc>().getParams(),
12952       E->getCallOperator()->getConstexprKind(),
12953       NewTrailingRequiresClause.get());
12954 
12955   LSI->CallOperator = NewCallOperator;
12956 
12957   getDerived().transformAttrs(E->getCallOperator(), NewCallOperator);
12958   getDerived().transformedLocalDecl(E->getCallOperator(), {NewCallOperator});
12959 
12960   // Number the lambda for linkage purposes if necessary.
12961   getSema().handleLambdaNumbering(Class, NewCallOperator, Mangling);
12962 
12963   // Introduce the context of the call operator.
12964   Sema::ContextRAII SavedContext(getSema(), NewCallOperator,
12965                                  /*NewThisContext*/false);
12966 
12967   // Enter the scope of the lambda.
12968   getSema().buildLambdaScope(LSI, NewCallOperator,
12969                              E->getIntroducerRange(),
12970                              E->getCaptureDefault(),
12971                              E->getCaptureDefaultLoc(),
12972                              E->hasExplicitParameters(),
12973                              E->hasExplicitResultType(),
12974                              E->isMutable());
12975 
12976   bool Invalid = false;
12977 
12978   // Transform captures.
12979   for (LambdaExpr::capture_iterator C = E->capture_begin(),
12980                                  CEnd = E->capture_end();
12981        C != CEnd; ++C) {
12982     // When we hit the first implicit capture, tell Sema that we've finished
12983     // the list of explicit captures.
12984     if (C->isImplicit())
12985       break;
12986 
12987     // Capturing 'this' is trivial.
12988     if (C->capturesThis()) {
12989       getSema().CheckCXXThisCapture(C->getLocation(), C->isExplicit(),
12990                                     /*BuildAndDiagnose*/ true, nullptr,
12991                                     C->getCaptureKind() == LCK_StarThis);
12992       continue;
12993     }
12994     // Captured expression will be recaptured during captured variables
12995     // rebuilding.
12996     if (C->capturesVLAType())
12997       continue;
12998 
12999     // Rebuild init-captures, including the implied field declaration.
13000     if (E->isInitCapture(C)) {
13001       TransformedInitCapture &NewC = InitCaptures[C - E->capture_begin()];
13002 
13003       VarDecl *OldVD = C->getCapturedVar();
13004       llvm::SmallVector<Decl*, 4> NewVDs;
13005 
13006       for (InitCaptureInfoTy &Info : NewC.Expansions) {
13007         ExprResult Init = Info.first;
13008         QualType InitQualType = Info.second;
13009         if (Init.isInvalid() || InitQualType.isNull()) {
13010           Invalid = true;
13011           break;
13012         }
13013         VarDecl *NewVD = getSema().createLambdaInitCaptureVarDecl(
13014             OldVD->getLocation(), InitQualType, NewC.EllipsisLoc,
13015             OldVD->getIdentifier(), OldVD->getInitStyle(), Init.get());
13016         if (!NewVD) {
13017           Invalid = true;
13018           break;
13019         }
13020         NewVDs.push_back(NewVD);
13021         getSema().addInitCapture(LSI, NewVD);
13022       }
13023 
13024       if (Invalid)
13025         break;
13026 
13027       getDerived().transformedLocalDecl(OldVD, NewVDs);
13028       continue;
13029     }
13030 
13031     assert(C->capturesVariable() && "unexpected kind of lambda capture");
13032 
13033     // Determine the capture kind for Sema.
13034     Sema::TryCaptureKind Kind
13035       = C->isImplicit()? Sema::TryCapture_Implicit
13036                        : C->getCaptureKind() == LCK_ByCopy
13037                            ? Sema::TryCapture_ExplicitByVal
13038                            : Sema::TryCapture_ExplicitByRef;
13039     SourceLocation EllipsisLoc;
13040     if (C->isPackExpansion()) {
13041       UnexpandedParameterPack Unexpanded(C->getCapturedVar(), C->getLocation());
13042       bool ShouldExpand = false;
13043       bool RetainExpansion = false;
13044       Optional<unsigned> NumExpansions;
13045       if (getDerived().TryExpandParameterPacks(C->getEllipsisLoc(),
13046                                                C->getLocation(),
13047                                                Unexpanded,
13048                                                ShouldExpand, RetainExpansion,
13049                                                NumExpansions)) {
13050         Invalid = true;
13051         continue;
13052       }
13053 
13054       if (ShouldExpand) {
13055         // The transform has determined that we should perform an expansion;
13056         // transform and capture each of the arguments.
13057         // expansion of the pattern. Do so.
13058         VarDecl *Pack = C->getCapturedVar();
13059         for (unsigned I = 0; I != *NumExpansions; ++I) {
13060           Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
13061           VarDecl *CapturedVar
13062             = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(),
13063                                                                Pack));
13064           if (!CapturedVar) {
13065             Invalid = true;
13066             continue;
13067           }
13068 
13069           // Capture the transformed variable.
13070           getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind);
13071         }
13072 
13073         // FIXME: Retain a pack expansion if RetainExpansion is true.
13074 
13075         continue;
13076       }
13077 
13078       EllipsisLoc = C->getEllipsisLoc();
13079     }
13080 
13081     // Transform the captured variable.
13082     VarDecl *CapturedVar
13083       = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(),
13084                                                          C->getCapturedVar()));
13085     if (!CapturedVar || CapturedVar->isInvalidDecl()) {
13086       Invalid = true;
13087       continue;
13088     }
13089 
13090     // Capture the transformed variable.
13091     getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind,
13092                                  EllipsisLoc);
13093   }
13094   getSema().finishLambdaExplicitCaptures(LSI);
13095 
13096   // FIXME: Sema's lambda-building mechanism expects us to push an expression
13097   // evaluation context even if we're not transforming the function body.
13098   getSema().PushExpressionEvaluationContext(
13099       Sema::ExpressionEvaluationContext::PotentiallyEvaluated);
13100 
13101   // Instantiate the body of the lambda expression.
13102   StmtResult Body =
13103       Invalid ? StmtError() : getDerived().TransformLambdaBody(E, E->getBody());
13104 
13105   // ActOnLambda* will pop the function scope for us.
13106   FuncScopeCleanup.disable();
13107 
13108   if (Body.isInvalid()) {
13109     SavedContext.pop();
13110     getSema().ActOnLambdaError(E->getBeginLoc(), /*CurScope=*/nullptr,
13111                                /*IsInstantiation=*/true);
13112     return ExprError();
13113   }
13114 
13115   // Copy the LSI before ActOnFinishFunctionBody removes it.
13116   // FIXME: This is dumb. Store the lambda information somewhere that outlives
13117   // the call operator.
13118   auto LSICopy = *LSI;
13119   getSema().ActOnFinishFunctionBody(NewCallOperator, Body.get(),
13120                                     /*IsInstantiation*/ true);
13121   SavedContext.pop();
13122 
13123   return getSema().BuildLambdaExpr(E->getBeginLoc(), Body.get()->getEndLoc(),
13124                                    &LSICopy);
13125 }
13126 
13127 template<typename Derived>
13128 StmtResult
13129 TreeTransform<Derived>::TransformLambdaBody(LambdaExpr *E, Stmt *S) {
13130   return TransformStmt(S);
13131 }
13132 
13133 template<typename Derived>
13134 StmtResult
13135 TreeTransform<Derived>::SkipLambdaBody(LambdaExpr *E, Stmt *S) {
13136   // Transform captures.
13137   for (LambdaExpr::capture_iterator C = E->capture_begin(),
13138                                  CEnd = E->capture_end();
13139        C != CEnd; ++C) {
13140     // When we hit the first implicit capture, tell Sema that we've finished
13141     // the list of explicit captures.
13142     if (!C->isImplicit())
13143       continue;
13144 
13145     // Capturing 'this' is trivial.
13146     if (C->capturesThis()) {
13147       getSema().CheckCXXThisCapture(C->getLocation(), C->isExplicit(),
13148                                     /*BuildAndDiagnose*/ true, nullptr,
13149                                     C->getCaptureKind() == LCK_StarThis);
13150       continue;
13151     }
13152     // Captured expression will be recaptured during captured variables
13153     // rebuilding.
13154     if (C->capturesVLAType())
13155       continue;
13156 
13157     assert(C->capturesVariable() && "unexpected kind of lambda capture");
13158     assert(!E->isInitCapture(C) && "implicit init-capture?");
13159 
13160     // Transform the captured variable.
13161     VarDecl *CapturedVar = cast_or_null<VarDecl>(
13162         getDerived().TransformDecl(C->getLocation(), C->getCapturedVar()));
13163     if (!CapturedVar || CapturedVar->isInvalidDecl())
13164       return StmtError();
13165 
13166     // Capture the transformed variable.
13167     getSema().tryCaptureVariable(CapturedVar, C->getLocation());
13168   }
13169 
13170   return S;
13171 }
13172 
13173 template<typename Derived>
13174 ExprResult
13175 TreeTransform<Derived>::TransformCXXUnresolvedConstructExpr(
13176                                                   CXXUnresolvedConstructExpr *E) {
13177   TypeSourceInfo *T =
13178       getDerived().TransformTypeWithDeducedTST(E->getTypeSourceInfo());
13179   if (!T)
13180     return ExprError();
13181 
13182   bool ArgumentChanged = false;
13183   SmallVector<Expr*, 8> Args;
13184   Args.reserve(E->getNumArgs());
13185   {
13186     EnterExpressionEvaluationContext Context(
13187         getSema(), EnterExpressionEvaluationContext::InitList,
13188         E->isListInitialization());
13189     if (getDerived().TransformExprs(E->arg_begin(), E->getNumArgs(), true, Args,
13190                                     &ArgumentChanged))
13191       return ExprError();
13192   }
13193 
13194   if (!getDerived().AlwaysRebuild() &&
13195       T == E->getTypeSourceInfo() &&
13196       !ArgumentChanged)
13197     return E;
13198 
13199   // FIXME: we're faking the locations of the commas
13200   return getDerived().RebuildCXXUnresolvedConstructExpr(
13201       T, E->getLParenLoc(), Args, E->getRParenLoc(), E->isListInitialization());
13202 }
13203 
13204 template<typename Derived>
13205 ExprResult
13206 TreeTransform<Derived>::TransformCXXDependentScopeMemberExpr(
13207                                              CXXDependentScopeMemberExpr *E) {
13208   // Transform the base of the expression.
13209   ExprResult Base((Expr*) nullptr);
13210   Expr *OldBase;
13211   QualType BaseType;
13212   QualType ObjectType;
13213   if (!E->isImplicitAccess()) {
13214     OldBase = E->getBase();
13215     Base = getDerived().TransformExpr(OldBase);
13216     if (Base.isInvalid())
13217       return ExprError();
13218 
13219     // Start the member reference and compute the object's type.
13220     ParsedType ObjectTy;
13221     bool MayBePseudoDestructor = false;
13222     Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(),
13223                                                 E->getOperatorLoc(),
13224                                       E->isArrow()? tok::arrow : tok::period,
13225                                                 ObjectTy,
13226                                                 MayBePseudoDestructor);
13227     if (Base.isInvalid())
13228       return ExprError();
13229 
13230     ObjectType = ObjectTy.get();
13231     BaseType = ((Expr*) Base.get())->getType();
13232   } else {
13233     OldBase = nullptr;
13234     BaseType = getDerived().TransformType(E->getBaseType());
13235     ObjectType = BaseType->castAs<PointerType>()->getPointeeType();
13236   }
13237 
13238   // Transform the first part of the nested-name-specifier that qualifies
13239   // the member name.
13240   NamedDecl *FirstQualifierInScope
13241     = getDerived().TransformFirstQualifierInScope(
13242                                             E->getFirstQualifierFoundInScope(),
13243                                             E->getQualifierLoc().getBeginLoc());
13244 
13245   NestedNameSpecifierLoc QualifierLoc;
13246   if (E->getQualifier()) {
13247     QualifierLoc
13248       = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc(),
13249                                                      ObjectType,
13250                                                      FirstQualifierInScope);
13251     if (!QualifierLoc)
13252       return ExprError();
13253   }
13254 
13255   SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc();
13256 
13257   // TODO: If this is a conversion-function-id, verify that the
13258   // destination type name (if present) resolves the same way after
13259   // instantiation as it did in the local scope.
13260 
13261   DeclarationNameInfo NameInfo
13262     = getDerived().TransformDeclarationNameInfo(E->getMemberNameInfo());
13263   if (!NameInfo.getName())
13264     return ExprError();
13265 
13266   if (!E->hasExplicitTemplateArgs()) {
13267     // This is a reference to a member without an explicitly-specified
13268     // template argument list. Optimize for this common case.
13269     if (!getDerived().AlwaysRebuild() &&
13270         Base.get() == OldBase &&
13271         BaseType == E->getBaseType() &&
13272         QualifierLoc == E->getQualifierLoc() &&
13273         NameInfo.getName() == E->getMember() &&
13274         FirstQualifierInScope == E->getFirstQualifierFoundInScope())
13275       return E;
13276 
13277     return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(),
13278                                                        BaseType,
13279                                                        E->isArrow(),
13280                                                        E->getOperatorLoc(),
13281                                                        QualifierLoc,
13282                                                        TemplateKWLoc,
13283                                                        FirstQualifierInScope,
13284                                                        NameInfo,
13285                                                        /*TemplateArgs*/nullptr);
13286   }
13287 
13288   TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc());
13289   if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
13290                                               E->getNumTemplateArgs(),
13291                                               TransArgs))
13292     return ExprError();
13293 
13294   return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(),
13295                                                      BaseType,
13296                                                      E->isArrow(),
13297                                                      E->getOperatorLoc(),
13298                                                      QualifierLoc,
13299                                                      TemplateKWLoc,
13300                                                      FirstQualifierInScope,
13301                                                      NameInfo,
13302                                                      &TransArgs);
13303 }
13304 
13305 template <typename Derived>
13306 ExprResult TreeTransform<Derived>::TransformUnresolvedMemberExpr(
13307     UnresolvedMemberExpr *Old) {
13308   // Transform the base of the expression.
13309   ExprResult Base((Expr *)nullptr);
13310   QualType BaseType;
13311   if (!Old->isImplicitAccess()) {
13312     Base = getDerived().TransformExpr(Old->getBase());
13313     if (Base.isInvalid())
13314       return ExprError();
13315     Base =
13316         getSema().PerformMemberExprBaseConversion(Base.get(), Old->isArrow());
13317     if (Base.isInvalid())
13318       return ExprError();
13319     BaseType = Base.get()->getType();
13320   } else {
13321     BaseType = getDerived().TransformType(Old->getBaseType());
13322   }
13323 
13324   NestedNameSpecifierLoc QualifierLoc;
13325   if (Old->getQualifierLoc()) {
13326     QualifierLoc =
13327         getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc());
13328     if (!QualifierLoc)
13329       return ExprError();
13330   }
13331 
13332   SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc();
13333 
13334   LookupResult R(SemaRef, Old->getMemberNameInfo(), Sema::LookupOrdinaryName);
13335 
13336   // Transform the declaration set.
13337   if (TransformOverloadExprDecls(Old, /*RequiresADL*/ false, R))
13338     return ExprError();
13339 
13340   // Determine the naming class.
13341   if (Old->getNamingClass()) {
13342     CXXRecordDecl *NamingClass = cast_or_null<CXXRecordDecl>(
13343         getDerived().TransformDecl(Old->getMemberLoc(), Old->getNamingClass()));
13344     if (!NamingClass)
13345       return ExprError();
13346 
13347     R.setNamingClass(NamingClass);
13348   }
13349 
13350   TemplateArgumentListInfo TransArgs;
13351   if (Old->hasExplicitTemplateArgs()) {
13352     TransArgs.setLAngleLoc(Old->getLAngleLoc());
13353     TransArgs.setRAngleLoc(Old->getRAngleLoc());
13354     if (getDerived().TransformTemplateArguments(
13355             Old->getTemplateArgs(), Old->getNumTemplateArgs(), TransArgs))
13356       return ExprError();
13357   }
13358 
13359   // FIXME: to do this check properly, we will need to preserve the
13360   // first-qualifier-in-scope here, just in case we had a dependent
13361   // base (and therefore couldn't do the check) and a
13362   // nested-name-qualifier (and therefore could do the lookup).
13363   NamedDecl *FirstQualifierInScope = nullptr;
13364 
13365   return getDerived().RebuildUnresolvedMemberExpr(
13366       Base.get(), BaseType, Old->getOperatorLoc(), Old->isArrow(), QualifierLoc,
13367       TemplateKWLoc, FirstQualifierInScope, R,
13368       (Old->hasExplicitTemplateArgs() ? &TransArgs : nullptr));
13369 }
13370 
13371 template<typename Derived>
13372 ExprResult
13373 TreeTransform<Derived>::TransformCXXNoexceptExpr(CXXNoexceptExpr *E) {
13374   EnterExpressionEvaluationContext Unevaluated(
13375       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
13376   ExprResult SubExpr = getDerived().TransformExpr(E->getOperand());
13377   if (SubExpr.isInvalid())
13378     return ExprError();
13379 
13380   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getOperand())
13381     return E;
13382 
13383   return getDerived().RebuildCXXNoexceptExpr(E->getSourceRange(),SubExpr.get());
13384 }
13385 
13386 template<typename Derived>
13387 ExprResult
13388 TreeTransform<Derived>::TransformPackExpansionExpr(PackExpansionExpr *E) {
13389   ExprResult Pattern = getDerived().TransformExpr(E->getPattern());
13390   if (Pattern.isInvalid())
13391     return ExprError();
13392 
13393   if (!getDerived().AlwaysRebuild() && Pattern.get() == E->getPattern())
13394     return E;
13395 
13396   return getDerived().RebuildPackExpansion(Pattern.get(), E->getEllipsisLoc(),
13397                                            E->getNumExpansions());
13398 }
13399 
13400 template<typename Derived>
13401 ExprResult
13402 TreeTransform<Derived>::TransformSizeOfPackExpr(SizeOfPackExpr *E) {
13403   // If E is not value-dependent, then nothing will change when we transform it.
13404   // Note: This is an instantiation-centric view.
13405   if (!E->isValueDependent())
13406     return E;
13407 
13408   EnterExpressionEvaluationContext Unevaluated(
13409       getSema(), Sema::ExpressionEvaluationContext::Unevaluated);
13410 
13411   ArrayRef<TemplateArgument> PackArgs;
13412   TemplateArgument ArgStorage;
13413 
13414   // Find the argument list to transform.
13415   if (E->isPartiallySubstituted()) {
13416     PackArgs = E->getPartialArguments();
13417   } else if (E->isValueDependent()) {
13418     UnexpandedParameterPack Unexpanded(E->getPack(), E->getPackLoc());
13419     bool ShouldExpand = false;
13420     bool RetainExpansion = false;
13421     Optional<unsigned> NumExpansions;
13422     if (getDerived().TryExpandParameterPacks(E->getOperatorLoc(), E->getPackLoc(),
13423                                              Unexpanded,
13424                                              ShouldExpand, RetainExpansion,
13425                                              NumExpansions))
13426       return ExprError();
13427 
13428     // If we need to expand the pack, build a template argument from it and
13429     // expand that.
13430     if (ShouldExpand) {
13431       auto *Pack = E->getPack();
13432       if (auto *TTPD = dyn_cast<TemplateTypeParmDecl>(Pack)) {
13433         ArgStorage = getSema().Context.getPackExpansionType(
13434             getSema().Context.getTypeDeclType(TTPD), None);
13435       } else if (auto *TTPD = dyn_cast<TemplateTemplateParmDecl>(Pack)) {
13436         ArgStorage = TemplateArgument(TemplateName(TTPD), None);
13437       } else {
13438         auto *VD = cast<ValueDecl>(Pack);
13439         ExprResult DRE = getSema().BuildDeclRefExpr(
13440             VD, VD->getType().getNonLValueExprType(getSema().Context),
13441             VD->getType()->isReferenceType() ? VK_LValue : VK_PRValue,
13442             E->getPackLoc());
13443         if (DRE.isInvalid())
13444           return ExprError();
13445         ArgStorage = new (getSema().Context) PackExpansionExpr(
13446             getSema().Context.DependentTy, DRE.get(), E->getPackLoc(), None);
13447       }
13448       PackArgs = ArgStorage;
13449     }
13450   }
13451 
13452   // If we're not expanding the pack, just transform the decl.
13453   if (!PackArgs.size()) {
13454     auto *Pack = cast_or_null<NamedDecl>(
13455         getDerived().TransformDecl(E->getPackLoc(), E->getPack()));
13456     if (!Pack)
13457       return ExprError();
13458     return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), Pack,
13459                                               E->getPackLoc(),
13460                                               E->getRParenLoc(), None, None);
13461   }
13462 
13463   // Try to compute the result without performing a partial substitution.
13464   Optional<unsigned> Result = 0;
13465   for (const TemplateArgument &Arg : PackArgs) {
13466     if (!Arg.isPackExpansion()) {
13467       Result = *Result + 1;
13468       continue;
13469     }
13470 
13471     TemplateArgumentLoc ArgLoc;
13472     InventTemplateArgumentLoc(Arg, ArgLoc);
13473 
13474     // Find the pattern of the pack expansion.
13475     SourceLocation Ellipsis;
13476     Optional<unsigned> OrigNumExpansions;
13477     TemplateArgumentLoc Pattern =
13478         getSema().getTemplateArgumentPackExpansionPattern(ArgLoc, Ellipsis,
13479                                                           OrigNumExpansions);
13480 
13481     // Substitute under the pack expansion. Do not expand the pack (yet).
13482     TemplateArgumentLoc OutPattern;
13483     Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
13484     if (getDerived().TransformTemplateArgument(Pattern, OutPattern,
13485                                                /*Uneval*/ true))
13486       return true;
13487 
13488     // See if we can determine the number of arguments from the result.
13489     Optional<unsigned> NumExpansions =
13490         getSema().getFullyPackExpandedSize(OutPattern.getArgument());
13491     if (!NumExpansions) {
13492       // No: we must be in an alias template expansion, and we're going to need
13493       // to actually expand the packs.
13494       Result = None;
13495       break;
13496     }
13497 
13498     Result = *Result + *NumExpansions;
13499   }
13500 
13501   // Common case: we could determine the number of expansions without
13502   // substituting.
13503   if (Result)
13504     return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(),
13505                                               E->getPackLoc(),
13506                                               E->getRParenLoc(), *Result, None);
13507 
13508   TemplateArgumentListInfo TransformedPackArgs(E->getPackLoc(),
13509                                                E->getPackLoc());
13510   {
13511     TemporaryBase Rebase(*this, E->getPackLoc(), getBaseEntity());
13512     typedef TemplateArgumentLocInventIterator<
13513         Derived, const TemplateArgument*> PackLocIterator;
13514     if (TransformTemplateArguments(PackLocIterator(*this, PackArgs.begin()),
13515                                    PackLocIterator(*this, PackArgs.end()),
13516                                    TransformedPackArgs, /*Uneval*/true))
13517       return ExprError();
13518   }
13519 
13520   // Check whether we managed to fully-expand the pack.
13521   // FIXME: Is it possible for us to do so and not hit the early exit path?
13522   SmallVector<TemplateArgument, 8> Args;
13523   bool PartialSubstitution = false;
13524   for (auto &Loc : TransformedPackArgs.arguments()) {
13525     Args.push_back(Loc.getArgument());
13526     if (Loc.getArgument().isPackExpansion())
13527       PartialSubstitution = true;
13528   }
13529 
13530   if (PartialSubstitution)
13531     return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(),
13532                                               E->getPackLoc(),
13533                                               E->getRParenLoc(), None, Args);
13534 
13535   return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(),
13536                                             E->getPackLoc(), E->getRParenLoc(),
13537                                             Args.size(), None);
13538 }
13539 
13540 template<typename Derived>
13541 ExprResult
13542 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmPackExpr(
13543                                           SubstNonTypeTemplateParmPackExpr *E) {
13544   // Default behavior is to do nothing with this transformation.
13545   return E;
13546 }
13547 
13548 template<typename Derived>
13549 ExprResult
13550 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmExpr(
13551                                           SubstNonTypeTemplateParmExpr *E) {
13552   // Default behavior is to do nothing with this transformation.
13553   return E;
13554 }
13555 
13556 template<typename Derived>
13557 ExprResult
13558 TreeTransform<Derived>::TransformFunctionParmPackExpr(FunctionParmPackExpr *E) {
13559   // Default behavior is to do nothing with this transformation.
13560   return E;
13561 }
13562 
13563 template<typename Derived>
13564 ExprResult
13565 TreeTransform<Derived>::TransformMaterializeTemporaryExpr(
13566                                                   MaterializeTemporaryExpr *E) {
13567   return getDerived().TransformExpr(E->getSubExpr());
13568 }
13569 
13570 template<typename Derived>
13571 ExprResult
13572 TreeTransform<Derived>::TransformCXXFoldExpr(CXXFoldExpr *E) {
13573   UnresolvedLookupExpr *Callee = nullptr;
13574   if (Expr *OldCallee = E->getCallee()) {
13575     ExprResult CalleeResult = getDerived().TransformExpr(OldCallee);
13576     if (CalleeResult.isInvalid())
13577       return ExprError();
13578     Callee = cast<UnresolvedLookupExpr>(CalleeResult.get());
13579   }
13580 
13581   Expr *Pattern = E->getPattern();
13582 
13583   SmallVector<UnexpandedParameterPack, 2> Unexpanded;
13584   getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
13585   assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
13586 
13587   // Determine whether the set of unexpanded parameter packs can and should
13588   // be expanded.
13589   bool Expand = true;
13590   bool RetainExpansion = false;
13591   Optional<unsigned> OrigNumExpansions = E->getNumExpansions(),
13592                      NumExpansions = OrigNumExpansions;
13593   if (getDerived().TryExpandParameterPacks(E->getEllipsisLoc(),
13594                                            Pattern->getSourceRange(),
13595                                            Unexpanded,
13596                                            Expand, RetainExpansion,
13597                                            NumExpansions))
13598     return true;
13599 
13600   if (!Expand) {
13601     // Do not expand any packs here, just transform and rebuild a fold
13602     // expression.
13603     Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
13604 
13605     ExprResult LHS =
13606         E->getLHS() ? getDerived().TransformExpr(E->getLHS()) : ExprResult();
13607     if (LHS.isInvalid())
13608       return true;
13609 
13610     ExprResult RHS =
13611         E->getRHS() ? getDerived().TransformExpr(E->getRHS()) : ExprResult();
13612     if (RHS.isInvalid())
13613       return true;
13614 
13615     if (!getDerived().AlwaysRebuild() &&
13616         LHS.get() == E->getLHS() && RHS.get() == E->getRHS())
13617       return E;
13618 
13619     return getDerived().RebuildCXXFoldExpr(
13620         Callee, E->getBeginLoc(), LHS.get(), E->getOperator(),
13621         E->getEllipsisLoc(), RHS.get(), E->getEndLoc(), NumExpansions);
13622   }
13623 
13624   // Formally a fold expression expands to nested parenthesized expressions.
13625   // Enforce this limit to avoid creating trees so deep we can't safely traverse
13626   // them.
13627   if (NumExpansions && SemaRef.getLangOpts().BracketDepth < NumExpansions) {
13628     SemaRef.Diag(E->getEllipsisLoc(),
13629                  clang::diag::err_fold_expression_limit_exceeded)
13630         << *NumExpansions << SemaRef.getLangOpts().BracketDepth
13631         << E->getSourceRange();
13632     SemaRef.Diag(E->getEllipsisLoc(), diag::note_bracket_depth);
13633     return ExprError();
13634   }
13635 
13636   // The transform has determined that we should perform an elementwise
13637   // expansion of the pattern. Do so.
13638   ExprResult Result = getDerived().TransformExpr(E->getInit());
13639   if (Result.isInvalid())
13640     return true;
13641   bool LeftFold = E->isLeftFold();
13642 
13643   // If we're retaining an expansion for a right fold, it is the innermost
13644   // component and takes the init (if any).
13645   if (!LeftFold && RetainExpansion) {
13646     ForgetPartiallySubstitutedPackRAII Forget(getDerived());
13647 
13648     ExprResult Out = getDerived().TransformExpr(Pattern);
13649     if (Out.isInvalid())
13650       return true;
13651 
13652     Result = getDerived().RebuildCXXFoldExpr(
13653         Callee, E->getBeginLoc(), Out.get(), E->getOperator(),
13654         E->getEllipsisLoc(), Result.get(), E->getEndLoc(), OrigNumExpansions);
13655     if (Result.isInvalid())
13656       return true;
13657   }
13658 
13659   for (unsigned I = 0; I != *NumExpansions; ++I) {
13660     Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(
13661         getSema(), LeftFold ? I : *NumExpansions - I - 1);
13662     ExprResult Out = getDerived().TransformExpr(Pattern);
13663     if (Out.isInvalid())
13664       return true;
13665 
13666     if (Out.get()->containsUnexpandedParameterPack()) {
13667       // We still have a pack; retain a pack expansion for this slice.
13668       Result = getDerived().RebuildCXXFoldExpr(
13669           Callee, E->getBeginLoc(), LeftFold ? Result.get() : Out.get(),
13670           E->getOperator(), E->getEllipsisLoc(),
13671           LeftFold ? Out.get() : Result.get(), E->getEndLoc(),
13672           OrigNumExpansions);
13673     } else if (Result.isUsable()) {
13674       // We've got down to a single element; build a binary operator.
13675       Expr *LHS = LeftFold ? Result.get() : Out.get();
13676       Expr *RHS = LeftFold ? Out.get() : Result.get();
13677       if (Callee)
13678         Result = getDerived().RebuildCXXOperatorCallExpr(
13679             BinaryOperator::getOverloadedOperator(E->getOperator()),
13680             E->getEllipsisLoc(), Callee, LHS, RHS);
13681       else
13682         Result = getDerived().RebuildBinaryOperator(E->getEllipsisLoc(),
13683                                                     E->getOperator(), LHS, RHS);
13684     } else
13685       Result = Out;
13686 
13687     if (Result.isInvalid())
13688       return true;
13689   }
13690 
13691   // If we're retaining an expansion for a left fold, it is the outermost
13692   // component and takes the complete expansion so far as its init (if any).
13693   if (LeftFold && RetainExpansion) {
13694     ForgetPartiallySubstitutedPackRAII Forget(getDerived());
13695 
13696     ExprResult Out = getDerived().TransformExpr(Pattern);
13697     if (Out.isInvalid())
13698       return true;
13699 
13700     Result = getDerived().RebuildCXXFoldExpr(
13701         Callee, E->getBeginLoc(), Result.get(), E->getOperator(),
13702         E->getEllipsisLoc(), Out.get(), E->getEndLoc(), OrigNumExpansions);
13703     if (Result.isInvalid())
13704       return true;
13705   }
13706 
13707   // If we had no init and an empty pack, and we're not retaining an expansion,
13708   // then produce a fallback value or error.
13709   if (Result.isUnset())
13710     return getDerived().RebuildEmptyCXXFoldExpr(E->getEllipsisLoc(),
13711                                                 E->getOperator());
13712 
13713   return Result;
13714 }
13715 
13716 template<typename Derived>
13717 ExprResult
13718 TreeTransform<Derived>::TransformCXXStdInitializerListExpr(
13719     CXXStdInitializerListExpr *E) {
13720   return getDerived().TransformExpr(E->getSubExpr());
13721 }
13722 
13723 template<typename Derived>
13724 ExprResult
13725 TreeTransform<Derived>::TransformObjCStringLiteral(ObjCStringLiteral *E) {
13726   return SemaRef.MaybeBindToTemporary(E);
13727 }
13728 
13729 template<typename Derived>
13730 ExprResult
13731 TreeTransform<Derived>::TransformObjCBoolLiteralExpr(ObjCBoolLiteralExpr *E) {
13732   return E;
13733 }
13734 
13735 template<typename Derived>
13736 ExprResult
13737 TreeTransform<Derived>::TransformObjCBoxedExpr(ObjCBoxedExpr *E) {
13738   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
13739   if (SubExpr.isInvalid())
13740     return ExprError();
13741 
13742   if (!getDerived().AlwaysRebuild() &&
13743       SubExpr.get() == E->getSubExpr())
13744     return E;
13745 
13746   return getDerived().RebuildObjCBoxedExpr(E->getSourceRange(), SubExpr.get());
13747 }
13748 
13749 template<typename Derived>
13750 ExprResult
13751 TreeTransform<Derived>::TransformObjCArrayLiteral(ObjCArrayLiteral *E) {
13752   // Transform each of the elements.
13753   SmallVector<Expr *, 8> Elements;
13754   bool ArgChanged = false;
13755   if (getDerived().TransformExprs(E->getElements(), E->getNumElements(),
13756                                   /*IsCall=*/false, Elements, &ArgChanged))
13757     return ExprError();
13758 
13759   if (!getDerived().AlwaysRebuild() && !ArgChanged)
13760     return SemaRef.MaybeBindToTemporary(E);
13761 
13762   return getDerived().RebuildObjCArrayLiteral(E->getSourceRange(),
13763                                               Elements.data(),
13764                                               Elements.size());
13765 }
13766 
13767 template<typename Derived>
13768 ExprResult
13769 TreeTransform<Derived>::TransformObjCDictionaryLiteral(
13770                                                     ObjCDictionaryLiteral *E) {
13771   // Transform each of the elements.
13772   SmallVector<ObjCDictionaryElement, 8> Elements;
13773   bool ArgChanged = false;
13774   for (unsigned I = 0, N = E->getNumElements(); I != N; ++I) {
13775     ObjCDictionaryElement OrigElement = E->getKeyValueElement(I);
13776 
13777     if (OrigElement.isPackExpansion()) {
13778       // This key/value element is a pack expansion.
13779       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
13780       getSema().collectUnexpandedParameterPacks(OrigElement.Key, Unexpanded);
13781       getSema().collectUnexpandedParameterPacks(OrigElement.Value, Unexpanded);
13782       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
13783 
13784       // Determine whether the set of unexpanded parameter packs can
13785       // and should be expanded.
13786       bool Expand = true;
13787       bool RetainExpansion = false;
13788       Optional<unsigned> OrigNumExpansions = OrigElement.NumExpansions;
13789       Optional<unsigned> NumExpansions = OrigNumExpansions;
13790       SourceRange PatternRange(OrigElement.Key->getBeginLoc(),
13791                                OrigElement.Value->getEndLoc());
13792       if (getDerived().TryExpandParameterPacks(OrigElement.EllipsisLoc,
13793                                                PatternRange, Unexpanded, Expand,
13794                                                RetainExpansion, NumExpansions))
13795         return ExprError();
13796 
13797       if (!Expand) {
13798         // The transform has determined that we should perform a simple
13799         // transformation on the pack expansion, producing another pack
13800         // expansion.
13801         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
13802         ExprResult Key = getDerived().TransformExpr(OrigElement.Key);
13803         if (Key.isInvalid())
13804           return ExprError();
13805 
13806         if (Key.get() != OrigElement.Key)
13807           ArgChanged = true;
13808 
13809         ExprResult Value = getDerived().TransformExpr(OrigElement.Value);
13810         if (Value.isInvalid())
13811           return ExprError();
13812 
13813         if (Value.get() != OrigElement.Value)
13814           ArgChanged = true;
13815 
13816         ObjCDictionaryElement Expansion = {
13817           Key.get(), Value.get(), OrigElement.EllipsisLoc, NumExpansions
13818         };
13819         Elements.push_back(Expansion);
13820         continue;
13821       }
13822 
13823       // Record right away that the argument was changed.  This needs
13824       // to happen even if the array expands to nothing.
13825       ArgChanged = true;
13826 
13827       // The transform has determined that we should perform an elementwise
13828       // expansion of the pattern. Do so.
13829       for (unsigned I = 0; I != *NumExpansions; ++I) {
13830         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
13831         ExprResult Key = getDerived().TransformExpr(OrigElement.Key);
13832         if (Key.isInvalid())
13833           return ExprError();
13834 
13835         ExprResult Value = getDerived().TransformExpr(OrigElement.Value);
13836         if (Value.isInvalid())
13837           return ExprError();
13838 
13839         ObjCDictionaryElement Element = {
13840           Key.get(), Value.get(), SourceLocation(), NumExpansions
13841         };
13842 
13843         // If any unexpanded parameter packs remain, we still have a
13844         // pack expansion.
13845         // FIXME: Can this really happen?
13846         if (Key.get()->containsUnexpandedParameterPack() ||
13847             Value.get()->containsUnexpandedParameterPack())
13848           Element.EllipsisLoc = OrigElement.EllipsisLoc;
13849 
13850         Elements.push_back(Element);
13851       }
13852 
13853       // FIXME: Retain a pack expansion if RetainExpansion is true.
13854 
13855       // We've finished with this pack expansion.
13856       continue;
13857     }
13858 
13859     // Transform and check key.
13860     ExprResult Key = getDerived().TransformExpr(OrigElement.Key);
13861     if (Key.isInvalid())
13862       return ExprError();
13863 
13864     if (Key.get() != OrigElement.Key)
13865       ArgChanged = true;
13866 
13867     // Transform and check value.
13868     ExprResult Value
13869       = getDerived().TransformExpr(OrigElement.Value);
13870     if (Value.isInvalid())
13871       return ExprError();
13872 
13873     if (Value.get() != OrigElement.Value)
13874       ArgChanged = true;
13875 
13876     ObjCDictionaryElement Element = {
13877       Key.get(), Value.get(), SourceLocation(), None
13878     };
13879     Elements.push_back(Element);
13880   }
13881 
13882   if (!getDerived().AlwaysRebuild() && !ArgChanged)
13883     return SemaRef.MaybeBindToTemporary(E);
13884 
13885   return getDerived().RebuildObjCDictionaryLiteral(E->getSourceRange(),
13886                                                    Elements);
13887 }
13888 
13889 template<typename Derived>
13890 ExprResult
13891 TreeTransform<Derived>::TransformObjCEncodeExpr(ObjCEncodeExpr *E) {
13892   TypeSourceInfo *EncodedTypeInfo
13893     = getDerived().TransformType(E->getEncodedTypeSourceInfo());
13894   if (!EncodedTypeInfo)
13895     return ExprError();
13896 
13897   if (!getDerived().AlwaysRebuild() &&
13898       EncodedTypeInfo == E->getEncodedTypeSourceInfo())
13899     return E;
13900 
13901   return getDerived().RebuildObjCEncodeExpr(E->getAtLoc(),
13902                                             EncodedTypeInfo,
13903                                             E->getRParenLoc());
13904 }
13905 
13906 template<typename Derived>
13907 ExprResult TreeTransform<Derived>::
13908 TransformObjCIndirectCopyRestoreExpr(ObjCIndirectCopyRestoreExpr *E) {
13909   // This is a kind of implicit conversion, and it needs to get dropped
13910   // and recomputed for the same general reasons that ImplicitCastExprs
13911   // do, as well a more specific one: this expression is only valid when
13912   // it appears *immediately* as an argument expression.
13913   return getDerived().TransformExpr(E->getSubExpr());
13914 }
13915 
13916 template<typename Derived>
13917 ExprResult TreeTransform<Derived>::
13918 TransformObjCBridgedCastExpr(ObjCBridgedCastExpr *E) {
13919   TypeSourceInfo *TSInfo
13920     = getDerived().TransformType(E->getTypeInfoAsWritten());
13921   if (!TSInfo)
13922     return ExprError();
13923 
13924   ExprResult Result = getDerived().TransformExpr(E->getSubExpr());
13925   if (Result.isInvalid())
13926     return ExprError();
13927 
13928   if (!getDerived().AlwaysRebuild() &&
13929       TSInfo == E->getTypeInfoAsWritten() &&
13930       Result.get() == E->getSubExpr())
13931     return E;
13932 
13933   return SemaRef.BuildObjCBridgedCast(E->getLParenLoc(), E->getBridgeKind(),
13934                                       E->getBridgeKeywordLoc(), TSInfo,
13935                                       Result.get());
13936 }
13937 
13938 template <typename Derived>
13939 ExprResult TreeTransform<Derived>::TransformObjCAvailabilityCheckExpr(
13940     ObjCAvailabilityCheckExpr *E) {
13941   return E;
13942 }
13943 
13944 template<typename Derived>
13945 ExprResult
13946 TreeTransform<Derived>::TransformObjCMessageExpr(ObjCMessageExpr *E) {
13947   // Transform arguments.
13948   bool ArgChanged = false;
13949   SmallVector<Expr*, 8> Args;
13950   Args.reserve(E->getNumArgs());
13951   if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), false, Args,
13952                                   &ArgChanged))
13953     return ExprError();
13954 
13955   if (E->getReceiverKind() == ObjCMessageExpr::Class) {
13956     // Class message: transform the receiver type.
13957     TypeSourceInfo *ReceiverTypeInfo
13958       = getDerived().TransformType(E->getClassReceiverTypeInfo());
13959     if (!ReceiverTypeInfo)
13960       return ExprError();
13961 
13962     // If nothing changed, just retain the existing message send.
13963     if (!getDerived().AlwaysRebuild() &&
13964         ReceiverTypeInfo == E->getClassReceiverTypeInfo() && !ArgChanged)
13965       return SemaRef.MaybeBindToTemporary(E);
13966 
13967     // Build a new class message send.
13968     SmallVector<SourceLocation, 16> SelLocs;
13969     E->getSelectorLocs(SelLocs);
13970     return getDerived().RebuildObjCMessageExpr(ReceiverTypeInfo,
13971                                                E->getSelector(),
13972                                                SelLocs,
13973                                                E->getMethodDecl(),
13974                                                E->getLeftLoc(),
13975                                                Args,
13976                                                E->getRightLoc());
13977   }
13978   else if (E->getReceiverKind() == ObjCMessageExpr::SuperClass ||
13979            E->getReceiverKind() == ObjCMessageExpr::SuperInstance) {
13980     if (!E->getMethodDecl())
13981       return ExprError();
13982 
13983     // Build a new class message send to 'super'.
13984     SmallVector<SourceLocation, 16> SelLocs;
13985     E->getSelectorLocs(SelLocs);
13986     return getDerived().RebuildObjCMessageExpr(E->getSuperLoc(),
13987                                                E->getSelector(),
13988                                                SelLocs,
13989                                                E->getReceiverType(),
13990                                                E->getMethodDecl(),
13991                                                E->getLeftLoc(),
13992                                                Args,
13993                                                E->getRightLoc());
13994   }
13995 
13996   // Instance message: transform the receiver
13997   assert(E->getReceiverKind() == ObjCMessageExpr::Instance &&
13998          "Only class and instance messages may be instantiated");
13999   ExprResult Receiver
14000     = getDerived().TransformExpr(E->getInstanceReceiver());
14001   if (Receiver.isInvalid())
14002     return ExprError();
14003 
14004   // If nothing changed, just retain the existing message send.
14005   if (!getDerived().AlwaysRebuild() &&
14006       Receiver.get() == E->getInstanceReceiver() && !ArgChanged)
14007     return SemaRef.MaybeBindToTemporary(E);
14008 
14009   // Build a new instance message send.
14010   SmallVector<SourceLocation, 16> SelLocs;
14011   E->getSelectorLocs(SelLocs);
14012   return getDerived().RebuildObjCMessageExpr(Receiver.get(),
14013                                              E->getSelector(),
14014                                              SelLocs,
14015                                              E->getMethodDecl(),
14016                                              E->getLeftLoc(),
14017                                              Args,
14018                                              E->getRightLoc());
14019 }
14020 
14021 template<typename Derived>
14022 ExprResult
14023 TreeTransform<Derived>::TransformObjCSelectorExpr(ObjCSelectorExpr *E) {
14024   return E;
14025 }
14026 
14027 template<typename Derived>
14028 ExprResult
14029 TreeTransform<Derived>::TransformObjCProtocolExpr(ObjCProtocolExpr *E) {
14030   return E;
14031 }
14032 
14033 template<typename Derived>
14034 ExprResult
14035 TreeTransform<Derived>::TransformObjCIvarRefExpr(ObjCIvarRefExpr *E) {
14036   // Transform the base expression.
14037   ExprResult Base = getDerived().TransformExpr(E->getBase());
14038   if (Base.isInvalid())
14039     return ExprError();
14040 
14041   // We don't need to transform the ivar; it will never change.
14042 
14043   // If nothing changed, just retain the existing expression.
14044   if (!getDerived().AlwaysRebuild() &&
14045       Base.get() == E->getBase())
14046     return E;
14047 
14048   return getDerived().RebuildObjCIvarRefExpr(Base.get(), E->getDecl(),
14049                                              E->getLocation(),
14050                                              E->isArrow(), E->isFreeIvar());
14051 }
14052 
14053 template<typename Derived>
14054 ExprResult
14055 TreeTransform<Derived>::TransformObjCPropertyRefExpr(ObjCPropertyRefExpr *E) {
14056   // 'super' and types never change. Property never changes. Just
14057   // retain the existing expression.
14058   if (!E->isObjectReceiver())
14059     return E;
14060 
14061   // Transform the base expression.
14062   ExprResult Base = getDerived().TransformExpr(E->getBase());
14063   if (Base.isInvalid())
14064     return ExprError();
14065 
14066   // We don't need to transform the property; it will never change.
14067 
14068   // If nothing changed, just retain the existing expression.
14069   if (!getDerived().AlwaysRebuild() &&
14070       Base.get() == E->getBase())
14071     return E;
14072 
14073   if (E->isExplicitProperty())
14074     return getDerived().RebuildObjCPropertyRefExpr(Base.get(),
14075                                                    E->getExplicitProperty(),
14076                                                    E->getLocation());
14077 
14078   return getDerived().RebuildObjCPropertyRefExpr(Base.get(),
14079                                                  SemaRef.Context.PseudoObjectTy,
14080                                                  E->getImplicitPropertyGetter(),
14081                                                  E->getImplicitPropertySetter(),
14082                                                  E->getLocation());
14083 }
14084 
14085 template<typename Derived>
14086 ExprResult
14087 TreeTransform<Derived>::TransformObjCSubscriptRefExpr(ObjCSubscriptRefExpr *E) {
14088   // Transform the base expression.
14089   ExprResult Base = getDerived().TransformExpr(E->getBaseExpr());
14090   if (Base.isInvalid())
14091     return ExprError();
14092 
14093   // Transform the key expression.
14094   ExprResult Key = getDerived().TransformExpr(E->getKeyExpr());
14095   if (Key.isInvalid())
14096     return ExprError();
14097 
14098   // If nothing changed, just retain the existing expression.
14099   if (!getDerived().AlwaysRebuild() &&
14100       Key.get() == E->getKeyExpr() && Base.get() == E->getBaseExpr())
14101     return E;
14102 
14103   return getDerived().RebuildObjCSubscriptRefExpr(E->getRBracket(),
14104                                                   Base.get(), Key.get(),
14105                                                   E->getAtIndexMethodDecl(),
14106                                                   E->setAtIndexMethodDecl());
14107 }
14108 
14109 template<typename Derived>
14110 ExprResult
14111 TreeTransform<Derived>::TransformObjCIsaExpr(ObjCIsaExpr *E) {
14112   // Transform the base expression.
14113   ExprResult Base = getDerived().TransformExpr(E->getBase());
14114   if (Base.isInvalid())
14115     return ExprError();
14116 
14117   // If nothing changed, just retain the existing expression.
14118   if (!getDerived().AlwaysRebuild() &&
14119       Base.get() == E->getBase())
14120     return E;
14121 
14122   return getDerived().RebuildObjCIsaExpr(Base.get(), E->getIsaMemberLoc(),
14123                                          E->getOpLoc(),
14124                                          E->isArrow());
14125 }
14126 
14127 template<typename Derived>
14128 ExprResult
14129 TreeTransform<Derived>::TransformShuffleVectorExpr(ShuffleVectorExpr *E) {
14130   bool ArgumentChanged = false;
14131   SmallVector<Expr*, 8> SubExprs;
14132   SubExprs.reserve(E->getNumSubExprs());
14133   if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false,
14134                                   SubExprs, &ArgumentChanged))
14135     return ExprError();
14136 
14137   if (!getDerived().AlwaysRebuild() &&
14138       !ArgumentChanged)
14139     return E;
14140 
14141   return getDerived().RebuildShuffleVectorExpr(E->getBuiltinLoc(),
14142                                                SubExprs,
14143                                                E->getRParenLoc());
14144 }
14145 
14146 template<typename Derived>
14147 ExprResult
14148 TreeTransform<Derived>::TransformConvertVectorExpr(ConvertVectorExpr *E) {
14149   ExprResult SrcExpr = getDerived().TransformExpr(E->getSrcExpr());
14150   if (SrcExpr.isInvalid())
14151     return ExprError();
14152 
14153   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo());
14154   if (!Type)
14155     return ExprError();
14156 
14157   if (!getDerived().AlwaysRebuild() &&
14158       Type == E->getTypeSourceInfo() &&
14159       SrcExpr.get() == E->getSrcExpr())
14160     return E;
14161 
14162   return getDerived().RebuildConvertVectorExpr(E->getBuiltinLoc(),
14163                                                SrcExpr.get(), Type,
14164                                                E->getRParenLoc());
14165 }
14166 
14167 template<typename Derived>
14168 ExprResult
14169 TreeTransform<Derived>::TransformBlockExpr(BlockExpr *E) {
14170   BlockDecl *oldBlock = E->getBlockDecl();
14171 
14172   SemaRef.ActOnBlockStart(E->getCaretLocation(), /*Scope=*/nullptr);
14173   BlockScopeInfo *blockScope = SemaRef.getCurBlock();
14174 
14175   blockScope->TheDecl->setIsVariadic(oldBlock->isVariadic());
14176   blockScope->TheDecl->setBlockMissingReturnType(
14177                          oldBlock->blockMissingReturnType());
14178 
14179   SmallVector<ParmVarDecl*, 4> params;
14180   SmallVector<QualType, 4> paramTypes;
14181 
14182   const FunctionProtoType *exprFunctionType = E->getFunctionType();
14183 
14184   // Parameter substitution.
14185   Sema::ExtParameterInfoBuilder extParamInfos;
14186   if (getDerived().TransformFunctionTypeParams(
14187           E->getCaretLocation(), oldBlock->parameters(), nullptr,
14188           exprFunctionType->getExtParameterInfosOrNull(), paramTypes, &params,
14189           extParamInfos)) {
14190     getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr);
14191     return ExprError();
14192   }
14193 
14194   QualType exprResultType =
14195       getDerived().TransformType(exprFunctionType->getReturnType());
14196 
14197   auto epi = exprFunctionType->getExtProtoInfo();
14198   epi.ExtParameterInfos = extParamInfos.getPointerOrNull(paramTypes.size());
14199 
14200   QualType functionType =
14201     getDerived().RebuildFunctionProtoType(exprResultType, paramTypes, epi);
14202   blockScope->FunctionType = functionType;
14203 
14204   // Set the parameters on the block decl.
14205   if (!params.empty())
14206     blockScope->TheDecl->setParams(params);
14207 
14208   if (!oldBlock->blockMissingReturnType()) {
14209     blockScope->HasImplicitReturnType = false;
14210     blockScope->ReturnType = exprResultType;
14211   }
14212 
14213   // Transform the body
14214   StmtResult body = getDerived().TransformStmt(E->getBody());
14215   if (body.isInvalid()) {
14216     getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr);
14217     return ExprError();
14218   }
14219 
14220 #ifndef NDEBUG
14221   // In builds with assertions, make sure that we captured everything we
14222   // captured before.
14223   if (!SemaRef.getDiagnostics().hasErrorOccurred()) {
14224     for (const auto &I : oldBlock->captures()) {
14225       VarDecl *oldCapture = I.getVariable();
14226 
14227       // Ignore parameter packs.
14228       if (oldCapture->isParameterPack())
14229         continue;
14230 
14231       VarDecl *newCapture =
14232         cast<VarDecl>(getDerived().TransformDecl(E->getCaretLocation(),
14233                                                  oldCapture));
14234       assert(blockScope->CaptureMap.count(newCapture));
14235     }
14236     assert(oldBlock->capturesCXXThis() == blockScope->isCXXThisCaptured());
14237   }
14238 #endif
14239 
14240   return SemaRef.ActOnBlockStmtExpr(E->getCaretLocation(), body.get(),
14241                                     /*Scope=*/nullptr);
14242 }
14243 
14244 template<typename Derived>
14245 ExprResult
14246 TreeTransform<Derived>::TransformAsTypeExpr(AsTypeExpr *E) {
14247   ExprResult SrcExpr = getDerived().TransformExpr(E->getSrcExpr());
14248   if (SrcExpr.isInvalid())
14249     return ExprError();
14250 
14251   QualType Type = getDerived().TransformType(E->getType());
14252 
14253   return SemaRef.BuildAsTypeExpr(SrcExpr.get(), Type, E->getBuiltinLoc(),
14254                                  E->getRParenLoc());
14255 }
14256 
14257 template<typename Derived>
14258 ExprResult
14259 TreeTransform<Derived>::TransformAtomicExpr(AtomicExpr *E) {
14260   bool ArgumentChanged = false;
14261   SmallVector<Expr*, 8> SubExprs;
14262   SubExprs.reserve(E->getNumSubExprs());
14263   if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false,
14264                                   SubExprs, &ArgumentChanged))
14265     return ExprError();
14266 
14267   if (!getDerived().AlwaysRebuild() &&
14268       !ArgumentChanged)
14269     return E;
14270 
14271   return getDerived().RebuildAtomicExpr(E->getBuiltinLoc(), SubExprs,
14272                                         E->getOp(), E->getRParenLoc());
14273 }
14274 
14275 //===----------------------------------------------------------------------===//
14276 // Type reconstruction
14277 //===----------------------------------------------------------------------===//
14278 
14279 template<typename Derived>
14280 QualType TreeTransform<Derived>::RebuildPointerType(QualType PointeeType,
14281                                                     SourceLocation Star) {
14282   return SemaRef.BuildPointerType(PointeeType, Star,
14283                                   getDerived().getBaseEntity());
14284 }
14285 
14286 template<typename Derived>
14287 QualType TreeTransform<Derived>::RebuildBlockPointerType(QualType PointeeType,
14288                                                          SourceLocation Star) {
14289   return SemaRef.BuildBlockPointerType(PointeeType, Star,
14290                                        getDerived().getBaseEntity());
14291 }
14292 
14293 template<typename Derived>
14294 QualType
14295 TreeTransform<Derived>::RebuildReferenceType(QualType ReferentType,
14296                                              bool WrittenAsLValue,
14297                                              SourceLocation Sigil) {
14298   return SemaRef.BuildReferenceType(ReferentType, WrittenAsLValue,
14299                                     Sigil, getDerived().getBaseEntity());
14300 }
14301 
14302 template<typename Derived>
14303 QualType
14304 TreeTransform<Derived>::RebuildMemberPointerType(QualType PointeeType,
14305                                                  QualType ClassType,
14306                                                  SourceLocation Sigil) {
14307   return SemaRef.BuildMemberPointerType(PointeeType, ClassType, Sigil,
14308                                         getDerived().getBaseEntity());
14309 }
14310 
14311 template<typename Derived>
14312 QualType TreeTransform<Derived>::RebuildObjCTypeParamType(
14313            const ObjCTypeParamDecl *Decl,
14314            SourceLocation ProtocolLAngleLoc,
14315            ArrayRef<ObjCProtocolDecl *> Protocols,
14316            ArrayRef<SourceLocation> ProtocolLocs,
14317            SourceLocation ProtocolRAngleLoc) {
14318   return SemaRef.BuildObjCTypeParamType(Decl,
14319                                         ProtocolLAngleLoc, Protocols,
14320                                         ProtocolLocs, ProtocolRAngleLoc,
14321                                         /*FailOnError=*/true);
14322 }
14323 
14324 template<typename Derived>
14325 QualType TreeTransform<Derived>::RebuildObjCObjectType(
14326            QualType BaseType,
14327            SourceLocation Loc,
14328            SourceLocation TypeArgsLAngleLoc,
14329            ArrayRef<TypeSourceInfo *> TypeArgs,
14330            SourceLocation TypeArgsRAngleLoc,
14331            SourceLocation ProtocolLAngleLoc,
14332            ArrayRef<ObjCProtocolDecl *> Protocols,
14333            ArrayRef<SourceLocation> ProtocolLocs,
14334            SourceLocation ProtocolRAngleLoc) {
14335   return SemaRef.BuildObjCObjectType(BaseType, Loc, TypeArgsLAngleLoc,
14336                                      TypeArgs, TypeArgsRAngleLoc,
14337                                      ProtocolLAngleLoc, Protocols, ProtocolLocs,
14338                                      ProtocolRAngleLoc,
14339                                      /*FailOnError=*/true);
14340 }
14341 
14342 template<typename Derived>
14343 QualType TreeTransform<Derived>::RebuildObjCObjectPointerType(
14344            QualType PointeeType,
14345            SourceLocation Star) {
14346   return SemaRef.Context.getObjCObjectPointerType(PointeeType);
14347 }
14348 
14349 template<typename Derived>
14350 QualType
14351 TreeTransform<Derived>::RebuildArrayType(QualType ElementType,
14352                                          ArrayType::ArraySizeModifier SizeMod,
14353                                          const llvm::APInt *Size,
14354                                          Expr *SizeExpr,
14355                                          unsigned IndexTypeQuals,
14356                                          SourceRange BracketsRange) {
14357   if (SizeExpr || !Size)
14358     return SemaRef.BuildArrayType(ElementType, SizeMod, SizeExpr,
14359                                   IndexTypeQuals, BracketsRange,
14360                                   getDerived().getBaseEntity());
14361 
14362   QualType Types[] = {
14363     SemaRef.Context.UnsignedCharTy, SemaRef.Context.UnsignedShortTy,
14364     SemaRef.Context.UnsignedIntTy, SemaRef.Context.UnsignedLongTy,
14365     SemaRef.Context.UnsignedLongLongTy, SemaRef.Context.UnsignedInt128Ty
14366   };
14367   const unsigned NumTypes = llvm::array_lengthof(Types);
14368   QualType SizeType;
14369   for (unsigned I = 0; I != NumTypes; ++I)
14370     if (Size->getBitWidth() == SemaRef.Context.getIntWidth(Types[I])) {
14371       SizeType = Types[I];
14372       break;
14373     }
14374 
14375   // Note that we can return a VariableArrayType here in the case where
14376   // the element type was a dependent VariableArrayType.
14377   IntegerLiteral *ArraySize
14378       = IntegerLiteral::Create(SemaRef.Context, *Size, SizeType,
14379                                /*FIXME*/BracketsRange.getBegin());
14380   return SemaRef.BuildArrayType(ElementType, SizeMod, ArraySize,
14381                                 IndexTypeQuals, BracketsRange,
14382                                 getDerived().getBaseEntity());
14383 }
14384 
14385 template<typename Derived>
14386 QualType
14387 TreeTransform<Derived>::RebuildConstantArrayType(QualType ElementType,
14388                                                  ArrayType::ArraySizeModifier SizeMod,
14389                                                  const llvm::APInt &Size,
14390                                                  Expr *SizeExpr,
14391                                                  unsigned IndexTypeQuals,
14392                                                  SourceRange BracketsRange) {
14393   return getDerived().RebuildArrayType(ElementType, SizeMod, &Size, SizeExpr,
14394                                         IndexTypeQuals, BracketsRange);
14395 }
14396 
14397 template<typename Derived>
14398 QualType
14399 TreeTransform<Derived>::RebuildIncompleteArrayType(QualType ElementType,
14400                                           ArrayType::ArraySizeModifier SizeMod,
14401                                                  unsigned IndexTypeQuals,
14402                                                    SourceRange BracketsRange) {
14403   return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr, nullptr,
14404                                        IndexTypeQuals, BracketsRange);
14405 }
14406 
14407 template<typename Derived>
14408 QualType
14409 TreeTransform<Derived>::RebuildVariableArrayType(QualType ElementType,
14410                                           ArrayType::ArraySizeModifier SizeMod,
14411                                                  Expr *SizeExpr,
14412                                                  unsigned IndexTypeQuals,
14413                                                  SourceRange BracketsRange) {
14414   return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr,
14415                                        SizeExpr,
14416                                        IndexTypeQuals, BracketsRange);
14417 }
14418 
14419 template<typename Derived>
14420 QualType
14421 TreeTransform<Derived>::RebuildDependentSizedArrayType(QualType ElementType,
14422                                           ArrayType::ArraySizeModifier SizeMod,
14423                                                        Expr *SizeExpr,
14424                                                        unsigned IndexTypeQuals,
14425                                                    SourceRange BracketsRange) {
14426   return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr,
14427                                        SizeExpr,
14428                                        IndexTypeQuals, BracketsRange);
14429 }
14430 
14431 template <typename Derived>
14432 QualType TreeTransform<Derived>::RebuildDependentAddressSpaceType(
14433     QualType PointeeType, Expr *AddrSpaceExpr, SourceLocation AttributeLoc) {
14434   return SemaRef.BuildAddressSpaceAttr(PointeeType, AddrSpaceExpr,
14435                                           AttributeLoc);
14436 }
14437 
14438 template <typename Derived>
14439 QualType
14440 TreeTransform<Derived>::RebuildVectorType(QualType ElementType,
14441                                           unsigned NumElements,
14442                                           VectorType::VectorKind VecKind) {
14443   // FIXME: semantic checking!
14444   return SemaRef.Context.getVectorType(ElementType, NumElements, VecKind);
14445 }
14446 
14447 template <typename Derived>
14448 QualType TreeTransform<Derived>::RebuildDependentVectorType(
14449     QualType ElementType, Expr *SizeExpr, SourceLocation AttributeLoc,
14450     VectorType::VectorKind VecKind) {
14451   return SemaRef.BuildVectorType(ElementType, SizeExpr, AttributeLoc);
14452 }
14453 
14454 template<typename Derived>
14455 QualType TreeTransform<Derived>::RebuildExtVectorType(QualType ElementType,
14456                                                       unsigned NumElements,
14457                                                  SourceLocation AttributeLoc) {
14458   llvm::APInt numElements(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy),
14459                           NumElements, true);
14460   IntegerLiteral *VectorSize
14461     = IntegerLiteral::Create(SemaRef.Context, numElements, SemaRef.Context.IntTy,
14462                              AttributeLoc);
14463   return SemaRef.BuildExtVectorType(ElementType, VectorSize, AttributeLoc);
14464 }
14465 
14466 template<typename Derived>
14467 QualType
14468 TreeTransform<Derived>::RebuildDependentSizedExtVectorType(QualType ElementType,
14469                                                            Expr *SizeExpr,
14470                                                   SourceLocation AttributeLoc) {
14471   return SemaRef.BuildExtVectorType(ElementType, SizeExpr, AttributeLoc);
14472 }
14473 
14474 template <typename Derived>
14475 QualType TreeTransform<Derived>::RebuildConstantMatrixType(
14476     QualType ElementType, unsigned NumRows, unsigned NumColumns) {
14477   return SemaRef.Context.getConstantMatrixType(ElementType, NumRows,
14478                                                NumColumns);
14479 }
14480 
14481 template <typename Derived>
14482 QualType TreeTransform<Derived>::RebuildDependentSizedMatrixType(
14483     QualType ElementType, Expr *RowExpr, Expr *ColumnExpr,
14484     SourceLocation AttributeLoc) {
14485   return SemaRef.BuildMatrixType(ElementType, RowExpr, ColumnExpr,
14486                                  AttributeLoc);
14487 }
14488 
14489 template<typename Derived>
14490 QualType TreeTransform<Derived>::RebuildFunctionProtoType(
14491     QualType T,
14492     MutableArrayRef<QualType> ParamTypes,
14493     const FunctionProtoType::ExtProtoInfo &EPI) {
14494   return SemaRef.BuildFunctionType(T, ParamTypes,
14495                                    getDerived().getBaseLocation(),
14496                                    getDerived().getBaseEntity(),
14497                                    EPI);
14498 }
14499 
14500 template<typename Derived>
14501 QualType TreeTransform<Derived>::RebuildFunctionNoProtoType(QualType T) {
14502   return SemaRef.Context.getFunctionNoProtoType(T);
14503 }
14504 
14505 template<typename Derived>
14506 QualType TreeTransform<Derived>::RebuildUnresolvedUsingType(SourceLocation Loc,
14507                                                             Decl *D) {
14508   assert(D && "no decl found");
14509   if (D->isInvalidDecl()) return QualType();
14510 
14511   // FIXME: Doesn't account for ObjCInterfaceDecl!
14512   if (auto *UPD = dyn_cast<UsingPackDecl>(D)) {
14513     // A valid resolved using typename pack expansion decl can have multiple
14514     // UsingDecls, but they must each have exactly one type, and it must be
14515     // the same type in every case. But we must have at least one expansion!
14516     if (UPD->expansions().empty()) {
14517       getSema().Diag(Loc, diag::err_using_pack_expansion_empty)
14518           << UPD->isCXXClassMember() << UPD;
14519       return QualType();
14520     }
14521 
14522     // We might still have some unresolved types. Try to pick a resolved type
14523     // if we can. The final instantiation will check that the remaining
14524     // unresolved types instantiate to the type we pick.
14525     QualType FallbackT;
14526     QualType T;
14527     for (auto *E : UPD->expansions()) {
14528       QualType ThisT = RebuildUnresolvedUsingType(Loc, E);
14529       if (ThisT.isNull())
14530         continue;
14531       else if (ThisT->getAs<UnresolvedUsingType>())
14532         FallbackT = ThisT;
14533       else if (T.isNull())
14534         T = ThisT;
14535       else
14536         assert(getSema().Context.hasSameType(ThisT, T) &&
14537                "mismatched resolved types in using pack expansion");
14538     }
14539     return T.isNull() ? FallbackT : T;
14540   } else if (auto *Using = dyn_cast<UsingDecl>(D)) {
14541     assert(Using->hasTypename() &&
14542            "UnresolvedUsingTypenameDecl transformed to non-typename using");
14543 
14544     // A valid resolved using typename decl points to exactly one type decl.
14545     assert(++Using->shadow_begin() == Using->shadow_end());
14546 
14547     UsingShadowDecl *Shadow = *Using->shadow_begin();
14548     if (SemaRef.DiagnoseUseOfDecl(Shadow->getTargetDecl(), Loc))
14549       return QualType();
14550     return SemaRef.Context.getUsingType(
14551         Shadow, SemaRef.Context.getTypeDeclType(
14552                     cast<TypeDecl>(Shadow->getTargetDecl())));
14553   } else {
14554     assert(isa<UnresolvedUsingTypenameDecl>(D) &&
14555            "UnresolvedUsingTypenameDecl transformed to non-using decl");
14556     return SemaRef.Context.getTypeDeclType(
14557         cast<UnresolvedUsingTypenameDecl>(D));
14558   }
14559 }
14560 
14561 template <typename Derived>
14562 QualType TreeTransform<Derived>::RebuildTypeOfExprType(Expr *E,
14563                                                        SourceLocation) {
14564   return SemaRef.BuildTypeofExprType(E);
14565 }
14566 
14567 template<typename Derived>
14568 QualType TreeTransform<Derived>::RebuildTypeOfType(QualType Underlying) {
14569   return SemaRef.Context.getTypeOfType(Underlying);
14570 }
14571 
14572 template <typename Derived>
14573 QualType TreeTransform<Derived>::RebuildDecltypeType(Expr *E, SourceLocation) {
14574   return SemaRef.BuildDecltypeType(E);
14575 }
14576 
14577 template<typename Derived>
14578 QualType TreeTransform<Derived>::RebuildUnaryTransformType(QualType BaseType,
14579                                             UnaryTransformType::UTTKind UKind,
14580                                             SourceLocation Loc) {
14581   return SemaRef.BuildUnaryTransformType(BaseType, UKind, Loc);
14582 }
14583 
14584 template<typename Derived>
14585 QualType TreeTransform<Derived>::RebuildTemplateSpecializationType(
14586                                                       TemplateName Template,
14587                                              SourceLocation TemplateNameLoc,
14588                                      TemplateArgumentListInfo &TemplateArgs) {
14589   return SemaRef.CheckTemplateIdType(Template, TemplateNameLoc, TemplateArgs);
14590 }
14591 
14592 template<typename Derived>
14593 QualType TreeTransform<Derived>::RebuildAtomicType(QualType ValueType,
14594                                                    SourceLocation KWLoc) {
14595   return SemaRef.BuildAtomicType(ValueType, KWLoc);
14596 }
14597 
14598 template<typename Derived>
14599 QualType TreeTransform<Derived>::RebuildPipeType(QualType ValueType,
14600                                                  SourceLocation KWLoc,
14601                                                  bool isReadPipe) {
14602   return isReadPipe ? SemaRef.BuildReadPipeType(ValueType, KWLoc)
14603                     : SemaRef.BuildWritePipeType(ValueType, KWLoc);
14604 }
14605 
14606 template <typename Derived>
14607 QualType TreeTransform<Derived>::RebuildBitIntType(bool IsUnsigned,
14608                                                    unsigned NumBits,
14609                                                    SourceLocation Loc) {
14610   llvm::APInt NumBitsAP(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy),
14611                         NumBits, true);
14612   IntegerLiteral *Bits = IntegerLiteral::Create(SemaRef.Context, NumBitsAP,
14613                                                 SemaRef.Context.IntTy, Loc);
14614   return SemaRef.BuildBitIntType(IsUnsigned, Bits, Loc);
14615 }
14616 
14617 template <typename Derived>
14618 QualType TreeTransform<Derived>::RebuildDependentBitIntType(
14619     bool IsUnsigned, Expr *NumBitsExpr, SourceLocation Loc) {
14620   return SemaRef.BuildBitIntType(IsUnsigned, NumBitsExpr, Loc);
14621 }
14622 
14623 template<typename Derived>
14624 TemplateName
14625 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS,
14626                                             bool TemplateKW,
14627                                             TemplateDecl *Template) {
14628   return SemaRef.Context.getQualifiedTemplateName(SS.getScopeRep(), TemplateKW,
14629                                                   Template);
14630 }
14631 
14632 template<typename Derived>
14633 TemplateName
14634 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS,
14635                                             SourceLocation TemplateKWLoc,
14636                                             const IdentifierInfo &Name,
14637                                             SourceLocation NameLoc,
14638                                             QualType ObjectType,
14639                                             NamedDecl *FirstQualifierInScope,
14640                                             bool AllowInjectedClassName) {
14641   UnqualifiedId TemplateName;
14642   TemplateName.setIdentifier(&Name, NameLoc);
14643   Sema::TemplateTy Template;
14644   getSema().ActOnTemplateName(/*Scope=*/nullptr, SS, TemplateKWLoc,
14645                               TemplateName, ParsedType::make(ObjectType),
14646                               /*EnteringContext=*/false, Template,
14647                               AllowInjectedClassName);
14648   return Template.get();
14649 }
14650 
14651 template<typename Derived>
14652 TemplateName
14653 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS,
14654                                             SourceLocation TemplateKWLoc,
14655                                             OverloadedOperatorKind Operator,
14656                                             SourceLocation NameLoc,
14657                                             QualType ObjectType,
14658                                             bool AllowInjectedClassName) {
14659   UnqualifiedId Name;
14660   // FIXME: Bogus location information.
14661   SourceLocation SymbolLocations[3] = { NameLoc, NameLoc, NameLoc };
14662   Name.setOperatorFunctionId(NameLoc, Operator, SymbolLocations);
14663   Sema::TemplateTy Template;
14664   getSema().ActOnTemplateName(
14665       /*Scope=*/nullptr, SS, TemplateKWLoc, Name, ParsedType::make(ObjectType),
14666       /*EnteringContext=*/false, Template, AllowInjectedClassName);
14667   return Template.get();
14668 }
14669 
14670 template<typename Derived>
14671 ExprResult
14672 TreeTransform<Derived>::RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op,
14673                                                    SourceLocation OpLoc,
14674                                                    Expr *OrigCallee,
14675                                                    Expr *First,
14676                                                    Expr *Second) {
14677   Expr *Callee = OrigCallee->IgnoreParenCasts();
14678   bool isPostIncDec = Second && (Op == OO_PlusPlus || Op == OO_MinusMinus);
14679 
14680   if (First->getObjectKind() == OK_ObjCProperty) {
14681     BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op);
14682     if (BinaryOperator::isAssignmentOp(Opc))
14683       return SemaRef.checkPseudoObjectAssignment(/*Scope=*/nullptr, OpLoc, Opc,
14684                                                  First, Second);
14685     ExprResult Result = SemaRef.CheckPlaceholderExpr(First);
14686     if (Result.isInvalid())
14687       return ExprError();
14688     First = Result.get();
14689   }
14690 
14691   if (Second && Second->getObjectKind() == OK_ObjCProperty) {
14692     ExprResult Result = SemaRef.CheckPlaceholderExpr(Second);
14693     if (Result.isInvalid())
14694       return ExprError();
14695     Second = Result.get();
14696   }
14697 
14698   // Determine whether this should be a builtin operation.
14699   if (Op == OO_Subscript) {
14700     if (!First->getType()->isOverloadableType() &&
14701         !Second->getType()->isOverloadableType())
14702       return getSema().CreateBuiltinArraySubscriptExpr(
14703           First, Callee->getBeginLoc(), Second, OpLoc);
14704   } else if (Op == OO_Arrow) {
14705     // -> is never a builtin operation.
14706     return SemaRef.BuildOverloadedArrowExpr(nullptr, First, OpLoc);
14707   } else if (Second == nullptr || isPostIncDec) {
14708     if (!First->getType()->isOverloadableType() ||
14709         (Op == OO_Amp && getSema().isQualifiedMemberAccess(First))) {
14710       // The argument is not of overloadable type, or this is an expression
14711       // of the form &Class::member, so try to create a built-in unary
14712       // operation.
14713       UnaryOperatorKind Opc
14714         = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec);
14715 
14716       return getSema().CreateBuiltinUnaryOp(OpLoc, Opc, First);
14717     }
14718   } else {
14719     if (!First->getType()->isOverloadableType() &&
14720         !Second->getType()->isOverloadableType()) {
14721       // Neither of the arguments is an overloadable type, so try to
14722       // create a built-in binary operation.
14723       BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op);
14724       ExprResult Result
14725         = SemaRef.CreateBuiltinBinOp(OpLoc, Opc, First, Second);
14726       if (Result.isInvalid())
14727         return ExprError();
14728 
14729       return Result;
14730     }
14731   }
14732 
14733   // Compute the transformed set of functions (and function templates) to be
14734   // used during overload resolution.
14735   UnresolvedSet<16> Functions;
14736   bool RequiresADL;
14737 
14738   if (UnresolvedLookupExpr *ULE = dyn_cast<UnresolvedLookupExpr>(Callee)) {
14739     Functions.append(ULE->decls_begin(), ULE->decls_end());
14740     // If the overload could not be resolved in the template definition
14741     // (because we had a dependent argument), ADL is performed as part of
14742     // template instantiation.
14743     RequiresADL = ULE->requiresADL();
14744   } else {
14745     // If we've resolved this to a particular non-member function, just call
14746     // that function. If we resolved it to a member function,
14747     // CreateOverloaded* will find that function for us.
14748     NamedDecl *ND = cast<DeclRefExpr>(Callee)->getDecl();
14749     if (!isa<CXXMethodDecl>(ND))
14750       Functions.addDecl(ND);
14751     RequiresADL = false;
14752   }
14753 
14754   // Add any functions found via argument-dependent lookup.
14755   Expr *Args[2] = { First, Second };
14756   unsigned NumArgs = 1 + (Second != nullptr);
14757 
14758   // Create the overloaded operator invocation for unary operators.
14759   if (NumArgs == 1 || isPostIncDec) {
14760     UnaryOperatorKind Opc
14761       = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec);
14762     return SemaRef.CreateOverloadedUnaryOp(OpLoc, Opc, Functions, First,
14763                                            RequiresADL);
14764   }
14765 
14766   if (Op == OO_Subscript) {
14767     SourceLocation LBrace;
14768     SourceLocation RBrace;
14769 
14770     if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Callee)) {
14771       DeclarationNameLoc NameLoc = DRE->getNameInfo().getInfo();
14772       LBrace = NameLoc.getCXXOperatorNameBeginLoc();
14773       RBrace = NameLoc.getCXXOperatorNameEndLoc();
14774     } else {
14775       LBrace = Callee->getBeginLoc();
14776       RBrace = OpLoc;
14777     }
14778 
14779     return SemaRef.CreateOverloadedArraySubscriptExpr(LBrace, RBrace,
14780                                                       First, Second);
14781   }
14782 
14783   // Create the overloaded operator invocation for binary operators.
14784   BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op);
14785   ExprResult Result = SemaRef.CreateOverloadedBinOp(
14786       OpLoc, Opc, Functions, Args[0], Args[1], RequiresADL);
14787   if (Result.isInvalid())
14788     return ExprError();
14789 
14790   return Result;
14791 }
14792 
14793 template<typename Derived>
14794 ExprResult
14795 TreeTransform<Derived>::RebuildCXXPseudoDestructorExpr(Expr *Base,
14796                                                      SourceLocation OperatorLoc,
14797                                                        bool isArrow,
14798                                                        CXXScopeSpec &SS,
14799                                                      TypeSourceInfo *ScopeType,
14800                                                        SourceLocation CCLoc,
14801                                                        SourceLocation TildeLoc,
14802                                         PseudoDestructorTypeStorage Destroyed) {
14803   QualType BaseType = Base->getType();
14804   if (Base->isTypeDependent() || Destroyed.getIdentifier() ||
14805       (!isArrow && !BaseType->getAs<RecordType>()) ||
14806       (isArrow && BaseType->getAs<PointerType>() &&
14807        !BaseType->castAs<PointerType>()->getPointeeType()
14808                                               ->template getAs<RecordType>())){
14809     // This pseudo-destructor expression is still a pseudo-destructor.
14810     return SemaRef.BuildPseudoDestructorExpr(
14811         Base, OperatorLoc, isArrow ? tok::arrow : tok::period, SS, ScopeType,
14812         CCLoc, TildeLoc, Destroyed);
14813   }
14814 
14815   TypeSourceInfo *DestroyedType = Destroyed.getTypeSourceInfo();
14816   DeclarationName Name(SemaRef.Context.DeclarationNames.getCXXDestructorName(
14817                  SemaRef.Context.getCanonicalType(DestroyedType->getType())));
14818   DeclarationNameInfo NameInfo(Name, Destroyed.getLocation());
14819   NameInfo.setNamedTypeInfo(DestroyedType);
14820 
14821   // The scope type is now known to be a valid nested name specifier
14822   // component. Tack it on to the end of the nested name specifier.
14823   if (ScopeType) {
14824     if (!ScopeType->getType()->getAs<TagType>()) {
14825       getSema().Diag(ScopeType->getTypeLoc().getBeginLoc(),
14826                      diag::err_expected_class_or_namespace)
14827           << ScopeType->getType() << getSema().getLangOpts().CPlusPlus;
14828       return ExprError();
14829     }
14830     SS.Extend(SemaRef.Context, SourceLocation(), ScopeType->getTypeLoc(),
14831               CCLoc);
14832   }
14833 
14834   SourceLocation TemplateKWLoc; // FIXME: retrieve it from caller.
14835   return getSema().BuildMemberReferenceExpr(Base, BaseType,
14836                                             OperatorLoc, isArrow,
14837                                             SS, TemplateKWLoc,
14838                                             /*FIXME: FirstQualifier*/ nullptr,
14839                                             NameInfo,
14840                                             /*TemplateArgs*/ nullptr,
14841                                             /*S*/nullptr);
14842 }
14843 
14844 template<typename Derived>
14845 StmtResult
14846 TreeTransform<Derived>::TransformCapturedStmt(CapturedStmt *S) {
14847   SourceLocation Loc = S->getBeginLoc();
14848   CapturedDecl *CD = S->getCapturedDecl();
14849   unsigned NumParams = CD->getNumParams();
14850   unsigned ContextParamPos = CD->getContextParamPosition();
14851   SmallVector<Sema::CapturedParamNameType, 4> Params;
14852   for (unsigned I = 0; I < NumParams; ++I) {
14853     if (I != ContextParamPos) {
14854       Params.push_back(
14855              std::make_pair(
14856                   CD->getParam(I)->getName(),
14857                   getDerived().TransformType(CD->getParam(I)->getType())));
14858     } else {
14859       Params.push_back(std::make_pair(StringRef(), QualType()));
14860     }
14861   }
14862   getSema().ActOnCapturedRegionStart(Loc, /*CurScope*/nullptr,
14863                                      S->getCapturedRegionKind(), Params);
14864   StmtResult Body;
14865   {
14866     Sema::CompoundScopeRAII CompoundScope(getSema());
14867     Body = getDerived().TransformStmt(S->getCapturedStmt());
14868   }
14869 
14870   if (Body.isInvalid()) {
14871     getSema().ActOnCapturedRegionError();
14872     return StmtError();
14873   }
14874 
14875   return getSema().ActOnCapturedRegionEnd(Body.get());
14876 }
14877 
14878 } // end namespace clang
14879 
14880 #endif // LLVM_CLANG_LIB_SEMA_TREETRANSFORM_H
14881