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 'has_device_addr' 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 *RebuildOMPHasDeviceAddrClause(ArrayRef<Expr *> VarList,
2109                                            const OMPVarListLocTy &Locs) {
2110     return getSema().ActOnOpenMPHasDeviceAddrClause(VarList, Locs);
2111   }
2112 
2113   /// Build a new OpenMP 'defaultmap' clause.
2114   ///
2115   /// By default, performs semantic analysis to build the new OpenMP clause.
2116   /// Subclasses may override this routine to provide different behavior.
2117   OMPClause *RebuildOMPDefaultmapClause(OpenMPDefaultmapClauseModifier M,
2118                                         OpenMPDefaultmapClauseKind Kind,
2119                                         SourceLocation StartLoc,
2120                                         SourceLocation LParenLoc,
2121                                         SourceLocation MLoc,
2122                                         SourceLocation KindLoc,
2123                                         SourceLocation EndLoc) {
2124     return getSema().ActOnOpenMPDefaultmapClause(M, Kind, StartLoc, LParenLoc,
2125                                                  MLoc, KindLoc, EndLoc);
2126   }
2127 
2128   /// Build a new OpenMP 'nontemporal' clause.
2129   ///
2130   /// By default, performs semantic analysis to build the new OpenMP clause.
2131   /// Subclasses may override this routine to provide different behavior.
2132   OMPClause *RebuildOMPNontemporalClause(ArrayRef<Expr *> VarList,
2133                                          SourceLocation StartLoc,
2134                                          SourceLocation LParenLoc,
2135                                          SourceLocation EndLoc) {
2136     return getSema().ActOnOpenMPNontemporalClause(VarList, StartLoc, LParenLoc,
2137                                                   EndLoc);
2138   }
2139 
2140   /// Build a new OpenMP 'inclusive' clause.
2141   ///
2142   /// By default, performs semantic analysis to build the new OpenMP clause.
2143   /// Subclasses may override this routine to provide different behavior.
2144   OMPClause *RebuildOMPInclusiveClause(ArrayRef<Expr *> VarList,
2145                                        SourceLocation StartLoc,
2146                                        SourceLocation LParenLoc,
2147                                        SourceLocation EndLoc) {
2148     return getSema().ActOnOpenMPInclusiveClause(VarList, StartLoc, LParenLoc,
2149                                                 EndLoc);
2150   }
2151 
2152   /// Build a new OpenMP 'exclusive' clause.
2153   ///
2154   /// By default, performs semantic analysis to build the new OpenMP clause.
2155   /// Subclasses may override this routine to provide different behavior.
2156   OMPClause *RebuildOMPExclusiveClause(ArrayRef<Expr *> VarList,
2157                                        SourceLocation StartLoc,
2158                                        SourceLocation LParenLoc,
2159                                        SourceLocation EndLoc) {
2160     return getSema().ActOnOpenMPExclusiveClause(VarList, StartLoc, LParenLoc,
2161                                                 EndLoc);
2162   }
2163 
2164   /// Build a new OpenMP 'uses_allocators' clause.
2165   ///
2166   /// By default, performs semantic analysis to build the new OpenMP clause.
2167   /// Subclasses may override this routine to provide different behavior.
2168   OMPClause *RebuildOMPUsesAllocatorsClause(
2169       ArrayRef<Sema::UsesAllocatorsData> Data, SourceLocation StartLoc,
2170       SourceLocation LParenLoc, SourceLocation EndLoc) {
2171     return getSema().ActOnOpenMPUsesAllocatorClause(StartLoc, LParenLoc, EndLoc,
2172                                                     Data);
2173   }
2174 
2175   /// Build a new OpenMP 'affinity' clause.
2176   ///
2177   /// By default, performs semantic analysis to build the new OpenMP clause.
2178   /// Subclasses may override this routine to provide different behavior.
2179   OMPClause *RebuildOMPAffinityClause(SourceLocation StartLoc,
2180                                       SourceLocation LParenLoc,
2181                                       SourceLocation ColonLoc,
2182                                       SourceLocation EndLoc, Expr *Modifier,
2183                                       ArrayRef<Expr *> Locators) {
2184     return getSema().ActOnOpenMPAffinityClause(StartLoc, LParenLoc, ColonLoc,
2185                                                EndLoc, Modifier, Locators);
2186   }
2187 
2188   /// Build a new OpenMP 'order' clause.
2189   ///
2190   /// By default, performs semantic analysis to build the new OpenMP clause.
2191   /// Subclasses may override this routine to provide different behavior.
2192   OMPClause *RebuildOMPOrderClause(OpenMPOrderClauseKind Kind,
2193                                    SourceLocation KindKwLoc,
2194                                    SourceLocation StartLoc,
2195                                    SourceLocation LParenLoc,
2196                                    SourceLocation EndLoc) {
2197     return getSema().ActOnOpenMPOrderClause(Kind, KindKwLoc, StartLoc,
2198                                             LParenLoc, EndLoc);
2199   }
2200 
2201   /// Build a new OpenMP 'init' clause.
2202   ///
2203   /// By default, performs semantic analysis to build the new OpenMP clause.
2204   /// Subclasses may override this routine to provide different behavior.
2205   OMPClause *RebuildOMPInitClause(Expr *InteropVar, ArrayRef<Expr *> PrefExprs,
2206                                   bool IsTarget, bool IsTargetSync,
2207                                   SourceLocation StartLoc,
2208                                   SourceLocation LParenLoc,
2209                                   SourceLocation VarLoc,
2210                                   SourceLocation EndLoc) {
2211     return getSema().ActOnOpenMPInitClause(InteropVar, PrefExprs, IsTarget,
2212                                            IsTargetSync, StartLoc, LParenLoc,
2213                                            VarLoc, EndLoc);
2214   }
2215 
2216   /// Build a new OpenMP 'use' clause.
2217   ///
2218   /// By default, performs semantic analysis to build the new OpenMP clause.
2219   /// Subclasses may override this routine to provide different behavior.
2220   OMPClause *RebuildOMPUseClause(Expr *InteropVar, SourceLocation StartLoc,
2221                                  SourceLocation LParenLoc,
2222                                  SourceLocation VarLoc, SourceLocation EndLoc) {
2223     return getSema().ActOnOpenMPUseClause(InteropVar, StartLoc, LParenLoc,
2224                                           VarLoc, EndLoc);
2225   }
2226 
2227   /// Build a new OpenMP 'destroy' clause.
2228   ///
2229   /// By default, performs semantic analysis to build the new OpenMP clause.
2230   /// Subclasses may override this routine to provide different behavior.
2231   OMPClause *RebuildOMPDestroyClause(Expr *InteropVar, SourceLocation StartLoc,
2232                                      SourceLocation LParenLoc,
2233                                      SourceLocation VarLoc,
2234                                      SourceLocation EndLoc) {
2235     return getSema().ActOnOpenMPDestroyClause(InteropVar, StartLoc, LParenLoc,
2236                                               VarLoc, EndLoc);
2237   }
2238 
2239   /// Build a new OpenMP 'novariants' clause.
2240   ///
2241   /// By default, performs semantic analysis to build the new OpenMP clause.
2242   /// Subclasses may override this routine to provide different behavior.
2243   OMPClause *RebuildOMPNovariantsClause(Expr *Condition,
2244                                         SourceLocation StartLoc,
2245                                         SourceLocation LParenLoc,
2246                                         SourceLocation EndLoc) {
2247     return getSema().ActOnOpenMPNovariantsClause(Condition, StartLoc, LParenLoc,
2248                                                  EndLoc);
2249   }
2250 
2251   /// Build a new OpenMP 'nocontext' clause.
2252   ///
2253   /// By default, performs semantic analysis to build the new OpenMP clause.
2254   /// Subclasses may override this routine to provide different behavior.
2255   OMPClause *RebuildOMPNocontextClause(Expr *Condition, SourceLocation StartLoc,
2256                                        SourceLocation LParenLoc,
2257                                        SourceLocation EndLoc) {
2258     return getSema().ActOnOpenMPNocontextClause(Condition, StartLoc, LParenLoc,
2259                                                 EndLoc);
2260   }
2261 
2262   /// Build a new OpenMP 'filter' clause.
2263   ///
2264   /// By default, performs semantic analysis to build the new OpenMP clause.
2265   /// Subclasses may override this routine to provide different behavior.
2266   OMPClause *RebuildOMPFilterClause(Expr *ThreadID, SourceLocation StartLoc,
2267                                     SourceLocation LParenLoc,
2268                                     SourceLocation EndLoc) {
2269     return getSema().ActOnOpenMPFilterClause(ThreadID, StartLoc, LParenLoc,
2270                                              EndLoc);
2271   }
2272 
2273   /// Build a new OpenMP 'bind' clause.
2274   ///
2275   /// By default, performs semantic analysis to build the new OpenMP clause.
2276   /// Subclasses may override this routine to provide different behavior.
2277   OMPClause *RebuildOMPBindClause(OpenMPBindClauseKind Kind,
2278                                   SourceLocation KindLoc,
2279                                   SourceLocation StartLoc,
2280                                   SourceLocation LParenLoc,
2281                                   SourceLocation EndLoc) {
2282     return getSema().ActOnOpenMPBindClause(Kind, KindLoc, StartLoc, LParenLoc,
2283                                            EndLoc);
2284   }
2285 
2286   /// Build a new OpenMP 'align' clause.
2287   ///
2288   /// By default, performs semantic analysis to build the new OpenMP clause.
2289   /// Subclasses may override this routine to provide different behavior.
2290   OMPClause *RebuildOMPAlignClause(Expr *A, SourceLocation StartLoc,
2291                                    SourceLocation LParenLoc,
2292                                    SourceLocation EndLoc) {
2293     return getSema().ActOnOpenMPAlignClause(A, StartLoc, LParenLoc, EndLoc);
2294   }
2295 
2296   /// Rebuild the operand to an 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   ExprResult RebuildObjCAtSynchronizedOperand(SourceLocation atLoc,
2301                                               Expr *object) {
2302     return getSema().ActOnObjCAtSynchronizedOperand(atLoc, object);
2303   }
2304 
2305   /// Build a new Objective-C \@synchronized 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 RebuildObjCAtSynchronizedStmt(SourceLocation AtLoc,
2310                                            Expr *Object, Stmt *Body) {
2311     return getSema().ActOnObjCAtSynchronizedStmt(AtLoc, Object, Body);
2312   }
2313 
2314   /// Build a new Objective-C \@autoreleasepool 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 RebuildObjCAutoreleasePoolStmt(SourceLocation AtLoc,
2319                                             Stmt *Body) {
2320     return getSema().ActOnObjCAutoreleasePoolStmt(AtLoc, Body);
2321   }
2322 
2323   /// Build a new Objective-C fast enumeration statement.
2324   ///
2325   /// By default, performs semantic analysis to build the new statement.
2326   /// Subclasses may override this routine to provide different behavior.
2327   StmtResult RebuildObjCForCollectionStmt(SourceLocation ForLoc,
2328                                           Stmt *Element,
2329                                           Expr *Collection,
2330                                           SourceLocation RParenLoc,
2331                                           Stmt *Body) {
2332     StmtResult ForEachStmt = getSema().ActOnObjCForCollectionStmt(ForLoc,
2333                                                 Element,
2334                                                 Collection,
2335                                                 RParenLoc);
2336     if (ForEachStmt.isInvalid())
2337       return StmtError();
2338 
2339     return getSema().FinishObjCForCollectionStmt(ForEachStmt.get(), Body);
2340   }
2341 
2342   /// Build a new C++ exception declaration.
2343   ///
2344   /// By default, performs semantic analysis to build the new decaration.
2345   /// Subclasses may override this routine to provide different behavior.
2346   VarDecl *RebuildExceptionDecl(VarDecl *ExceptionDecl,
2347                                 TypeSourceInfo *Declarator,
2348                                 SourceLocation StartLoc,
2349                                 SourceLocation IdLoc,
2350                                 IdentifierInfo *Id) {
2351     VarDecl *Var = getSema().BuildExceptionDeclaration(nullptr, Declarator,
2352                                                        StartLoc, IdLoc, Id);
2353     if (Var)
2354       getSema().CurContext->addDecl(Var);
2355     return Var;
2356   }
2357 
2358   /// Build a new C++ catch statement.
2359   ///
2360   /// By default, performs semantic analysis to build the new statement.
2361   /// Subclasses may override this routine to provide different behavior.
2362   StmtResult RebuildCXXCatchStmt(SourceLocation CatchLoc,
2363                                  VarDecl *ExceptionDecl,
2364                                  Stmt *Handler) {
2365     return Owned(new (getSema().Context) CXXCatchStmt(CatchLoc, ExceptionDecl,
2366                                                       Handler));
2367   }
2368 
2369   /// Build a new C++ try 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 RebuildCXXTryStmt(SourceLocation TryLoc, Stmt *TryBlock,
2374                                ArrayRef<Stmt *> Handlers) {
2375     return getSema().ActOnCXXTryBlock(TryLoc, TryBlock, Handlers);
2376   }
2377 
2378   /// Build a new C++0x range-based for statement.
2379   ///
2380   /// By default, performs semantic analysis to build the new statement.
2381   /// Subclasses may override this routine to provide different behavior.
2382   StmtResult RebuildCXXForRangeStmt(SourceLocation ForLoc,
2383                                     SourceLocation CoawaitLoc, Stmt *Init,
2384                                     SourceLocation ColonLoc, Stmt *Range,
2385                                     Stmt *Begin, Stmt *End, Expr *Cond,
2386                                     Expr *Inc, Stmt *LoopVar,
2387                                     SourceLocation RParenLoc) {
2388     // If we've just learned that the range is actually an Objective-C
2389     // collection, treat this as an Objective-C fast enumeration loop.
2390     if (DeclStmt *RangeStmt = dyn_cast<DeclStmt>(Range)) {
2391       if (RangeStmt->isSingleDecl()) {
2392         if (VarDecl *RangeVar = dyn_cast<VarDecl>(RangeStmt->getSingleDecl())) {
2393           if (RangeVar->isInvalidDecl())
2394             return StmtError();
2395 
2396           Expr *RangeExpr = RangeVar->getInit();
2397           if (!RangeExpr->isTypeDependent() &&
2398               RangeExpr->getType()->isObjCObjectPointerType()) {
2399             // FIXME: Support init-statements in Objective-C++20 ranged for
2400             // statement.
2401             if (Init) {
2402               return SemaRef.Diag(Init->getBeginLoc(),
2403                                   diag::err_objc_for_range_init_stmt)
2404                          << Init->getSourceRange();
2405             }
2406             return getSema().ActOnObjCForCollectionStmt(ForLoc, LoopVar,
2407                                                         RangeExpr, RParenLoc);
2408           }
2409         }
2410       }
2411     }
2412 
2413     return getSema().BuildCXXForRangeStmt(ForLoc, CoawaitLoc, Init, ColonLoc,
2414                                           Range, Begin, End, Cond, Inc, LoopVar,
2415                                           RParenLoc, Sema::BFRK_Rebuild);
2416   }
2417 
2418   /// Build a new C++0x range-based for statement.
2419   ///
2420   /// By default, performs semantic analysis to build the new statement.
2421   /// Subclasses may override this routine to provide different behavior.
2422   StmtResult RebuildMSDependentExistsStmt(SourceLocation KeywordLoc,
2423                                           bool IsIfExists,
2424                                           NestedNameSpecifierLoc QualifierLoc,
2425                                           DeclarationNameInfo NameInfo,
2426                                           Stmt *Nested) {
2427     return getSema().BuildMSDependentExistsStmt(KeywordLoc, IsIfExists,
2428                                                 QualifierLoc, NameInfo, Nested);
2429   }
2430 
2431   /// Attach body to a C++0x range-based for statement.
2432   ///
2433   /// By default, performs semantic analysis to finish the new statement.
2434   /// Subclasses may override this routine to provide different behavior.
2435   StmtResult FinishCXXForRangeStmt(Stmt *ForRange, Stmt *Body) {
2436     return getSema().FinishCXXForRangeStmt(ForRange, Body);
2437   }
2438 
2439   StmtResult RebuildSEHTryStmt(bool IsCXXTry, SourceLocation TryLoc,
2440                                Stmt *TryBlock, Stmt *Handler) {
2441     return getSema().ActOnSEHTryBlock(IsCXXTry, TryLoc, TryBlock, Handler);
2442   }
2443 
2444   StmtResult RebuildSEHExceptStmt(SourceLocation Loc, Expr *FilterExpr,
2445                                   Stmt *Block) {
2446     return getSema().ActOnSEHExceptBlock(Loc, FilterExpr, Block);
2447   }
2448 
2449   StmtResult RebuildSEHFinallyStmt(SourceLocation Loc, Stmt *Block) {
2450     return SEHFinallyStmt::Create(getSema().getASTContext(), Loc, Block);
2451   }
2452 
2453   ExprResult RebuildSYCLUniqueStableNameExpr(SourceLocation OpLoc,
2454                                              SourceLocation LParen,
2455                                              SourceLocation RParen,
2456                                              TypeSourceInfo *TSI) {
2457     return getSema().BuildSYCLUniqueStableNameExpr(OpLoc, LParen, RParen, TSI);
2458   }
2459 
2460   /// Build a new predefined expression.
2461   ///
2462   /// By default, performs semantic analysis to build the new expression.
2463   /// Subclasses may override this routine to provide different behavior.
2464   ExprResult RebuildPredefinedExpr(SourceLocation Loc,
2465                                    PredefinedExpr::IdentKind IK) {
2466     return getSema().BuildPredefinedExpr(Loc, IK);
2467   }
2468 
2469   /// Build a new expression that references a declaration.
2470   ///
2471   /// By default, performs semantic analysis to build the new expression.
2472   /// Subclasses may override this routine to provide different behavior.
2473   ExprResult RebuildDeclarationNameExpr(const CXXScopeSpec &SS,
2474                                         LookupResult &R,
2475                                         bool RequiresADL) {
2476     return getSema().BuildDeclarationNameExpr(SS, R, RequiresADL);
2477   }
2478 
2479 
2480   /// Build a new expression that references a declaration.
2481   ///
2482   /// By default, performs semantic analysis to build the new expression.
2483   /// Subclasses may override this routine to provide different behavior.
2484   ExprResult RebuildDeclRefExpr(NestedNameSpecifierLoc QualifierLoc,
2485                                 ValueDecl *VD,
2486                                 const DeclarationNameInfo &NameInfo,
2487                                 NamedDecl *Found,
2488                                 TemplateArgumentListInfo *TemplateArgs) {
2489     CXXScopeSpec SS;
2490     SS.Adopt(QualifierLoc);
2491     return getSema().BuildDeclarationNameExpr(SS, NameInfo, VD, Found,
2492                                               TemplateArgs);
2493   }
2494 
2495   /// Build a new expression in parentheses.
2496   ///
2497   /// By default, performs semantic analysis to build the new expression.
2498   /// Subclasses may override this routine to provide different behavior.
2499   ExprResult RebuildParenExpr(Expr *SubExpr, SourceLocation LParen,
2500                                     SourceLocation RParen) {
2501     return getSema().ActOnParenExpr(LParen, RParen, SubExpr);
2502   }
2503 
2504   /// Build a new pseudo-destructor expression.
2505   ///
2506   /// By default, performs semantic analysis to build the new expression.
2507   /// Subclasses may override this routine to provide different behavior.
2508   ExprResult RebuildCXXPseudoDestructorExpr(Expr *Base,
2509                                             SourceLocation OperatorLoc,
2510                                             bool isArrow,
2511                                             CXXScopeSpec &SS,
2512                                             TypeSourceInfo *ScopeType,
2513                                             SourceLocation CCLoc,
2514                                             SourceLocation TildeLoc,
2515                                         PseudoDestructorTypeStorage Destroyed);
2516 
2517   /// Build a new unary operator expression.
2518   ///
2519   /// By default, performs semantic analysis to build the new expression.
2520   /// Subclasses may override this routine to provide different behavior.
2521   ExprResult RebuildUnaryOperator(SourceLocation OpLoc,
2522                                         UnaryOperatorKind Opc,
2523                                         Expr *SubExpr) {
2524     return getSema().BuildUnaryOp(/*Scope=*/nullptr, OpLoc, Opc, SubExpr);
2525   }
2526 
2527   /// Build a new builtin offsetof expression.
2528   ///
2529   /// By default, performs semantic analysis to build the new expression.
2530   /// Subclasses may override this routine to provide different behavior.
2531   ExprResult RebuildOffsetOfExpr(SourceLocation OperatorLoc,
2532                                  TypeSourceInfo *Type,
2533                                  ArrayRef<Sema::OffsetOfComponent> Components,
2534                                  SourceLocation RParenLoc) {
2535     return getSema().BuildBuiltinOffsetOf(OperatorLoc, Type, Components,
2536                                           RParenLoc);
2537   }
2538 
2539   /// Build a new sizeof, alignof or vec_step expression with a
2540   /// type argument.
2541   ///
2542   /// By default, performs semantic analysis to build the new expression.
2543   /// Subclasses may override this routine to provide different behavior.
2544   ExprResult RebuildUnaryExprOrTypeTrait(TypeSourceInfo *TInfo,
2545                                          SourceLocation OpLoc,
2546                                          UnaryExprOrTypeTrait ExprKind,
2547                                          SourceRange R) {
2548     return getSema().CreateUnaryExprOrTypeTraitExpr(TInfo, OpLoc, ExprKind, R);
2549   }
2550 
2551   /// Build a new sizeof, alignof or vec step expression with an
2552   /// expression argument.
2553   ///
2554   /// By default, performs semantic analysis to build the new expression.
2555   /// Subclasses may override this routine to provide different behavior.
2556   ExprResult RebuildUnaryExprOrTypeTrait(Expr *SubExpr, SourceLocation OpLoc,
2557                                          UnaryExprOrTypeTrait ExprKind,
2558                                          SourceRange R) {
2559     ExprResult Result
2560       = getSema().CreateUnaryExprOrTypeTraitExpr(SubExpr, OpLoc, ExprKind);
2561     if (Result.isInvalid())
2562       return ExprError();
2563 
2564     return Result;
2565   }
2566 
2567   /// Build a new array subscript expression.
2568   ///
2569   /// By default, performs semantic analysis to build the new expression.
2570   /// Subclasses may override this routine to provide different behavior.
2571   ExprResult RebuildArraySubscriptExpr(Expr *LHS,
2572                                              SourceLocation LBracketLoc,
2573                                              Expr *RHS,
2574                                              SourceLocation RBracketLoc) {
2575     return getSema().ActOnArraySubscriptExpr(/*Scope=*/nullptr, LHS,
2576                                              LBracketLoc, RHS,
2577                                              RBracketLoc);
2578   }
2579 
2580   /// Build a new matrix subscript expression.
2581   ///
2582   /// By default, performs semantic analysis to build the new expression.
2583   /// Subclasses may override this routine to provide different behavior.
2584   ExprResult RebuildMatrixSubscriptExpr(Expr *Base, Expr *RowIdx,
2585                                         Expr *ColumnIdx,
2586                                         SourceLocation RBracketLoc) {
2587     return getSema().CreateBuiltinMatrixSubscriptExpr(Base, RowIdx, ColumnIdx,
2588                                                       RBracketLoc);
2589   }
2590 
2591   /// Build a new array section expression.
2592   ///
2593   /// By default, performs semantic analysis to build the new expression.
2594   /// Subclasses may override this routine to provide different behavior.
2595   ExprResult RebuildOMPArraySectionExpr(Expr *Base, SourceLocation LBracketLoc,
2596                                         Expr *LowerBound,
2597                                         SourceLocation ColonLocFirst,
2598                                         SourceLocation ColonLocSecond,
2599                                         Expr *Length, Expr *Stride,
2600                                         SourceLocation RBracketLoc) {
2601     return getSema().ActOnOMPArraySectionExpr(Base, LBracketLoc, LowerBound,
2602                                               ColonLocFirst, ColonLocSecond,
2603                                               Length, Stride, RBracketLoc);
2604   }
2605 
2606   /// Build a new array shaping expression.
2607   ///
2608   /// By default, performs semantic analysis to build the new expression.
2609   /// Subclasses may override this routine to provide different behavior.
2610   ExprResult RebuildOMPArrayShapingExpr(Expr *Base, SourceLocation LParenLoc,
2611                                         SourceLocation RParenLoc,
2612                                         ArrayRef<Expr *> Dims,
2613                                         ArrayRef<SourceRange> BracketsRanges) {
2614     return getSema().ActOnOMPArrayShapingExpr(Base, LParenLoc, RParenLoc, Dims,
2615                                               BracketsRanges);
2616   }
2617 
2618   /// Build a new iterator expression.
2619   ///
2620   /// By default, performs semantic analysis to build the new expression.
2621   /// Subclasses may override this routine to provide different behavior.
2622   ExprResult RebuildOMPIteratorExpr(
2623       SourceLocation IteratorKwLoc, SourceLocation LLoc, SourceLocation RLoc,
2624       ArrayRef<Sema::OMPIteratorData> Data) {
2625     return getSema().ActOnOMPIteratorExpr(/*Scope=*/nullptr, IteratorKwLoc,
2626                                           LLoc, RLoc, Data);
2627   }
2628 
2629   /// Build a new call expression.
2630   ///
2631   /// By default, performs semantic analysis to build the new expression.
2632   /// Subclasses may override this routine to provide different behavior.
2633   ExprResult RebuildCallExpr(Expr *Callee, SourceLocation LParenLoc,
2634                                    MultiExprArg Args,
2635                                    SourceLocation RParenLoc,
2636                                    Expr *ExecConfig = nullptr) {
2637     return getSema().ActOnCallExpr(
2638         /*Scope=*/nullptr, Callee, LParenLoc, Args, RParenLoc, ExecConfig);
2639   }
2640 
2641   ExprResult RebuildCxxSubscriptExpr(Expr *Callee, SourceLocation LParenLoc,
2642                                      MultiExprArg Args,
2643                                      SourceLocation RParenLoc) {
2644     return getSema().ActOnArraySubscriptExpr(
2645         /*Scope=*/nullptr, Callee, LParenLoc, Args, RParenLoc);
2646   }
2647 
2648   /// Build a new member access expression.
2649   ///
2650   /// By default, performs semantic analysis to build the new expression.
2651   /// Subclasses may override this routine to provide different behavior.
2652   ExprResult RebuildMemberExpr(Expr *Base, SourceLocation OpLoc,
2653                                bool isArrow,
2654                                NestedNameSpecifierLoc QualifierLoc,
2655                                SourceLocation TemplateKWLoc,
2656                                const DeclarationNameInfo &MemberNameInfo,
2657                                ValueDecl *Member,
2658                                NamedDecl *FoundDecl,
2659                         const TemplateArgumentListInfo *ExplicitTemplateArgs,
2660                                NamedDecl *FirstQualifierInScope) {
2661     ExprResult BaseResult = getSema().PerformMemberExprBaseConversion(Base,
2662                                                                       isArrow);
2663     if (!Member->getDeclName()) {
2664       // We have a reference to an unnamed field.  This is always the
2665       // base of an anonymous struct/union member access, i.e. the
2666       // field is always of record type.
2667       assert(Member->getType()->isRecordType() &&
2668              "unnamed member not of record type?");
2669 
2670       BaseResult =
2671         getSema().PerformObjectMemberConversion(BaseResult.get(),
2672                                                 QualifierLoc.getNestedNameSpecifier(),
2673                                                 FoundDecl, Member);
2674       if (BaseResult.isInvalid())
2675         return ExprError();
2676       Base = BaseResult.get();
2677 
2678       CXXScopeSpec EmptySS;
2679       return getSema().BuildFieldReferenceExpr(
2680           Base, isArrow, OpLoc, EmptySS, cast<FieldDecl>(Member),
2681           DeclAccessPair::make(FoundDecl, FoundDecl->getAccess()), MemberNameInfo);
2682     }
2683 
2684     CXXScopeSpec SS;
2685     SS.Adopt(QualifierLoc);
2686 
2687     Base = BaseResult.get();
2688     QualType BaseType = Base->getType();
2689 
2690     if (isArrow && !BaseType->isPointerType())
2691       return ExprError();
2692 
2693     // FIXME: this involves duplicating earlier analysis in a lot of
2694     // cases; we should avoid this when possible.
2695     LookupResult R(getSema(), MemberNameInfo, Sema::LookupMemberName);
2696     R.addDecl(FoundDecl);
2697     R.resolveKind();
2698 
2699     return getSema().BuildMemberReferenceExpr(Base, BaseType, OpLoc, isArrow,
2700                                               SS, TemplateKWLoc,
2701                                               FirstQualifierInScope,
2702                                               R, ExplicitTemplateArgs,
2703                                               /*S*/nullptr);
2704   }
2705 
2706   /// Build a new binary operator expression.
2707   ///
2708   /// By default, performs semantic analysis to build the new expression.
2709   /// Subclasses may override this routine to provide different behavior.
2710   ExprResult RebuildBinaryOperator(SourceLocation OpLoc,
2711                                          BinaryOperatorKind Opc,
2712                                          Expr *LHS, Expr *RHS) {
2713     return getSema().BuildBinOp(/*Scope=*/nullptr, OpLoc, Opc, LHS, RHS);
2714   }
2715 
2716   /// Build a new rewritten operator expression.
2717   ///
2718   /// By default, performs semantic analysis to build the new expression.
2719   /// Subclasses may override this routine to provide different behavior.
2720   ExprResult RebuildCXXRewrittenBinaryOperator(
2721       SourceLocation OpLoc, BinaryOperatorKind Opcode,
2722       const UnresolvedSetImpl &UnqualLookups, Expr *LHS, Expr *RHS) {
2723     return getSema().CreateOverloadedBinOp(OpLoc, Opcode, UnqualLookups, LHS,
2724                                            RHS, /*RequiresADL*/false);
2725   }
2726 
2727   /// Build a new conditional operator expression.
2728   ///
2729   /// By default, performs semantic analysis to build the new expression.
2730   /// Subclasses may override this routine to provide different behavior.
2731   ExprResult RebuildConditionalOperator(Expr *Cond,
2732                                         SourceLocation QuestionLoc,
2733                                         Expr *LHS,
2734                                         SourceLocation ColonLoc,
2735                                         Expr *RHS) {
2736     return getSema().ActOnConditionalOp(QuestionLoc, ColonLoc, Cond,
2737                                         LHS, RHS);
2738   }
2739 
2740   /// Build a new C-style cast expression.
2741   ///
2742   /// By default, performs semantic analysis to build the new expression.
2743   /// Subclasses may override this routine to provide different behavior.
2744   ExprResult RebuildCStyleCastExpr(SourceLocation LParenLoc,
2745                                          TypeSourceInfo *TInfo,
2746                                          SourceLocation RParenLoc,
2747                                          Expr *SubExpr) {
2748     return getSema().BuildCStyleCastExpr(LParenLoc, TInfo, RParenLoc,
2749                                          SubExpr);
2750   }
2751 
2752   /// Build a new compound literal expression.
2753   ///
2754   /// By default, performs semantic analysis to build the new expression.
2755   /// Subclasses may override this routine to provide different behavior.
2756   ExprResult RebuildCompoundLiteralExpr(SourceLocation LParenLoc,
2757                                               TypeSourceInfo *TInfo,
2758                                               SourceLocation RParenLoc,
2759                                               Expr *Init) {
2760     return getSema().BuildCompoundLiteralExpr(LParenLoc, TInfo, RParenLoc,
2761                                               Init);
2762   }
2763 
2764   /// Build a new extended vector element access expression.
2765   ///
2766   /// By default, performs semantic analysis to build the new expression.
2767   /// Subclasses may override this routine to provide different behavior.
2768   ExprResult RebuildExtVectorElementExpr(Expr *Base,
2769                                                SourceLocation OpLoc,
2770                                                SourceLocation AccessorLoc,
2771                                                IdentifierInfo &Accessor) {
2772 
2773     CXXScopeSpec SS;
2774     DeclarationNameInfo NameInfo(&Accessor, AccessorLoc);
2775     return getSema().BuildMemberReferenceExpr(Base, Base->getType(),
2776                                               OpLoc, /*IsArrow*/ false,
2777                                               SS, SourceLocation(),
2778                                               /*FirstQualifierInScope*/ nullptr,
2779                                               NameInfo,
2780                                               /* TemplateArgs */ nullptr,
2781                                               /*S*/ nullptr);
2782   }
2783 
2784   /// Build a new initializer list expression.
2785   ///
2786   /// By default, performs semantic analysis to build the new expression.
2787   /// Subclasses may override this routine to provide different behavior.
2788   ExprResult RebuildInitList(SourceLocation LBraceLoc,
2789                              MultiExprArg Inits,
2790                              SourceLocation RBraceLoc) {
2791     return SemaRef.BuildInitList(LBraceLoc, Inits, RBraceLoc);
2792   }
2793 
2794   /// Build a new designated initializer expression.
2795   ///
2796   /// By default, performs semantic analysis to build the new expression.
2797   /// Subclasses may override this routine to provide different behavior.
2798   ExprResult RebuildDesignatedInitExpr(Designation &Desig,
2799                                              MultiExprArg ArrayExprs,
2800                                              SourceLocation EqualOrColonLoc,
2801                                              bool GNUSyntax,
2802                                              Expr *Init) {
2803     ExprResult Result
2804       = SemaRef.ActOnDesignatedInitializer(Desig, EqualOrColonLoc, GNUSyntax,
2805                                            Init);
2806     if (Result.isInvalid())
2807       return ExprError();
2808 
2809     return Result;
2810   }
2811 
2812   /// Build a new value-initialized expression.
2813   ///
2814   /// By default, builds the implicit value initialization without performing
2815   /// any semantic analysis. Subclasses may override this routine to provide
2816   /// different behavior.
2817   ExprResult RebuildImplicitValueInitExpr(QualType T) {
2818     return new (SemaRef.Context) ImplicitValueInitExpr(T);
2819   }
2820 
2821   /// Build a new \c va_arg expression.
2822   ///
2823   /// By default, performs semantic analysis to build the new expression.
2824   /// Subclasses may override this routine to provide different behavior.
2825   ExprResult RebuildVAArgExpr(SourceLocation BuiltinLoc,
2826                                     Expr *SubExpr, TypeSourceInfo *TInfo,
2827                                     SourceLocation RParenLoc) {
2828     return getSema().BuildVAArgExpr(BuiltinLoc,
2829                                     SubExpr, TInfo,
2830                                     RParenLoc);
2831   }
2832 
2833   /// Build a new expression list in parentheses.
2834   ///
2835   /// By default, performs semantic analysis to build the new expression.
2836   /// Subclasses may override this routine to provide different behavior.
2837   ExprResult RebuildParenListExpr(SourceLocation LParenLoc,
2838                                   MultiExprArg SubExprs,
2839                                   SourceLocation RParenLoc) {
2840     return getSema().ActOnParenListExpr(LParenLoc, RParenLoc, SubExprs);
2841   }
2842 
2843   /// Build a new address-of-label expression.
2844   ///
2845   /// By default, performs semantic analysis, using the name of the label
2846   /// rather than attempting to map the label statement itself.
2847   /// Subclasses may override this routine to provide different behavior.
2848   ExprResult RebuildAddrLabelExpr(SourceLocation AmpAmpLoc,
2849                                   SourceLocation LabelLoc, LabelDecl *Label) {
2850     return getSema().ActOnAddrLabel(AmpAmpLoc, LabelLoc, Label);
2851   }
2852 
2853   /// Build a new GNU statement expression.
2854   ///
2855   /// By default, performs semantic analysis to build the new expression.
2856   /// Subclasses may override this routine to provide different behavior.
2857   ExprResult RebuildStmtExpr(SourceLocation LParenLoc, Stmt *SubStmt,
2858                              SourceLocation RParenLoc, unsigned TemplateDepth) {
2859     return getSema().BuildStmtExpr(LParenLoc, SubStmt, RParenLoc,
2860                                    TemplateDepth);
2861   }
2862 
2863   /// Build a new __builtin_choose_expr expression.
2864   ///
2865   /// By default, performs semantic analysis to build the new expression.
2866   /// Subclasses may override this routine to provide different behavior.
2867   ExprResult RebuildChooseExpr(SourceLocation BuiltinLoc,
2868                                      Expr *Cond, Expr *LHS, Expr *RHS,
2869                                      SourceLocation RParenLoc) {
2870     return SemaRef.ActOnChooseExpr(BuiltinLoc,
2871                                    Cond, LHS, RHS,
2872                                    RParenLoc);
2873   }
2874 
2875   /// Build a new generic selection expression.
2876   ///
2877   /// By default, performs semantic analysis to build the new expression.
2878   /// Subclasses may override this routine to provide different behavior.
2879   ExprResult RebuildGenericSelectionExpr(SourceLocation KeyLoc,
2880                                          SourceLocation DefaultLoc,
2881                                          SourceLocation RParenLoc,
2882                                          Expr *ControllingExpr,
2883                                          ArrayRef<TypeSourceInfo *> Types,
2884                                          ArrayRef<Expr *> Exprs) {
2885     return getSema().CreateGenericSelectionExpr(KeyLoc, DefaultLoc, RParenLoc,
2886                                                 ControllingExpr, Types, Exprs);
2887   }
2888 
2889   /// Build a new overloaded operator call expression.
2890   ///
2891   /// By default, performs semantic analysis to build the new expression.
2892   /// The semantic analysis provides the behavior of template instantiation,
2893   /// copying with transformations that turn what looks like an overloaded
2894   /// operator call into a use of a builtin operator, performing
2895   /// argument-dependent lookup, etc. Subclasses may override this routine to
2896   /// provide different behavior.
2897   ExprResult RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op,
2898                                               SourceLocation OpLoc,
2899                                               Expr *Callee,
2900                                               Expr *First,
2901                                               Expr *Second);
2902 
2903   /// Build a new C++ "named" cast expression, such as static_cast or
2904   /// reinterpret_cast.
2905   ///
2906   /// By default, this routine dispatches to one of the more-specific routines
2907   /// for a particular named case, e.g., RebuildCXXStaticCastExpr().
2908   /// Subclasses may override this routine to provide different behavior.
2909   ExprResult RebuildCXXNamedCastExpr(SourceLocation OpLoc,
2910                                            Stmt::StmtClass Class,
2911                                            SourceLocation LAngleLoc,
2912                                            TypeSourceInfo *TInfo,
2913                                            SourceLocation RAngleLoc,
2914                                            SourceLocation LParenLoc,
2915                                            Expr *SubExpr,
2916                                            SourceLocation RParenLoc) {
2917     switch (Class) {
2918     case Stmt::CXXStaticCastExprClass:
2919       return getDerived().RebuildCXXStaticCastExpr(OpLoc, LAngleLoc, TInfo,
2920                                                    RAngleLoc, LParenLoc,
2921                                                    SubExpr, RParenLoc);
2922 
2923     case Stmt::CXXDynamicCastExprClass:
2924       return getDerived().RebuildCXXDynamicCastExpr(OpLoc, LAngleLoc, TInfo,
2925                                                     RAngleLoc, LParenLoc,
2926                                                     SubExpr, RParenLoc);
2927 
2928     case Stmt::CXXReinterpretCastExprClass:
2929       return getDerived().RebuildCXXReinterpretCastExpr(OpLoc, LAngleLoc, TInfo,
2930                                                         RAngleLoc, LParenLoc,
2931                                                         SubExpr,
2932                                                         RParenLoc);
2933 
2934     case Stmt::CXXConstCastExprClass:
2935       return getDerived().RebuildCXXConstCastExpr(OpLoc, LAngleLoc, TInfo,
2936                                                    RAngleLoc, LParenLoc,
2937                                                    SubExpr, RParenLoc);
2938 
2939     case Stmt::CXXAddrspaceCastExprClass:
2940       return getDerived().RebuildCXXAddrspaceCastExpr(
2941           OpLoc, LAngleLoc, TInfo, RAngleLoc, LParenLoc, SubExpr, RParenLoc);
2942 
2943     default:
2944       llvm_unreachable("Invalid C++ named cast");
2945     }
2946   }
2947 
2948   /// Build a new C++ static_cast expression.
2949   ///
2950   /// By default, performs semantic analysis to build the new expression.
2951   /// Subclasses may override this routine to provide different behavior.
2952   ExprResult RebuildCXXStaticCastExpr(SourceLocation OpLoc,
2953                                             SourceLocation LAngleLoc,
2954                                             TypeSourceInfo *TInfo,
2955                                             SourceLocation RAngleLoc,
2956                                             SourceLocation LParenLoc,
2957                                             Expr *SubExpr,
2958                                             SourceLocation RParenLoc) {
2959     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_static_cast,
2960                                        TInfo, SubExpr,
2961                                        SourceRange(LAngleLoc, RAngleLoc),
2962                                        SourceRange(LParenLoc, RParenLoc));
2963   }
2964 
2965   /// Build a new C++ dynamic_cast expression.
2966   ///
2967   /// By default, performs semantic analysis to build the new expression.
2968   /// Subclasses may override this routine to provide different behavior.
2969   ExprResult RebuildCXXDynamicCastExpr(SourceLocation OpLoc,
2970                                              SourceLocation LAngleLoc,
2971                                              TypeSourceInfo *TInfo,
2972                                              SourceLocation RAngleLoc,
2973                                              SourceLocation LParenLoc,
2974                                              Expr *SubExpr,
2975                                              SourceLocation RParenLoc) {
2976     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_dynamic_cast,
2977                                        TInfo, SubExpr,
2978                                        SourceRange(LAngleLoc, RAngleLoc),
2979                                        SourceRange(LParenLoc, RParenLoc));
2980   }
2981 
2982   /// Build a new C++ reinterpret_cast expression.
2983   ///
2984   /// By default, performs semantic analysis to build the new expression.
2985   /// Subclasses may override this routine to provide different behavior.
2986   ExprResult RebuildCXXReinterpretCastExpr(SourceLocation OpLoc,
2987                                                  SourceLocation LAngleLoc,
2988                                                  TypeSourceInfo *TInfo,
2989                                                  SourceLocation RAngleLoc,
2990                                                  SourceLocation LParenLoc,
2991                                                  Expr *SubExpr,
2992                                                  SourceLocation RParenLoc) {
2993     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_reinterpret_cast,
2994                                        TInfo, SubExpr,
2995                                        SourceRange(LAngleLoc, RAngleLoc),
2996                                        SourceRange(LParenLoc, RParenLoc));
2997   }
2998 
2999   /// Build a new C++ const_cast expression.
3000   ///
3001   /// By default, performs semantic analysis to build the new expression.
3002   /// Subclasses may override this routine to provide different behavior.
3003   ExprResult RebuildCXXConstCastExpr(SourceLocation OpLoc,
3004                                            SourceLocation LAngleLoc,
3005                                            TypeSourceInfo *TInfo,
3006                                            SourceLocation RAngleLoc,
3007                                            SourceLocation LParenLoc,
3008                                            Expr *SubExpr,
3009                                            SourceLocation RParenLoc) {
3010     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_const_cast,
3011                                        TInfo, SubExpr,
3012                                        SourceRange(LAngleLoc, RAngleLoc),
3013                                        SourceRange(LParenLoc, RParenLoc));
3014   }
3015 
3016   ExprResult
3017   RebuildCXXAddrspaceCastExpr(SourceLocation OpLoc, SourceLocation LAngleLoc,
3018                               TypeSourceInfo *TInfo, SourceLocation RAngleLoc,
3019                               SourceLocation LParenLoc, Expr *SubExpr,
3020                               SourceLocation RParenLoc) {
3021     return getSema().BuildCXXNamedCast(
3022         OpLoc, tok::kw_addrspace_cast, TInfo, SubExpr,
3023         SourceRange(LAngleLoc, RAngleLoc), SourceRange(LParenLoc, RParenLoc));
3024   }
3025 
3026   /// Build a new C++ functional-style cast expression.
3027   ///
3028   /// By default, performs semantic analysis to build the new expression.
3029   /// Subclasses may override this routine to provide different behavior.
3030   ExprResult RebuildCXXFunctionalCastExpr(TypeSourceInfo *TInfo,
3031                                           SourceLocation LParenLoc,
3032                                           Expr *Sub,
3033                                           SourceLocation RParenLoc,
3034                                           bool ListInitialization) {
3035     return getSema().BuildCXXTypeConstructExpr(TInfo, LParenLoc,
3036                                                MultiExprArg(&Sub, 1), RParenLoc,
3037                                                ListInitialization);
3038   }
3039 
3040   /// Build a new C++ __builtin_bit_cast expression.
3041   ///
3042   /// By default, performs semantic analysis to build the new expression.
3043   /// Subclasses may override this routine to provide different behavior.
3044   ExprResult RebuildBuiltinBitCastExpr(SourceLocation KWLoc,
3045                                        TypeSourceInfo *TSI, Expr *Sub,
3046                                        SourceLocation RParenLoc) {
3047     return getSema().BuildBuiltinBitCastExpr(KWLoc, TSI, Sub, RParenLoc);
3048   }
3049 
3050   /// Build a new C++ typeid(type) expression.
3051   ///
3052   /// By default, performs semantic analysis to build the new expression.
3053   /// Subclasses may override this routine to provide different behavior.
3054   ExprResult RebuildCXXTypeidExpr(QualType TypeInfoType,
3055                                         SourceLocation TypeidLoc,
3056                                         TypeSourceInfo *Operand,
3057                                         SourceLocation RParenLoc) {
3058     return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand,
3059                                     RParenLoc);
3060   }
3061 
3062 
3063   /// Build a new C++ typeid(expr) expression.
3064   ///
3065   /// By default, performs semantic analysis to build the new expression.
3066   /// Subclasses may override this routine to provide different behavior.
3067   ExprResult RebuildCXXTypeidExpr(QualType TypeInfoType,
3068                                         SourceLocation TypeidLoc,
3069                                         Expr *Operand,
3070                                         SourceLocation RParenLoc) {
3071     return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand,
3072                                     RParenLoc);
3073   }
3074 
3075   /// Build a new C++ __uuidof(type) expression.
3076   ///
3077   /// By default, performs semantic analysis to build the new expression.
3078   /// Subclasses may override this routine to provide different behavior.
3079   ExprResult RebuildCXXUuidofExpr(QualType Type, SourceLocation TypeidLoc,
3080                                   TypeSourceInfo *Operand,
3081                                   SourceLocation RParenLoc) {
3082     return getSema().BuildCXXUuidof(Type, TypeidLoc, Operand, RParenLoc);
3083   }
3084 
3085   /// Build a new C++ __uuidof(expr) expression.
3086   ///
3087   /// By default, performs semantic analysis to build the new expression.
3088   /// Subclasses may override this routine to provide different behavior.
3089   ExprResult RebuildCXXUuidofExpr(QualType Type, SourceLocation TypeidLoc,
3090                                   Expr *Operand, SourceLocation RParenLoc) {
3091     return getSema().BuildCXXUuidof(Type, TypeidLoc, Operand, RParenLoc);
3092   }
3093 
3094   /// Build a new C++ "this" expression.
3095   ///
3096   /// By default, builds a new "this" expression without performing any
3097   /// semantic analysis. Subclasses may override this routine to provide
3098   /// different behavior.
3099   ExprResult RebuildCXXThisExpr(SourceLocation ThisLoc,
3100                                 QualType ThisType,
3101                                 bool isImplicit) {
3102     return getSema().BuildCXXThisExpr(ThisLoc, ThisType, isImplicit);
3103   }
3104 
3105   /// Build a new C++ throw expression.
3106   ///
3107   /// By default, performs semantic analysis to build the new expression.
3108   /// Subclasses may override this routine to provide different behavior.
3109   ExprResult RebuildCXXThrowExpr(SourceLocation ThrowLoc, Expr *Sub,
3110                                  bool IsThrownVariableInScope) {
3111     return getSema().BuildCXXThrow(ThrowLoc, Sub, IsThrownVariableInScope);
3112   }
3113 
3114   /// Build a new C++ default-argument expression.
3115   ///
3116   /// By default, builds a new default-argument expression, which does not
3117   /// require any semantic analysis. Subclasses may override this routine to
3118   /// provide different behavior.
3119   ExprResult RebuildCXXDefaultArgExpr(SourceLocation Loc, ParmVarDecl *Param) {
3120     return CXXDefaultArgExpr::Create(getSema().Context, Loc, Param,
3121                                      getSema().CurContext);
3122   }
3123 
3124   /// Build a new C++11 default-initialization expression.
3125   ///
3126   /// By default, builds a new default field initialization expression, which
3127   /// does not require any semantic analysis. Subclasses may override this
3128   /// routine to provide different behavior.
3129   ExprResult RebuildCXXDefaultInitExpr(SourceLocation Loc,
3130                                        FieldDecl *Field) {
3131     return CXXDefaultInitExpr::Create(getSema().Context, Loc, Field,
3132                                       getSema().CurContext);
3133   }
3134 
3135   /// Build a new C++ zero-initialization expression.
3136   ///
3137   /// By default, performs semantic analysis to build the new expression.
3138   /// Subclasses may override this routine to provide different behavior.
3139   ExprResult RebuildCXXScalarValueInitExpr(TypeSourceInfo *TSInfo,
3140                                            SourceLocation LParenLoc,
3141                                            SourceLocation RParenLoc) {
3142     return getSema().BuildCXXTypeConstructExpr(
3143         TSInfo, LParenLoc, None, RParenLoc, /*ListInitialization=*/false);
3144   }
3145 
3146   /// Build a new C++ "new" expression.
3147   ///
3148   /// By default, performs semantic analysis to build the new expression.
3149   /// Subclasses may override this routine to provide different behavior.
3150   ExprResult RebuildCXXNewExpr(SourceLocation StartLoc,
3151                                bool UseGlobal,
3152                                SourceLocation PlacementLParen,
3153                                MultiExprArg PlacementArgs,
3154                                SourceLocation PlacementRParen,
3155                                SourceRange TypeIdParens,
3156                                QualType AllocatedType,
3157                                TypeSourceInfo *AllocatedTypeInfo,
3158                                Optional<Expr *> ArraySize,
3159                                SourceRange DirectInitRange,
3160                                Expr *Initializer) {
3161     return getSema().BuildCXXNew(StartLoc, UseGlobal,
3162                                  PlacementLParen,
3163                                  PlacementArgs,
3164                                  PlacementRParen,
3165                                  TypeIdParens,
3166                                  AllocatedType,
3167                                  AllocatedTypeInfo,
3168                                  ArraySize,
3169                                  DirectInitRange,
3170                                  Initializer);
3171   }
3172 
3173   /// Build a new C++ "delete" expression.
3174   ///
3175   /// By default, performs semantic analysis to build the new expression.
3176   /// Subclasses may override this routine to provide different behavior.
3177   ExprResult RebuildCXXDeleteExpr(SourceLocation StartLoc,
3178                                         bool IsGlobalDelete,
3179                                         bool IsArrayForm,
3180                                         Expr *Operand) {
3181     return getSema().ActOnCXXDelete(StartLoc, IsGlobalDelete, IsArrayForm,
3182                                     Operand);
3183   }
3184 
3185   /// Build a new type trait expression.
3186   ///
3187   /// By default, performs semantic analysis to build the new expression.
3188   /// Subclasses may override this routine to provide different behavior.
3189   ExprResult RebuildTypeTrait(TypeTrait Trait,
3190                               SourceLocation StartLoc,
3191                               ArrayRef<TypeSourceInfo *> Args,
3192                               SourceLocation RParenLoc) {
3193     return getSema().BuildTypeTrait(Trait, StartLoc, Args, RParenLoc);
3194   }
3195 
3196   /// Build a new array type trait expression.
3197   ///
3198   /// By default, performs semantic analysis to build the new expression.
3199   /// Subclasses may override this routine to provide different behavior.
3200   ExprResult RebuildArrayTypeTrait(ArrayTypeTrait Trait,
3201                                    SourceLocation StartLoc,
3202                                    TypeSourceInfo *TSInfo,
3203                                    Expr *DimExpr,
3204                                    SourceLocation RParenLoc) {
3205     return getSema().BuildArrayTypeTrait(Trait, StartLoc, TSInfo, DimExpr, RParenLoc);
3206   }
3207 
3208   /// Build a new expression trait expression.
3209   ///
3210   /// By default, performs semantic analysis to build the new expression.
3211   /// Subclasses may override this routine to provide different behavior.
3212   ExprResult RebuildExpressionTrait(ExpressionTrait Trait,
3213                                    SourceLocation StartLoc,
3214                                    Expr *Queried,
3215                                    SourceLocation RParenLoc) {
3216     return getSema().BuildExpressionTrait(Trait, StartLoc, Queried, RParenLoc);
3217   }
3218 
3219   /// Build a new (previously unresolved) declaration reference
3220   /// expression.
3221   ///
3222   /// By default, performs semantic analysis to build the new expression.
3223   /// Subclasses may override this routine to provide different behavior.
3224   ExprResult RebuildDependentScopeDeclRefExpr(
3225                                           NestedNameSpecifierLoc QualifierLoc,
3226                                           SourceLocation TemplateKWLoc,
3227                                        const DeclarationNameInfo &NameInfo,
3228                               const TemplateArgumentListInfo *TemplateArgs,
3229                                           bool IsAddressOfOperand,
3230                                           TypeSourceInfo **RecoveryTSI) {
3231     CXXScopeSpec SS;
3232     SS.Adopt(QualifierLoc);
3233 
3234     if (TemplateArgs || TemplateKWLoc.isValid())
3235       return getSema().BuildQualifiedTemplateIdExpr(SS, TemplateKWLoc, NameInfo,
3236                                                     TemplateArgs);
3237 
3238     return getSema().BuildQualifiedDeclarationNameExpr(
3239         SS, NameInfo, IsAddressOfOperand, /*S*/nullptr, RecoveryTSI);
3240   }
3241 
3242   /// Build a new template-id expression.
3243   ///
3244   /// By default, performs semantic analysis to build the new expression.
3245   /// Subclasses may override this routine to provide different behavior.
3246   ExprResult RebuildTemplateIdExpr(const CXXScopeSpec &SS,
3247                                    SourceLocation TemplateKWLoc,
3248                                    LookupResult &R,
3249                                    bool RequiresADL,
3250                               const TemplateArgumentListInfo *TemplateArgs) {
3251     return getSema().BuildTemplateIdExpr(SS, TemplateKWLoc, R, RequiresADL,
3252                                          TemplateArgs);
3253   }
3254 
3255   /// Build a new object-construction expression.
3256   ///
3257   /// By default, performs semantic analysis to build the new expression.
3258   /// Subclasses may override this routine to provide different behavior.
3259   ExprResult RebuildCXXConstructExpr(QualType T,
3260                                      SourceLocation Loc,
3261                                      CXXConstructorDecl *Constructor,
3262                                      bool IsElidable,
3263                                      MultiExprArg Args,
3264                                      bool HadMultipleCandidates,
3265                                      bool ListInitialization,
3266                                      bool StdInitListInitialization,
3267                                      bool RequiresZeroInit,
3268                              CXXConstructExpr::ConstructionKind ConstructKind,
3269                                      SourceRange ParenRange) {
3270     // Reconstruct the constructor we originally found, which might be
3271     // different if this is a call to an inherited constructor.
3272     CXXConstructorDecl *FoundCtor = Constructor;
3273     if (Constructor->isInheritingConstructor())
3274       FoundCtor = Constructor->getInheritedConstructor().getConstructor();
3275 
3276     SmallVector<Expr *, 8> ConvertedArgs;
3277     if (getSema().CompleteConstructorCall(FoundCtor, T, Args, Loc,
3278                                           ConvertedArgs))
3279       return ExprError();
3280 
3281     return getSema().BuildCXXConstructExpr(Loc, T, Constructor,
3282                                            IsElidable,
3283                                            ConvertedArgs,
3284                                            HadMultipleCandidates,
3285                                            ListInitialization,
3286                                            StdInitListInitialization,
3287                                            RequiresZeroInit, ConstructKind,
3288                                            ParenRange);
3289   }
3290 
3291   /// Build a new implicit construction via inherited constructor
3292   /// expression.
3293   ExprResult RebuildCXXInheritedCtorInitExpr(QualType T, SourceLocation Loc,
3294                                              CXXConstructorDecl *Constructor,
3295                                              bool ConstructsVBase,
3296                                              bool InheritedFromVBase) {
3297     return new (getSema().Context) CXXInheritedCtorInitExpr(
3298         Loc, T, Constructor, ConstructsVBase, InheritedFromVBase);
3299   }
3300 
3301   /// Build a new object-construction expression.
3302   ///
3303   /// By default, performs semantic analysis to build the new expression.
3304   /// Subclasses may override this routine to provide different behavior.
3305   ExprResult RebuildCXXTemporaryObjectExpr(TypeSourceInfo *TSInfo,
3306                                            SourceLocation LParenOrBraceLoc,
3307                                            MultiExprArg Args,
3308                                            SourceLocation RParenOrBraceLoc,
3309                                            bool ListInitialization) {
3310     return getSema().BuildCXXTypeConstructExpr(
3311         TSInfo, LParenOrBraceLoc, Args, RParenOrBraceLoc, ListInitialization);
3312   }
3313 
3314   /// Build a new object-construction expression.
3315   ///
3316   /// By default, performs semantic analysis to build the new expression.
3317   /// Subclasses may override this routine to provide different behavior.
3318   ExprResult RebuildCXXUnresolvedConstructExpr(TypeSourceInfo *TSInfo,
3319                                                SourceLocation LParenLoc,
3320                                                MultiExprArg Args,
3321                                                SourceLocation RParenLoc,
3322                                                bool ListInitialization) {
3323     return getSema().BuildCXXTypeConstructExpr(TSInfo, LParenLoc, Args,
3324                                                RParenLoc, ListInitialization);
3325   }
3326 
3327   /// Build a new member reference expression.
3328   ///
3329   /// By default, performs semantic analysis to build the new expression.
3330   /// Subclasses may override this routine to provide different behavior.
3331   ExprResult RebuildCXXDependentScopeMemberExpr(Expr *BaseE,
3332                                                 QualType BaseType,
3333                                                 bool IsArrow,
3334                                                 SourceLocation OperatorLoc,
3335                                           NestedNameSpecifierLoc QualifierLoc,
3336                                                 SourceLocation TemplateKWLoc,
3337                                             NamedDecl *FirstQualifierInScope,
3338                                    const DeclarationNameInfo &MemberNameInfo,
3339                               const TemplateArgumentListInfo *TemplateArgs) {
3340     CXXScopeSpec SS;
3341     SS.Adopt(QualifierLoc);
3342 
3343     return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType,
3344                                             OperatorLoc, IsArrow,
3345                                             SS, TemplateKWLoc,
3346                                             FirstQualifierInScope,
3347                                             MemberNameInfo,
3348                                             TemplateArgs, /*S*/nullptr);
3349   }
3350 
3351   /// Build a new member reference expression.
3352   ///
3353   /// By default, performs semantic analysis to build the new expression.
3354   /// Subclasses may override this routine to provide different behavior.
3355   ExprResult RebuildUnresolvedMemberExpr(Expr *BaseE, QualType BaseType,
3356                                          SourceLocation OperatorLoc,
3357                                          bool IsArrow,
3358                                          NestedNameSpecifierLoc QualifierLoc,
3359                                          SourceLocation TemplateKWLoc,
3360                                          NamedDecl *FirstQualifierInScope,
3361                                          LookupResult &R,
3362                                 const TemplateArgumentListInfo *TemplateArgs) {
3363     CXXScopeSpec SS;
3364     SS.Adopt(QualifierLoc);
3365 
3366     return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType,
3367                                             OperatorLoc, IsArrow,
3368                                             SS, TemplateKWLoc,
3369                                             FirstQualifierInScope,
3370                                             R, TemplateArgs, /*S*/nullptr);
3371   }
3372 
3373   /// Build a new noexcept expression.
3374   ///
3375   /// By default, performs semantic analysis to build the new expression.
3376   /// Subclasses may override this routine to provide different behavior.
3377   ExprResult RebuildCXXNoexceptExpr(SourceRange Range, Expr *Arg) {
3378     return SemaRef.BuildCXXNoexceptExpr(Range.getBegin(), Arg, Range.getEnd());
3379   }
3380 
3381   /// Build a new expression to compute the length of a parameter pack.
3382   ExprResult RebuildSizeOfPackExpr(SourceLocation OperatorLoc,
3383                                    NamedDecl *Pack,
3384                                    SourceLocation PackLoc,
3385                                    SourceLocation RParenLoc,
3386                                    Optional<unsigned> Length,
3387                                    ArrayRef<TemplateArgument> PartialArgs) {
3388     return SizeOfPackExpr::Create(SemaRef.Context, OperatorLoc, Pack, PackLoc,
3389                                   RParenLoc, Length, PartialArgs);
3390   }
3391 
3392   /// Build a new expression representing a call to a source location
3393   ///  builtin.
3394   ///
3395   /// By default, performs semantic analysis to build the new expression.
3396   /// Subclasses may override this routine to provide different behavior.
3397   ExprResult RebuildSourceLocExpr(SourceLocExpr::IdentKind Kind,
3398                                   QualType ResultTy, SourceLocation BuiltinLoc,
3399                                   SourceLocation RPLoc,
3400                                   DeclContext *ParentContext) {
3401     return getSema().BuildSourceLocExpr(Kind, ResultTy, BuiltinLoc, RPLoc,
3402                                         ParentContext);
3403   }
3404 
3405   /// Build a new Objective-C boxed expression.
3406   ///
3407   /// By default, performs semantic analysis to build the new expression.
3408   /// Subclasses may override this routine to provide different behavior.
3409   ExprResult RebuildConceptSpecializationExpr(NestedNameSpecifierLoc NNS,
3410       SourceLocation TemplateKWLoc, DeclarationNameInfo ConceptNameInfo,
3411       NamedDecl *FoundDecl, ConceptDecl *NamedConcept,
3412       TemplateArgumentListInfo *TALI) {
3413     CXXScopeSpec SS;
3414     SS.Adopt(NNS);
3415     ExprResult Result = getSema().CheckConceptTemplateId(SS, TemplateKWLoc,
3416                                                          ConceptNameInfo,
3417                                                          FoundDecl,
3418                                                          NamedConcept, TALI);
3419     if (Result.isInvalid())
3420       return ExprError();
3421     return Result;
3422   }
3423 
3424   /// \brief Build a new requires expression.
3425   ///
3426   /// By default, performs semantic analysis to build the new expression.
3427   /// Subclasses may override this routine to provide different behavior.
3428   ExprResult RebuildRequiresExpr(SourceLocation RequiresKWLoc,
3429                                  RequiresExprBodyDecl *Body,
3430                                  ArrayRef<ParmVarDecl *> LocalParameters,
3431                                  ArrayRef<concepts::Requirement *> Requirements,
3432                                  SourceLocation ClosingBraceLoc) {
3433     return RequiresExpr::Create(SemaRef.Context, RequiresKWLoc, Body,
3434                                 LocalParameters, Requirements, ClosingBraceLoc);
3435   }
3436 
3437   concepts::TypeRequirement *
3438   RebuildTypeRequirement(
3439       concepts::Requirement::SubstitutionDiagnostic *SubstDiag) {
3440     return SemaRef.BuildTypeRequirement(SubstDiag);
3441   }
3442 
3443   concepts::TypeRequirement *RebuildTypeRequirement(TypeSourceInfo *T) {
3444     return SemaRef.BuildTypeRequirement(T);
3445   }
3446 
3447   concepts::ExprRequirement *
3448   RebuildExprRequirement(
3449       concepts::Requirement::SubstitutionDiagnostic *SubstDiag, bool IsSimple,
3450       SourceLocation NoexceptLoc,
3451       concepts::ExprRequirement::ReturnTypeRequirement Ret) {
3452     return SemaRef.BuildExprRequirement(SubstDiag, IsSimple, NoexceptLoc,
3453                                         std::move(Ret));
3454   }
3455 
3456   concepts::ExprRequirement *
3457   RebuildExprRequirement(Expr *E, bool IsSimple, SourceLocation NoexceptLoc,
3458                          concepts::ExprRequirement::ReturnTypeRequirement Ret) {
3459     return SemaRef.BuildExprRequirement(E, IsSimple, NoexceptLoc,
3460                                         std::move(Ret));
3461   }
3462 
3463   concepts::NestedRequirement *
3464   RebuildNestedRequirement(
3465       concepts::Requirement::SubstitutionDiagnostic *SubstDiag) {
3466     return SemaRef.BuildNestedRequirement(SubstDiag);
3467   }
3468 
3469   concepts::NestedRequirement *RebuildNestedRequirement(Expr *Constraint) {
3470     return SemaRef.BuildNestedRequirement(Constraint);
3471   }
3472 
3473   /// \brief Build a new Objective-C boxed expression.
3474   ///
3475   /// By default, performs semantic analysis to build the new expression.
3476   /// Subclasses may override this routine to provide different behavior.
3477   ExprResult RebuildObjCBoxedExpr(SourceRange SR, Expr *ValueExpr) {
3478     return getSema().BuildObjCBoxedExpr(SR, ValueExpr);
3479   }
3480 
3481   /// Build a new Objective-C array literal.
3482   ///
3483   /// By default, performs semantic analysis to build the new expression.
3484   /// Subclasses may override this routine to provide different behavior.
3485   ExprResult RebuildObjCArrayLiteral(SourceRange Range,
3486                                      Expr **Elements, unsigned NumElements) {
3487     return getSema().BuildObjCArrayLiteral(Range,
3488                                            MultiExprArg(Elements, NumElements));
3489   }
3490 
3491   ExprResult RebuildObjCSubscriptRefExpr(SourceLocation RB,
3492                                          Expr *Base, Expr *Key,
3493                                          ObjCMethodDecl *getterMethod,
3494                                          ObjCMethodDecl *setterMethod) {
3495     return  getSema().BuildObjCSubscriptExpression(RB, Base, Key,
3496                                                    getterMethod, setterMethod);
3497   }
3498 
3499   /// Build a new Objective-C dictionary literal.
3500   ///
3501   /// By default, performs semantic analysis to build the new expression.
3502   /// Subclasses may override this routine to provide different behavior.
3503   ExprResult RebuildObjCDictionaryLiteral(SourceRange Range,
3504                               MutableArrayRef<ObjCDictionaryElement> Elements) {
3505     return getSema().BuildObjCDictionaryLiteral(Range, Elements);
3506   }
3507 
3508   /// Build a new Objective-C \@encode expression.
3509   ///
3510   /// By default, performs semantic analysis to build the new expression.
3511   /// Subclasses may override this routine to provide different behavior.
3512   ExprResult RebuildObjCEncodeExpr(SourceLocation AtLoc,
3513                                          TypeSourceInfo *EncodeTypeInfo,
3514                                          SourceLocation RParenLoc) {
3515     return SemaRef.BuildObjCEncodeExpression(AtLoc, EncodeTypeInfo, RParenLoc);
3516   }
3517 
3518   /// Build a new Objective-C class message.
3519   ExprResult RebuildObjCMessageExpr(TypeSourceInfo *ReceiverTypeInfo,
3520                                           Selector Sel,
3521                                           ArrayRef<SourceLocation> SelectorLocs,
3522                                           ObjCMethodDecl *Method,
3523                                           SourceLocation LBracLoc,
3524                                           MultiExprArg Args,
3525                                           SourceLocation RBracLoc) {
3526     return SemaRef.BuildClassMessage(ReceiverTypeInfo,
3527                                      ReceiverTypeInfo->getType(),
3528                                      /*SuperLoc=*/SourceLocation(),
3529                                      Sel, Method, LBracLoc, SelectorLocs,
3530                                      RBracLoc, Args);
3531   }
3532 
3533   /// Build a new Objective-C instance message.
3534   ExprResult RebuildObjCMessageExpr(Expr *Receiver,
3535                                           Selector Sel,
3536                                           ArrayRef<SourceLocation> SelectorLocs,
3537                                           ObjCMethodDecl *Method,
3538                                           SourceLocation LBracLoc,
3539                                           MultiExprArg Args,
3540                                           SourceLocation RBracLoc) {
3541     return SemaRef.BuildInstanceMessage(Receiver,
3542                                         Receiver->getType(),
3543                                         /*SuperLoc=*/SourceLocation(),
3544                                         Sel, Method, LBracLoc, SelectorLocs,
3545                                         RBracLoc, Args);
3546   }
3547 
3548   /// Build a new Objective-C instance/class message to 'super'.
3549   ExprResult RebuildObjCMessageExpr(SourceLocation SuperLoc,
3550                                     Selector Sel,
3551                                     ArrayRef<SourceLocation> SelectorLocs,
3552                                     QualType SuperType,
3553                                     ObjCMethodDecl *Method,
3554                                     SourceLocation LBracLoc,
3555                                     MultiExprArg Args,
3556                                     SourceLocation RBracLoc) {
3557     return Method->isInstanceMethod() ? SemaRef.BuildInstanceMessage(nullptr,
3558                                           SuperType,
3559                                           SuperLoc,
3560                                           Sel, Method, LBracLoc, SelectorLocs,
3561                                           RBracLoc, Args)
3562                                       : SemaRef.BuildClassMessage(nullptr,
3563                                           SuperType,
3564                                           SuperLoc,
3565                                           Sel, Method, LBracLoc, SelectorLocs,
3566                                           RBracLoc, Args);
3567 
3568 
3569   }
3570 
3571   /// Build a new Objective-C ivar reference expression.
3572   ///
3573   /// By default, performs semantic analysis to build the new expression.
3574   /// Subclasses may override this routine to provide different behavior.
3575   ExprResult RebuildObjCIvarRefExpr(Expr *BaseArg, ObjCIvarDecl *Ivar,
3576                                           SourceLocation IvarLoc,
3577                                           bool IsArrow, bool IsFreeIvar) {
3578     CXXScopeSpec SS;
3579     DeclarationNameInfo NameInfo(Ivar->getDeclName(), IvarLoc);
3580     ExprResult Result = getSema().BuildMemberReferenceExpr(
3581         BaseArg, BaseArg->getType(),
3582         /*FIXME:*/ IvarLoc, IsArrow, SS, SourceLocation(),
3583         /*FirstQualifierInScope=*/nullptr, NameInfo,
3584         /*TemplateArgs=*/nullptr,
3585         /*S=*/nullptr);
3586     if (IsFreeIvar && Result.isUsable())
3587       cast<ObjCIvarRefExpr>(Result.get())->setIsFreeIvar(IsFreeIvar);
3588     return Result;
3589   }
3590 
3591   /// Build a new Objective-C property reference expression.
3592   ///
3593   /// By default, performs semantic analysis to build the new expression.
3594   /// Subclasses may override this routine to provide different behavior.
3595   ExprResult RebuildObjCPropertyRefExpr(Expr *BaseArg,
3596                                         ObjCPropertyDecl *Property,
3597                                         SourceLocation PropertyLoc) {
3598     CXXScopeSpec SS;
3599     DeclarationNameInfo NameInfo(Property->getDeclName(), PropertyLoc);
3600     return getSema().BuildMemberReferenceExpr(BaseArg, BaseArg->getType(),
3601                                               /*FIXME:*/PropertyLoc,
3602                                               /*IsArrow=*/false,
3603                                               SS, SourceLocation(),
3604                                               /*FirstQualifierInScope=*/nullptr,
3605                                               NameInfo,
3606                                               /*TemplateArgs=*/nullptr,
3607                                               /*S=*/nullptr);
3608   }
3609 
3610   /// Build a new Objective-C property reference expression.
3611   ///
3612   /// By default, performs semantic analysis to build the new expression.
3613   /// Subclasses may override this routine to provide different behavior.
3614   ExprResult RebuildObjCPropertyRefExpr(Expr *Base, QualType T,
3615                                         ObjCMethodDecl *Getter,
3616                                         ObjCMethodDecl *Setter,
3617                                         SourceLocation PropertyLoc) {
3618     // Since these expressions can only be value-dependent, we do not
3619     // need to perform semantic analysis again.
3620     return Owned(
3621       new (getSema().Context) ObjCPropertyRefExpr(Getter, Setter, T,
3622                                                   VK_LValue, OK_ObjCProperty,
3623                                                   PropertyLoc, Base));
3624   }
3625 
3626   /// Build a new Objective-C "isa" expression.
3627   ///
3628   /// By default, performs semantic analysis to build the new expression.
3629   /// Subclasses may override this routine to provide different behavior.
3630   ExprResult RebuildObjCIsaExpr(Expr *BaseArg, SourceLocation IsaLoc,
3631                                 SourceLocation OpLoc, bool IsArrow) {
3632     CXXScopeSpec SS;
3633     DeclarationNameInfo NameInfo(&getSema().Context.Idents.get("isa"), IsaLoc);
3634     return getSema().BuildMemberReferenceExpr(BaseArg, BaseArg->getType(),
3635                                               OpLoc, IsArrow,
3636                                               SS, SourceLocation(),
3637                                               /*FirstQualifierInScope=*/nullptr,
3638                                               NameInfo,
3639                                               /*TemplateArgs=*/nullptr,
3640                                               /*S=*/nullptr);
3641   }
3642 
3643   /// Build a new shuffle vector expression.
3644   ///
3645   /// By default, performs semantic analysis to build the new expression.
3646   /// Subclasses may override this routine to provide different behavior.
3647   ExprResult RebuildShuffleVectorExpr(SourceLocation BuiltinLoc,
3648                                       MultiExprArg SubExprs,
3649                                       SourceLocation RParenLoc) {
3650     // Find the declaration for __builtin_shufflevector
3651     const IdentifierInfo &Name
3652       = SemaRef.Context.Idents.get("__builtin_shufflevector");
3653     TranslationUnitDecl *TUDecl = SemaRef.Context.getTranslationUnitDecl();
3654     DeclContext::lookup_result Lookup = TUDecl->lookup(DeclarationName(&Name));
3655     assert(!Lookup.empty() && "No __builtin_shufflevector?");
3656 
3657     // Build a reference to the __builtin_shufflevector builtin
3658     FunctionDecl *Builtin = cast<FunctionDecl>(Lookup.front());
3659     Expr *Callee = new (SemaRef.Context)
3660         DeclRefExpr(SemaRef.Context, Builtin, false,
3661                     SemaRef.Context.BuiltinFnTy, VK_PRValue, BuiltinLoc);
3662     QualType CalleePtrTy = SemaRef.Context.getPointerType(Builtin->getType());
3663     Callee = SemaRef.ImpCastExprToType(Callee, CalleePtrTy,
3664                                        CK_BuiltinFnToFnPtr).get();
3665 
3666     // Build the CallExpr
3667     ExprResult TheCall = CallExpr::Create(
3668         SemaRef.Context, Callee, SubExprs, Builtin->getCallResultType(),
3669         Expr::getValueKindForType(Builtin->getReturnType()), RParenLoc,
3670         FPOptionsOverride());
3671 
3672     // Type-check the __builtin_shufflevector expression.
3673     return SemaRef.SemaBuiltinShuffleVector(cast<CallExpr>(TheCall.get()));
3674   }
3675 
3676   /// Build a new convert vector expression.
3677   ExprResult RebuildConvertVectorExpr(SourceLocation BuiltinLoc,
3678                                       Expr *SrcExpr, TypeSourceInfo *DstTInfo,
3679                                       SourceLocation RParenLoc) {
3680     return SemaRef.SemaConvertVectorExpr(SrcExpr, DstTInfo,
3681                                          BuiltinLoc, RParenLoc);
3682   }
3683 
3684   /// Build a new template argument pack expansion.
3685   ///
3686   /// By default, performs semantic analysis to build a new pack expansion
3687   /// for a template argument. Subclasses may override this routine to provide
3688   /// different behavior.
3689   TemplateArgumentLoc RebuildPackExpansion(TemplateArgumentLoc Pattern,
3690                                            SourceLocation EllipsisLoc,
3691                                            Optional<unsigned> NumExpansions) {
3692     switch (Pattern.getArgument().getKind()) {
3693     case TemplateArgument::Expression: {
3694       ExprResult Result
3695         = getSema().CheckPackExpansion(Pattern.getSourceExpression(),
3696                                        EllipsisLoc, NumExpansions);
3697       if (Result.isInvalid())
3698         return TemplateArgumentLoc();
3699 
3700       return TemplateArgumentLoc(Result.get(), Result.get());
3701     }
3702 
3703     case TemplateArgument::Template:
3704       return TemplateArgumentLoc(
3705           SemaRef.Context,
3706           TemplateArgument(Pattern.getArgument().getAsTemplate(),
3707                            NumExpansions),
3708           Pattern.getTemplateQualifierLoc(), Pattern.getTemplateNameLoc(),
3709           EllipsisLoc);
3710 
3711     case TemplateArgument::Null:
3712     case TemplateArgument::Integral:
3713     case TemplateArgument::Declaration:
3714     case TemplateArgument::Pack:
3715     case TemplateArgument::TemplateExpansion:
3716     case TemplateArgument::NullPtr:
3717       llvm_unreachable("Pack expansion pattern has no parameter packs");
3718 
3719     case TemplateArgument::Type:
3720       if (TypeSourceInfo *Expansion
3721             = getSema().CheckPackExpansion(Pattern.getTypeSourceInfo(),
3722                                            EllipsisLoc,
3723                                            NumExpansions))
3724         return TemplateArgumentLoc(TemplateArgument(Expansion->getType()),
3725                                    Expansion);
3726       break;
3727     }
3728 
3729     return TemplateArgumentLoc();
3730   }
3731 
3732   /// Build a new expression pack expansion.
3733   ///
3734   /// By default, performs semantic analysis to build a new pack expansion
3735   /// for an expression. Subclasses may override this routine to provide
3736   /// different behavior.
3737   ExprResult RebuildPackExpansion(Expr *Pattern, SourceLocation EllipsisLoc,
3738                                   Optional<unsigned> NumExpansions) {
3739     return getSema().CheckPackExpansion(Pattern, EllipsisLoc, NumExpansions);
3740   }
3741 
3742   /// Build a new C++1z fold-expression.
3743   ///
3744   /// By default, performs semantic analysis in order to build a new fold
3745   /// expression.
3746   ExprResult RebuildCXXFoldExpr(UnresolvedLookupExpr *ULE,
3747                                 SourceLocation LParenLoc, Expr *LHS,
3748                                 BinaryOperatorKind Operator,
3749                                 SourceLocation EllipsisLoc, Expr *RHS,
3750                                 SourceLocation RParenLoc,
3751                                 Optional<unsigned> NumExpansions) {
3752     return getSema().BuildCXXFoldExpr(ULE, LParenLoc, LHS, Operator,
3753                                       EllipsisLoc, RHS, RParenLoc,
3754                                       NumExpansions);
3755   }
3756 
3757   /// Build an empty C++1z fold-expression with the given operator.
3758   ///
3759   /// By default, produces the fallback value for the fold-expression, or
3760   /// produce an error if there is no fallback value.
3761   ExprResult RebuildEmptyCXXFoldExpr(SourceLocation EllipsisLoc,
3762                                      BinaryOperatorKind Operator) {
3763     return getSema().BuildEmptyCXXFoldExpr(EllipsisLoc, Operator);
3764   }
3765 
3766   /// Build a new atomic operation expression.
3767   ///
3768   /// By default, performs semantic analysis to build the new expression.
3769   /// Subclasses may override this routine to provide different behavior.
3770   ExprResult RebuildAtomicExpr(SourceLocation BuiltinLoc, MultiExprArg SubExprs,
3771                                AtomicExpr::AtomicOp Op,
3772                                SourceLocation RParenLoc) {
3773     // Use this for all of the locations, since we don't know the difference
3774     // between the call and the expr at this point.
3775     SourceRange Range{BuiltinLoc, RParenLoc};
3776     return getSema().BuildAtomicExpr(Range, Range, RParenLoc, SubExprs, Op,
3777                                      Sema::AtomicArgumentOrder::AST);
3778   }
3779 
3780   ExprResult RebuildRecoveryExpr(SourceLocation BeginLoc, SourceLocation EndLoc,
3781                                  ArrayRef<Expr *> SubExprs, QualType Type) {
3782     return getSema().CreateRecoveryExpr(BeginLoc, EndLoc, SubExprs, Type);
3783   }
3784 
3785 private:
3786   TypeLoc TransformTypeInObjectScope(TypeLoc TL,
3787                                      QualType ObjectType,
3788                                      NamedDecl *FirstQualifierInScope,
3789                                      CXXScopeSpec &SS);
3790 
3791   TypeSourceInfo *TransformTypeInObjectScope(TypeSourceInfo *TSInfo,
3792                                              QualType ObjectType,
3793                                              NamedDecl *FirstQualifierInScope,
3794                                              CXXScopeSpec &SS);
3795 
3796   TypeSourceInfo *TransformTSIInObjectScope(TypeLoc TL, QualType ObjectType,
3797                                             NamedDecl *FirstQualifierInScope,
3798                                             CXXScopeSpec &SS);
3799 
3800   QualType TransformDependentNameType(TypeLocBuilder &TLB,
3801                                       DependentNameTypeLoc TL,
3802                                       bool DeducibleTSTContext);
3803 };
3804 
3805 template <typename Derived>
3806 StmtResult TreeTransform<Derived>::TransformStmt(Stmt *S, StmtDiscardKind SDK) {
3807   if (!S)
3808     return S;
3809 
3810   switch (S->getStmtClass()) {
3811   case Stmt::NoStmtClass: break;
3812 
3813   // Transform individual statement nodes
3814   // Pass SDK into statements that can produce a value
3815 #define STMT(Node, Parent)                                              \
3816   case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(S));
3817 #define VALUESTMT(Node, Parent)                                         \
3818   case Stmt::Node##Class:                                               \
3819     return getDerived().Transform##Node(cast<Node>(S), SDK);
3820 #define ABSTRACT_STMT(Node)
3821 #define EXPR(Node, Parent)
3822 #include "clang/AST/StmtNodes.inc"
3823 
3824   // Transform expressions by calling TransformExpr.
3825 #define STMT(Node, Parent)
3826 #define ABSTRACT_STMT(Stmt)
3827 #define EXPR(Node, Parent) case Stmt::Node##Class:
3828 #include "clang/AST/StmtNodes.inc"
3829     {
3830       ExprResult E = getDerived().TransformExpr(cast<Expr>(S));
3831 
3832       if (SDK == SDK_StmtExprResult)
3833         E = getSema().ActOnStmtExprResult(E);
3834       return getSema().ActOnExprStmt(E, SDK == SDK_Discarded);
3835     }
3836   }
3837 
3838   return S;
3839 }
3840 
3841 template<typename Derived>
3842 OMPClause *TreeTransform<Derived>::TransformOMPClause(OMPClause *S) {
3843   if (!S)
3844     return S;
3845 
3846   switch (S->getClauseKind()) {
3847   default: break;
3848   // Transform individual clause nodes
3849 #define GEN_CLANG_CLAUSE_CLASS
3850 #define CLAUSE_CLASS(Enum, Str, Class)                                         \
3851   case Enum:                                                                   \
3852     return getDerived().Transform##Class(cast<Class>(S));
3853 #include "llvm/Frontend/OpenMP/OMP.inc"
3854   }
3855 
3856   return S;
3857 }
3858 
3859 
3860 template<typename Derived>
3861 ExprResult TreeTransform<Derived>::TransformExpr(Expr *E) {
3862   if (!E)
3863     return E;
3864 
3865   switch (E->getStmtClass()) {
3866     case Stmt::NoStmtClass: break;
3867 #define STMT(Node, Parent) case Stmt::Node##Class: break;
3868 #define ABSTRACT_STMT(Stmt)
3869 #define EXPR(Node, Parent)                                              \
3870     case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(E));
3871 #include "clang/AST/StmtNodes.inc"
3872   }
3873 
3874   return E;
3875 }
3876 
3877 template<typename Derived>
3878 ExprResult TreeTransform<Derived>::TransformInitializer(Expr *Init,
3879                                                         bool NotCopyInit) {
3880   // Initializers are instantiated like expressions, except that various outer
3881   // layers are stripped.
3882   if (!Init)
3883     return Init;
3884 
3885   if (auto *FE = dyn_cast<FullExpr>(Init))
3886     Init = FE->getSubExpr();
3887 
3888   if (auto *AIL = dyn_cast<ArrayInitLoopExpr>(Init)) {
3889     OpaqueValueExpr *OVE = AIL->getCommonExpr();
3890     Init = OVE->getSourceExpr();
3891   }
3892 
3893   if (MaterializeTemporaryExpr *MTE = dyn_cast<MaterializeTemporaryExpr>(Init))
3894     Init = MTE->getSubExpr();
3895 
3896   while (CXXBindTemporaryExpr *Binder = dyn_cast<CXXBindTemporaryExpr>(Init))
3897     Init = Binder->getSubExpr();
3898 
3899   if (ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(Init))
3900     Init = ICE->getSubExprAsWritten();
3901 
3902   if (CXXStdInitializerListExpr *ILE =
3903           dyn_cast<CXXStdInitializerListExpr>(Init))
3904     return TransformInitializer(ILE->getSubExpr(), NotCopyInit);
3905 
3906   // If this is copy-initialization, we only need to reconstruct
3907   // InitListExprs. Other forms of copy-initialization will be a no-op if
3908   // the initializer is already the right type.
3909   CXXConstructExpr *Construct = dyn_cast<CXXConstructExpr>(Init);
3910   if (!NotCopyInit && !(Construct && Construct->isListInitialization()))
3911     return getDerived().TransformExpr(Init);
3912 
3913   // Revert value-initialization back to empty parens.
3914   if (CXXScalarValueInitExpr *VIE = dyn_cast<CXXScalarValueInitExpr>(Init)) {
3915     SourceRange Parens = VIE->getSourceRange();
3916     return getDerived().RebuildParenListExpr(Parens.getBegin(), None,
3917                                              Parens.getEnd());
3918   }
3919 
3920   // FIXME: We shouldn't build ImplicitValueInitExprs for direct-initialization.
3921   if (isa<ImplicitValueInitExpr>(Init))
3922     return getDerived().RebuildParenListExpr(SourceLocation(), None,
3923                                              SourceLocation());
3924 
3925   // Revert initialization by constructor back to a parenthesized or braced list
3926   // of expressions. Any other form of initializer can just be reused directly.
3927   if (!Construct || isa<CXXTemporaryObjectExpr>(Construct))
3928     return getDerived().TransformExpr(Init);
3929 
3930   // If the initialization implicitly converted an initializer list to a
3931   // std::initializer_list object, unwrap the std::initializer_list too.
3932   if (Construct && Construct->isStdInitListInitialization())
3933     return TransformInitializer(Construct->getArg(0), NotCopyInit);
3934 
3935   // Enter a list-init context if this was list initialization.
3936   EnterExpressionEvaluationContext Context(
3937       getSema(), EnterExpressionEvaluationContext::InitList,
3938       Construct->isListInitialization());
3939 
3940   SmallVector<Expr*, 8> NewArgs;
3941   bool ArgChanged = false;
3942   if (getDerived().TransformExprs(Construct->getArgs(), Construct->getNumArgs(),
3943                                   /*IsCall*/true, NewArgs, &ArgChanged))
3944     return ExprError();
3945 
3946   // If this was list initialization, revert to syntactic list form.
3947   if (Construct->isListInitialization())
3948     return getDerived().RebuildInitList(Construct->getBeginLoc(), NewArgs,
3949                                         Construct->getEndLoc());
3950 
3951   // Build a ParenListExpr to represent anything else.
3952   SourceRange Parens = Construct->getParenOrBraceRange();
3953   if (Parens.isInvalid()) {
3954     // This was a variable declaration's initialization for which no initializer
3955     // was specified.
3956     assert(NewArgs.empty() &&
3957            "no parens or braces but have direct init with arguments?");
3958     return ExprEmpty();
3959   }
3960   return getDerived().RebuildParenListExpr(Parens.getBegin(), NewArgs,
3961                                            Parens.getEnd());
3962 }
3963 
3964 template<typename Derived>
3965 bool TreeTransform<Derived>::TransformExprs(Expr *const *Inputs,
3966                                             unsigned NumInputs,
3967                                             bool IsCall,
3968                                       SmallVectorImpl<Expr *> &Outputs,
3969                                             bool *ArgChanged) {
3970   for (unsigned I = 0; I != NumInputs; ++I) {
3971     // If requested, drop call arguments that need to be dropped.
3972     if (IsCall && getDerived().DropCallArgument(Inputs[I])) {
3973       if (ArgChanged)
3974         *ArgChanged = true;
3975 
3976       break;
3977     }
3978 
3979     if (PackExpansionExpr *Expansion = dyn_cast<PackExpansionExpr>(Inputs[I])) {
3980       Expr *Pattern = Expansion->getPattern();
3981 
3982       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
3983       getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
3984       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
3985 
3986       // Determine whether the set of unexpanded parameter packs can and should
3987       // be expanded.
3988       bool Expand = true;
3989       bool RetainExpansion = false;
3990       Optional<unsigned> OrigNumExpansions = Expansion->getNumExpansions();
3991       Optional<unsigned> NumExpansions = OrigNumExpansions;
3992       if (getDerived().TryExpandParameterPacks(Expansion->getEllipsisLoc(),
3993                                                Pattern->getSourceRange(),
3994                                                Unexpanded,
3995                                                Expand, RetainExpansion,
3996                                                NumExpansions))
3997         return true;
3998 
3999       if (!Expand) {
4000         // The transform has determined that we should perform a simple
4001         // transformation on the pack expansion, producing another pack
4002         // expansion.
4003         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
4004         ExprResult OutPattern = getDerived().TransformExpr(Pattern);
4005         if (OutPattern.isInvalid())
4006           return true;
4007 
4008         ExprResult Out = getDerived().RebuildPackExpansion(OutPattern.get(),
4009                                                 Expansion->getEllipsisLoc(),
4010                                                            NumExpansions);
4011         if (Out.isInvalid())
4012           return true;
4013 
4014         if (ArgChanged)
4015           *ArgChanged = true;
4016         Outputs.push_back(Out.get());
4017         continue;
4018       }
4019 
4020       // Record right away that the argument was changed.  This needs
4021       // to happen even if the array expands to nothing.
4022       if (ArgChanged) *ArgChanged = true;
4023 
4024       // The transform has determined that we should perform an elementwise
4025       // expansion of the pattern. Do so.
4026       for (unsigned I = 0; I != *NumExpansions; ++I) {
4027         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
4028         ExprResult Out = getDerived().TransformExpr(Pattern);
4029         if (Out.isInvalid())
4030           return true;
4031 
4032         if (Out.get()->containsUnexpandedParameterPack()) {
4033           Out = getDerived().RebuildPackExpansion(
4034               Out.get(), Expansion->getEllipsisLoc(), OrigNumExpansions);
4035           if (Out.isInvalid())
4036             return true;
4037         }
4038 
4039         Outputs.push_back(Out.get());
4040       }
4041 
4042       // If we're supposed to retain a pack expansion, do so by temporarily
4043       // forgetting the partially-substituted parameter pack.
4044       if (RetainExpansion) {
4045         ForgetPartiallySubstitutedPackRAII Forget(getDerived());
4046 
4047         ExprResult Out = getDerived().TransformExpr(Pattern);
4048         if (Out.isInvalid())
4049           return true;
4050 
4051         Out = getDerived().RebuildPackExpansion(
4052             Out.get(), Expansion->getEllipsisLoc(), OrigNumExpansions);
4053         if (Out.isInvalid())
4054           return true;
4055 
4056         Outputs.push_back(Out.get());
4057       }
4058 
4059       continue;
4060     }
4061 
4062     ExprResult Result =
4063       IsCall ? getDerived().TransformInitializer(Inputs[I], /*DirectInit*/false)
4064              : getDerived().TransformExpr(Inputs[I]);
4065     if (Result.isInvalid())
4066       return true;
4067 
4068     if (Result.get() != Inputs[I] && ArgChanged)
4069       *ArgChanged = true;
4070 
4071     Outputs.push_back(Result.get());
4072   }
4073 
4074   return false;
4075 }
4076 
4077 template <typename Derived>
4078 Sema::ConditionResult TreeTransform<Derived>::TransformCondition(
4079     SourceLocation Loc, VarDecl *Var, Expr *Expr, Sema::ConditionKind Kind) {
4080   if (Var) {
4081     VarDecl *ConditionVar = cast_or_null<VarDecl>(
4082         getDerived().TransformDefinition(Var->getLocation(), Var));
4083 
4084     if (!ConditionVar)
4085       return Sema::ConditionError();
4086 
4087     return getSema().ActOnConditionVariable(ConditionVar, Loc, Kind);
4088   }
4089 
4090   if (Expr) {
4091     ExprResult CondExpr = getDerived().TransformExpr(Expr);
4092 
4093     if (CondExpr.isInvalid())
4094       return Sema::ConditionError();
4095 
4096     return getSema().ActOnCondition(nullptr, Loc, CondExpr.get(), Kind,
4097                                     /*MissingOK=*/true);
4098   }
4099 
4100   return Sema::ConditionResult();
4101 }
4102 
4103 template <typename Derived>
4104 NestedNameSpecifierLoc TreeTransform<Derived>::TransformNestedNameSpecifierLoc(
4105     NestedNameSpecifierLoc NNS, QualType ObjectType,
4106     NamedDecl *FirstQualifierInScope) {
4107   SmallVector<NestedNameSpecifierLoc, 4> Qualifiers;
4108   for (NestedNameSpecifierLoc Qualifier = NNS; Qualifier;
4109        Qualifier = Qualifier.getPrefix())
4110     Qualifiers.push_back(Qualifier);
4111 
4112   CXXScopeSpec SS;
4113   while (!Qualifiers.empty()) {
4114     NestedNameSpecifierLoc Q = Qualifiers.pop_back_val();
4115     NestedNameSpecifier *QNNS = Q.getNestedNameSpecifier();
4116 
4117     switch (QNNS->getKind()) {
4118     case NestedNameSpecifier::Identifier: {
4119       Sema::NestedNameSpecInfo IdInfo(QNNS->getAsIdentifier(),
4120                                       Q.getLocalBeginLoc(), Q.getLocalEndLoc(),
4121                                       ObjectType);
4122       if (SemaRef.BuildCXXNestedNameSpecifier(/*Scope=*/nullptr, IdInfo, false,
4123                                               SS, FirstQualifierInScope, false))
4124         return NestedNameSpecifierLoc();
4125       break;
4126     }
4127 
4128     case NestedNameSpecifier::Namespace: {
4129       NamespaceDecl *NS =
4130           cast_or_null<NamespaceDecl>(getDerived().TransformDecl(
4131               Q.getLocalBeginLoc(), QNNS->getAsNamespace()));
4132       SS.Extend(SemaRef.Context, NS, Q.getLocalBeginLoc(), Q.getLocalEndLoc());
4133       break;
4134     }
4135 
4136     case NestedNameSpecifier::NamespaceAlias: {
4137       NamespaceAliasDecl *Alias =
4138           cast_or_null<NamespaceAliasDecl>(getDerived().TransformDecl(
4139               Q.getLocalBeginLoc(), QNNS->getAsNamespaceAlias()));
4140       SS.Extend(SemaRef.Context, Alias, Q.getLocalBeginLoc(),
4141                 Q.getLocalEndLoc());
4142       break;
4143     }
4144 
4145     case NestedNameSpecifier::Global:
4146       // There is no meaningful transformation that one could perform on the
4147       // global scope.
4148       SS.MakeGlobal(SemaRef.Context, Q.getBeginLoc());
4149       break;
4150 
4151     case NestedNameSpecifier::Super: {
4152       CXXRecordDecl *RD =
4153           cast_or_null<CXXRecordDecl>(getDerived().TransformDecl(
4154               SourceLocation(), QNNS->getAsRecordDecl()));
4155       SS.MakeSuper(SemaRef.Context, RD, Q.getBeginLoc(), Q.getEndLoc());
4156       break;
4157     }
4158 
4159     case NestedNameSpecifier::TypeSpecWithTemplate:
4160     case NestedNameSpecifier::TypeSpec: {
4161       TypeLoc TL = TransformTypeInObjectScope(Q.getTypeLoc(), ObjectType,
4162                                               FirstQualifierInScope, SS);
4163 
4164       if (!TL)
4165         return NestedNameSpecifierLoc();
4166 
4167       if (TL.getType()->isDependentType() || TL.getType()->isRecordType() ||
4168           (SemaRef.getLangOpts().CPlusPlus11 &&
4169            TL.getType()->isEnumeralType())) {
4170         assert(!TL.getType().hasLocalQualifiers() &&
4171                "Can't get cv-qualifiers here");
4172         if (TL.getType()->isEnumeralType())
4173           SemaRef.Diag(TL.getBeginLoc(),
4174                        diag::warn_cxx98_compat_enum_nested_name_spec);
4175         SS.Extend(SemaRef.Context, /*FIXME:*/ SourceLocation(), TL,
4176                   Q.getLocalEndLoc());
4177         break;
4178       }
4179       // If the nested-name-specifier is an invalid type def, don't emit an
4180       // error because a previous error should have already been emitted.
4181       TypedefTypeLoc TTL = TL.getAs<TypedefTypeLoc>();
4182       if (!TTL || !TTL.getTypedefNameDecl()->isInvalidDecl()) {
4183         SemaRef.Diag(TL.getBeginLoc(), diag::err_nested_name_spec_non_tag)
4184             << TL.getType() << SS.getRange();
4185       }
4186       return NestedNameSpecifierLoc();
4187     }
4188     }
4189 
4190     // The qualifier-in-scope and object type only apply to the leftmost entity.
4191     FirstQualifierInScope = nullptr;
4192     ObjectType = QualType();
4193   }
4194 
4195   // Don't rebuild the nested-name-specifier if we don't have to.
4196   if (SS.getScopeRep() == NNS.getNestedNameSpecifier() &&
4197       !getDerived().AlwaysRebuild())
4198     return NNS;
4199 
4200   // If we can re-use the source-location data from the original
4201   // nested-name-specifier, do so.
4202   if (SS.location_size() == NNS.getDataLength() &&
4203       memcmp(SS.location_data(), NNS.getOpaqueData(), SS.location_size()) == 0)
4204     return NestedNameSpecifierLoc(SS.getScopeRep(), NNS.getOpaqueData());
4205 
4206   // Allocate new nested-name-specifier location information.
4207   return SS.getWithLocInContext(SemaRef.Context);
4208 }
4209 
4210 template<typename Derived>
4211 DeclarationNameInfo
4212 TreeTransform<Derived>
4213 ::TransformDeclarationNameInfo(const DeclarationNameInfo &NameInfo) {
4214   DeclarationName Name = NameInfo.getName();
4215   if (!Name)
4216     return DeclarationNameInfo();
4217 
4218   switch (Name.getNameKind()) {
4219   case DeclarationName::Identifier:
4220   case DeclarationName::ObjCZeroArgSelector:
4221   case DeclarationName::ObjCOneArgSelector:
4222   case DeclarationName::ObjCMultiArgSelector:
4223   case DeclarationName::CXXOperatorName:
4224   case DeclarationName::CXXLiteralOperatorName:
4225   case DeclarationName::CXXUsingDirective:
4226     return NameInfo;
4227 
4228   case DeclarationName::CXXDeductionGuideName: {
4229     TemplateDecl *OldTemplate = Name.getCXXDeductionGuideTemplate();
4230     TemplateDecl *NewTemplate = cast_or_null<TemplateDecl>(
4231         getDerived().TransformDecl(NameInfo.getLoc(), OldTemplate));
4232     if (!NewTemplate)
4233       return DeclarationNameInfo();
4234 
4235     DeclarationNameInfo NewNameInfo(NameInfo);
4236     NewNameInfo.setName(
4237         SemaRef.Context.DeclarationNames.getCXXDeductionGuideName(NewTemplate));
4238     return NewNameInfo;
4239   }
4240 
4241   case DeclarationName::CXXConstructorName:
4242   case DeclarationName::CXXDestructorName:
4243   case DeclarationName::CXXConversionFunctionName: {
4244     TypeSourceInfo *NewTInfo;
4245     CanQualType NewCanTy;
4246     if (TypeSourceInfo *OldTInfo = NameInfo.getNamedTypeInfo()) {
4247       NewTInfo = getDerived().TransformType(OldTInfo);
4248       if (!NewTInfo)
4249         return DeclarationNameInfo();
4250       NewCanTy = SemaRef.Context.getCanonicalType(NewTInfo->getType());
4251     }
4252     else {
4253       NewTInfo = nullptr;
4254       TemporaryBase Rebase(*this, NameInfo.getLoc(), Name);
4255       QualType NewT = getDerived().TransformType(Name.getCXXNameType());
4256       if (NewT.isNull())
4257         return DeclarationNameInfo();
4258       NewCanTy = SemaRef.Context.getCanonicalType(NewT);
4259     }
4260 
4261     DeclarationName NewName
4262       = SemaRef.Context.DeclarationNames.getCXXSpecialName(Name.getNameKind(),
4263                                                            NewCanTy);
4264     DeclarationNameInfo NewNameInfo(NameInfo);
4265     NewNameInfo.setName(NewName);
4266     NewNameInfo.setNamedTypeInfo(NewTInfo);
4267     return NewNameInfo;
4268   }
4269   }
4270 
4271   llvm_unreachable("Unknown name kind.");
4272 }
4273 
4274 template<typename Derived>
4275 TemplateName
4276 TreeTransform<Derived>::TransformTemplateName(CXXScopeSpec &SS,
4277                                               TemplateName Name,
4278                                               SourceLocation NameLoc,
4279                                               QualType ObjectType,
4280                                               NamedDecl *FirstQualifierInScope,
4281                                               bool AllowInjectedClassName) {
4282   if (QualifiedTemplateName *QTN = Name.getAsQualifiedTemplateName()) {
4283     TemplateDecl *Template = QTN->getUnderlyingTemplate().getAsTemplateDecl();
4284     assert(Template && "qualified template name must refer to a template");
4285 
4286     TemplateDecl *TransTemplate
4287       = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc,
4288                                                               Template));
4289     if (!TransTemplate)
4290       return TemplateName();
4291 
4292     if (!getDerived().AlwaysRebuild() &&
4293         SS.getScopeRep() == QTN->getQualifier() &&
4294         TransTemplate == Template)
4295       return Name;
4296 
4297     return getDerived().RebuildTemplateName(SS, QTN->hasTemplateKeyword(),
4298                                             TransTemplate);
4299   }
4300 
4301   if (DependentTemplateName *DTN = Name.getAsDependentTemplateName()) {
4302     if (SS.getScopeRep()) {
4303       // These apply to the scope specifier, not the template.
4304       ObjectType = QualType();
4305       FirstQualifierInScope = nullptr;
4306     }
4307 
4308     if (!getDerived().AlwaysRebuild() &&
4309         SS.getScopeRep() == DTN->getQualifier() &&
4310         ObjectType.isNull())
4311       return Name;
4312 
4313     // FIXME: Preserve the location of the "template" keyword.
4314     SourceLocation TemplateKWLoc = NameLoc;
4315 
4316     if (DTN->isIdentifier()) {
4317       return getDerived().RebuildTemplateName(SS,
4318                                               TemplateKWLoc,
4319                                               *DTN->getIdentifier(),
4320                                               NameLoc,
4321                                               ObjectType,
4322                                               FirstQualifierInScope,
4323                                               AllowInjectedClassName);
4324     }
4325 
4326     return getDerived().RebuildTemplateName(SS, TemplateKWLoc,
4327                                             DTN->getOperator(), NameLoc,
4328                                             ObjectType, AllowInjectedClassName);
4329   }
4330 
4331   if (TemplateDecl *Template = Name.getAsTemplateDecl()) {
4332     TemplateDecl *TransTemplate
4333       = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc,
4334                                                               Template));
4335     if (!TransTemplate)
4336       return TemplateName();
4337 
4338     if (!getDerived().AlwaysRebuild() &&
4339         TransTemplate == Template)
4340       return Name;
4341 
4342     return TemplateName(TransTemplate);
4343   }
4344 
4345   if (SubstTemplateTemplateParmPackStorage *SubstPack
4346       = Name.getAsSubstTemplateTemplateParmPack()) {
4347     TemplateTemplateParmDecl *TransParam
4348     = cast_or_null<TemplateTemplateParmDecl>(
4349             getDerived().TransformDecl(NameLoc, SubstPack->getParameterPack()));
4350     if (!TransParam)
4351       return TemplateName();
4352 
4353     if (!getDerived().AlwaysRebuild() &&
4354         TransParam == SubstPack->getParameterPack())
4355       return Name;
4356 
4357     return getDerived().RebuildTemplateName(TransParam,
4358                                             SubstPack->getArgumentPack());
4359   }
4360 
4361   // These should be getting filtered out before they reach the AST.
4362   llvm_unreachable("overloaded function decl survived to here");
4363 }
4364 
4365 template<typename Derived>
4366 void TreeTransform<Derived>::InventTemplateArgumentLoc(
4367                                          const TemplateArgument &Arg,
4368                                          TemplateArgumentLoc &Output) {
4369   Output = getSema().getTrivialTemplateArgumentLoc(
4370       Arg, QualType(), getDerived().getBaseLocation());
4371 }
4372 
4373 template <typename Derived>
4374 bool TreeTransform<Derived>::TransformTemplateArgument(
4375     const TemplateArgumentLoc &Input, TemplateArgumentLoc &Output,
4376     bool Uneval) {
4377   const TemplateArgument &Arg = Input.getArgument();
4378   switch (Arg.getKind()) {
4379   case TemplateArgument::Null:
4380   case TemplateArgument::Pack:
4381     llvm_unreachable("Unexpected TemplateArgument");
4382 
4383   case TemplateArgument::Integral:
4384   case TemplateArgument::NullPtr:
4385   case TemplateArgument::Declaration: {
4386     // Transform a resolved template argument straight to a resolved template
4387     // argument. We get here when substituting into an already-substituted
4388     // template type argument during concept satisfaction checking.
4389     QualType T = Arg.getNonTypeTemplateArgumentType();
4390     QualType NewT = getDerived().TransformType(T);
4391     if (NewT.isNull())
4392       return true;
4393 
4394     ValueDecl *D = Arg.getKind() == TemplateArgument::Declaration
4395                        ? Arg.getAsDecl()
4396                        : nullptr;
4397     ValueDecl *NewD = D ? cast_or_null<ValueDecl>(getDerived().TransformDecl(
4398                               getDerived().getBaseLocation(), D))
4399                         : nullptr;
4400     if (D && !NewD)
4401       return true;
4402 
4403     if (NewT == T && D == NewD)
4404       Output = Input;
4405     else if (Arg.getKind() == TemplateArgument::Integral)
4406       Output = TemplateArgumentLoc(
4407           TemplateArgument(getSema().Context, Arg.getAsIntegral(), NewT),
4408           TemplateArgumentLocInfo());
4409     else if (Arg.getKind() == TemplateArgument::NullPtr)
4410       Output = TemplateArgumentLoc(TemplateArgument(NewT, /*IsNullPtr=*/true),
4411                                    TemplateArgumentLocInfo());
4412     else
4413       Output = TemplateArgumentLoc(TemplateArgument(NewD, NewT),
4414                                    TemplateArgumentLocInfo());
4415 
4416     return false;
4417   }
4418 
4419   case TemplateArgument::Type: {
4420     TypeSourceInfo *DI = Input.getTypeSourceInfo();
4421     if (!DI)
4422       DI = InventTypeSourceInfo(Input.getArgument().getAsType());
4423 
4424     DI = getDerived().TransformType(DI);
4425     if (!DI)
4426       return true;
4427 
4428     Output = TemplateArgumentLoc(TemplateArgument(DI->getType()), DI);
4429     return false;
4430   }
4431 
4432   case TemplateArgument::Template: {
4433     NestedNameSpecifierLoc QualifierLoc = Input.getTemplateQualifierLoc();
4434     if (QualifierLoc) {
4435       QualifierLoc = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc);
4436       if (!QualifierLoc)
4437         return true;
4438     }
4439 
4440     CXXScopeSpec SS;
4441     SS.Adopt(QualifierLoc);
4442     TemplateName Template = getDerived().TransformTemplateName(
4443         SS, Arg.getAsTemplate(), Input.getTemplateNameLoc());
4444     if (Template.isNull())
4445       return true;
4446 
4447     Output = TemplateArgumentLoc(SemaRef.Context, TemplateArgument(Template),
4448                                  QualifierLoc, Input.getTemplateNameLoc());
4449     return false;
4450   }
4451 
4452   case TemplateArgument::TemplateExpansion:
4453     llvm_unreachable("Caller should expand pack expansions");
4454 
4455   case TemplateArgument::Expression: {
4456     // Template argument expressions are constant expressions.
4457     EnterExpressionEvaluationContext Unevaluated(
4458         getSema(),
4459         Uneval ? Sema::ExpressionEvaluationContext::Unevaluated
4460                : Sema::ExpressionEvaluationContext::ConstantEvaluated,
4461         /*LambdaContextDecl=*/nullptr, /*ExprContext=*/
4462         Sema::ExpressionEvaluationContextRecord::EK_TemplateArgument);
4463 
4464     Expr *InputExpr = Input.getSourceExpression();
4465     if (!InputExpr)
4466       InputExpr = Input.getArgument().getAsExpr();
4467 
4468     ExprResult E = getDerived().TransformExpr(InputExpr);
4469     E = SemaRef.ActOnConstantExpression(E);
4470     if (E.isInvalid())
4471       return true;
4472     Output = TemplateArgumentLoc(TemplateArgument(E.get()), E.get());
4473     return false;
4474   }
4475   }
4476 
4477   // Work around bogus GCC warning
4478   return true;
4479 }
4480 
4481 /// Iterator adaptor that invents template argument location information
4482 /// for each of the template arguments in its underlying iterator.
4483 template<typename Derived, typename InputIterator>
4484 class TemplateArgumentLocInventIterator {
4485   TreeTransform<Derived> &Self;
4486   InputIterator Iter;
4487 
4488 public:
4489   typedef TemplateArgumentLoc value_type;
4490   typedef TemplateArgumentLoc reference;
4491   typedef typename std::iterator_traits<InputIterator>::difference_type
4492     difference_type;
4493   typedef std::input_iterator_tag iterator_category;
4494 
4495   class pointer {
4496     TemplateArgumentLoc Arg;
4497 
4498   public:
4499     explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { }
4500 
4501     const TemplateArgumentLoc *operator->() const { return &Arg; }
4502   };
4503 
4504   TemplateArgumentLocInventIterator() { }
4505 
4506   explicit TemplateArgumentLocInventIterator(TreeTransform<Derived> &Self,
4507                                              InputIterator Iter)
4508     : Self(Self), Iter(Iter) { }
4509 
4510   TemplateArgumentLocInventIterator &operator++() {
4511     ++Iter;
4512     return *this;
4513   }
4514 
4515   TemplateArgumentLocInventIterator operator++(int) {
4516     TemplateArgumentLocInventIterator Old(*this);
4517     ++(*this);
4518     return Old;
4519   }
4520 
4521   reference operator*() const {
4522     TemplateArgumentLoc Result;
4523     Self.InventTemplateArgumentLoc(*Iter, Result);
4524     return Result;
4525   }
4526 
4527   pointer operator->() const { return pointer(**this); }
4528 
4529   friend bool operator==(const TemplateArgumentLocInventIterator &X,
4530                          const TemplateArgumentLocInventIterator &Y) {
4531     return X.Iter == Y.Iter;
4532   }
4533 
4534   friend bool operator!=(const TemplateArgumentLocInventIterator &X,
4535                          const TemplateArgumentLocInventIterator &Y) {
4536     return X.Iter != Y.Iter;
4537   }
4538 };
4539 
4540 template<typename Derived>
4541 template<typename InputIterator>
4542 bool TreeTransform<Derived>::TransformTemplateArguments(
4543     InputIterator First, InputIterator Last, TemplateArgumentListInfo &Outputs,
4544     bool Uneval) {
4545   for (; First != Last; ++First) {
4546     TemplateArgumentLoc Out;
4547     TemplateArgumentLoc In = *First;
4548 
4549     if (In.getArgument().getKind() == TemplateArgument::Pack) {
4550       // Unpack argument packs, which we translate them into separate
4551       // arguments.
4552       // FIXME: We could do much better if we could guarantee that the
4553       // TemplateArgumentLocInfo for the pack expansion would be usable for
4554       // all of the template arguments in the argument pack.
4555       typedef TemplateArgumentLocInventIterator<Derived,
4556                                                 TemplateArgument::pack_iterator>
4557         PackLocIterator;
4558       if (TransformTemplateArguments(PackLocIterator(*this,
4559                                                  In.getArgument().pack_begin()),
4560                                      PackLocIterator(*this,
4561                                                    In.getArgument().pack_end()),
4562                                      Outputs, Uneval))
4563         return true;
4564 
4565       continue;
4566     }
4567 
4568     if (In.getArgument().isPackExpansion()) {
4569       // We have a pack expansion, for which we will be substituting into
4570       // the pattern.
4571       SourceLocation Ellipsis;
4572       Optional<unsigned> OrigNumExpansions;
4573       TemplateArgumentLoc Pattern
4574         = getSema().getTemplateArgumentPackExpansionPattern(
4575               In, Ellipsis, OrigNumExpansions);
4576 
4577       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
4578       getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
4579       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
4580 
4581       // Determine whether the set of unexpanded parameter packs can and should
4582       // be expanded.
4583       bool Expand = true;
4584       bool RetainExpansion = false;
4585       Optional<unsigned> NumExpansions = OrigNumExpansions;
4586       if (getDerived().TryExpandParameterPacks(Ellipsis,
4587                                                Pattern.getSourceRange(),
4588                                                Unexpanded,
4589                                                Expand,
4590                                                RetainExpansion,
4591                                                NumExpansions))
4592         return true;
4593 
4594       if (!Expand) {
4595         // The transform has determined that we should perform a simple
4596         // transformation on the pack expansion, producing another pack
4597         // expansion.
4598         TemplateArgumentLoc OutPattern;
4599         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
4600         if (getDerived().TransformTemplateArgument(Pattern, OutPattern, Uneval))
4601           return true;
4602 
4603         Out = getDerived().RebuildPackExpansion(OutPattern, Ellipsis,
4604                                                 NumExpansions);
4605         if (Out.getArgument().isNull())
4606           return true;
4607 
4608         Outputs.addArgument(Out);
4609         continue;
4610       }
4611 
4612       // The transform has determined that we should perform an elementwise
4613       // expansion of the pattern. Do so.
4614       for (unsigned I = 0; I != *NumExpansions; ++I) {
4615         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
4616 
4617         if (getDerived().TransformTemplateArgument(Pattern, Out, Uneval))
4618           return true;
4619 
4620         if (Out.getArgument().containsUnexpandedParameterPack()) {
4621           Out = getDerived().RebuildPackExpansion(Out, Ellipsis,
4622                                                   OrigNumExpansions);
4623           if (Out.getArgument().isNull())
4624             return true;
4625         }
4626 
4627         Outputs.addArgument(Out);
4628       }
4629 
4630       // If we're supposed to retain a pack expansion, do so by temporarily
4631       // forgetting the partially-substituted parameter pack.
4632       if (RetainExpansion) {
4633         ForgetPartiallySubstitutedPackRAII Forget(getDerived());
4634 
4635         if (getDerived().TransformTemplateArgument(Pattern, Out, Uneval))
4636           return true;
4637 
4638         Out = getDerived().RebuildPackExpansion(Out, Ellipsis,
4639                                                 OrigNumExpansions);
4640         if (Out.getArgument().isNull())
4641           return true;
4642 
4643         Outputs.addArgument(Out);
4644       }
4645 
4646       continue;
4647     }
4648 
4649     // The simple case:
4650     if (getDerived().TransformTemplateArgument(In, Out, Uneval))
4651       return true;
4652 
4653     Outputs.addArgument(Out);
4654   }
4655 
4656   return false;
4657 
4658 }
4659 
4660 //===----------------------------------------------------------------------===//
4661 // Type transformation
4662 //===----------------------------------------------------------------------===//
4663 
4664 template<typename Derived>
4665 QualType TreeTransform<Derived>::TransformType(QualType T) {
4666   if (getDerived().AlreadyTransformed(T))
4667     return T;
4668 
4669   // Temporary workaround.  All of these transformations should
4670   // eventually turn into transformations on TypeLocs.
4671   TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(T,
4672                                                 getDerived().getBaseLocation());
4673 
4674   TypeSourceInfo *NewDI = getDerived().TransformType(DI);
4675 
4676   if (!NewDI)
4677     return QualType();
4678 
4679   return NewDI->getType();
4680 }
4681 
4682 template<typename Derived>
4683 TypeSourceInfo *TreeTransform<Derived>::TransformType(TypeSourceInfo *DI) {
4684   // Refine the base location to the type's location.
4685   TemporaryBase Rebase(*this, DI->getTypeLoc().getBeginLoc(),
4686                        getDerived().getBaseEntity());
4687   if (getDerived().AlreadyTransformed(DI->getType()))
4688     return DI;
4689 
4690   TypeLocBuilder TLB;
4691 
4692   TypeLoc TL = DI->getTypeLoc();
4693   TLB.reserve(TL.getFullDataSize());
4694 
4695   QualType Result = getDerived().TransformType(TLB, TL);
4696   if (Result.isNull())
4697     return nullptr;
4698 
4699   return TLB.getTypeSourceInfo(SemaRef.Context, Result);
4700 }
4701 
4702 template<typename Derived>
4703 QualType
4704 TreeTransform<Derived>::TransformType(TypeLocBuilder &TLB, TypeLoc T) {
4705   switch (T.getTypeLocClass()) {
4706 #define ABSTRACT_TYPELOC(CLASS, PARENT)
4707 #define TYPELOC(CLASS, PARENT)                                                 \
4708   case TypeLoc::CLASS:                                                         \
4709     return getDerived().Transform##CLASS##Type(TLB,                            \
4710                                                T.castAs<CLASS##TypeLoc>());
4711 #include "clang/AST/TypeLocNodes.def"
4712   }
4713 
4714   llvm_unreachable("unhandled type loc!");
4715 }
4716 
4717 template<typename Derived>
4718 QualType TreeTransform<Derived>::TransformTypeWithDeducedTST(QualType T) {
4719   if (!isa<DependentNameType>(T))
4720     return TransformType(T);
4721 
4722   if (getDerived().AlreadyTransformed(T))
4723     return T;
4724   TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(T,
4725                                                 getDerived().getBaseLocation());
4726   TypeSourceInfo *NewDI = getDerived().TransformTypeWithDeducedTST(DI);
4727   return NewDI ? NewDI->getType() : QualType();
4728 }
4729 
4730 template<typename Derived>
4731 TypeSourceInfo *
4732 TreeTransform<Derived>::TransformTypeWithDeducedTST(TypeSourceInfo *DI) {
4733   if (!isa<DependentNameType>(DI->getType()))
4734     return TransformType(DI);
4735 
4736   // Refine the base location to the type's location.
4737   TemporaryBase Rebase(*this, DI->getTypeLoc().getBeginLoc(),
4738                        getDerived().getBaseEntity());
4739   if (getDerived().AlreadyTransformed(DI->getType()))
4740     return DI;
4741 
4742   TypeLocBuilder TLB;
4743 
4744   TypeLoc TL = DI->getTypeLoc();
4745   TLB.reserve(TL.getFullDataSize());
4746 
4747   auto QTL = TL.getAs<QualifiedTypeLoc>();
4748   if (QTL)
4749     TL = QTL.getUnqualifiedLoc();
4750 
4751   auto DNTL = TL.castAs<DependentNameTypeLoc>();
4752 
4753   QualType Result = getDerived().TransformDependentNameType(
4754       TLB, DNTL, /*DeducedTSTContext*/true);
4755   if (Result.isNull())
4756     return nullptr;
4757 
4758   if (QTL) {
4759     Result = getDerived().RebuildQualifiedType(Result, QTL);
4760     if (Result.isNull())
4761       return nullptr;
4762     TLB.TypeWasModifiedSafely(Result);
4763   }
4764 
4765   return TLB.getTypeSourceInfo(SemaRef.Context, Result);
4766 }
4767 
4768 template<typename Derived>
4769 QualType
4770 TreeTransform<Derived>::TransformQualifiedType(TypeLocBuilder &TLB,
4771                                                QualifiedTypeLoc T) {
4772   QualType Result = getDerived().TransformType(TLB, T.getUnqualifiedLoc());
4773   if (Result.isNull())
4774     return QualType();
4775 
4776   Result = getDerived().RebuildQualifiedType(Result, T);
4777 
4778   if (Result.isNull())
4779     return QualType();
4780 
4781   // RebuildQualifiedType might have updated the type, but not in a way
4782   // that invalidates the TypeLoc. (There's no location information for
4783   // qualifiers.)
4784   TLB.TypeWasModifiedSafely(Result);
4785 
4786   return Result;
4787 }
4788 
4789 template <typename Derived>
4790 QualType TreeTransform<Derived>::RebuildQualifiedType(QualType T,
4791                                                       QualifiedTypeLoc TL) {
4792 
4793   SourceLocation Loc = TL.getBeginLoc();
4794   Qualifiers Quals = TL.getType().getLocalQualifiers();
4795 
4796   if ((T.getAddressSpace() != LangAS::Default &&
4797        Quals.getAddressSpace() != LangAS::Default) &&
4798       T.getAddressSpace() != Quals.getAddressSpace()) {
4799     SemaRef.Diag(Loc, diag::err_address_space_mismatch_templ_inst)
4800         << TL.getType() << T;
4801     return QualType();
4802   }
4803 
4804   // C++ [dcl.fct]p7:
4805   //   [When] adding cv-qualifications on top of the function type [...] the
4806   //   cv-qualifiers are ignored.
4807   if (T->isFunctionType()) {
4808     T = SemaRef.getASTContext().getAddrSpaceQualType(T,
4809                                                      Quals.getAddressSpace());
4810     return T;
4811   }
4812 
4813   // C++ [dcl.ref]p1:
4814   //   when the cv-qualifiers are introduced through the use of a typedef-name
4815   //   or decltype-specifier [...] the cv-qualifiers are ignored.
4816   // Note that [dcl.ref]p1 lists all cases in which cv-qualifiers can be
4817   // applied to a reference type.
4818   if (T->isReferenceType()) {
4819     // The only qualifier that applies to a reference type is restrict.
4820     if (!Quals.hasRestrict())
4821       return T;
4822     Quals = Qualifiers::fromCVRMask(Qualifiers::Restrict);
4823   }
4824 
4825   // Suppress Objective-C lifetime qualifiers if they don't make sense for the
4826   // resulting type.
4827   if (Quals.hasObjCLifetime()) {
4828     if (!T->isObjCLifetimeType() && !T->isDependentType())
4829       Quals.removeObjCLifetime();
4830     else if (T.getObjCLifetime()) {
4831       // Objective-C ARC:
4832       //   A lifetime qualifier applied to a substituted template parameter
4833       //   overrides the lifetime qualifier from the template argument.
4834       const AutoType *AutoTy;
4835       if (const SubstTemplateTypeParmType *SubstTypeParam
4836                                 = dyn_cast<SubstTemplateTypeParmType>(T)) {
4837         QualType Replacement = SubstTypeParam->getReplacementType();
4838         Qualifiers Qs = Replacement.getQualifiers();
4839         Qs.removeObjCLifetime();
4840         Replacement = SemaRef.Context.getQualifiedType(
4841             Replacement.getUnqualifiedType(), Qs);
4842         T = SemaRef.Context.getSubstTemplateTypeParmType(
4843             SubstTypeParam->getReplacedParameter(), Replacement);
4844       } else if ((AutoTy = dyn_cast<AutoType>(T)) && AutoTy->isDeduced()) {
4845         // 'auto' types behave the same way as template parameters.
4846         QualType Deduced = AutoTy->getDeducedType();
4847         Qualifiers Qs = Deduced.getQualifiers();
4848         Qs.removeObjCLifetime();
4849         Deduced =
4850             SemaRef.Context.getQualifiedType(Deduced.getUnqualifiedType(), Qs);
4851         T = SemaRef.Context.getAutoType(Deduced, AutoTy->getKeyword(),
4852                                         AutoTy->isDependentType(),
4853                                         /*isPack=*/false,
4854                                         AutoTy->getTypeConstraintConcept(),
4855                                         AutoTy->getTypeConstraintArguments());
4856       } else {
4857         // Otherwise, complain about the addition of a qualifier to an
4858         // already-qualified type.
4859         // FIXME: Why is this check not in Sema::BuildQualifiedType?
4860         SemaRef.Diag(Loc, diag::err_attr_objc_ownership_redundant) << T;
4861         Quals.removeObjCLifetime();
4862       }
4863     }
4864   }
4865 
4866   return SemaRef.BuildQualifiedType(T, Loc, Quals);
4867 }
4868 
4869 template<typename Derived>
4870 TypeLoc
4871 TreeTransform<Derived>::TransformTypeInObjectScope(TypeLoc TL,
4872                                                    QualType ObjectType,
4873                                                    NamedDecl *UnqualLookup,
4874                                                    CXXScopeSpec &SS) {
4875   if (getDerived().AlreadyTransformed(TL.getType()))
4876     return TL;
4877 
4878   TypeSourceInfo *TSI =
4879       TransformTSIInObjectScope(TL, ObjectType, UnqualLookup, SS);
4880   if (TSI)
4881     return TSI->getTypeLoc();
4882   return TypeLoc();
4883 }
4884 
4885 template<typename Derived>
4886 TypeSourceInfo *
4887 TreeTransform<Derived>::TransformTypeInObjectScope(TypeSourceInfo *TSInfo,
4888                                                    QualType ObjectType,
4889                                                    NamedDecl *UnqualLookup,
4890                                                    CXXScopeSpec &SS) {
4891   if (getDerived().AlreadyTransformed(TSInfo->getType()))
4892     return TSInfo;
4893 
4894   return TransformTSIInObjectScope(TSInfo->getTypeLoc(), ObjectType,
4895                                    UnqualLookup, SS);
4896 }
4897 
4898 template <typename Derived>
4899 TypeSourceInfo *TreeTransform<Derived>::TransformTSIInObjectScope(
4900     TypeLoc TL, QualType ObjectType, NamedDecl *UnqualLookup,
4901     CXXScopeSpec &SS) {
4902   QualType T = TL.getType();
4903   assert(!getDerived().AlreadyTransformed(T));
4904 
4905   TypeLocBuilder TLB;
4906   QualType Result;
4907 
4908   if (isa<TemplateSpecializationType>(T)) {
4909     TemplateSpecializationTypeLoc SpecTL =
4910         TL.castAs<TemplateSpecializationTypeLoc>();
4911 
4912     TemplateName Template = getDerived().TransformTemplateName(
4913         SS, SpecTL.getTypePtr()->getTemplateName(), SpecTL.getTemplateNameLoc(),
4914         ObjectType, UnqualLookup, /*AllowInjectedClassName*/true);
4915     if (Template.isNull())
4916       return nullptr;
4917 
4918     Result = getDerived().TransformTemplateSpecializationType(TLB, SpecTL,
4919                                                               Template);
4920   } else if (isa<DependentTemplateSpecializationType>(T)) {
4921     DependentTemplateSpecializationTypeLoc SpecTL =
4922         TL.castAs<DependentTemplateSpecializationTypeLoc>();
4923 
4924     TemplateName Template
4925       = getDerived().RebuildTemplateName(SS,
4926                                          SpecTL.getTemplateKeywordLoc(),
4927                                          *SpecTL.getTypePtr()->getIdentifier(),
4928                                          SpecTL.getTemplateNameLoc(),
4929                                          ObjectType, UnqualLookup,
4930                                          /*AllowInjectedClassName*/true);
4931     if (Template.isNull())
4932       return nullptr;
4933 
4934     Result = getDerived().TransformDependentTemplateSpecializationType(TLB,
4935                                                                        SpecTL,
4936                                                                        Template,
4937                                                                        SS);
4938   } else {
4939     // Nothing special needs to be done for these.
4940     Result = getDerived().TransformType(TLB, TL);
4941   }
4942 
4943   if (Result.isNull())
4944     return nullptr;
4945 
4946   return TLB.getTypeSourceInfo(SemaRef.Context, Result);
4947 }
4948 
4949 template <class TyLoc> static inline
4950 QualType TransformTypeSpecType(TypeLocBuilder &TLB, TyLoc T) {
4951   TyLoc NewT = TLB.push<TyLoc>(T.getType());
4952   NewT.setNameLoc(T.getNameLoc());
4953   return T.getType();
4954 }
4955 
4956 template<typename Derived>
4957 QualType TreeTransform<Derived>::TransformBuiltinType(TypeLocBuilder &TLB,
4958                                                       BuiltinTypeLoc T) {
4959   BuiltinTypeLoc NewT = TLB.push<BuiltinTypeLoc>(T.getType());
4960   NewT.setBuiltinLoc(T.getBuiltinLoc());
4961   if (T.needsExtraLocalData())
4962     NewT.getWrittenBuiltinSpecs() = T.getWrittenBuiltinSpecs();
4963   return T.getType();
4964 }
4965 
4966 template<typename Derived>
4967 QualType TreeTransform<Derived>::TransformComplexType(TypeLocBuilder &TLB,
4968                                                       ComplexTypeLoc T) {
4969   // FIXME: recurse?
4970   return TransformTypeSpecType(TLB, T);
4971 }
4972 
4973 template <typename Derived>
4974 QualType TreeTransform<Derived>::TransformAdjustedType(TypeLocBuilder &TLB,
4975                                                        AdjustedTypeLoc TL) {
4976   // Adjustments applied during transformation are handled elsewhere.
4977   return getDerived().TransformType(TLB, TL.getOriginalLoc());
4978 }
4979 
4980 template<typename Derived>
4981 QualType TreeTransform<Derived>::TransformDecayedType(TypeLocBuilder &TLB,
4982                                                       DecayedTypeLoc TL) {
4983   QualType OriginalType = getDerived().TransformType(TLB, TL.getOriginalLoc());
4984   if (OriginalType.isNull())
4985     return QualType();
4986 
4987   QualType Result = TL.getType();
4988   if (getDerived().AlwaysRebuild() ||
4989       OriginalType != TL.getOriginalLoc().getType())
4990     Result = SemaRef.Context.getDecayedType(OriginalType);
4991   TLB.push<DecayedTypeLoc>(Result);
4992   // Nothing to set for DecayedTypeLoc.
4993   return Result;
4994 }
4995 
4996 template<typename Derived>
4997 QualType TreeTransform<Derived>::TransformPointerType(TypeLocBuilder &TLB,
4998                                                       PointerTypeLoc TL) {
4999   QualType PointeeType
5000     = getDerived().TransformType(TLB, TL.getPointeeLoc());
5001   if (PointeeType.isNull())
5002     return QualType();
5003 
5004   QualType Result = TL.getType();
5005   if (PointeeType->getAs<ObjCObjectType>()) {
5006     // A dependent pointer type 'T *' has is being transformed such
5007     // that an Objective-C class type is being replaced for 'T'. The
5008     // resulting pointer type is an ObjCObjectPointerType, not a
5009     // PointerType.
5010     Result = SemaRef.Context.getObjCObjectPointerType(PointeeType);
5011 
5012     ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result);
5013     NewT.setStarLoc(TL.getStarLoc());
5014     return Result;
5015   }
5016 
5017   if (getDerived().AlwaysRebuild() ||
5018       PointeeType != TL.getPointeeLoc().getType()) {
5019     Result = getDerived().RebuildPointerType(PointeeType, TL.getSigilLoc());
5020     if (Result.isNull())
5021       return QualType();
5022   }
5023 
5024   // Objective-C ARC can add lifetime qualifiers to the type that we're
5025   // pointing to.
5026   TLB.TypeWasModifiedSafely(Result->getPointeeType());
5027 
5028   PointerTypeLoc NewT = TLB.push<PointerTypeLoc>(Result);
5029   NewT.setSigilLoc(TL.getSigilLoc());
5030   return Result;
5031 }
5032 
5033 template<typename Derived>
5034 QualType
5035 TreeTransform<Derived>::TransformBlockPointerType(TypeLocBuilder &TLB,
5036                                                   BlockPointerTypeLoc TL) {
5037   QualType PointeeType
5038     = getDerived().TransformType(TLB, TL.getPointeeLoc());
5039   if (PointeeType.isNull())
5040     return QualType();
5041 
5042   QualType Result = TL.getType();
5043   if (getDerived().AlwaysRebuild() ||
5044       PointeeType != TL.getPointeeLoc().getType()) {
5045     Result = getDerived().RebuildBlockPointerType(PointeeType,
5046                                                   TL.getSigilLoc());
5047     if (Result.isNull())
5048       return QualType();
5049   }
5050 
5051   BlockPointerTypeLoc NewT = TLB.push<BlockPointerTypeLoc>(Result);
5052   NewT.setSigilLoc(TL.getSigilLoc());
5053   return Result;
5054 }
5055 
5056 /// Transforms a reference type.  Note that somewhat paradoxically we
5057 /// don't care whether the type itself is an l-value type or an r-value
5058 /// type;  we only care if the type was *written* as an l-value type
5059 /// or an r-value type.
5060 template<typename Derived>
5061 QualType
5062 TreeTransform<Derived>::TransformReferenceType(TypeLocBuilder &TLB,
5063                                                ReferenceTypeLoc TL) {
5064   const ReferenceType *T = TL.getTypePtr();
5065 
5066   // Note that this works with the pointee-as-written.
5067   QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
5068   if (PointeeType.isNull())
5069     return QualType();
5070 
5071   QualType Result = TL.getType();
5072   if (getDerived().AlwaysRebuild() ||
5073       PointeeType != T->getPointeeTypeAsWritten()) {
5074     Result = getDerived().RebuildReferenceType(PointeeType,
5075                                                T->isSpelledAsLValue(),
5076                                                TL.getSigilLoc());
5077     if (Result.isNull())
5078       return QualType();
5079   }
5080 
5081   // Objective-C ARC can add lifetime qualifiers to the type that we're
5082   // referring to.
5083   TLB.TypeWasModifiedSafely(
5084       Result->castAs<ReferenceType>()->getPointeeTypeAsWritten());
5085 
5086   // r-value references can be rebuilt as l-value references.
5087   ReferenceTypeLoc NewTL;
5088   if (isa<LValueReferenceType>(Result))
5089     NewTL = TLB.push<LValueReferenceTypeLoc>(Result);
5090   else
5091     NewTL = TLB.push<RValueReferenceTypeLoc>(Result);
5092   NewTL.setSigilLoc(TL.getSigilLoc());
5093 
5094   return Result;
5095 }
5096 
5097 template<typename Derived>
5098 QualType
5099 TreeTransform<Derived>::TransformLValueReferenceType(TypeLocBuilder &TLB,
5100                                                  LValueReferenceTypeLoc TL) {
5101   return TransformReferenceType(TLB, TL);
5102 }
5103 
5104 template<typename Derived>
5105 QualType
5106 TreeTransform<Derived>::TransformRValueReferenceType(TypeLocBuilder &TLB,
5107                                                  RValueReferenceTypeLoc TL) {
5108   return TransformReferenceType(TLB, TL);
5109 }
5110 
5111 template<typename Derived>
5112 QualType
5113 TreeTransform<Derived>::TransformMemberPointerType(TypeLocBuilder &TLB,
5114                                                    MemberPointerTypeLoc TL) {
5115   QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
5116   if (PointeeType.isNull())
5117     return QualType();
5118 
5119   TypeSourceInfo* OldClsTInfo = TL.getClassTInfo();
5120   TypeSourceInfo *NewClsTInfo = nullptr;
5121   if (OldClsTInfo) {
5122     NewClsTInfo = getDerived().TransformType(OldClsTInfo);
5123     if (!NewClsTInfo)
5124       return QualType();
5125   }
5126 
5127   const MemberPointerType *T = TL.getTypePtr();
5128   QualType OldClsType = QualType(T->getClass(), 0);
5129   QualType NewClsType;
5130   if (NewClsTInfo)
5131     NewClsType = NewClsTInfo->getType();
5132   else {
5133     NewClsType = getDerived().TransformType(OldClsType);
5134     if (NewClsType.isNull())
5135       return QualType();
5136   }
5137 
5138   QualType Result = TL.getType();
5139   if (getDerived().AlwaysRebuild() ||
5140       PointeeType != T->getPointeeType() ||
5141       NewClsType != OldClsType) {
5142     Result = getDerived().RebuildMemberPointerType(PointeeType, NewClsType,
5143                                                    TL.getStarLoc());
5144     if (Result.isNull())
5145       return QualType();
5146   }
5147 
5148   // If we had to adjust the pointee type when building a member pointer, make
5149   // sure to push TypeLoc info for it.
5150   const MemberPointerType *MPT = Result->getAs<MemberPointerType>();
5151   if (MPT && PointeeType != MPT->getPointeeType()) {
5152     assert(isa<AdjustedType>(MPT->getPointeeType()));
5153     TLB.push<AdjustedTypeLoc>(MPT->getPointeeType());
5154   }
5155 
5156   MemberPointerTypeLoc NewTL = TLB.push<MemberPointerTypeLoc>(Result);
5157   NewTL.setSigilLoc(TL.getSigilLoc());
5158   NewTL.setClassTInfo(NewClsTInfo);
5159 
5160   return Result;
5161 }
5162 
5163 template<typename Derived>
5164 QualType
5165 TreeTransform<Derived>::TransformConstantArrayType(TypeLocBuilder &TLB,
5166                                                    ConstantArrayTypeLoc TL) {
5167   const ConstantArrayType *T = TL.getTypePtr();
5168   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5169   if (ElementType.isNull())
5170     return QualType();
5171 
5172   // Prefer the expression from the TypeLoc;  the other may have been uniqued.
5173   Expr *OldSize = TL.getSizeExpr();
5174   if (!OldSize)
5175     OldSize = const_cast<Expr*>(T->getSizeExpr());
5176   Expr *NewSize = nullptr;
5177   if (OldSize) {
5178     EnterExpressionEvaluationContext Unevaluated(
5179         SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
5180     NewSize = getDerived().TransformExpr(OldSize).template getAs<Expr>();
5181     NewSize = SemaRef.ActOnConstantExpression(NewSize).get();
5182   }
5183 
5184   QualType Result = TL.getType();
5185   if (getDerived().AlwaysRebuild() ||
5186       ElementType != T->getElementType() ||
5187       (T->getSizeExpr() && NewSize != OldSize)) {
5188     Result = getDerived().RebuildConstantArrayType(ElementType,
5189                                                    T->getSizeModifier(),
5190                                                    T->getSize(), NewSize,
5191                                              T->getIndexTypeCVRQualifiers(),
5192                                                    TL.getBracketsRange());
5193     if (Result.isNull())
5194       return QualType();
5195   }
5196 
5197   // We might have either a ConstantArrayType or a VariableArrayType now:
5198   // a ConstantArrayType is allowed to have an element type which is a
5199   // VariableArrayType if the type is dependent.  Fortunately, all array
5200   // types have the same location layout.
5201   ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result);
5202   NewTL.setLBracketLoc(TL.getLBracketLoc());
5203   NewTL.setRBracketLoc(TL.getRBracketLoc());
5204   NewTL.setSizeExpr(NewSize);
5205 
5206   return Result;
5207 }
5208 
5209 template<typename Derived>
5210 QualType TreeTransform<Derived>::TransformIncompleteArrayType(
5211                                               TypeLocBuilder &TLB,
5212                                               IncompleteArrayTypeLoc TL) {
5213   const IncompleteArrayType *T = TL.getTypePtr();
5214   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5215   if (ElementType.isNull())
5216     return QualType();
5217 
5218   QualType Result = TL.getType();
5219   if (getDerived().AlwaysRebuild() ||
5220       ElementType != T->getElementType()) {
5221     Result = getDerived().RebuildIncompleteArrayType(ElementType,
5222                                                      T->getSizeModifier(),
5223                                            T->getIndexTypeCVRQualifiers(),
5224                                                      TL.getBracketsRange());
5225     if (Result.isNull())
5226       return QualType();
5227   }
5228 
5229   IncompleteArrayTypeLoc NewTL = TLB.push<IncompleteArrayTypeLoc>(Result);
5230   NewTL.setLBracketLoc(TL.getLBracketLoc());
5231   NewTL.setRBracketLoc(TL.getRBracketLoc());
5232   NewTL.setSizeExpr(nullptr);
5233 
5234   return Result;
5235 }
5236 
5237 template<typename Derived>
5238 QualType
5239 TreeTransform<Derived>::TransformVariableArrayType(TypeLocBuilder &TLB,
5240                                                    VariableArrayTypeLoc TL) {
5241   const VariableArrayType *T = TL.getTypePtr();
5242   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5243   if (ElementType.isNull())
5244     return QualType();
5245 
5246   ExprResult SizeResult;
5247   {
5248     EnterExpressionEvaluationContext Context(
5249         SemaRef, Sema::ExpressionEvaluationContext::PotentiallyEvaluated);
5250     SizeResult = getDerived().TransformExpr(T->getSizeExpr());
5251   }
5252   if (SizeResult.isInvalid())
5253     return QualType();
5254   SizeResult =
5255       SemaRef.ActOnFinishFullExpr(SizeResult.get(), /*DiscardedValue*/ false);
5256   if (SizeResult.isInvalid())
5257     return QualType();
5258 
5259   Expr *Size = SizeResult.get();
5260 
5261   QualType Result = TL.getType();
5262   if (getDerived().AlwaysRebuild() ||
5263       ElementType != T->getElementType() ||
5264       Size != T->getSizeExpr()) {
5265     Result = getDerived().RebuildVariableArrayType(ElementType,
5266                                                    T->getSizeModifier(),
5267                                                    Size,
5268                                              T->getIndexTypeCVRQualifiers(),
5269                                                    TL.getBracketsRange());
5270     if (Result.isNull())
5271       return QualType();
5272   }
5273 
5274   // We might have constant size array now, but fortunately it has the same
5275   // location layout.
5276   ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result);
5277   NewTL.setLBracketLoc(TL.getLBracketLoc());
5278   NewTL.setRBracketLoc(TL.getRBracketLoc());
5279   NewTL.setSizeExpr(Size);
5280 
5281   return Result;
5282 }
5283 
5284 template<typename Derived>
5285 QualType
5286 TreeTransform<Derived>::TransformDependentSizedArrayType(TypeLocBuilder &TLB,
5287                                              DependentSizedArrayTypeLoc TL) {
5288   const DependentSizedArrayType *T = TL.getTypePtr();
5289   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5290   if (ElementType.isNull())
5291     return QualType();
5292 
5293   // Array bounds are constant expressions.
5294   EnterExpressionEvaluationContext Unevaluated(
5295       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
5296 
5297   // Prefer the expression from the TypeLoc;  the other may have been uniqued.
5298   Expr *origSize = TL.getSizeExpr();
5299   if (!origSize) origSize = T->getSizeExpr();
5300 
5301   ExprResult sizeResult
5302     = getDerived().TransformExpr(origSize);
5303   sizeResult = SemaRef.ActOnConstantExpression(sizeResult);
5304   if (sizeResult.isInvalid())
5305     return QualType();
5306 
5307   Expr *size = sizeResult.get();
5308 
5309   QualType Result = TL.getType();
5310   if (getDerived().AlwaysRebuild() ||
5311       ElementType != T->getElementType() ||
5312       size != origSize) {
5313     Result = getDerived().RebuildDependentSizedArrayType(ElementType,
5314                                                          T->getSizeModifier(),
5315                                                          size,
5316                                                 T->getIndexTypeCVRQualifiers(),
5317                                                         TL.getBracketsRange());
5318     if (Result.isNull())
5319       return QualType();
5320   }
5321 
5322   // We might have any sort of array type now, but fortunately they
5323   // all have the same location layout.
5324   ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result);
5325   NewTL.setLBracketLoc(TL.getLBracketLoc());
5326   NewTL.setRBracketLoc(TL.getRBracketLoc());
5327   NewTL.setSizeExpr(size);
5328 
5329   return Result;
5330 }
5331 
5332 template <typename Derived>
5333 QualType TreeTransform<Derived>::TransformDependentVectorType(
5334     TypeLocBuilder &TLB, DependentVectorTypeLoc TL) {
5335   const DependentVectorType *T = TL.getTypePtr();
5336   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5337   if (ElementType.isNull())
5338     return QualType();
5339 
5340   EnterExpressionEvaluationContext Unevaluated(
5341       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
5342 
5343   ExprResult Size = getDerived().TransformExpr(T->getSizeExpr());
5344   Size = SemaRef.ActOnConstantExpression(Size);
5345   if (Size.isInvalid())
5346     return QualType();
5347 
5348   QualType Result = TL.getType();
5349   if (getDerived().AlwaysRebuild() || ElementType != T->getElementType() ||
5350       Size.get() != T->getSizeExpr()) {
5351     Result = getDerived().RebuildDependentVectorType(
5352         ElementType, Size.get(), T->getAttributeLoc(), T->getVectorKind());
5353     if (Result.isNull())
5354       return QualType();
5355   }
5356 
5357   // Result might be dependent or not.
5358   if (isa<DependentVectorType>(Result)) {
5359     DependentVectorTypeLoc NewTL =
5360         TLB.push<DependentVectorTypeLoc>(Result);
5361     NewTL.setNameLoc(TL.getNameLoc());
5362   } else {
5363     VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result);
5364     NewTL.setNameLoc(TL.getNameLoc());
5365   }
5366 
5367   return Result;
5368 }
5369 
5370 template<typename Derived>
5371 QualType TreeTransform<Derived>::TransformDependentSizedExtVectorType(
5372                                       TypeLocBuilder &TLB,
5373                                       DependentSizedExtVectorTypeLoc TL) {
5374   const DependentSizedExtVectorType *T = TL.getTypePtr();
5375 
5376   // FIXME: ext vector locs should be nested
5377   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5378   if (ElementType.isNull())
5379     return QualType();
5380 
5381   // Vector sizes are constant expressions.
5382   EnterExpressionEvaluationContext Unevaluated(
5383       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
5384 
5385   ExprResult Size = getDerived().TransformExpr(T->getSizeExpr());
5386   Size = SemaRef.ActOnConstantExpression(Size);
5387   if (Size.isInvalid())
5388     return QualType();
5389 
5390   QualType Result = TL.getType();
5391   if (getDerived().AlwaysRebuild() ||
5392       ElementType != T->getElementType() ||
5393       Size.get() != T->getSizeExpr()) {
5394     Result = getDerived().RebuildDependentSizedExtVectorType(ElementType,
5395                                                              Size.get(),
5396                                                          T->getAttributeLoc());
5397     if (Result.isNull())
5398       return QualType();
5399   }
5400 
5401   // Result might be dependent or not.
5402   if (isa<DependentSizedExtVectorType>(Result)) {
5403     DependentSizedExtVectorTypeLoc NewTL
5404       = TLB.push<DependentSizedExtVectorTypeLoc>(Result);
5405     NewTL.setNameLoc(TL.getNameLoc());
5406   } else {
5407     ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result);
5408     NewTL.setNameLoc(TL.getNameLoc());
5409   }
5410 
5411   return Result;
5412 }
5413 
5414 template <typename Derived>
5415 QualType
5416 TreeTransform<Derived>::TransformConstantMatrixType(TypeLocBuilder &TLB,
5417                                                     ConstantMatrixTypeLoc TL) {
5418   const ConstantMatrixType *T = TL.getTypePtr();
5419   QualType ElementType = getDerived().TransformType(T->getElementType());
5420   if (ElementType.isNull())
5421     return QualType();
5422 
5423   QualType Result = TL.getType();
5424   if (getDerived().AlwaysRebuild() || ElementType != T->getElementType()) {
5425     Result = getDerived().RebuildConstantMatrixType(
5426         ElementType, T->getNumRows(), T->getNumColumns());
5427     if (Result.isNull())
5428       return QualType();
5429   }
5430 
5431   ConstantMatrixTypeLoc NewTL = TLB.push<ConstantMatrixTypeLoc>(Result);
5432   NewTL.setAttrNameLoc(TL.getAttrNameLoc());
5433   NewTL.setAttrOperandParensRange(TL.getAttrOperandParensRange());
5434   NewTL.setAttrRowOperand(TL.getAttrRowOperand());
5435   NewTL.setAttrColumnOperand(TL.getAttrColumnOperand());
5436 
5437   return Result;
5438 }
5439 
5440 template <typename Derived>
5441 QualType TreeTransform<Derived>::TransformDependentSizedMatrixType(
5442     TypeLocBuilder &TLB, DependentSizedMatrixTypeLoc TL) {
5443   const DependentSizedMatrixType *T = TL.getTypePtr();
5444 
5445   QualType ElementType = getDerived().TransformType(T->getElementType());
5446   if (ElementType.isNull()) {
5447     return QualType();
5448   }
5449 
5450   // Matrix dimensions are constant expressions.
5451   EnterExpressionEvaluationContext Unevaluated(
5452       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
5453 
5454   Expr *origRows = TL.getAttrRowOperand();
5455   if (!origRows)
5456     origRows = T->getRowExpr();
5457   Expr *origColumns = TL.getAttrColumnOperand();
5458   if (!origColumns)
5459     origColumns = T->getColumnExpr();
5460 
5461   ExprResult rowResult = getDerived().TransformExpr(origRows);
5462   rowResult = SemaRef.ActOnConstantExpression(rowResult);
5463   if (rowResult.isInvalid())
5464     return QualType();
5465 
5466   ExprResult columnResult = getDerived().TransformExpr(origColumns);
5467   columnResult = SemaRef.ActOnConstantExpression(columnResult);
5468   if (columnResult.isInvalid())
5469     return QualType();
5470 
5471   Expr *rows = rowResult.get();
5472   Expr *columns = columnResult.get();
5473 
5474   QualType Result = TL.getType();
5475   if (getDerived().AlwaysRebuild() || ElementType != T->getElementType() ||
5476       rows != origRows || columns != origColumns) {
5477     Result = getDerived().RebuildDependentSizedMatrixType(
5478         ElementType, rows, columns, T->getAttributeLoc());
5479 
5480     if (Result.isNull())
5481       return QualType();
5482   }
5483 
5484   // We might have any sort of matrix type now, but fortunately they
5485   // all have the same location layout.
5486   MatrixTypeLoc NewTL = TLB.push<MatrixTypeLoc>(Result);
5487   NewTL.setAttrNameLoc(TL.getAttrNameLoc());
5488   NewTL.setAttrOperandParensRange(TL.getAttrOperandParensRange());
5489   NewTL.setAttrRowOperand(rows);
5490   NewTL.setAttrColumnOperand(columns);
5491   return Result;
5492 }
5493 
5494 template <typename Derived>
5495 QualType TreeTransform<Derived>::TransformDependentAddressSpaceType(
5496     TypeLocBuilder &TLB, DependentAddressSpaceTypeLoc TL) {
5497   const DependentAddressSpaceType *T = TL.getTypePtr();
5498 
5499   QualType pointeeType = getDerived().TransformType(T->getPointeeType());
5500 
5501   if (pointeeType.isNull())
5502     return QualType();
5503 
5504   // Address spaces are constant expressions.
5505   EnterExpressionEvaluationContext Unevaluated(
5506       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
5507 
5508   ExprResult AddrSpace = getDerived().TransformExpr(T->getAddrSpaceExpr());
5509   AddrSpace = SemaRef.ActOnConstantExpression(AddrSpace);
5510   if (AddrSpace.isInvalid())
5511     return QualType();
5512 
5513   QualType Result = TL.getType();
5514   if (getDerived().AlwaysRebuild() || pointeeType != T->getPointeeType() ||
5515       AddrSpace.get() != T->getAddrSpaceExpr()) {
5516     Result = getDerived().RebuildDependentAddressSpaceType(
5517         pointeeType, AddrSpace.get(), T->getAttributeLoc());
5518     if (Result.isNull())
5519       return QualType();
5520   }
5521 
5522   // Result might be dependent or not.
5523   if (isa<DependentAddressSpaceType>(Result)) {
5524     DependentAddressSpaceTypeLoc NewTL =
5525         TLB.push<DependentAddressSpaceTypeLoc>(Result);
5526 
5527     NewTL.setAttrOperandParensRange(TL.getAttrOperandParensRange());
5528     NewTL.setAttrExprOperand(TL.getAttrExprOperand());
5529     NewTL.setAttrNameLoc(TL.getAttrNameLoc());
5530 
5531   } else {
5532     TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(
5533         Result, getDerived().getBaseLocation());
5534     TransformType(TLB, DI->getTypeLoc());
5535   }
5536 
5537   return Result;
5538 }
5539 
5540 template <typename Derived>
5541 QualType TreeTransform<Derived>::TransformVectorType(TypeLocBuilder &TLB,
5542                                                      VectorTypeLoc TL) {
5543   const VectorType *T = TL.getTypePtr();
5544   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5545   if (ElementType.isNull())
5546     return QualType();
5547 
5548   QualType Result = TL.getType();
5549   if (getDerived().AlwaysRebuild() ||
5550       ElementType != T->getElementType()) {
5551     Result = getDerived().RebuildVectorType(ElementType, T->getNumElements(),
5552                                             T->getVectorKind());
5553     if (Result.isNull())
5554       return QualType();
5555   }
5556 
5557   VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result);
5558   NewTL.setNameLoc(TL.getNameLoc());
5559 
5560   return Result;
5561 }
5562 
5563 template<typename Derived>
5564 QualType TreeTransform<Derived>::TransformExtVectorType(TypeLocBuilder &TLB,
5565                                                         ExtVectorTypeLoc TL) {
5566   const VectorType *T = TL.getTypePtr();
5567   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5568   if (ElementType.isNull())
5569     return QualType();
5570 
5571   QualType Result = TL.getType();
5572   if (getDerived().AlwaysRebuild() ||
5573       ElementType != T->getElementType()) {
5574     Result = getDerived().RebuildExtVectorType(ElementType,
5575                                                T->getNumElements(),
5576                                                /*FIXME*/ SourceLocation());
5577     if (Result.isNull())
5578       return QualType();
5579   }
5580 
5581   ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result);
5582   NewTL.setNameLoc(TL.getNameLoc());
5583 
5584   return Result;
5585 }
5586 
5587 template <typename Derived>
5588 ParmVarDecl *TreeTransform<Derived>::TransformFunctionTypeParam(
5589     ParmVarDecl *OldParm, int indexAdjustment, Optional<unsigned> NumExpansions,
5590     bool ExpectParameterPack) {
5591   TypeSourceInfo *OldDI = OldParm->getTypeSourceInfo();
5592   TypeSourceInfo *NewDI = nullptr;
5593 
5594   if (NumExpansions && isa<PackExpansionType>(OldDI->getType())) {
5595     // If we're substituting into a pack expansion type and we know the
5596     // length we want to expand to, just substitute for the pattern.
5597     TypeLoc OldTL = OldDI->getTypeLoc();
5598     PackExpansionTypeLoc OldExpansionTL = OldTL.castAs<PackExpansionTypeLoc>();
5599 
5600     TypeLocBuilder TLB;
5601     TypeLoc NewTL = OldDI->getTypeLoc();
5602     TLB.reserve(NewTL.getFullDataSize());
5603 
5604     QualType Result = getDerived().TransformType(TLB,
5605                                                OldExpansionTL.getPatternLoc());
5606     if (Result.isNull())
5607       return nullptr;
5608 
5609     Result = RebuildPackExpansionType(Result,
5610                                 OldExpansionTL.getPatternLoc().getSourceRange(),
5611                                       OldExpansionTL.getEllipsisLoc(),
5612                                       NumExpansions);
5613     if (Result.isNull())
5614       return nullptr;
5615 
5616     PackExpansionTypeLoc NewExpansionTL
5617       = TLB.push<PackExpansionTypeLoc>(Result);
5618     NewExpansionTL.setEllipsisLoc(OldExpansionTL.getEllipsisLoc());
5619     NewDI = TLB.getTypeSourceInfo(SemaRef.Context, Result);
5620   } else
5621     NewDI = getDerived().TransformType(OldDI);
5622   if (!NewDI)
5623     return nullptr;
5624 
5625   if (NewDI == OldDI && indexAdjustment == 0)
5626     return OldParm;
5627 
5628   ParmVarDecl *newParm = ParmVarDecl::Create(SemaRef.Context,
5629                                              OldParm->getDeclContext(),
5630                                              OldParm->getInnerLocStart(),
5631                                              OldParm->getLocation(),
5632                                              OldParm->getIdentifier(),
5633                                              NewDI->getType(),
5634                                              NewDI,
5635                                              OldParm->getStorageClass(),
5636                                              /* DefArg */ nullptr);
5637   newParm->setScopeInfo(OldParm->getFunctionScopeDepth(),
5638                         OldParm->getFunctionScopeIndex() + indexAdjustment);
5639   transformedLocalDecl(OldParm, {newParm});
5640   return newParm;
5641 }
5642 
5643 template <typename Derived>
5644 bool TreeTransform<Derived>::TransformFunctionTypeParams(
5645     SourceLocation Loc, ArrayRef<ParmVarDecl *> Params,
5646     const QualType *ParamTypes,
5647     const FunctionProtoType::ExtParameterInfo *ParamInfos,
5648     SmallVectorImpl<QualType> &OutParamTypes,
5649     SmallVectorImpl<ParmVarDecl *> *PVars,
5650     Sema::ExtParameterInfoBuilder &PInfos) {
5651   int indexAdjustment = 0;
5652 
5653   unsigned NumParams = Params.size();
5654   for (unsigned i = 0; i != NumParams; ++i) {
5655     if (ParmVarDecl *OldParm = Params[i]) {
5656       assert(OldParm->getFunctionScopeIndex() == i);
5657 
5658       Optional<unsigned> NumExpansions;
5659       ParmVarDecl *NewParm = nullptr;
5660       if (OldParm->isParameterPack()) {
5661         // We have a function parameter pack that may need to be expanded.
5662         SmallVector<UnexpandedParameterPack, 2> Unexpanded;
5663 
5664         // Find the parameter packs that could be expanded.
5665         TypeLoc TL = OldParm->getTypeSourceInfo()->getTypeLoc();
5666         PackExpansionTypeLoc ExpansionTL = TL.castAs<PackExpansionTypeLoc>();
5667         TypeLoc Pattern = ExpansionTL.getPatternLoc();
5668         SemaRef.collectUnexpandedParameterPacks(Pattern, Unexpanded);
5669 
5670         // Determine whether we should expand the parameter packs.
5671         bool ShouldExpand = false;
5672         bool RetainExpansion = false;
5673         Optional<unsigned> OrigNumExpansions;
5674         if (Unexpanded.size() > 0) {
5675           OrigNumExpansions = ExpansionTL.getTypePtr()->getNumExpansions();
5676           NumExpansions = OrigNumExpansions;
5677           if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(),
5678                                                    Pattern.getSourceRange(),
5679                                                    Unexpanded,
5680                                                    ShouldExpand,
5681                                                    RetainExpansion,
5682                                                    NumExpansions)) {
5683             return true;
5684           }
5685         } else {
5686 #ifndef NDEBUG
5687           const AutoType *AT =
5688               Pattern.getType().getTypePtr()->getContainedAutoType();
5689           assert((AT && (!AT->isDeduced() || AT->getDeducedType().isNull())) &&
5690                  "Could not find parameter packs or undeduced auto type!");
5691 #endif
5692         }
5693 
5694         if (ShouldExpand) {
5695           // Expand the function parameter pack into multiple, separate
5696           // parameters.
5697           getDerived().ExpandingFunctionParameterPack(OldParm);
5698           for (unsigned I = 0; I != *NumExpansions; ++I) {
5699             Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
5700             ParmVarDecl *NewParm
5701               = getDerived().TransformFunctionTypeParam(OldParm,
5702                                                         indexAdjustment++,
5703                                                         OrigNumExpansions,
5704                                                 /*ExpectParameterPack=*/false);
5705             if (!NewParm)
5706               return true;
5707 
5708             if (ParamInfos)
5709               PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5710             OutParamTypes.push_back(NewParm->getType());
5711             if (PVars)
5712               PVars->push_back(NewParm);
5713           }
5714 
5715           // If we're supposed to retain a pack expansion, do so by temporarily
5716           // forgetting the partially-substituted parameter pack.
5717           if (RetainExpansion) {
5718             ForgetPartiallySubstitutedPackRAII Forget(getDerived());
5719             ParmVarDecl *NewParm
5720               = getDerived().TransformFunctionTypeParam(OldParm,
5721                                                         indexAdjustment++,
5722                                                         OrigNumExpansions,
5723                                                 /*ExpectParameterPack=*/false);
5724             if (!NewParm)
5725               return true;
5726 
5727             if (ParamInfos)
5728               PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5729             OutParamTypes.push_back(NewParm->getType());
5730             if (PVars)
5731               PVars->push_back(NewParm);
5732           }
5733 
5734           // The next parameter should have the same adjustment as the
5735           // last thing we pushed, but we post-incremented indexAdjustment
5736           // on every push.  Also, if we push nothing, the adjustment should
5737           // go down by one.
5738           indexAdjustment--;
5739 
5740           // We're done with the pack expansion.
5741           continue;
5742         }
5743 
5744         // We'll substitute the parameter now without expanding the pack
5745         // expansion.
5746         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
5747         NewParm = getDerived().TransformFunctionTypeParam(OldParm,
5748                                                           indexAdjustment,
5749                                                           NumExpansions,
5750                                                   /*ExpectParameterPack=*/true);
5751         assert(NewParm->isParameterPack() &&
5752                "Parameter pack no longer a parameter pack after "
5753                "transformation.");
5754       } else {
5755         NewParm = getDerived().TransformFunctionTypeParam(
5756             OldParm, indexAdjustment, None, /*ExpectParameterPack=*/ false);
5757       }
5758 
5759       if (!NewParm)
5760         return true;
5761 
5762       if (ParamInfos)
5763         PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5764       OutParamTypes.push_back(NewParm->getType());
5765       if (PVars)
5766         PVars->push_back(NewParm);
5767       continue;
5768     }
5769 
5770     // Deal with the possibility that we don't have a parameter
5771     // declaration for this parameter.
5772     QualType OldType = ParamTypes[i];
5773     bool IsPackExpansion = false;
5774     Optional<unsigned> NumExpansions;
5775     QualType NewType;
5776     if (const PackExpansionType *Expansion
5777                                        = dyn_cast<PackExpansionType>(OldType)) {
5778       // We have a function parameter pack that may need to be expanded.
5779       QualType Pattern = Expansion->getPattern();
5780       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
5781       getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
5782 
5783       // Determine whether we should expand the parameter packs.
5784       bool ShouldExpand = false;
5785       bool RetainExpansion = false;
5786       if (getDerived().TryExpandParameterPacks(Loc, SourceRange(),
5787                                                Unexpanded,
5788                                                ShouldExpand,
5789                                                RetainExpansion,
5790                                                NumExpansions)) {
5791         return true;
5792       }
5793 
5794       if (ShouldExpand) {
5795         // Expand the function parameter pack into multiple, separate
5796         // parameters.
5797         for (unsigned I = 0; I != *NumExpansions; ++I) {
5798           Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
5799           QualType NewType = getDerived().TransformType(Pattern);
5800           if (NewType.isNull())
5801             return true;
5802 
5803           if (NewType->containsUnexpandedParameterPack()) {
5804             NewType =
5805                 getSema().getASTContext().getPackExpansionType(NewType, None);
5806 
5807             if (NewType.isNull())
5808               return true;
5809           }
5810 
5811           if (ParamInfos)
5812             PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5813           OutParamTypes.push_back(NewType);
5814           if (PVars)
5815             PVars->push_back(nullptr);
5816         }
5817 
5818         // We're done with the pack expansion.
5819         continue;
5820       }
5821 
5822       // If we're supposed to retain a pack expansion, do so by temporarily
5823       // forgetting the partially-substituted parameter pack.
5824       if (RetainExpansion) {
5825         ForgetPartiallySubstitutedPackRAII Forget(getDerived());
5826         QualType NewType = getDerived().TransformType(Pattern);
5827         if (NewType.isNull())
5828           return true;
5829 
5830         if (ParamInfos)
5831           PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5832         OutParamTypes.push_back(NewType);
5833         if (PVars)
5834           PVars->push_back(nullptr);
5835       }
5836 
5837       // We'll substitute the parameter now without expanding the pack
5838       // expansion.
5839       OldType = Expansion->getPattern();
5840       IsPackExpansion = true;
5841       Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
5842       NewType = getDerived().TransformType(OldType);
5843     } else {
5844       NewType = getDerived().TransformType(OldType);
5845     }
5846 
5847     if (NewType.isNull())
5848       return true;
5849 
5850     if (IsPackExpansion)
5851       NewType = getSema().Context.getPackExpansionType(NewType,
5852                                                        NumExpansions);
5853 
5854     if (ParamInfos)
5855       PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5856     OutParamTypes.push_back(NewType);
5857     if (PVars)
5858       PVars->push_back(nullptr);
5859   }
5860 
5861 #ifndef NDEBUG
5862   if (PVars) {
5863     for (unsigned i = 0, e = PVars->size(); i != e; ++i)
5864       if (ParmVarDecl *parm = (*PVars)[i])
5865         assert(parm->getFunctionScopeIndex() == i);
5866   }
5867 #endif
5868 
5869   return false;
5870 }
5871 
5872 template<typename Derived>
5873 QualType
5874 TreeTransform<Derived>::TransformFunctionProtoType(TypeLocBuilder &TLB,
5875                                                    FunctionProtoTypeLoc TL) {
5876   SmallVector<QualType, 4> ExceptionStorage;
5877   TreeTransform *This = this; // Work around gcc.gnu.org/PR56135.
5878   return getDerived().TransformFunctionProtoType(
5879       TLB, TL, nullptr, Qualifiers(),
5880       [&](FunctionProtoType::ExceptionSpecInfo &ESI, bool &Changed) {
5881         return This->getDerived().TransformExceptionSpec(
5882             TL.getBeginLoc(), ESI, ExceptionStorage, Changed);
5883       });
5884 }
5885 
5886 template<typename Derived> template<typename Fn>
5887 QualType TreeTransform<Derived>::TransformFunctionProtoType(
5888     TypeLocBuilder &TLB, FunctionProtoTypeLoc TL, CXXRecordDecl *ThisContext,
5889     Qualifiers ThisTypeQuals, Fn TransformExceptionSpec) {
5890 
5891   // Transform the parameters and return type.
5892   //
5893   // We are required to instantiate the params and return type in source order.
5894   // When the function has a trailing return type, we instantiate the
5895   // parameters before the return type,  since the return type can then refer
5896   // to the parameters themselves (via decltype, sizeof, etc.).
5897   //
5898   SmallVector<QualType, 4> ParamTypes;
5899   SmallVector<ParmVarDecl*, 4> ParamDecls;
5900   Sema::ExtParameterInfoBuilder ExtParamInfos;
5901   const FunctionProtoType *T = TL.getTypePtr();
5902 
5903   QualType ResultType;
5904 
5905   if (T->hasTrailingReturn()) {
5906     if (getDerived().TransformFunctionTypeParams(
5907             TL.getBeginLoc(), TL.getParams(),
5908             TL.getTypePtr()->param_type_begin(),
5909             T->getExtParameterInfosOrNull(),
5910             ParamTypes, &ParamDecls, ExtParamInfos))
5911       return QualType();
5912 
5913     {
5914       // C++11 [expr.prim.general]p3:
5915       //   If a declaration declares a member function or member function
5916       //   template of a class X, the expression this is a prvalue of type
5917       //   "pointer to cv-qualifier-seq X" between the optional cv-qualifer-seq
5918       //   and the end of the function-definition, member-declarator, or
5919       //   declarator.
5920       Sema::CXXThisScopeRAII ThisScope(SemaRef, ThisContext, ThisTypeQuals);
5921 
5922       ResultType = getDerived().TransformType(TLB, TL.getReturnLoc());
5923       if (ResultType.isNull())
5924         return QualType();
5925     }
5926   }
5927   else {
5928     ResultType = getDerived().TransformType(TLB, TL.getReturnLoc());
5929     if (ResultType.isNull())
5930       return QualType();
5931 
5932     if (getDerived().TransformFunctionTypeParams(
5933             TL.getBeginLoc(), TL.getParams(),
5934             TL.getTypePtr()->param_type_begin(),
5935             T->getExtParameterInfosOrNull(),
5936             ParamTypes, &ParamDecls, ExtParamInfos))
5937       return QualType();
5938   }
5939 
5940   FunctionProtoType::ExtProtoInfo EPI = T->getExtProtoInfo();
5941 
5942   bool EPIChanged = false;
5943   if (TransformExceptionSpec(EPI.ExceptionSpec, EPIChanged))
5944     return QualType();
5945 
5946   // Handle extended parameter information.
5947   if (auto NewExtParamInfos =
5948         ExtParamInfos.getPointerOrNull(ParamTypes.size())) {
5949     if (!EPI.ExtParameterInfos ||
5950         llvm::makeArrayRef(EPI.ExtParameterInfos, TL.getNumParams())
5951           != llvm::makeArrayRef(NewExtParamInfos, ParamTypes.size())) {
5952       EPIChanged = true;
5953     }
5954     EPI.ExtParameterInfos = NewExtParamInfos;
5955   } else if (EPI.ExtParameterInfos) {
5956     EPIChanged = true;
5957     EPI.ExtParameterInfos = nullptr;
5958   }
5959 
5960   QualType Result = TL.getType();
5961   if (getDerived().AlwaysRebuild() || ResultType != T->getReturnType() ||
5962       T->getParamTypes() != llvm::makeArrayRef(ParamTypes) || EPIChanged) {
5963     Result = getDerived().RebuildFunctionProtoType(ResultType, ParamTypes, EPI);
5964     if (Result.isNull())
5965       return QualType();
5966   }
5967 
5968   FunctionProtoTypeLoc NewTL = TLB.push<FunctionProtoTypeLoc>(Result);
5969   NewTL.setLocalRangeBegin(TL.getLocalRangeBegin());
5970   NewTL.setLParenLoc(TL.getLParenLoc());
5971   NewTL.setRParenLoc(TL.getRParenLoc());
5972   NewTL.setExceptionSpecRange(TL.getExceptionSpecRange());
5973   NewTL.setLocalRangeEnd(TL.getLocalRangeEnd());
5974   for (unsigned i = 0, e = NewTL.getNumParams(); i != e; ++i)
5975     NewTL.setParam(i, ParamDecls[i]);
5976 
5977   return Result;
5978 }
5979 
5980 template<typename Derived>
5981 bool TreeTransform<Derived>::TransformExceptionSpec(
5982     SourceLocation Loc, FunctionProtoType::ExceptionSpecInfo &ESI,
5983     SmallVectorImpl<QualType> &Exceptions, bool &Changed) {
5984   assert(ESI.Type != EST_Uninstantiated && ESI.Type != EST_Unevaluated);
5985 
5986   // Instantiate a dynamic noexcept expression, if any.
5987   if (isComputedNoexcept(ESI.Type)) {
5988     EnterExpressionEvaluationContext Unevaluated(
5989         getSema(), Sema::ExpressionEvaluationContext::ConstantEvaluated);
5990     ExprResult NoexceptExpr = getDerived().TransformExpr(ESI.NoexceptExpr);
5991     if (NoexceptExpr.isInvalid())
5992       return true;
5993 
5994     ExceptionSpecificationType EST = ESI.Type;
5995     NoexceptExpr =
5996         getSema().ActOnNoexceptSpec(NoexceptExpr.get(), EST);
5997     if (NoexceptExpr.isInvalid())
5998       return true;
5999 
6000     if (ESI.NoexceptExpr != NoexceptExpr.get() || EST != ESI.Type)
6001       Changed = true;
6002     ESI.NoexceptExpr = NoexceptExpr.get();
6003     ESI.Type = EST;
6004   }
6005 
6006   if (ESI.Type != EST_Dynamic)
6007     return false;
6008 
6009   // Instantiate a dynamic exception specification's type.
6010   for (QualType T : ESI.Exceptions) {
6011     if (const PackExpansionType *PackExpansion =
6012             T->getAs<PackExpansionType>()) {
6013       Changed = true;
6014 
6015       // We have a pack expansion. Instantiate it.
6016       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
6017       SemaRef.collectUnexpandedParameterPacks(PackExpansion->getPattern(),
6018                                               Unexpanded);
6019       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
6020 
6021       // Determine whether the set of unexpanded parameter packs can and
6022       // should
6023       // be expanded.
6024       bool Expand = false;
6025       bool RetainExpansion = false;
6026       Optional<unsigned> NumExpansions = PackExpansion->getNumExpansions();
6027       // FIXME: Track the location of the ellipsis (and track source location
6028       // information for the types in the exception specification in general).
6029       if (getDerived().TryExpandParameterPacks(
6030               Loc, SourceRange(), Unexpanded, Expand,
6031               RetainExpansion, NumExpansions))
6032         return true;
6033 
6034       if (!Expand) {
6035         // We can't expand this pack expansion into separate arguments yet;
6036         // just substitute into the pattern and create a new pack expansion
6037         // type.
6038         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
6039         QualType U = getDerived().TransformType(PackExpansion->getPattern());
6040         if (U.isNull())
6041           return true;
6042 
6043         U = SemaRef.Context.getPackExpansionType(U, NumExpansions);
6044         Exceptions.push_back(U);
6045         continue;
6046       }
6047 
6048       // Substitute into the pack expansion pattern for each slice of the
6049       // pack.
6050       for (unsigned ArgIdx = 0; ArgIdx != *NumExpansions; ++ArgIdx) {
6051         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), ArgIdx);
6052 
6053         QualType U = getDerived().TransformType(PackExpansion->getPattern());
6054         if (U.isNull() || SemaRef.CheckSpecifiedExceptionType(U, Loc))
6055           return true;
6056 
6057         Exceptions.push_back(U);
6058       }
6059     } else {
6060       QualType U = getDerived().TransformType(T);
6061       if (U.isNull() || SemaRef.CheckSpecifiedExceptionType(U, Loc))
6062         return true;
6063       if (T != U)
6064         Changed = true;
6065 
6066       Exceptions.push_back(U);
6067     }
6068   }
6069 
6070   ESI.Exceptions = Exceptions;
6071   if (ESI.Exceptions.empty())
6072     ESI.Type = EST_DynamicNone;
6073   return false;
6074 }
6075 
6076 template<typename Derived>
6077 QualType TreeTransform<Derived>::TransformFunctionNoProtoType(
6078                                                  TypeLocBuilder &TLB,
6079                                                  FunctionNoProtoTypeLoc TL) {
6080   const FunctionNoProtoType *T = TL.getTypePtr();
6081   QualType ResultType = getDerived().TransformType(TLB, TL.getReturnLoc());
6082   if (ResultType.isNull())
6083     return QualType();
6084 
6085   QualType Result = TL.getType();
6086   if (getDerived().AlwaysRebuild() || ResultType != T->getReturnType())
6087     Result = getDerived().RebuildFunctionNoProtoType(ResultType);
6088 
6089   FunctionNoProtoTypeLoc NewTL = TLB.push<FunctionNoProtoTypeLoc>(Result);
6090   NewTL.setLocalRangeBegin(TL.getLocalRangeBegin());
6091   NewTL.setLParenLoc(TL.getLParenLoc());
6092   NewTL.setRParenLoc(TL.getRParenLoc());
6093   NewTL.setLocalRangeEnd(TL.getLocalRangeEnd());
6094 
6095   return Result;
6096 }
6097 
6098 template <typename Derived>
6099 QualType TreeTransform<Derived>::TransformUnresolvedUsingType(
6100     TypeLocBuilder &TLB, UnresolvedUsingTypeLoc TL) {
6101   const UnresolvedUsingType *T = TL.getTypePtr();
6102   Decl *D = getDerived().TransformDecl(TL.getNameLoc(), T->getDecl());
6103   if (!D)
6104     return QualType();
6105 
6106   QualType Result = TL.getType();
6107   if (getDerived().AlwaysRebuild() || D != T->getDecl()) {
6108     Result = getDerived().RebuildUnresolvedUsingType(TL.getNameLoc(), D);
6109     if (Result.isNull())
6110       return QualType();
6111   }
6112 
6113   // We might get an arbitrary type spec type back.  We should at
6114   // least always get a type spec type, though.
6115   TypeSpecTypeLoc NewTL = TLB.pushTypeSpec(Result);
6116   NewTL.setNameLoc(TL.getNameLoc());
6117 
6118   return Result;
6119 }
6120 
6121 template <typename Derived>
6122 QualType TreeTransform<Derived>::TransformUsingType(TypeLocBuilder &TLB,
6123                                                     UsingTypeLoc TL) {
6124   const UsingType *T = TL.getTypePtr();
6125 
6126   auto *Found = cast_or_null<UsingShadowDecl>(getDerived().TransformDecl(
6127       TL.getLocalSourceRange().getBegin(), T->getFoundDecl()));
6128   if (!Found)
6129     return QualType();
6130 
6131   QualType Underlying = getDerived().TransformType(T->desugar());
6132   if (Underlying.isNull())
6133     return QualType();
6134 
6135   QualType Result = TL.getType();
6136   if (getDerived().AlwaysRebuild() || Found != T->getFoundDecl() ||
6137       Underlying != T->getUnderlyingType()) {
6138     Result = getDerived().RebuildUsingType(Found, Underlying);
6139     if (Result.isNull())
6140       return QualType();
6141   }
6142 
6143   TLB.pushTypeSpec(Result).setNameLoc(TL.getNameLoc());
6144   return Result;
6145 }
6146 
6147 template<typename Derived>
6148 QualType TreeTransform<Derived>::TransformTypedefType(TypeLocBuilder &TLB,
6149                                                       TypedefTypeLoc TL) {
6150   const TypedefType *T = TL.getTypePtr();
6151   TypedefNameDecl *Typedef
6152     = cast_or_null<TypedefNameDecl>(getDerived().TransformDecl(TL.getNameLoc(),
6153                                                                T->getDecl()));
6154   if (!Typedef)
6155     return QualType();
6156 
6157   QualType Result = TL.getType();
6158   if (getDerived().AlwaysRebuild() ||
6159       Typedef != T->getDecl()) {
6160     Result = getDerived().RebuildTypedefType(Typedef);
6161     if (Result.isNull())
6162       return QualType();
6163   }
6164 
6165   TypedefTypeLoc NewTL = TLB.push<TypedefTypeLoc>(Result);
6166   NewTL.setNameLoc(TL.getNameLoc());
6167 
6168   return Result;
6169 }
6170 
6171 template<typename Derived>
6172 QualType TreeTransform<Derived>::TransformTypeOfExprType(TypeLocBuilder &TLB,
6173                                                       TypeOfExprTypeLoc TL) {
6174   // typeof expressions are not potentially evaluated contexts
6175   EnterExpressionEvaluationContext Unevaluated(
6176       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated,
6177       Sema::ReuseLambdaContextDecl);
6178 
6179   ExprResult E = getDerived().TransformExpr(TL.getUnderlyingExpr());
6180   if (E.isInvalid())
6181     return QualType();
6182 
6183   E = SemaRef.HandleExprEvaluationContextForTypeof(E.get());
6184   if (E.isInvalid())
6185     return QualType();
6186 
6187   QualType Result = TL.getType();
6188   if (getDerived().AlwaysRebuild() ||
6189       E.get() != TL.getUnderlyingExpr()) {
6190     Result = getDerived().RebuildTypeOfExprType(E.get(), TL.getTypeofLoc());
6191     if (Result.isNull())
6192       return QualType();
6193   }
6194   else E.get();
6195 
6196   TypeOfExprTypeLoc NewTL = TLB.push<TypeOfExprTypeLoc>(Result);
6197   NewTL.setTypeofLoc(TL.getTypeofLoc());
6198   NewTL.setLParenLoc(TL.getLParenLoc());
6199   NewTL.setRParenLoc(TL.getRParenLoc());
6200 
6201   return Result;
6202 }
6203 
6204 template<typename Derived>
6205 QualType TreeTransform<Derived>::TransformTypeOfType(TypeLocBuilder &TLB,
6206                                                      TypeOfTypeLoc TL) {
6207   TypeSourceInfo* Old_Under_TI = TL.getUnderlyingTInfo();
6208   TypeSourceInfo* New_Under_TI = getDerived().TransformType(Old_Under_TI);
6209   if (!New_Under_TI)
6210     return QualType();
6211 
6212   QualType Result = TL.getType();
6213   if (getDerived().AlwaysRebuild() || New_Under_TI != Old_Under_TI) {
6214     Result = getDerived().RebuildTypeOfType(New_Under_TI->getType());
6215     if (Result.isNull())
6216       return QualType();
6217   }
6218 
6219   TypeOfTypeLoc NewTL = TLB.push<TypeOfTypeLoc>(Result);
6220   NewTL.setTypeofLoc(TL.getTypeofLoc());
6221   NewTL.setLParenLoc(TL.getLParenLoc());
6222   NewTL.setRParenLoc(TL.getRParenLoc());
6223   NewTL.setUnderlyingTInfo(New_Under_TI);
6224 
6225   return Result;
6226 }
6227 
6228 template<typename Derived>
6229 QualType TreeTransform<Derived>::TransformDecltypeType(TypeLocBuilder &TLB,
6230                                                        DecltypeTypeLoc TL) {
6231   const DecltypeType *T = TL.getTypePtr();
6232 
6233   // decltype expressions are not potentially evaluated contexts
6234   EnterExpressionEvaluationContext Unevaluated(
6235       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, nullptr,
6236       Sema::ExpressionEvaluationContextRecord::EK_Decltype);
6237 
6238   ExprResult E = getDerived().TransformExpr(T->getUnderlyingExpr());
6239   if (E.isInvalid())
6240     return QualType();
6241 
6242   E = getSema().ActOnDecltypeExpression(E.get());
6243   if (E.isInvalid())
6244     return QualType();
6245 
6246   QualType Result = TL.getType();
6247   if (getDerived().AlwaysRebuild() ||
6248       E.get() != T->getUnderlyingExpr()) {
6249     Result = getDerived().RebuildDecltypeType(E.get(), TL.getDecltypeLoc());
6250     if (Result.isNull())
6251       return QualType();
6252   }
6253   else E.get();
6254 
6255   DecltypeTypeLoc NewTL = TLB.push<DecltypeTypeLoc>(Result);
6256   NewTL.setDecltypeLoc(TL.getDecltypeLoc());
6257   NewTL.setRParenLoc(TL.getRParenLoc());
6258   return Result;
6259 }
6260 
6261 template<typename Derived>
6262 QualType TreeTransform<Derived>::TransformUnaryTransformType(
6263                                                             TypeLocBuilder &TLB,
6264                                                      UnaryTransformTypeLoc TL) {
6265   QualType Result = TL.getType();
6266   if (Result->isDependentType()) {
6267     const UnaryTransformType *T = TL.getTypePtr();
6268     QualType NewBase =
6269       getDerived().TransformType(TL.getUnderlyingTInfo())->getType();
6270     Result = getDerived().RebuildUnaryTransformType(NewBase,
6271                                                     T->getUTTKind(),
6272                                                     TL.getKWLoc());
6273     if (Result.isNull())
6274       return QualType();
6275   }
6276 
6277   UnaryTransformTypeLoc NewTL = TLB.push<UnaryTransformTypeLoc>(Result);
6278   NewTL.setKWLoc(TL.getKWLoc());
6279   NewTL.setParensRange(TL.getParensRange());
6280   NewTL.setUnderlyingTInfo(TL.getUnderlyingTInfo());
6281   return Result;
6282 }
6283 
6284 template<typename Derived>
6285 QualType TreeTransform<Derived>::TransformDeducedTemplateSpecializationType(
6286     TypeLocBuilder &TLB, DeducedTemplateSpecializationTypeLoc TL) {
6287   const DeducedTemplateSpecializationType *T = TL.getTypePtr();
6288 
6289   CXXScopeSpec SS;
6290   TemplateName TemplateName = getDerived().TransformTemplateName(
6291       SS, T->getTemplateName(), TL.getTemplateNameLoc());
6292   if (TemplateName.isNull())
6293     return QualType();
6294 
6295   QualType OldDeduced = T->getDeducedType();
6296   QualType NewDeduced;
6297   if (!OldDeduced.isNull()) {
6298     NewDeduced = getDerived().TransformType(OldDeduced);
6299     if (NewDeduced.isNull())
6300       return QualType();
6301   }
6302 
6303   QualType Result = getDerived().RebuildDeducedTemplateSpecializationType(
6304       TemplateName, NewDeduced);
6305   if (Result.isNull())
6306     return QualType();
6307 
6308   DeducedTemplateSpecializationTypeLoc NewTL =
6309       TLB.push<DeducedTemplateSpecializationTypeLoc>(Result);
6310   NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6311 
6312   return Result;
6313 }
6314 
6315 template<typename Derived>
6316 QualType TreeTransform<Derived>::TransformRecordType(TypeLocBuilder &TLB,
6317                                                      RecordTypeLoc TL) {
6318   const RecordType *T = TL.getTypePtr();
6319   RecordDecl *Record
6320     = cast_or_null<RecordDecl>(getDerived().TransformDecl(TL.getNameLoc(),
6321                                                           T->getDecl()));
6322   if (!Record)
6323     return QualType();
6324 
6325   QualType Result = TL.getType();
6326   if (getDerived().AlwaysRebuild() ||
6327       Record != T->getDecl()) {
6328     Result = getDerived().RebuildRecordType(Record);
6329     if (Result.isNull())
6330       return QualType();
6331   }
6332 
6333   RecordTypeLoc NewTL = TLB.push<RecordTypeLoc>(Result);
6334   NewTL.setNameLoc(TL.getNameLoc());
6335 
6336   return Result;
6337 }
6338 
6339 template<typename Derived>
6340 QualType TreeTransform<Derived>::TransformEnumType(TypeLocBuilder &TLB,
6341                                                    EnumTypeLoc TL) {
6342   const EnumType *T = TL.getTypePtr();
6343   EnumDecl *Enum
6344     = cast_or_null<EnumDecl>(getDerived().TransformDecl(TL.getNameLoc(),
6345                                                         T->getDecl()));
6346   if (!Enum)
6347     return QualType();
6348 
6349   QualType Result = TL.getType();
6350   if (getDerived().AlwaysRebuild() ||
6351       Enum != T->getDecl()) {
6352     Result = getDerived().RebuildEnumType(Enum);
6353     if (Result.isNull())
6354       return QualType();
6355   }
6356 
6357   EnumTypeLoc NewTL = TLB.push<EnumTypeLoc>(Result);
6358   NewTL.setNameLoc(TL.getNameLoc());
6359 
6360   return Result;
6361 }
6362 
6363 template<typename Derived>
6364 QualType TreeTransform<Derived>::TransformInjectedClassNameType(
6365                                          TypeLocBuilder &TLB,
6366                                          InjectedClassNameTypeLoc TL) {
6367   Decl *D = getDerived().TransformDecl(TL.getNameLoc(),
6368                                        TL.getTypePtr()->getDecl());
6369   if (!D) return QualType();
6370 
6371   QualType T = SemaRef.Context.getTypeDeclType(cast<TypeDecl>(D));
6372   TLB.pushTypeSpec(T).setNameLoc(TL.getNameLoc());
6373   return T;
6374 }
6375 
6376 template<typename Derived>
6377 QualType TreeTransform<Derived>::TransformTemplateTypeParmType(
6378                                                 TypeLocBuilder &TLB,
6379                                                 TemplateTypeParmTypeLoc TL) {
6380   return TransformTypeSpecType(TLB, TL);
6381 }
6382 
6383 template<typename Derived>
6384 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmType(
6385                                          TypeLocBuilder &TLB,
6386                                          SubstTemplateTypeParmTypeLoc TL) {
6387   const SubstTemplateTypeParmType *T = TL.getTypePtr();
6388 
6389   // Substitute into the replacement type, which itself might involve something
6390   // that needs to be transformed. This only tends to occur with default
6391   // template arguments of template template parameters.
6392   TemporaryBase Rebase(*this, TL.getNameLoc(), DeclarationName());
6393   QualType Replacement = getDerived().TransformType(T->getReplacementType());
6394   if (Replacement.isNull())
6395     return QualType();
6396 
6397   // Always canonicalize the replacement type.
6398   Replacement = SemaRef.Context.getCanonicalType(Replacement);
6399   QualType Result
6400     = SemaRef.Context.getSubstTemplateTypeParmType(T->getReplacedParameter(),
6401                                                    Replacement);
6402 
6403   // Propagate type-source information.
6404   SubstTemplateTypeParmTypeLoc NewTL
6405     = TLB.push<SubstTemplateTypeParmTypeLoc>(Result);
6406   NewTL.setNameLoc(TL.getNameLoc());
6407   return Result;
6408 
6409 }
6410 
6411 template<typename Derived>
6412 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmPackType(
6413                                           TypeLocBuilder &TLB,
6414                                           SubstTemplateTypeParmPackTypeLoc TL) {
6415   return TransformTypeSpecType(TLB, TL);
6416 }
6417 
6418 template<typename Derived>
6419 QualType TreeTransform<Derived>::TransformTemplateSpecializationType(
6420                                                         TypeLocBuilder &TLB,
6421                                            TemplateSpecializationTypeLoc TL) {
6422   const TemplateSpecializationType *T = TL.getTypePtr();
6423 
6424   // The nested-name-specifier never matters in a TemplateSpecializationType,
6425   // because we can't have a dependent nested-name-specifier anyway.
6426   CXXScopeSpec SS;
6427   TemplateName Template
6428     = getDerived().TransformTemplateName(SS, T->getTemplateName(),
6429                                          TL.getTemplateNameLoc());
6430   if (Template.isNull())
6431     return QualType();
6432 
6433   return getDerived().TransformTemplateSpecializationType(TLB, TL, Template);
6434 }
6435 
6436 template<typename Derived>
6437 QualType TreeTransform<Derived>::TransformAtomicType(TypeLocBuilder &TLB,
6438                                                      AtomicTypeLoc TL) {
6439   QualType ValueType = getDerived().TransformType(TLB, TL.getValueLoc());
6440   if (ValueType.isNull())
6441     return QualType();
6442 
6443   QualType Result = TL.getType();
6444   if (getDerived().AlwaysRebuild() ||
6445       ValueType != TL.getValueLoc().getType()) {
6446     Result = getDerived().RebuildAtomicType(ValueType, TL.getKWLoc());
6447     if (Result.isNull())
6448       return QualType();
6449   }
6450 
6451   AtomicTypeLoc NewTL = TLB.push<AtomicTypeLoc>(Result);
6452   NewTL.setKWLoc(TL.getKWLoc());
6453   NewTL.setLParenLoc(TL.getLParenLoc());
6454   NewTL.setRParenLoc(TL.getRParenLoc());
6455 
6456   return Result;
6457 }
6458 
6459 template <typename Derived>
6460 QualType TreeTransform<Derived>::TransformPipeType(TypeLocBuilder &TLB,
6461                                                    PipeTypeLoc TL) {
6462   QualType ValueType = getDerived().TransformType(TLB, TL.getValueLoc());
6463   if (ValueType.isNull())
6464     return QualType();
6465 
6466   QualType Result = TL.getType();
6467   if (getDerived().AlwaysRebuild() || ValueType != TL.getValueLoc().getType()) {
6468     const PipeType *PT = Result->castAs<PipeType>();
6469     bool isReadPipe = PT->isReadOnly();
6470     Result = getDerived().RebuildPipeType(ValueType, TL.getKWLoc(), isReadPipe);
6471     if (Result.isNull())
6472       return QualType();
6473   }
6474 
6475   PipeTypeLoc NewTL = TLB.push<PipeTypeLoc>(Result);
6476   NewTL.setKWLoc(TL.getKWLoc());
6477 
6478   return Result;
6479 }
6480 
6481 template <typename Derived>
6482 QualType TreeTransform<Derived>::TransformBitIntType(TypeLocBuilder &TLB,
6483                                                      BitIntTypeLoc TL) {
6484   const BitIntType *EIT = TL.getTypePtr();
6485   QualType Result = TL.getType();
6486 
6487   if (getDerived().AlwaysRebuild()) {
6488     Result = getDerived().RebuildBitIntType(EIT->isUnsigned(),
6489                                             EIT->getNumBits(), TL.getNameLoc());
6490     if (Result.isNull())
6491       return QualType();
6492   }
6493 
6494   BitIntTypeLoc NewTL = TLB.push<BitIntTypeLoc>(Result);
6495   NewTL.setNameLoc(TL.getNameLoc());
6496   return Result;
6497 }
6498 
6499 template <typename Derived>
6500 QualType TreeTransform<Derived>::TransformDependentBitIntType(
6501     TypeLocBuilder &TLB, DependentBitIntTypeLoc TL) {
6502   const DependentBitIntType *EIT = TL.getTypePtr();
6503 
6504   EnterExpressionEvaluationContext Unevaluated(
6505       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
6506   ExprResult BitsExpr = getDerived().TransformExpr(EIT->getNumBitsExpr());
6507   BitsExpr = SemaRef.ActOnConstantExpression(BitsExpr);
6508 
6509   if (BitsExpr.isInvalid())
6510     return QualType();
6511 
6512   QualType Result = TL.getType();
6513 
6514   if (getDerived().AlwaysRebuild() || BitsExpr.get() != EIT->getNumBitsExpr()) {
6515     Result = getDerived().RebuildDependentBitIntType(
6516         EIT->isUnsigned(), BitsExpr.get(), TL.getNameLoc());
6517 
6518     if (Result.isNull())
6519       return QualType();
6520   }
6521 
6522   if (isa<DependentBitIntType>(Result)) {
6523     DependentBitIntTypeLoc NewTL = TLB.push<DependentBitIntTypeLoc>(Result);
6524     NewTL.setNameLoc(TL.getNameLoc());
6525   } else {
6526     BitIntTypeLoc NewTL = TLB.push<BitIntTypeLoc>(Result);
6527     NewTL.setNameLoc(TL.getNameLoc());
6528   }
6529   return Result;
6530 }
6531 
6532   /// Simple iterator that traverses the template arguments in a
6533   /// container that provides a \c getArgLoc() member function.
6534   ///
6535   /// This iterator is intended to be used with the iterator form of
6536   /// \c TreeTransform<Derived>::TransformTemplateArguments().
6537   template<typename ArgLocContainer>
6538   class TemplateArgumentLocContainerIterator {
6539     ArgLocContainer *Container;
6540     unsigned Index;
6541 
6542   public:
6543     typedef TemplateArgumentLoc value_type;
6544     typedef TemplateArgumentLoc reference;
6545     typedef int difference_type;
6546     typedef std::input_iterator_tag iterator_category;
6547 
6548     class pointer {
6549       TemplateArgumentLoc Arg;
6550 
6551     public:
6552       explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { }
6553 
6554       const TemplateArgumentLoc *operator->() const {
6555         return &Arg;
6556       }
6557     };
6558 
6559 
6560     TemplateArgumentLocContainerIterator() {}
6561 
6562     TemplateArgumentLocContainerIterator(ArgLocContainer &Container,
6563                                  unsigned Index)
6564       : Container(&Container), Index(Index) { }
6565 
6566     TemplateArgumentLocContainerIterator &operator++() {
6567       ++Index;
6568       return *this;
6569     }
6570 
6571     TemplateArgumentLocContainerIterator operator++(int) {
6572       TemplateArgumentLocContainerIterator Old(*this);
6573       ++(*this);
6574       return Old;
6575     }
6576 
6577     TemplateArgumentLoc operator*() const {
6578       return Container->getArgLoc(Index);
6579     }
6580 
6581     pointer operator->() const {
6582       return pointer(Container->getArgLoc(Index));
6583     }
6584 
6585     friend bool operator==(const TemplateArgumentLocContainerIterator &X,
6586                            const TemplateArgumentLocContainerIterator &Y) {
6587       return X.Container == Y.Container && X.Index == Y.Index;
6588     }
6589 
6590     friend bool operator!=(const TemplateArgumentLocContainerIterator &X,
6591                            const TemplateArgumentLocContainerIterator &Y) {
6592       return !(X == Y);
6593     }
6594   };
6595 
6596 template<typename Derived>
6597 QualType TreeTransform<Derived>::TransformAutoType(TypeLocBuilder &TLB,
6598                                                    AutoTypeLoc TL) {
6599   const AutoType *T = TL.getTypePtr();
6600   QualType OldDeduced = T->getDeducedType();
6601   QualType NewDeduced;
6602   if (!OldDeduced.isNull()) {
6603     NewDeduced = getDerived().TransformType(OldDeduced);
6604     if (NewDeduced.isNull())
6605       return QualType();
6606   }
6607 
6608   ConceptDecl *NewCD = nullptr;
6609   TemplateArgumentListInfo NewTemplateArgs;
6610   NestedNameSpecifierLoc NewNestedNameSpec;
6611   if (T->isConstrained()) {
6612     NewCD = cast_or_null<ConceptDecl>(getDerived().TransformDecl(
6613         TL.getConceptNameLoc(), T->getTypeConstraintConcept()));
6614 
6615     NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
6616     NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
6617     typedef TemplateArgumentLocContainerIterator<AutoTypeLoc> ArgIterator;
6618     if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
6619                                                 ArgIterator(TL,
6620                                                             TL.getNumArgs()),
6621                                                 NewTemplateArgs))
6622       return QualType();
6623 
6624     if (TL.getNestedNameSpecifierLoc()) {
6625       NewNestedNameSpec
6626         = getDerived().TransformNestedNameSpecifierLoc(
6627             TL.getNestedNameSpecifierLoc());
6628       if (!NewNestedNameSpec)
6629         return QualType();
6630     }
6631   }
6632 
6633   QualType Result = TL.getType();
6634   if (getDerived().AlwaysRebuild() || NewDeduced != OldDeduced ||
6635       T->isDependentType() || T->isConstrained()) {
6636     // FIXME: Maybe don't rebuild if all template arguments are the same.
6637     llvm::SmallVector<TemplateArgument, 4> NewArgList;
6638     NewArgList.reserve(NewTemplateArgs.size());
6639     for (const auto &ArgLoc : NewTemplateArgs.arguments())
6640       NewArgList.push_back(ArgLoc.getArgument());
6641     Result = getDerived().RebuildAutoType(NewDeduced, T->getKeyword(), NewCD,
6642                                           NewArgList);
6643     if (Result.isNull())
6644       return QualType();
6645   }
6646 
6647   AutoTypeLoc NewTL = TLB.push<AutoTypeLoc>(Result);
6648   NewTL.setNameLoc(TL.getNameLoc());
6649   NewTL.setNestedNameSpecifierLoc(NewNestedNameSpec);
6650   NewTL.setTemplateKWLoc(TL.getTemplateKWLoc());
6651   NewTL.setConceptNameLoc(TL.getConceptNameLoc());
6652   NewTL.setFoundDecl(TL.getFoundDecl());
6653   NewTL.setLAngleLoc(TL.getLAngleLoc());
6654   NewTL.setRAngleLoc(TL.getRAngleLoc());
6655   NewTL.setRParenLoc(TL.getRParenLoc());
6656   for (unsigned I = 0; I < NewTL.getNumArgs(); ++I)
6657     NewTL.setArgLocInfo(I, NewTemplateArgs.arguments()[I].getLocInfo());
6658 
6659   return Result;
6660 }
6661 
6662 template <typename Derived>
6663 QualType TreeTransform<Derived>::TransformTemplateSpecializationType(
6664                                                         TypeLocBuilder &TLB,
6665                                            TemplateSpecializationTypeLoc TL,
6666                                                       TemplateName Template) {
6667   TemplateArgumentListInfo NewTemplateArgs;
6668   NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
6669   NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
6670   typedef TemplateArgumentLocContainerIterator<TemplateSpecializationTypeLoc>
6671     ArgIterator;
6672   if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
6673                                               ArgIterator(TL, TL.getNumArgs()),
6674                                               NewTemplateArgs))
6675     return QualType();
6676 
6677   // FIXME: maybe don't rebuild if all the template arguments are the same.
6678 
6679   QualType Result =
6680     getDerived().RebuildTemplateSpecializationType(Template,
6681                                                    TL.getTemplateNameLoc(),
6682                                                    NewTemplateArgs);
6683 
6684   if (!Result.isNull()) {
6685     // Specializations of template template parameters are represented as
6686     // TemplateSpecializationTypes, and substitution of type alias templates
6687     // within a dependent context can transform them into
6688     // DependentTemplateSpecializationTypes.
6689     if (isa<DependentTemplateSpecializationType>(Result)) {
6690       DependentTemplateSpecializationTypeLoc NewTL
6691         = TLB.push<DependentTemplateSpecializationTypeLoc>(Result);
6692       NewTL.setElaboratedKeywordLoc(SourceLocation());
6693       NewTL.setQualifierLoc(NestedNameSpecifierLoc());
6694       NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6695       NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6696       NewTL.setLAngleLoc(TL.getLAngleLoc());
6697       NewTL.setRAngleLoc(TL.getRAngleLoc());
6698       for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
6699         NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
6700       return Result;
6701     }
6702 
6703     TemplateSpecializationTypeLoc NewTL
6704       = TLB.push<TemplateSpecializationTypeLoc>(Result);
6705     NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6706     NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6707     NewTL.setLAngleLoc(TL.getLAngleLoc());
6708     NewTL.setRAngleLoc(TL.getRAngleLoc());
6709     for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
6710       NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
6711   }
6712 
6713   return Result;
6714 }
6715 
6716 template <typename Derived>
6717 QualType TreeTransform<Derived>::TransformDependentTemplateSpecializationType(
6718                                      TypeLocBuilder &TLB,
6719                                      DependentTemplateSpecializationTypeLoc TL,
6720                                      TemplateName Template,
6721                                      CXXScopeSpec &SS) {
6722   TemplateArgumentListInfo NewTemplateArgs;
6723   NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
6724   NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
6725   typedef TemplateArgumentLocContainerIterator<
6726             DependentTemplateSpecializationTypeLoc> ArgIterator;
6727   if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
6728                                               ArgIterator(TL, TL.getNumArgs()),
6729                                               NewTemplateArgs))
6730     return QualType();
6731 
6732   // FIXME: maybe don't rebuild if all the template arguments are the same.
6733 
6734   if (DependentTemplateName *DTN = Template.getAsDependentTemplateName()) {
6735     QualType Result
6736       = getSema().Context.getDependentTemplateSpecializationType(
6737                                                 TL.getTypePtr()->getKeyword(),
6738                                                          DTN->getQualifier(),
6739                                                          DTN->getIdentifier(),
6740                                                                NewTemplateArgs);
6741 
6742     DependentTemplateSpecializationTypeLoc NewTL
6743       = TLB.push<DependentTemplateSpecializationTypeLoc>(Result);
6744     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6745     NewTL.setQualifierLoc(SS.getWithLocInContext(SemaRef.Context));
6746     NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6747     NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6748     NewTL.setLAngleLoc(TL.getLAngleLoc());
6749     NewTL.setRAngleLoc(TL.getRAngleLoc());
6750     for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
6751       NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
6752     return Result;
6753   }
6754 
6755   QualType Result
6756     = getDerived().RebuildTemplateSpecializationType(Template,
6757                                                      TL.getTemplateNameLoc(),
6758                                                      NewTemplateArgs);
6759 
6760   if (!Result.isNull()) {
6761     /// FIXME: Wrap this in an elaborated-type-specifier?
6762     TemplateSpecializationTypeLoc NewTL
6763       = TLB.push<TemplateSpecializationTypeLoc>(Result);
6764     NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6765     NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6766     NewTL.setLAngleLoc(TL.getLAngleLoc());
6767     NewTL.setRAngleLoc(TL.getRAngleLoc());
6768     for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
6769       NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
6770   }
6771 
6772   return Result;
6773 }
6774 
6775 template<typename Derived>
6776 QualType
6777 TreeTransform<Derived>::TransformElaboratedType(TypeLocBuilder &TLB,
6778                                                 ElaboratedTypeLoc TL) {
6779   const ElaboratedType *T = TL.getTypePtr();
6780 
6781   NestedNameSpecifierLoc QualifierLoc;
6782   // NOTE: the qualifier in an ElaboratedType is optional.
6783   if (TL.getQualifierLoc()) {
6784     QualifierLoc
6785       = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc());
6786     if (!QualifierLoc)
6787       return QualType();
6788   }
6789 
6790   QualType NamedT = getDerived().TransformType(TLB, TL.getNamedTypeLoc());
6791   if (NamedT.isNull())
6792     return QualType();
6793 
6794   // C++0x [dcl.type.elab]p2:
6795   //   If the identifier resolves to a typedef-name or the simple-template-id
6796   //   resolves to an alias template specialization, the
6797   //   elaborated-type-specifier is ill-formed.
6798   if (T->getKeyword() != ETK_None && T->getKeyword() != ETK_Typename) {
6799     if (const TemplateSpecializationType *TST =
6800           NamedT->getAs<TemplateSpecializationType>()) {
6801       TemplateName Template = TST->getTemplateName();
6802       if (TypeAliasTemplateDecl *TAT = dyn_cast_or_null<TypeAliasTemplateDecl>(
6803               Template.getAsTemplateDecl())) {
6804         SemaRef.Diag(TL.getNamedTypeLoc().getBeginLoc(),
6805                      diag::err_tag_reference_non_tag)
6806             << TAT << Sema::NTK_TypeAliasTemplate
6807             << ElaboratedType::getTagTypeKindForKeyword(T->getKeyword());
6808         SemaRef.Diag(TAT->getLocation(), diag::note_declared_at);
6809       }
6810     }
6811   }
6812 
6813   QualType Result = TL.getType();
6814   if (getDerived().AlwaysRebuild() ||
6815       QualifierLoc != TL.getQualifierLoc() ||
6816       NamedT != T->getNamedType()) {
6817     Result = getDerived().RebuildElaboratedType(TL.getElaboratedKeywordLoc(),
6818                                                 T->getKeyword(),
6819                                                 QualifierLoc, NamedT);
6820     if (Result.isNull())
6821       return QualType();
6822   }
6823 
6824   ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
6825   NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6826   NewTL.setQualifierLoc(QualifierLoc);
6827   return Result;
6828 }
6829 
6830 template<typename Derived>
6831 QualType TreeTransform<Derived>::TransformAttributedType(
6832                                                 TypeLocBuilder &TLB,
6833                                                 AttributedTypeLoc TL) {
6834   const AttributedType *oldType = TL.getTypePtr();
6835   QualType modifiedType = getDerived().TransformType(TLB, TL.getModifiedLoc());
6836   if (modifiedType.isNull())
6837     return QualType();
6838 
6839   // oldAttr can be null if we started with a QualType rather than a TypeLoc.
6840   const Attr *oldAttr = TL.getAttr();
6841   const Attr *newAttr = oldAttr ? getDerived().TransformAttr(oldAttr) : nullptr;
6842   if (oldAttr && !newAttr)
6843     return QualType();
6844 
6845   QualType result = TL.getType();
6846 
6847   // FIXME: dependent operand expressions?
6848   if (getDerived().AlwaysRebuild() ||
6849       modifiedType != oldType->getModifiedType()) {
6850     // TODO: this is really lame; we should really be rebuilding the
6851     // equivalent type from first principles.
6852     QualType equivalentType
6853       = getDerived().TransformType(oldType->getEquivalentType());
6854     if (equivalentType.isNull())
6855       return QualType();
6856 
6857     // Check whether we can add nullability; it is only represented as
6858     // type sugar, and therefore cannot be diagnosed in any other way.
6859     if (auto nullability = oldType->getImmediateNullability()) {
6860       if (!modifiedType->canHaveNullability()) {
6861         SemaRef.Diag(TL.getAttr()->getLocation(),
6862                      diag::err_nullability_nonpointer)
6863             << DiagNullabilityKind(*nullability, false) << modifiedType;
6864         return QualType();
6865       }
6866     }
6867 
6868     result = SemaRef.Context.getAttributedType(TL.getAttrKind(),
6869                                                modifiedType,
6870                                                equivalentType);
6871   }
6872 
6873   AttributedTypeLoc newTL = TLB.push<AttributedTypeLoc>(result);
6874   newTL.setAttr(newAttr);
6875   return result;
6876 }
6877 
6878 template <typename Derived>
6879 QualType TreeTransform<Derived>::TransformBTFTagAttributedType(
6880     TypeLocBuilder &TLB, BTFTagAttributedTypeLoc TL) {
6881   // The BTFTagAttributedType is available for C only.
6882   llvm_unreachable("Unexpected TreeTransform for BTFTagAttributedType");
6883 }
6884 
6885 template<typename Derived>
6886 QualType
6887 TreeTransform<Derived>::TransformParenType(TypeLocBuilder &TLB,
6888                                            ParenTypeLoc TL) {
6889   QualType Inner = getDerived().TransformType(TLB, TL.getInnerLoc());
6890   if (Inner.isNull())
6891     return QualType();
6892 
6893   QualType Result = TL.getType();
6894   if (getDerived().AlwaysRebuild() ||
6895       Inner != TL.getInnerLoc().getType()) {
6896     Result = getDerived().RebuildParenType(Inner);
6897     if (Result.isNull())
6898       return QualType();
6899   }
6900 
6901   ParenTypeLoc NewTL = TLB.push<ParenTypeLoc>(Result);
6902   NewTL.setLParenLoc(TL.getLParenLoc());
6903   NewTL.setRParenLoc(TL.getRParenLoc());
6904   return Result;
6905 }
6906 
6907 template <typename Derived>
6908 QualType
6909 TreeTransform<Derived>::TransformMacroQualifiedType(TypeLocBuilder &TLB,
6910                                                     MacroQualifiedTypeLoc TL) {
6911   QualType Inner = getDerived().TransformType(TLB, TL.getInnerLoc());
6912   if (Inner.isNull())
6913     return QualType();
6914 
6915   QualType Result = TL.getType();
6916   if (getDerived().AlwaysRebuild() || Inner != TL.getInnerLoc().getType()) {
6917     Result =
6918         getDerived().RebuildMacroQualifiedType(Inner, TL.getMacroIdentifier());
6919     if (Result.isNull())
6920       return QualType();
6921   }
6922 
6923   MacroQualifiedTypeLoc NewTL = TLB.push<MacroQualifiedTypeLoc>(Result);
6924   NewTL.setExpansionLoc(TL.getExpansionLoc());
6925   return Result;
6926 }
6927 
6928 template<typename Derived>
6929 QualType TreeTransform<Derived>::TransformDependentNameType(
6930     TypeLocBuilder &TLB, DependentNameTypeLoc TL) {
6931   return TransformDependentNameType(TLB, TL, false);
6932 }
6933 
6934 template<typename Derived>
6935 QualType TreeTransform<Derived>::TransformDependentNameType(
6936     TypeLocBuilder &TLB, DependentNameTypeLoc TL, bool DeducedTSTContext) {
6937   const DependentNameType *T = TL.getTypePtr();
6938 
6939   NestedNameSpecifierLoc QualifierLoc
6940     = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc());
6941   if (!QualifierLoc)
6942     return QualType();
6943 
6944   QualType Result
6945     = getDerived().RebuildDependentNameType(T->getKeyword(),
6946                                             TL.getElaboratedKeywordLoc(),
6947                                             QualifierLoc,
6948                                             T->getIdentifier(),
6949                                             TL.getNameLoc(),
6950                                             DeducedTSTContext);
6951   if (Result.isNull())
6952     return QualType();
6953 
6954   if (const ElaboratedType* ElabT = Result->getAs<ElaboratedType>()) {
6955     QualType NamedT = ElabT->getNamedType();
6956     TLB.pushTypeSpec(NamedT).setNameLoc(TL.getNameLoc());
6957 
6958     ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
6959     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6960     NewTL.setQualifierLoc(QualifierLoc);
6961   } else {
6962     DependentNameTypeLoc NewTL = TLB.push<DependentNameTypeLoc>(Result);
6963     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6964     NewTL.setQualifierLoc(QualifierLoc);
6965     NewTL.setNameLoc(TL.getNameLoc());
6966   }
6967   return Result;
6968 }
6969 
6970 template<typename Derived>
6971 QualType TreeTransform<Derived>::
6972           TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB,
6973                                  DependentTemplateSpecializationTypeLoc TL) {
6974   NestedNameSpecifierLoc QualifierLoc;
6975   if (TL.getQualifierLoc()) {
6976     QualifierLoc
6977       = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc());
6978     if (!QualifierLoc)
6979       return QualType();
6980   }
6981 
6982   return getDerived()
6983            .TransformDependentTemplateSpecializationType(TLB, TL, QualifierLoc);
6984 }
6985 
6986 template<typename Derived>
6987 QualType TreeTransform<Derived>::
6988 TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB,
6989                                    DependentTemplateSpecializationTypeLoc TL,
6990                                        NestedNameSpecifierLoc QualifierLoc) {
6991   const DependentTemplateSpecializationType *T = TL.getTypePtr();
6992 
6993   TemplateArgumentListInfo NewTemplateArgs;
6994   NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
6995   NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
6996 
6997   typedef TemplateArgumentLocContainerIterator<
6998   DependentTemplateSpecializationTypeLoc> ArgIterator;
6999   if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
7000                                               ArgIterator(TL, TL.getNumArgs()),
7001                                               NewTemplateArgs))
7002     return QualType();
7003 
7004   QualType Result = getDerived().RebuildDependentTemplateSpecializationType(
7005       T->getKeyword(), QualifierLoc, TL.getTemplateKeywordLoc(),
7006       T->getIdentifier(), TL.getTemplateNameLoc(), NewTemplateArgs,
7007       /*AllowInjectedClassName*/ false);
7008   if (Result.isNull())
7009     return QualType();
7010 
7011   if (const ElaboratedType *ElabT = dyn_cast<ElaboratedType>(Result)) {
7012     QualType NamedT = ElabT->getNamedType();
7013 
7014     // Copy information relevant to the template specialization.
7015     TemplateSpecializationTypeLoc NamedTL
7016       = TLB.push<TemplateSpecializationTypeLoc>(NamedT);
7017     NamedTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
7018     NamedTL.setTemplateNameLoc(TL.getTemplateNameLoc());
7019     NamedTL.setLAngleLoc(TL.getLAngleLoc());
7020     NamedTL.setRAngleLoc(TL.getRAngleLoc());
7021     for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I)
7022       NamedTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo());
7023 
7024     // Copy information relevant to the elaborated type.
7025     ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
7026     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
7027     NewTL.setQualifierLoc(QualifierLoc);
7028   } else if (isa<DependentTemplateSpecializationType>(Result)) {
7029     DependentTemplateSpecializationTypeLoc SpecTL
7030       = TLB.push<DependentTemplateSpecializationTypeLoc>(Result);
7031     SpecTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
7032     SpecTL.setQualifierLoc(QualifierLoc);
7033     SpecTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
7034     SpecTL.setTemplateNameLoc(TL.getTemplateNameLoc());
7035     SpecTL.setLAngleLoc(TL.getLAngleLoc());
7036     SpecTL.setRAngleLoc(TL.getRAngleLoc());
7037     for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I)
7038       SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo());
7039   } else {
7040     TemplateSpecializationTypeLoc SpecTL
7041       = TLB.push<TemplateSpecializationTypeLoc>(Result);
7042     SpecTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
7043     SpecTL.setTemplateNameLoc(TL.getTemplateNameLoc());
7044     SpecTL.setLAngleLoc(TL.getLAngleLoc());
7045     SpecTL.setRAngleLoc(TL.getRAngleLoc());
7046     for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I)
7047       SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo());
7048   }
7049   return Result;
7050 }
7051 
7052 template<typename Derived>
7053 QualType TreeTransform<Derived>::TransformPackExpansionType(TypeLocBuilder &TLB,
7054                                                       PackExpansionTypeLoc TL) {
7055   QualType Pattern
7056     = getDerived().TransformType(TLB, TL.getPatternLoc());
7057   if (Pattern.isNull())
7058     return QualType();
7059 
7060   QualType Result = TL.getType();
7061   if (getDerived().AlwaysRebuild() ||
7062       Pattern != TL.getPatternLoc().getType()) {
7063     Result = getDerived().RebuildPackExpansionType(Pattern,
7064                                            TL.getPatternLoc().getSourceRange(),
7065                                                    TL.getEllipsisLoc(),
7066                                            TL.getTypePtr()->getNumExpansions());
7067     if (Result.isNull())
7068       return QualType();
7069   }
7070 
7071   PackExpansionTypeLoc NewT = TLB.push<PackExpansionTypeLoc>(Result);
7072   NewT.setEllipsisLoc(TL.getEllipsisLoc());
7073   return Result;
7074 }
7075 
7076 template<typename Derived>
7077 QualType
7078 TreeTransform<Derived>::TransformObjCInterfaceType(TypeLocBuilder &TLB,
7079                                                    ObjCInterfaceTypeLoc TL) {
7080   // ObjCInterfaceType is never dependent.
7081   TLB.pushFullCopy(TL);
7082   return TL.getType();
7083 }
7084 
7085 template<typename Derived>
7086 QualType
7087 TreeTransform<Derived>::TransformObjCTypeParamType(TypeLocBuilder &TLB,
7088                                                    ObjCTypeParamTypeLoc TL) {
7089   const ObjCTypeParamType *T = TL.getTypePtr();
7090   ObjCTypeParamDecl *OTP = cast_or_null<ObjCTypeParamDecl>(
7091       getDerived().TransformDecl(T->getDecl()->getLocation(), T->getDecl()));
7092   if (!OTP)
7093     return QualType();
7094 
7095   QualType Result = TL.getType();
7096   if (getDerived().AlwaysRebuild() ||
7097       OTP != T->getDecl()) {
7098     Result = getDerived().RebuildObjCTypeParamType(OTP,
7099                  TL.getProtocolLAngleLoc(),
7100                  llvm::makeArrayRef(TL.getTypePtr()->qual_begin(),
7101                                     TL.getNumProtocols()),
7102                  TL.getProtocolLocs(),
7103                  TL.getProtocolRAngleLoc());
7104     if (Result.isNull())
7105       return QualType();
7106   }
7107 
7108   ObjCTypeParamTypeLoc NewTL = TLB.push<ObjCTypeParamTypeLoc>(Result);
7109   if (TL.getNumProtocols()) {
7110     NewTL.setProtocolLAngleLoc(TL.getProtocolLAngleLoc());
7111     for (unsigned i = 0, n = TL.getNumProtocols(); i != n; ++i)
7112       NewTL.setProtocolLoc(i, TL.getProtocolLoc(i));
7113     NewTL.setProtocolRAngleLoc(TL.getProtocolRAngleLoc());
7114   }
7115   return Result;
7116 }
7117 
7118 template<typename Derived>
7119 QualType
7120 TreeTransform<Derived>::TransformObjCObjectType(TypeLocBuilder &TLB,
7121                                                 ObjCObjectTypeLoc TL) {
7122   // Transform base type.
7123   QualType BaseType = getDerived().TransformType(TLB, TL.getBaseLoc());
7124   if (BaseType.isNull())
7125     return QualType();
7126 
7127   bool AnyChanged = BaseType != TL.getBaseLoc().getType();
7128 
7129   // Transform type arguments.
7130   SmallVector<TypeSourceInfo *, 4> NewTypeArgInfos;
7131   for (unsigned i = 0, n = TL.getNumTypeArgs(); i != n; ++i) {
7132     TypeSourceInfo *TypeArgInfo = TL.getTypeArgTInfo(i);
7133     TypeLoc TypeArgLoc = TypeArgInfo->getTypeLoc();
7134     QualType TypeArg = TypeArgInfo->getType();
7135     if (auto PackExpansionLoc = TypeArgLoc.getAs<PackExpansionTypeLoc>()) {
7136       AnyChanged = true;
7137 
7138       // We have a pack expansion. Instantiate it.
7139       const auto *PackExpansion = PackExpansionLoc.getType()
7140                                     ->castAs<PackExpansionType>();
7141       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
7142       SemaRef.collectUnexpandedParameterPacks(PackExpansion->getPattern(),
7143                                               Unexpanded);
7144       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
7145 
7146       // Determine whether the set of unexpanded parameter packs can
7147       // and should be expanded.
7148       TypeLoc PatternLoc = PackExpansionLoc.getPatternLoc();
7149       bool Expand = false;
7150       bool RetainExpansion = false;
7151       Optional<unsigned> NumExpansions = PackExpansion->getNumExpansions();
7152       if (getDerived().TryExpandParameterPacks(
7153             PackExpansionLoc.getEllipsisLoc(), PatternLoc.getSourceRange(),
7154             Unexpanded, Expand, RetainExpansion, NumExpansions))
7155         return QualType();
7156 
7157       if (!Expand) {
7158         // We can't expand this pack expansion into separate arguments yet;
7159         // just substitute into the pattern and create a new pack expansion
7160         // type.
7161         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
7162 
7163         TypeLocBuilder TypeArgBuilder;
7164         TypeArgBuilder.reserve(PatternLoc.getFullDataSize());
7165         QualType NewPatternType = getDerived().TransformType(TypeArgBuilder,
7166                                                              PatternLoc);
7167         if (NewPatternType.isNull())
7168           return QualType();
7169 
7170         QualType NewExpansionType = SemaRef.Context.getPackExpansionType(
7171                                       NewPatternType, NumExpansions);
7172         auto NewExpansionLoc = TLB.push<PackExpansionTypeLoc>(NewExpansionType);
7173         NewExpansionLoc.setEllipsisLoc(PackExpansionLoc.getEllipsisLoc());
7174         NewTypeArgInfos.push_back(
7175           TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewExpansionType));
7176         continue;
7177       }
7178 
7179       // Substitute into the pack expansion pattern for each slice of the
7180       // pack.
7181       for (unsigned ArgIdx = 0; ArgIdx != *NumExpansions; ++ArgIdx) {
7182         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), ArgIdx);
7183 
7184         TypeLocBuilder TypeArgBuilder;
7185         TypeArgBuilder.reserve(PatternLoc.getFullDataSize());
7186 
7187         QualType NewTypeArg = getDerived().TransformType(TypeArgBuilder,
7188                                                          PatternLoc);
7189         if (NewTypeArg.isNull())
7190           return QualType();
7191 
7192         NewTypeArgInfos.push_back(
7193           TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewTypeArg));
7194       }
7195 
7196       continue;
7197     }
7198 
7199     TypeLocBuilder TypeArgBuilder;
7200     TypeArgBuilder.reserve(TypeArgLoc.getFullDataSize());
7201     QualType NewTypeArg = getDerived().TransformType(TypeArgBuilder, TypeArgLoc);
7202     if (NewTypeArg.isNull())
7203       return QualType();
7204 
7205     // If nothing changed, just keep the old TypeSourceInfo.
7206     if (NewTypeArg == TypeArg) {
7207       NewTypeArgInfos.push_back(TypeArgInfo);
7208       continue;
7209     }
7210 
7211     NewTypeArgInfos.push_back(
7212       TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewTypeArg));
7213     AnyChanged = true;
7214   }
7215 
7216   QualType Result = TL.getType();
7217   if (getDerived().AlwaysRebuild() || AnyChanged) {
7218     // Rebuild the type.
7219     Result = getDerived().RebuildObjCObjectType(
7220         BaseType, TL.getBeginLoc(), TL.getTypeArgsLAngleLoc(), NewTypeArgInfos,
7221         TL.getTypeArgsRAngleLoc(), TL.getProtocolLAngleLoc(),
7222         llvm::makeArrayRef(TL.getTypePtr()->qual_begin(), TL.getNumProtocols()),
7223         TL.getProtocolLocs(), TL.getProtocolRAngleLoc());
7224 
7225     if (Result.isNull())
7226       return QualType();
7227   }
7228 
7229   ObjCObjectTypeLoc NewT = TLB.push<ObjCObjectTypeLoc>(Result);
7230   NewT.setHasBaseTypeAsWritten(true);
7231   NewT.setTypeArgsLAngleLoc(TL.getTypeArgsLAngleLoc());
7232   for (unsigned i = 0, n = TL.getNumTypeArgs(); i != n; ++i)
7233     NewT.setTypeArgTInfo(i, NewTypeArgInfos[i]);
7234   NewT.setTypeArgsRAngleLoc(TL.getTypeArgsRAngleLoc());
7235   NewT.setProtocolLAngleLoc(TL.getProtocolLAngleLoc());
7236   for (unsigned i = 0, n = TL.getNumProtocols(); i != n; ++i)
7237     NewT.setProtocolLoc(i, TL.getProtocolLoc(i));
7238   NewT.setProtocolRAngleLoc(TL.getProtocolRAngleLoc());
7239   return Result;
7240 }
7241 
7242 template<typename Derived>
7243 QualType
7244 TreeTransform<Derived>::TransformObjCObjectPointerType(TypeLocBuilder &TLB,
7245                                                ObjCObjectPointerTypeLoc TL) {
7246   QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
7247   if (PointeeType.isNull())
7248     return QualType();
7249 
7250   QualType Result = TL.getType();
7251   if (getDerived().AlwaysRebuild() ||
7252       PointeeType != TL.getPointeeLoc().getType()) {
7253     Result = getDerived().RebuildObjCObjectPointerType(PointeeType,
7254                                                        TL.getStarLoc());
7255     if (Result.isNull())
7256       return QualType();
7257   }
7258 
7259   ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result);
7260   NewT.setStarLoc(TL.getStarLoc());
7261   return Result;
7262 }
7263 
7264 //===----------------------------------------------------------------------===//
7265 // Statement transformation
7266 //===----------------------------------------------------------------------===//
7267 template<typename Derived>
7268 StmtResult
7269 TreeTransform<Derived>::TransformNullStmt(NullStmt *S) {
7270   return S;
7271 }
7272 
7273 template<typename Derived>
7274 StmtResult
7275 TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S) {
7276   return getDerived().TransformCompoundStmt(S, false);
7277 }
7278 
7279 template<typename Derived>
7280 StmtResult
7281 TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S,
7282                                               bool IsStmtExpr) {
7283   Sema::CompoundScopeRAII CompoundScope(getSema());
7284 
7285   const Stmt *ExprResult = S->getStmtExprResult();
7286   bool SubStmtInvalid = false;
7287   bool SubStmtChanged = false;
7288   SmallVector<Stmt*, 8> Statements;
7289   for (auto *B : S->body()) {
7290     StmtResult Result = getDerived().TransformStmt(
7291         B, IsStmtExpr && B == ExprResult ? SDK_StmtExprResult : SDK_Discarded);
7292 
7293     if (Result.isInvalid()) {
7294       // Immediately fail if this was a DeclStmt, since it's very
7295       // likely that this will cause problems for future statements.
7296       if (isa<DeclStmt>(B))
7297         return StmtError();
7298 
7299       // Otherwise, just keep processing substatements and fail later.
7300       SubStmtInvalid = true;
7301       continue;
7302     }
7303 
7304     SubStmtChanged = SubStmtChanged || Result.get() != B;
7305     Statements.push_back(Result.getAs<Stmt>());
7306   }
7307 
7308   if (SubStmtInvalid)
7309     return StmtError();
7310 
7311   if (!getDerived().AlwaysRebuild() &&
7312       !SubStmtChanged)
7313     return S;
7314 
7315   return getDerived().RebuildCompoundStmt(S->getLBracLoc(),
7316                                           Statements,
7317                                           S->getRBracLoc(),
7318                                           IsStmtExpr);
7319 }
7320 
7321 template<typename Derived>
7322 StmtResult
7323 TreeTransform<Derived>::TransformCaseStmt(CaseStmt *S) {
7324   ExprResult LHS, RHS;
7325   {
7326     EnterExpressionEvaluationContext Unevaluated(
7327         SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
7328 
7329     // Transform the left-hand case value.
7330     LHS = getDerived().TransformExpr(S->getLHS());
7331     LHS = SemaRef.ActOnCaseExpr(S->getCaseLoc(), LHS);
7332     if (LHS.isInvalid())
7333       return StmtError();
7334 
7335     // Transform the right-hand case value (for the GNU case-range extension).
7336     RHS = getDerived().TransformExpr(S->getRHS());
7337     RHS = SemaRef.ActOnCaseExpr(S->getCaseLoc(), RHS);
7338     if (RHS.isInvalid())
7339       return StmtError();
7340   }
7341 
7342   // Build the case statement.
7343   // Case statements are always rebuilt so that they will attached to their
7344   // transformed switch statement.
7345   StmtResult Case = getDerived().RebuildCaseStmt(S->getCaseLoc(),
7346                                                        LHS.get(),
7347                                                        S->getEllipsisLoc(),
7348                                                        RHS.get(),
7349                                                        S->getColonLoc());
7350   if (Case.isInvalid())
7351     return StmtError();
7352 
7353   // Transform the statement following the case
7354   StmtResult SubStmt =
7355       getDerived().TransformStmt(S->getSubStmt());
7356   if (SubStmt.isInvalid())
7357     return StmtError();
7358 
7359   // Attach the body to the case statement
7360   return getDerived().RebuildCaseStmtBody(Case.get(), SubStmt.get());
7361 }
7362 
7363 template <typename Derived>
7364 StmtResult TreeTransform<Derived>::TransformDefaultStmt(DefaultStmt *S) {
7365   // Transform the statement following the default case
7366   StmtResult SubStmt =
7367       getDerived().TransformStmt(S->getSubStmt());
7368   if (SubStmt.isInvalid())
7369     return StmtError();
7370 
7371   // Default statements are always rebuilt
7372   return getDerived().RebuildDefaultStmt(S->getDefaultLoc(), S->getColonLoc(),
7373                                          SubStmt.get());
7374 }
7375 
7376 template<typename Derived>
7377 StmtResult
7378 TreeTransform<Derived>::TransformLabelStmt(LabelStmt *S, StmtDiscardKind SDK) {
7379   StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt(), SDK);
7380   if (SubStmt.isInvalid())
7381     return StmtError();
7382 
7383   Decl *LD = getDerived().TransformDecl(S->getDecl()->getLocation(),
7384                                         S->getDecl());
7385   if (!LD)
7386     return StmtError();
7387 
7388   // If we're transforming "in-place" (we're not creating new local
7389   // declarations), assume we're replacing the old label statement
7390   // and clear out the reference to it.
7391   if (LD == S->getDecl())
7392     S->getDecl()->setStmt(nullptr);
7393 
7394   // FIXME: Pass the real colon location in.
7395   return getDerived().RebuildLabelStmt(S->getIdentLoc(),
7396                                        cast<LabelDecl>(LD), SourceLocation(),
7397                                        SubStmt.get());
7398 }
7399 
7400 template <typename Derived>
7401 const Attr *TreeTransform<Derived>::TransformAttr(const Attr *R) {
7402   if (!R)
7403     return R;
7404 
7405   switch (R->getKind()) {
7406 // Transform attributes with a pragma spelling by calling TransformXXXAttr.
7407 #define ATTR(X)
7408 #define PRAGMA_SPELLING_ATTR(X)                                                \
7409   case attr::X:                                                                \
7410     return getDerived().Transform##X##Attr(cast<X##Attr>(R));
7411 #include "clang/Basic/AttrList.inc"
7412   default:
7413     return R;
7414   }
7415 }
7416 
7417 template <typename Derived>
7418 StmtResult
7419 TreeTransform<Derived>::TransformAttributedStmt(AttributedStmt *S,
7420                                                 StmtDiscardKind SDK) {
7421   bool AttrsChanged = false;
7422   SmallVector<const Attr *, 1> Attrs;
7423 
7424   // Visit attributes and keep track if any are transformed.
7425   for (const auto *I : S->getAttrs()) {
7426     const Attr *R = getDerived().TransformAttr(I);
7427     AttrsChanged |= (I != R);
7428     if (R)
7429       Attrs.push_back(R);
7430   }
7431 
7432   StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt(), SDK);
7433   if (SubStmt.isInvalid())
7434     return StmtError();
7435 
7436   if (SubStmt.get() == S->getSubStmt() && !AttrsChanged)
7437     return S;
7438 
7439   // If transforming the attributes failed for all of the attributes in the
7440   // statement, don't make an AttributedStmt without attributes.
7441   if (Attrs.empty())
7442     return SubStmt;
7443 
7444   return getDerived().RebuildAttributedStmt(S->getAttrLoc(), Attrs,
7445                                             SubStmt.get());
7446 }
7447 
7448 template<typename Derived>
7449 StmtResult
7450 TreeTransform<Derived>::TransformIfStmt(IfStmt *S) {
7451   // Transform the initialization statement
7452   StmtResult Init = getDerived().TransformStmt(S->getInit());
7453   if (Init.isInvalid())
7454     return StmtError();
7455 
7456   Sema::ConditionResult Cond;
7457   if (!S->isConsteval()) {
7458     // Transform the condition
7459     Cond = getDerived().TransformCondition(
7460         S->getIfLoc(), S->getConditionVariable(), S->getCond(),
7461         S->isConstexpr() ? Sema::ConditionKind::ConstexprIf
7462                          : Sema::ConditionKind::Boolean);
7463     if (Cond.isInvalid())
7464       return StmtError();
7465   }
7466 
7467   // If this is a constexpr if, determine which arm we should instantiate.
7468   llvm::Optional<bool> ConstexprConditionValue;
7469   if (S->isConstexpr())
7470     ConstexprConditionValue = Cond.getKnownValue();
7471 
7472   // Transform the "then" branch.
7473   StmtResult Then;
7474   if (!ConstexprConditionValue || *ConstexprConditionValue) {
7475     Then = getDerived().TransformStmt(S->getThen());
7476     if (Then.isInvalid())
7477       return StmtError();
7478   } else {
7479     Then = new (getSema().Context) NullStmt(S->getThen()->getBeginLoc());
7480   }
7481 
7482   // Transform the "else" branch.
7483   StmtResult Else;
7484   if (!ConstexprConditionValue || !*ConstexprConditionValue) {
7485     Else = getDerived().TransformStmt(S->getElse());
7486     if (Else.isInvalid())
7487       return StmtError();
7488   }
7489 
7490   if (!getDerived().AlwaysRebuild() &&
7491       Init.get() == S->getInit() &&
7492       Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) &&
7493       Then.get() == S->getThen() &&
7494       Else.get() == S->getElse())
7495     return S;
7496 
7497   return getDerived().RebuildIfStmt(
7498       S->getIfLoc(), S->getStatementKind(), S->getLParenLoc(), Cond,
7499       S->getRParenLoc(), Init.get(), Then.get(), S->getElseLoc(), Else.get());
7500 }
7501 
7502 template<typename Derived>
7503 StmtResult
7504 TreeTransform<Derived>::TransformSwitchStmt(SwitchStmt *S) {
7505   // Transform the initialization statement
7506   StmtResult Init = getDerived().TransformStmt(S->getInit());
7507   if (Init.isInvalid())
7508     return StmtError();
7509 
7510   // Transform the condition.
7511   Sema::ConditionResult Cond = getDerived().TransformCondition(
7512       S->getSwitchLoc(), S->getConditionVariable(), S->getCond(),
7513       Sema::ConditionKind::Switch);
7514   if (Cond.isInvalid())
7515     return StmtError();
7516 
7517   // Rebuild the switch statement.
7518   StmtResult Switch =
7519       getDerived().RebuildSwitchStmtStart(S->getSwitchLoc(), S->getLParenLoc(),
7520                                           Init.get(), Cond, S->getRParenLoc());
7521   if (Switch.isInvalid())
7522     return StmtError();
7523 
7524   // Transform the body of the switch statement.
7525   StmtResult Body = getDerived().TransformStmt(S->getBody());
7526   if (Body.isInvalid())
7527     return StmtError();
7528 
7529   // Complete the switch statement.
7530   return getDerived().RebuildSwitchStmtBody(S->getSwitchLoc(), Switch.get(),
7531                                             Body.get());
7532 }
7533 
7534 template<typename Derived>
7535 StmtResult
7536 TreeTransform<Derived>::TransformWhileStmt(WhileStmt *S) {
7537   // Transform the condition
7538   Sema::ConditionResult Cond = getDerived().TransformCondition(
7539       S->getWhileLoc(), S->getConditionVariable(), S->getCond(),
7540       Sema::ConditionKind::Boolean);
7541   if (Cond.isInvalid())
7542     return StmtError();
7543 
7544   // Transform the body
7545   StmtResult Body = getDerived().TransformStmt(S->getBody());
7546   if (Body.isInvalid())
7547     return StmtError();
7548 
7549   if (!getDerived().AlwaysRebuild() &&
7550       Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) &&
7551       Body.get() == S->getBody())
7552     return Owned(S);
7553 
7554   return getDerived().RebuildWhileStmt(S->getWhileLoc(), S->getLParenLoc(),
7555                                        Cond, S->getRParenLoc(), Body.get());
7556 }
7557 
7558 template<typename Derived>
7559 StmtResult
7560 TreeTransform<Derived>::TransformDoStmt(DoStmt *S) {
7561   // Transform the body
7562   StmtResult Body = getDerived().TransformStmt(S->getBody());
7563   if (Body.isInvalid())
7564     return StmtError();
7565 
7566   // Transform the condition
7567   ExprResult Cond = getDerived().TransformExpr(S->getCond());
7568   if (Cond.isInvalid())
7569     return StmtError();
7570 
7571   if (!getDerived().AlwaysRebuild() &&
7572       Cond.get() == S->getCond() &&
7573       Body.get() == S->getBody())
7574     return S;
7575 
7576   return getDerived().RebuildDoStmt(S->getDoLoc(), Body.get(), S->getWhileLoc(),
7577                                     /*FIXME:*/S->getWhileLoc(), Cond.get(),
7578                                     S->getRParenLoc());
7579 }
7580 
7581 template<typename Derived>
7582 StmtResult
7583 TreeTransform<Derived>::TransformForStmt(ForStmt *S) {
7584   if (getSema().getLangOpts().OpenMP)
7585     getSema().startOpenMPLoop();
7586 
7587   // Transform the initialization statement
7588   StmtResult Init = getDerived().TransformStmt(S->getInit());
7589   if (Init.isInvalid())
7590     return StmtError();
7591 
7592   // In OpenMP loop region loop control variable must be captured and be
7593   // private. Perform analysis of first part (if any).
7594   if (getSema().getLangOpts().OpenMP && Init.isUsable())
7595     getSema().ActOnOpenMPLoopInitialization(S->getForLoc(), Init.get());
7596 
7597   // Transform the condition
7598   Sema::ConditionResult Cond = getDerived().TransformCondition(
7599       S->getForLoc(), S->getConditionVariable(), S->getCond(),
7600       Sema::ConditionKind::Boolean);
7601   if (Cond.isInvalid())
7602     return StmtError();
7603 
7604   // Transform the increment
7605   ExprResult Inc = getDerived().TransformExpr(S->getInc());
7606   if (Inc.isInvalid())
7607     return StmtError();
7608 
7609   Sema::FullExprArg FullInc(getSema().MakeFullDiscardedValueExpr(Inc.get()));
7610   if (S->getInc() && !FullInc.get())
7611     return StmtError();
7612 
7613   // Transform the body
7614   StmtResult Body = getDerived().TransformStmt(S->getBody());
7615   if (Body.isInvalid())
7616     return StmtError();
7617 
7618   if (!getDerived().AlwaysRebuild() &&
7619       Init.get() == S->getInit() &&
7620       Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) &&
7621       Inc.get() == S->getInc() &&
7622       Body.get() == S->getBody())
7623     return S;
7624 
7625   return getDerived().RebuildForStmt(S->getForLoc(), S->getLParenLoc(),
7626                                      Init.get(), Cond, FullInc,
7627                                      S->getRParenLoc(), Body.get());
7628 }
7629 
7630 template<typename Derived>
7631 StmtResult
7632 TreeTransform<Derived>::TransformGotoStmt(GotoStmt *S) {
7633   Decl *LD = getDerived().TransformDecl(S->getLabel()->getLocation(),
7634                                         S->getLabel());
7635   if (!LD)
7636     return StmtError();
7637 
7638   // Goto statements must always be rebuilt, to resolve the label.
7639   return getDerived().RebuildGotoStmt(S->getGotoLoc(), S->getLabelLoc(),
7640                                       cast<LabelDecl>(LD));
7641 }
7642 
7643 template<typename Derived>
7644 StmtResult
7645 TreeTransform<Derived>::TransformIndirectGotoStmt(IndirectGotoStmt *S) {
7646   ExprResult Target = getDerived().TransformExpr(S->getTarget());
7647   if (Target.isInvalid())
7648     return StmtError();
7649   Target = SemaRef.MaybeCreateExprWithCleanups(Target.get());
7650 
7651   if (!getDerived().AlwaysRebuild() &&
7652       Target.get() == S->getTarget())
7653     return S;
7654 
7655   return getDerived().RebuildIndirectGotoStmt(S->getGotoLoc(), S->getStarLoc(),
7656                                               Target.get());
7657 }
7658 
7659 template<typename Derived>
7660 StmtResult
7661 TreeTransform<Derived>::TransformContinueStmt(ContinueStmt *S) {
7662   return S;
7663 }
7664 
7665 template<typename Derived>
7666 StmtResult
7667 TreeTransform<Derived>::TransformBreakStmt(BreakStmt *S) {
7668   return S;
7669 }
7670 
7671 template<typename Derived>
7672 StmtResult
7673 TreeTransform<Derived>::TransformReturnStmt(ReturnStmt *S) {
7674   ExprResult Result = getDerived().TransformInitializer(S->getRetValue(),
7675                                                         /*NotCopyInit*/false);
7676   if (Result.isInvalid())
7677     return StmtError();
7678 
7679   // FIXME: We always rebuild the return statement because there is no way
7680   // to tell whether the return type of the function has changed.
7681   return getDerived().RebuildReturnStmt(S->getReturnLoc(), Result.get());
7682 }
7683 
7684 template<typename Derived>
7685 StmtResult
7686 TreeTransform<Derived>::TransformDeclStmt(DeclStmt *S) {
7687   bool DeclChanged = false;
7688   SmallVector<Decl *, 4> Decls;
7689   for (auto *D : S->decls()) {
7690     Decl *Transformed = getDerived().TransformDefinition(D->getLocation(), D);
7691     if (!Transformed)
7692       return StmtError();
7693 
7694     if (Transformed != D)
7695       DeclChanged = true;
7696 
7697     Decls.push_back(Transformed);
7698   }
7699 
7700   if (!getDerived().AlwaysRebuild() && !DeclChanged)
7701     return S;
7702 
7703   return getDerived().RebuildDeclStmt(Decls, S->getBeginLoc(), S->getEndLoc());
7704 }
7705 
7706 template<typename Derived>
7707 StmtResult
7708 TreeTransform<Derived>::TransformGCCAsmStmt(GCCAsmStmt *S) {
7709 
7710   SmallVector<Expr*, 8> Constraints;
7711   SmallVector<Expr*, 8> Exprs;
7712   SmallVector<IdentifierInfo *, 4> Names;
7713 
7714   ExprResult AsmString;
7715   SmallVector<Expr*, 8> Clobbers;
7716 
7717   bool ExprsChanged = false;
7718 
7719   // Go through the outputs.
7720   for (unsigned I = 0, E = S->getNumOutputs(); I != E; ++I) {
7721     Names.push_back(S->getOutputIdentifier(I));
7722 
7723     // No need to transform the constraint literal.
7724     Constraints.push_back(S->getOutputConstraintLiteral(I));
7725 
7726     // Transform the output expr.
7727     Expr *OutputExpr = S->getOutputExpr(I);
7728     ExprResult Result = getDerived().TransformExpr(OutputExpr);
7729     if (Result.isInvalid())
7730       return StmtError();
7731 
7732     ExprsChanged |= Result.get() != OutputExpr;
7733 
7734     Exprs.push_back(Result.get());
7735   }
7736 
7737   // Go through the inputs.
7738   for (unsigned I = 0, E = S->getNumInputs(); I != E; ++I) {
7739     Names.push_back(S->getInputIdentifier(I));
7740 
7741     // No need to transform the constraint literal.
7742     Constraints.push_back(S->getInputConstraintLiteral(I));
7743 
7744     // Transform the input expr.
7745     Expr *InputExpr = S->getInputExpr(I);
7746     ExprResult Result = getDerived().TransformExpr(InputExpr);
7747     if (Result.isInvalid())
7748       return StmtError();
7749 
7750     ExprsChanged |= Result.get() != InputExpr;
7751 
7752     Exprs.push_back(Result.get());
7753   }
7754 
7755   // Go through the Labels.
7756   for (unsigned I = 0, E = S->getNumLabels(); I != E; ++I) {
7757     Names.push_back(S->getLabelIdentifier(I));
7758 
7759     ExprResult Result = getDerived().TransformExpr(S->getLabelExpr(I));
7760     if (Result.isInvalid())
7761       return StmtError();
7762     ExprsChanged |= Result.get() != S->getLabelExpr(I);
7763     Exprs.push_back(Result.get());
7764   }
7765   if (!getDerived().AlwaysRebuild() && !ExprsChanged)
7766     return S;
7767 
7768   // Go through the clobbers.
7769   for (unsigned I = 0, E = S->getNumClobbers(); I != E; ++I)
7770     Clobbers.push_back(S->getClobberStringLiteral(I));
7771 
7772   // No need to transform the asm string literal.
7773   AsmString = S->getAsmString();
7774   return getDerived().RebuildGCCAsmStmt(S->getAsmLoc(), S->isSimple(),
7775                                         S->isVolatile(), S->getNumOutputs(),
7776                                         S->getNumInputs(), Names.data(),
7777                                         Constraints, Exprs, AsmString.get(),
7778                                         Clobbers, S->getNumLabels(),
7779                                         S->getRParenLoc());
7780 }
7781 
7782 template<typename Derived>
7783 StmtResult
7784 TreeTransform<Derived>::TransformMSAsmStmt(MSAsmStmt *S) {
7785   ArrayRef<Token> AsmToks =
7786     llvm::makeArrayRef(S->getAsmToks(), S->getNumAsmToks());
7787 
7788   bool HadError = false, HadChange = false;
7789 
7790   ArrayRef<Expr*> SrcExprs = S->getAllExprs();
7791   SmallVector<Expr*, 8> TransformedExprs;
7792   TransformedExprs.reserve(SrcExprs.size());
7793   for (unsigned i = 0, e = SrcExprs.size(); i != e; ++i) {
7794     ExprResult Result = getDerived().TransformExpr(SrcExprs[i]);
7795     if (!Result.isUsable()) {
7796       HadError = true;
7797     } else {
7798       HadChange |= (Result.get() != SrcExprs[i]);
7799       TransformedExprs.push_back(Result.get());
7800     }
7801   }
7802 
7803   if (HadError) return StmtError();
7804   if (!HadChange && !getDerived().AlwaysRebuild())
7805     return Owned(S);
7806 
7807   return getDerived().RebuildMSAsmStmt(S->getAsmLoc(), S->getLBraceLoc(),
7808                                        AsmToks, S->getAsmString(),
7809                                        S->getNumOutputs(), S->getNumInputs(),
7810                                        S->getAllConstraints(), S->getClobbers(),
7811                                        TransformedExprs, S->getEndLoc());
7812 }
7813 
7814 // C++ Coroutines TS
7815 
7816 template<typename Derived>
7817 StmtResult
7818 TreeTransform<Derived>::TransformCoroutineBodyStmt(CoroutineBodyStmt *S) {
7819   auto *ScopeInfo = SemaRef.getCurFunction();
7820   auto *FD = cast<FunctionDecl>(SemaRef.CurContext);
7821   assert(FD && ScopeInfo && !ScopeInfo->CoroutinePromise &&
7822          ScopeInfo->NeedsCoroutineSuspends &&
7823          ScopeInfo->CoroutineSuspends.first == nullptr &&
7824          ScopeInfo->CoroutineSuspends.second == nullptr &&
7825          "expected clean scope info");
7826 
7827   // Set that we have (possibly-invalid) suspend points before we do anything
7828   // that may fail.
7829   ScopeInfo->setNeedsCoroutineSuspends(false);
7830 
7831   // We re-build the coroutine promise object (and the coroutine parameters its
7832   // type and constructor depend on) based on the types used in our current
7833   // function. We must do so, and set it on the current FunctionScopeInfo,
7834   // before attempting to transform the other parts of the coroutine body
7835   // statement, such as the implicit suspend statements (because those
7836   // statements reference the FunctionScopeInfo::CoroutinePromise).
7837   if (!SemaRef.buildCoroutineParameterMoves(FD->getLocation()))
7838     return StmtError();
7839   auto *Promise = SemaRef.buildCoroutinePromise(FD->getLocation());
7840   if (!Promise)
7841     return StmtError();
7842   getDerived().transformedLocalDecl(S->getPromiseDecl(), {Promise});
7843   ScopeInfo->CoroutinePromise = Promise;
7844 
7845   // Transform the implicit coroutine statements constructed using dependent
7846   // types during the previous parse: initial and final suspensions, the return
7847   // object, and others. We also transform the coroutine function's body.
7848   StmtResult InitSuspend = getDerived().TransformStmt(S->getInitSuspendStmt());
7849   if (InitSuspend.isInvalid())
7850     return StmtError();
7851   StmtResult FinalSuspend =
7852       getDerived().TransformStmt(S->getFinalSuspendStmt());
7853   if (FinalSuspend.isInvalid() ||
7854       !SemaRef.checkFinalSuspendNoThrow(FinalSuspend.get()))
7855     return StmtError();
7856   ScopeInfo->setCoroutineSuspends(InitSuspend.get(), FinalSuspend.get());
7857   assert(isa<Expr>(InitSuspend.get()) && isa<Expr>(FinalSuspend.get()));
7858 
7859   StmtResult BodyRes = getDerived().TransformStmt(S->getBody());
7860   if (BodyRes.isInvalid())
7861     return StmtError();
7862 
7863   CoroutineStmtBuilder Builder(SemaRef, *FD, *ScopeInfo, BodyRes.get());
7864   if (Builder.isInvalid())
7865     return StmtError();
7866 
7867   Expr *ReturnObject = S->getReturnValueInit();
7868   assert(ReturnObject && "the return object is expected to be valid");
7869   ExprResult Res = getDerived().TransformInitializer(ReturnObject,
7870                                                      /*NoCopyInit*/ false);
7871   if (Res.isInvalid())
7872     return StmtError();
7873   Builder.ReturnValue = Res.get();
7874 
7875   // If during the previous parse the coroutine still had a dependent promise
7876   // statement, we may need to build some implicit coroutine statements
7877   // (such as exception and fallthrough handlers) for the first time.
7878   if (S->hasDependentPromiseType()) {
7879     // We can only build these statements, however, if the current promise type
7880     // is not dependent.
7881     if (!Promise->getType()->isDependentType()) {
7882       assert(!S->getFallthroughHandler() && !S->getExceptionHandler() &&
7883              !S->getReturnStmtOnAllocFailure() && !S->getDeallocate() &&
7884              "these nodes should not have been built yet");
7885       if (!Builder.buildDependentStatements())
7886         return StmtError();
7887     }
7888   } else {
7889     if (auto *OnFallthrough = S->getFallthroughHandler()) {
7890       StmtResult Res = getDerived().TransformStmt(OnFallthrough);
7891       if (Res.isInvalid())
7892         return StmtError();
7893       Builder.OnFallthrough = Res.get();
7894     }
7895 
7896     if (auto *OnException = S->getExceptionHandler()) {
7897       StmtResult Res = getDerived().TransformStmt(OnException);
7898       if (Res.isInvalid())
7899         return StmtError();
7900       Builder.OnException = Res.get();
7901     }
7902 
7903     if (auto *OnAllocFailure = S->getReturnStmtOnAllocFailure()) {
7904       StmtResult Res = getDerived().TransformStmt(OnAllocFailure);
7905       if (Res.isInvalid())
7906         return StmtError();
7907       Builder.ReturnStmtOnAllocFailure = Res.get();
7908     }
7909 
7910     // Transform any additional statements we may have already built
7911     assert(S->getAllocate() && S->getDeallocate() &&
7912            "allocation and deallocation calls must already be built");
7913     ExprResult AllocRes = getDerived().TransformExpr(S->getAllocate());
7914     if (AllocRes.isInvalid())
7915       return StmtError();
7916     Builder.Allocate = AllocRes.get();
7917 
7918     ExprResult DeallocRes = getDerived().TransformExpr(S->getDeallocate());
7919     if (DeallocRes.isInvalid())
7920       return StmtError();
7921     Builder.Deallocate = DeallocRes.get();
7922 
7923     if (auto *ReturnStmt = S->getReturnStmt()) {
7924       StmtResult Res = getDerived().TransformStmt(ReturnStmt);
7925       if (Res.isInvalid())
7926         return StmtError();
7927       Builder.ReturnStmt = Res.get();
7928     }
7929   }
7930 
7931   return getDerived().RebuildCoroutineBodyStmt(Builder);
7932 }
7933 
7934 template<typename Derived>
7935 StmtResult
7936 TreeTransform<Derived>::TransformCoreturnStmt(CoreturnStmt *S) {
7937   ExprResult Result = getDerived().TransformInitializer(S->getOperand(),
7938                                                         /*NotCopyInit*/false);
7939   if (Result.isInvalid())
7940     return StmtError();
7941 
7942   // Always rebuild; we don't know if this needs to be injected into a new
7943   // context or if the promise type has changed.
7944   return getDerived().RebuildCoreturnStmt(S->getKeywordLoc(), Result.get(),
7945                                           S->isImplicit());
7946 }
7947 
7948 template<typename Derived>
7949 ExprResult
7950 TreeTransform<Derived>::TransformCoawaitExpr(CoawaitExpr *E) {
7951   ExprResult Result = getDerived().TransformInitializer(E->getOperand(),
7952                                                         /*NotCopyInit*/false);
7953   if (Result.isInvalid())
7954     return ExprError();
7955 
7956   // Always rebuild; we don't know if this needs to be injected into a new
7957   // context or if the promise type has changed.
7958   return getDerived().RebuildCoawaitExpr(E->getKeywordLoc(), Result.get(),
7959                                          E->isImplicit());
7960 }
7961 
7962 template <typename Derived>
7963 ExprResult
7964 TreeTransform<Derived>::TransformDependentCoawaitExpr(DependentCoawaitExpr *E) {
7965   ExprResult OperandResult = getDerived().TransformInitializer(E->getOperand(),
7966                                                         /*NotCopyInit*/ false);
7967   if (OperandResult.isInvalid())
7968     return ExprError();
7969 
7970   ExprResult LookupResult = getDerived().TransformUnresolvedLookupExpr(
7971           E->getOperatorCoawaitLookup());
7972 
7973   if (LookupResult.isInvalid())
7974     return ExprError();
7975 
7976   // Always rebuild; we don't know if this needs to be injected into a new
7977   // context or if the promise type has changed.
7978   return getDerived().RebuildDependentCoawaitExpr(
7979       E->getKeywordLoc(), OperandResult.get(),
7980       cast<UnresolvedLookupExpr>(LookupResult.get()));
7981 }
7982 
7983 template<typename Derived>
7984 ExprResult
7985 TreeTransform<Derived>::TransformCoyieldExpr(CoyieldExpr *E) {
7986   ExprResult Result = getDerived().TransformInitializer(E->getOperand(),
7987                                                         /*NotCopyInit*/false);
7988   if (Result.isInvalid())
7989     return ExprError();
7990 
7991   // Always rebuild; we don't know if this needs to be injected into a new
7992   // context or if the promise type has changed.
7993   return getDerived().RebuildCoyieldExpr(E->getKeywordLoc(), Result.get());
7994 }
7995 
7996 // Objective-C Statements.
7997 
7998 template<typename Derived>
7999 StmtResult
8000 TreeTransform<Derived>::TransformObjCAtTryStmt(ObjCAtTryStmt *S) {
8001   // Transform the body of the @try.
8002   StmtResult TryBody = getDerived().TransformStmt(S->getTryBody());
8003   if (TryBody.isInvalid())
8004     return StmtError();
8005 
8006   // Transform the @catch statements (if present).
8007   bool AnyCatchChanged = false;
8008   SmallVector<Stmt*, 8> CatchStmts;
8009   for (unsigned I = 0, N = S->getNumCatchStmts(); I != N; ++I) {
8010     StmtResult Catch = getDerived().TransformStmt(S->getCatchStmt(I));
8011     if (Catch.isInvalid())
8012       return StmtError();
8013     if (Catch.get() != S->getCatchStmt(I))
8014       AnyCatchChanged = true;
8015     CatchStmts.push_back(Catch.get());
8016   }
8017 
8018   // Transform the @finally statement (if present).
8019   StmtResult Finally;
8020   if (S->getFinallyStmt()) {
8021     Finally = getDerived().TransformStmt(S->getFinallyStmt());
8022     if (Finally.isInvalid())
8023       return StmtError();
8024   }
8025 
8026   // If nothing changed, just retain this statement.
8027   if (!getDerived().AlwaysRebuild() &&
8028       TryBody.get() == S->getTryBody() &&
8029       !AnyCatchChanged &&
8030       Finally.get() == S->getFinallyStmt())
8031     return S;
8032 
8033   // Build a new statement.
8034   return getDerived().RebuildObjCAtTryStmt(S->getAtTryLoc(), TryBody.get(),
8035                                            CatchStmts, Finally.get());
8036 }
8037 
8038 template<typename Derived>
8039 StmtResult
8040 TreeTransform<Derived>::TransformObjCAtCatchStmt(ObjCAtCatchStmt *S) {
8041   // Transform the @catch parameter, if there is one.
8042   VarDecl *Var = nullptr;
8043   if (VarDecl *FromVar = S->getCatchParamDecl()) {
8044     TypeSourceInfo *TSInfo = nullptr;
8045     if (FromVar->getTypeSourceInfo()) {
8046       TSInfo = getDerived().TransformType(FromVar->getTypeSourceInfo());
8047       if (!TSInfo)
8048         return StmtError();
8049     }
8050 
8051     QualType T;
8052     if (TSInfo)
8053       T = TSInfo->getType();
8054     else {
8055       T = getDerived().TransformType(FromVar->getType());
8056       if (T.isNull())
8057         return StmtError();
8058     }
8059 
8060     Var = getDerived().RebuildObjCExceptionDecl(FromVar, TSInfo, T);
8061     if (!Var)
8062       return StmtError();
8063   }
8064 
8065   StmtResult Body = getDerived().TransformStmt(S->getCatchBody());
8066   if (Body.isInvalid())
8067     return StmtError();
8068 
8069   return getDerived().RebuildObjCAtCatchStmt(S->getAtCatchLoc(),
8070                                              S->getRParenLoc(),
8071                                              Var, Body.get());
8072 }
8073 
8074 template<typename Derived>
8075 StmtResult
8076 TreeTransform<Derived>::TransformObjCAtFinallyStmt(ObjCAtFinallyStmt *S) {
8077   // Transform the body.
8078   StmtResult Body = getDerived().TransformStmt(S->getFinallyBody());
8079   if (Body.isInvalid())
8080     return StmtError();
8081 
8082   // If nothing changed, just retain this statement.
8083   if (!getDerived().AlwaysRebuild() &&
8084       Body.get() == S->getFinallyBody())
8085     return S;
8086 
8087   // Build a new statement.
8088   return getDerived().RebuildObjCAtFinallyStmt(S->getAtFinallyLoc(),
8089                                                Body.get());
8090 }
8091 
8092 template<typename Derived>
8093 StmtResult
8094 TreeTransform<Derived>::TransformObjCAtThrowStmt(ObjCAtThrowStmt *S) {
8095   ExprResult Operand;
8096   if (S->getThrowExpr()) {
8097     Operand = getDerived().TransformExpr(S->getThrowExpr());
8098     if (Operand.isInvalid())
8099       return StmtError();
8100   }
8101 
8102   if (!getDerived().AlwaysRebuild() &&
8103       Operand.get() == S->getThrowExpr())
8104     return S;
8105 
8106   return getDerived().RebuildObjCAtThrowStmt(S->getThrowLoc(), Operand.get());
8107 }
8108 
8109 template<typename Derived>
8110 StmtResult
8111 TreeTransform<Derived>::TransformObjCAtSynchronizedStmt(
8112                                                   ObjCAtSynchronizedStmt *S) {
8113   // Transform the object we are locking.
8114   ExprResult Object = getDerived().TransformExpr(S->getSynchExpr());
8115   if (Object.isInvalid())
8116     return StmtError();
8117   Object =
8118     getDerived().RebuildObjCAtSynchronizedOperand(S->getAtSynchronizedLoc(),
8119                                                   Object.get());
8120   if (Object.isInvalid())
8121     return StmtError();
8122 
8123   // Transform the body.
8124   StmtResult Body = getDerived().TransformStmt(S->getSynchBody());
8125   if (Body.isInvalid())
8126     return StmtError();
8127 
8128   // If nothing change, just retain the current statement.
8129   if (!getDerived().AlwaysRebuild() &&
8130       Object.get() == S->getSynchExpr() &&
8131       Body.get() == S->getSynchBody())
8132     return S;
8133 
8134   // Build a new statement.
8135   return getDerived().RebuildObjCAtSynchronizedStmt(S->getAtSynchronizedLoc(),
8136                                                     Object.get(), Body.get());
8137 }
8138 
8139 template<typename Derived>
8140 StmtResult
8141 TreeTransform<Derived>::TransformObjCAutoreleasePoolStmt(
8142                                               ObjCAutoreleasePoolStmt *S) {
8143   // Transform the body.
8144   StmtResult Body = getDerived().TransformStmt(S->getSubStmt());
8145   if (Body.isInvalid())
8146     return StmtError();
8147 
8148   // If nothing changed, just retain this statement.
8149   if (!getDerived().AlwaysRebuild() &&
8150       Body.get() == S->getSubStmt())
8151     return S;
8152 
8153   // Build a new statement.
8154   return getDerived().RebuildObjCAutoreleasePoolStmt(
8155                         S->getAtLoc(), Body.get());
8156 }
8157 
8158 template<typename Derived>
8159 StmtResult
8160 TreeTransform<Derived>::TransformObjCForCollectionStmt(
8161                                                   ObjCForCollectionStmt *S) {
8162   // Transform the element statement.
8163   StmtResult Element =
8164       getDerived().TransformStmt(S->getElement(), SDK_NotDiscarded);
8165   if (Element.isInvalid())
8166     return StmtError();
8167 
8168   // Transform the collection expression.
8169   ExprResult Collection = getDerived().TransformExpr(S->getCollection());
8170   if (Collection.isInvalid())
8171     return StmtError();
8172 
8173   // Transform the body.
8174   StmtResult Body = getDerived().TransformStmt(S->getBody());
8175   if (Body.isInvalid())
8176     return StmtError();
8177 
8178   // If nothing changed, just retain this statement.
8179   if (!getDerived().AlwaysRebuild() &&
8180       Element.get() == S->getElement() &&
8181       Collection.get() == S->getCollection() &&
8182       Body.get() == S->getBody())
8183     return S;
8184 
8185   // Build a new statement.
8186   return getDerived().RebuildObjCForCollectionStmt(S->getForLoc(),
8187                                                    Element.get(),
8188                                                    Collection.get(),
8189                                                    S->getRParenLoc(),
8190                                                    Body.get());
8191 }
8192 
8193 template <typename Derived>
8194 StmtResult TreeTransform<Derived>::TransformCXXCatchStmt(CXXCatchStmt *S) {
8195   // Transform the exception declaration, if any.
8196   VarDecl *Var = nullptr;
8197   if (VarDecl *ExceptionDecl = S->getExceptionDecl()) {
8198     TypeSourceInfo *T =
8199         getDerived().TransformType(ExceptionDecl->getTypeSourceInfo());
8200     if (!T)
8201       return StmtError();
8202 
8203     Var = getDerived().RebuildExceptionDecl(
8204         ExceptionDecl, T, ExceptionDecl->getInnerLocStart(),
8205         ExceptionDecl->getLocation(), ExceptionDecl->getIdentifier());
8206     if (!Var || Var->isInvalidDecl())
8207       return StmtError();
8208   }
8209 
8210   // Transform the actual exception handler.
8211   StmtResult Handler = getDerived().TransformStmt(S->getHandlerBlock());
8212   if (Handler.isInvalid())
8213     return StmtError();
8214 
8215   if (!getDerived().AlwaysRebuild() && !Var &&
8216       Handler.get() == S->getHandlerBlock())
8217     return S;
8218 
8219   return getDerived().RebuildCXXCatchStmt(S->getCatchLoc(), Var, Handler.get());
8220 }
8221 
8222 template <typename Derived>
8223 StmtResult TreeTransform<Derived>::TransformCXXTryStmt(CXXTryStmt *S) {
8224   // Transform the try block itself.
8225   StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock());
8226   if (TryBlock.isInvalid())
8227     return StmtError();
8228 
8229   // Transform the handlers.
8230   bool HandlerChanged = false;
8231   SmallVector<Stmt *, 8> Handlers;
8232   for (unsigned I = 0, N = S->getNumHandlers(); I != N; ++I) {
8233     StmtResult Handler = getDerived().TransformCXXCatchStmt(S->getHandler(I));
8234     if (Handler.isInvalid())
8235       return StmtError();
8236 
8237     HandlerChanged = HandlerChanged || Handler.get() != S->getHandler(I);
8238     Handlers.push_back(Handler.getAs<Stmt>());
8239   }
8240 
8241   if (!getDerived().AlwaysRebuild() && TryBlock.get() == S->getTryBlock() &&
8242       !HandlerChanged)
8243     return S;
8244 
8245   return getDerived().RebuildCXXTryStmt(S->getTryLoc(), TryBlock.get(),
8246                                         Handlers);
8247 }
8248 
8249 template<typename Derived>
8250 StmtResult
8251 TreeTransform<Derived>::TransformCXXForRangeStmt(CXXForRangeStmt *S) {
8252   StmtResult Init =
8253       S->getInit() ? getDerived().TransformStmt(S->getInit()) : StmtResult();
8254   if (Init.isInvalid())
8255     return StmtError();
8256 
8257   StmtResult Range = getDerived().TransformStmt(S->getRangeStmt());
8258   if (Range.isInvalid())
8259     return StmtError();
8260 
8261   StmtResult Begin = getDerived().TransformStmt(S->getBeginStmt());
8262   if (Begin.isInvalid())
8263     return StmtError();
8264   StmtResult End = getDerived().TransformStmt(S->getEndStmt());
8265   if (End.isInvalid())
8266     return StmtError();
8267 
8268   ExprResult Cond = getDerived().TransformExpr(S->getCond());
8269   if (Cond.isInvalid())
8270     return StmtError();
8271   if (Cond.get())
8272     Cond = SemaRef.CheckBooleanCondition(S->getColonLoc(), Cond.get());
8273   if (Cond.isInvalid())
8274     return StmtError();
8275   if (Cond.get())
8276     Cond = SemaRef.MaybeCreateExprWithCleanups(Cond.get());
8277 
8278   ExprResult Inc = getDerived().TransformExpr(S->getInc());
8279   if (Inc.isInvalid())
8280     return StmtError();
8281   if (Inc.get())
8282     Inc = SemaRef.MaybeCreateExprWithCleanups(Inc.get());
8283 
8284   StmtResult LoopVar = getDerived().TransformStmt(S->getLoopVarStmt());
8285   if (LoopVar.isInvalid())
8286     return StmtError();
8287 
8288   StmtResult NewStmt = S;
8289   if (getDerived().AlwaysRebuild() ||
8290       Init.get() != S->getInit() ||
8291       Range.get() != S->getRangeStmt() ||
8292       Begin.get() != S->getBeginStmt() ||
8293       End.get() != S->getEndStmt() ||
8294       Cond.get() != S->getCond() ||
8295       Inc.get() != S->getInc() ||
8296       LoopVar.get() != S->getLoopVarStmt()) {
8297     NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(),
8298                                                   S->getCoawaitLoc(), Init.get(),
8299                                                   S->getColonLoc(), Range.get(),
8300                                                   Begin.get(), End.get(),
8301                                                   Cond.get(),
8302                                                   Inc.get(), LoopVar.get(),
8303                                                   S->getRParenLoc());
8304     if (NewStmt.isInvalid() && LoopVar.get() != S->getLoopVarStmt()) {
8305       // Might not have attached any initializer to the loop variable.
8306       getSema().ActOnInitializerError(
8307           cast<DeclStmt>(LoopVar.get())->getSingleDecl());
8308       return StmtError();
8309     }
8310   }
8311 
8312   StmtResult Body = getDerived().TransformStmt(S->getBody());
8313   if (Body.isInvalid())
8314     return StmtError();
8315 
8316   // Body has changed but we didn't rebuild the for-range statement. Rebuild
8317   // it now so we have a new statement to attach the body to.
8318   if (Body.get() != S->getBody() && NewStmt.get() == S) {
8319     NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(),
8320                                                   S->getCoawaitLoc(), Init.get(),
8321                                                   S->getColonLoc(), Range.get(),
8322                                                   Begin.get(), End.get(),
8323                                                   Cond.get(),
8324                                                   Inc.get(), LoopVar.get(),
8325                                                   S->getRParenLoc());
8326     if (NewStmt.isInvalid())
8327       return StmtError();
8328   }
8329 
8330   if (NewStmt.get() == S)
8331     return S;
8332 
8333   return FinishCXXForRangeStmt(NewStmt.get(), Body.get());
8334 }
8335 
8336 template<typename Derived>
8337 StmtResult
8338 TreeTransform<Derived>::TransformMSDependentExistsStmt(
8339                                                     MSDependentExistsStmt *S) {
8340   // Transform the nested-name-specifier, if any.
8341   NestedNameSpecifierLoc QualifierLoc;
8342   if (S->getQualifierLoc()) {
8343     QualifierLoc
8344       = getDerived().TransformNestedNameSpecifierLoc(S->getQualifierLoc());
8345     if (!QualifierLoc)
8346       return StmtError();
8347   }
8348 
8349   // Transform the declaration name.
8350   DeclarationNameInfo NameInfo = S->getNameInfo();
8351   if (NameInfo.getName()) {
8352     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
8353     if (!NameInfo.getName())
8354       return StmtError();
8355   }
8356 
8357   // Check whether anything changed.
8358   if (!getDerived().AlwaysRebuild() &&
8359       QualifierLoc == S->getQualifierLoc() &&
8360       NameInfo.getName() == S->getNameInfo().getName())
8361     return S;
8362 
8363   // Determine whether this name exists, if we can.
8364   CXXScopeSpec SS;
8365   SS.Adopt(QualifierLoc);
8366   bool Dependent = false;
8367   switch (getSema().CheckMicrosoftIfExistsSymbol(/*S=*/nullptr, SS, NameInfo)) {
8368   case Sema::IER_Exists:
8369     if (S->isIfExists())
8370       break;
8371 
8372     return new (getSema().Context) NullStmt(S->getKeywordLoc());
8373 
8374   case Sema::IER_DoesNotExist:
8375     if (S->isIfNotExists())
8376       break;
8377 
8378     return new (getSema().Context) NullStmt(S->getKeywordLoc());
8379 
8380   case Sema::IER_Dependent:
8381     Dependent = true;
8382     break;
8383 
8384   case Sema::IER_Error:
8385     return StmtError();
8386   }
8387 
8388   // We need to continue with the instantiation, so do so now.
8389   StmtResult SubStmt = getDerived().TransformCompoundStmt(S->getSubStmt());
8390   if (SubStmt.isInvalid())
8391     return StmtError();
8392 
8393   // If we have resolved the name, just transform to the substatement.
8394   if (!Dependent)
8395     return SubStmt;
8396 
8397   // The name is still dependent, so build a dependent expression again.
8398   return getDerived().RebuildMSDependentExistsStmt(S->getKeywordLoc(),
8399                                                    S->isIfExists(),
8400                                                    QualifierLoc,
8401                                                    NameInfo,
8402                                                    SubStmt.get());
8403 }
8404 
8405 template<typename Derived>
8406 ExprResult
8407 TreeTransform<Derived>::TransformMSPropertyRefExpr(MSPropertyRefExpr *E) {
8408   NestedNameSpecifierLoc QualifierLoc;
8409   if (E->getQualifierLoc()) {
8410     QualifierLoc
8411     = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
8412     if (!QualifierLoc)
8413       return ExprError();
8414   }
8415 
8416   MSPropertyDecl *PD = cast_or_null<MSPropertyDecl>(
8417     getDerived().TransformDecl(E->getMemberLoc(), E->getPropertyDecl()));
8418   if (!PD)
8419     return ExprError();
8420 
8421   ExprResult Base = getDerived().TransformExpr(E->getBaseExpr());
8422   if (Base.isInvalid())
8423     return ExprError();
8424 
8425   return new (SemaRef.getASTContext())
8426       MSPropertyRefExpr(Base.get(), PD, E->isArrow(),
8427                         SemaRef.getASTContext().PseudoObjectTy, VK_LValue,
8428                         QualifierLoc, E->getMemberLoc());
8429 }
8430 
8431 template <typename Derived>
8432 ExprResult TreeTransform<Derived>::TransformMSPropertySubscriptExpr(
8433     MSPropertySubscriptExpr *E) {
8434   auto BaseRes = getDerived().TransformExpr(E->getBase());
8435   if (BaseRes.isInvalid())
8436     return ExprError();
8437   auto IdxRes = getDerived().TransformExpr(E->getIdx());
8438   if (IdxRes.isInvalid())
8439     return ExprError();
8440 
8441   if (!getDerived().AlwaysRebuild() &&
8442       BaseRes.get() == E->getBase() &&
8443       IdxRes.get() == E->getIdx())
8444     return E;
8445 
8446   return getDerived().RebuildArraySubscriptExpr(
8447       BaseRes.get(), SourceLocation(), IdxRes.get(), E->getRBracketLoc());
8448 }
8449 
8450 template <typename Derived>
8451 StmtResult TreeTransform<Derived>::TransformSEHTryStmt(SEHTryStmt *S) {
8452   StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock());
8453   if (TryBlock.isInvalid())
8454     return StmtError();
8455 
8456   StmtResult Handler = getDerived().TransformSEHHandler(S->getHandler());
8457   if (Handler.isInvalid())
8458     return StmtError();
8459 
8460   if (!getDerived().AlwaysRebuild() && TryBlock.get() == S->getTryBlock() &&
8461       Handler.get() == S->getHandler())
8462     return S;
8463 
8464   return getDerived().RebuildSEHTryStmt(S->getIsCXXTry(), S->getTryLoc(),
8465                                         TryBlock.get(), Handler.get());
8466 }
8467 
8468 template <typename Derived>
8469 StmtResult TreeTransform<Derived>::TransformSEHFinallyStmt(SEHFinallyStmt *S) {
8470   StmtResult Block = getDerived().TransformCompoundStmt(S->getBlock());
8471   if (Block.isInvalid())
8472     return StmtError();
8473 
8474   return getDerived().RebuildSEHFinallyStmt(S->getFinallyLoc(), Block.get());
8475 }
8476 
8477 template <typename Derived>
8478 StmtResult TreeTransform<Derived>::TransformSEHExceptStmt(SEHExceptStmt *S) {
8479   ExprResult FilterExpr = getDerived().TransformExpr(S->getFilterExpr());
8480   if (FilterExpr.isInvalid())
8481     return StmtError();
8482 
8483   StmtResult Block = getDerived().TransformCompoundStmt(S->getBlock());
8484   if (Block.isInvalid())
8485     return StmtError();
8486 
8487   return getDerived().RebuildSEHExceptStmt(S->getExceptLoc(), FilterExpr.get(),
8488                                            Block.get());
8489 }
8490 
8491 template <typename Derived>
8492 StmtResult TreeTransform<Derived>::TransformSEHHandler(Stmt *Handler) {
8493   if (isa<SEHFinallyStmt>(Handler))
8494     return getDerived().TransformSEHFinallyStmt(cast<SEHFinallyStmt>(Handler));
8495   else
8496     return getDerived().TransformSEHExceptStmt(cast<SEHExceptStmt>(Handler));
8497 }
8498 
8499 template<typename Derived>
8500 StmtResult
8501 TreeTransform<Derived>::TransformSEHLeaveStmt(SEHLeaveStmt *S) {
8502   return S;
8503 }
8504 
8505 //===----------------------------------------------------------------------===//
8506 // OpenMP directive transformation
8507 //===----------------------------------------------------------------------===//
8508 
8509 template <typename Derived>
8510 StmtResult
8511 TreeTransform<Derived>::TransformOMPCanonicalLoop(OMPCanonicalLoop *L) {
8512   // OMPCanonicalLoops are eliminated during transformation, since they will be
8513   // recomputed by semantic analysis of the associated OMPLoopBasedDirective
8514   // after transformation.
8515   return getDerived().TransformStmt(L->getLoopStmt());
8516 }
8517 
8518 template <typename Derived>
8519 StmtResult TreeTransform<Derived>::TransformOMPExecutableDirective(
8520     OMPExecutableDirective *D) {
8521 
8522   // Transform the clauses
8523   llvm::SmallVector<OMPClause *, 16> TClauses;
8524   ArrayRef<OMPClause *> Clauses = D->clauses();
8525   TClauses.reserve(Clauses.size());
8526   for (ArrayRef<OMPClause *>::iterator I = Clauses.begin(), E = Clauses.end();
8527        I != E; ++I) {
8528     if (*I) {
8529       getDerived().getSema().StartOpenMPClause((*I)->getClauseKind());
8530       OMPClause *Clause = getDerived().TransformOMPClause(*I);
8531       getDerived().getSema().EndOpenMPClause();
8532       if (Clause)
8533         TClauses.push_back(Clause);
8534     } else {
8535       TClauses.push_back(nullptr);
8536     }
8537   }
8538   StmtResult AssociatedStmt;
8539   if (D->hasAssociatedStmt() && D->getAssociatedStmt()) {
8540     getDerived().getSema().ActOnOpenMPRegionStart(D->getDirectiveKind(),
8541                                                   /*CurScope=*/nullptr);
8542     StmtResult Body;
8543     {
8544       Sema::CompoundScopeRAII CompoundScope(getSema());
8545       Stmt *CS;
8546       if (D->getDirectiveKind() == OMPD_atomic ||
8547           D->getDirectiveKind() == OMPD_critical ||
8548           D->getDirectiveKind() == OMPD_section ||
8549           D->getDirectiveKind() == OMPD_master)
8550         CS = D->getAssociatedStmt();
8551       else
8552         CS = D->getRawStmt();
8553       Body = getDerived().TransformStmt(CS);
8554       if (Body.isUsable() && isOpenMPLoopDirective(D->getDirectiveKind()) &&
8555           getSema().getLangOpts().OpenMPIRBuilder)
8556         Body = getDerived().RebuildOMPCanonicalLoop(Body.get());
8557     }
8558     AssociatedStmt =
8559         getDerived().getSema().ActOnOpenMPRegionEnd(Body, TClauses);
8560     if (AssociatedStmt.isInvalid()) {
8561       return StmtError();
8562     }
8563   }
8564   if (TClauses.size() != Clauses.size()) {
8565     return StmtError();
8566   }
8567 
8568   // Transform directive name for 'omp critical' directive.
8569   DeclarationNameInfo DirName;
8570   if (D->getDirectiveKind() == OMPD_critical) {
8571     DirName = cast<OMPCriticalDirective>(D)->getDirectiveName();
8572     DirName = getDerived().TransformDeclarationNameInfo(DirName);
8573   }
8574   OpenMPDirectiveKind CancelRegion = OMPD_unknown;
8575   if (D->getDirectiveKind() == OMPD_cancellation_point) {
8576     CancelRegion = cast<OMPCancellationPointDirective>(D)->getCancelRegion();
8577   } else if (D->getDirectiveKind() == OMPD_cancel) {
8578     CancelRegion = cast<OMPCancelDirective>(D)->getCancelRegion();
8579   }
8580 
8581   return getDerived().RebuildOMPExecutableDirective(
8582       D->getDirectiveKind(), DirName, CancelRegion, TClauses,
8583       AssociatedStmt.get(), D->getBeginLoc(), D->getEndLoc());
8584 }
8585 
8586 template <typename Derived>
8587 StmtResult
8588 TreeTransform<Derived>::TransformOMPMetaDirective(OMPMetaDirective *D) {
8589   // TODO: Fix This
8590   SemaRef.Diag(D->getBeginLoc(), diag::err_omp_instantiation_not_supported)
8591       << getOpenMPDirectiveName(D->getDirectiveKind());
8592   return StmtError();
8593 }
8594 
8595 template <typename Derived>
8596 StmtResult
8597 TreeTransform<Derived>::TransformOMPParallelDirective(OMPParallelDirective *D) {
8598   DeclarationNameInfo DirName;
8599   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel, DirName, nullptr,
8600                                              D->getBeginLoc());
8601   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8602   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8603   return Res;
8604 }
8605 
8606 template <typename Derived>
8607 StmtResult
8608 TreeTransform<Derived>::TransformOMPSimdDirective(OMPSimdDirective *D) {
8609   DeclarationNameInfo DirName;
8610   getDerived().getSema().StartOpenMPDSABlock(OMPD_simd, DirName, nullptr,
8611                                              D->getBeginLoc());
8612   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8613   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8614   return Res;
8615 }
8616 
8617 template <typename Derived>
8618 StmtResult
8619 TreeTransform<Derived>::TransformOMPTileDirective(OMPTileDirective *D) {
8620   DeclarationNameInfo DirName;
8621   getDerived().getSema().StartOpenMPDSABlock(D->getDirectiveKind(), DirName,
8622                                              nullptr, D->getBeginLoc());
8623   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8624   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8625   return Res;
8626 }
8627 
8628 template <typename Derived>
8629 StmtResult
8630 TreeTransform<Derived>::TransformOMPUnrollDirective(OMPUnrollDirective *D) {
8631   DeclarationNameInfo DirName;
8632   getDerived().getSema().StartOpenMPDSABlock(D->getDirectiveKind(), DirName,
8633                                              nullptr, D->getBeginLoc());
8634   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8635   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8636   return Res;
8637 }
8638 
8639 template <typename Derived>
8640 StmtResult
8641 TreeTransform<Derived>::TransformOMPForDirective(OMPForDirective *D) {
8642   DeclarationNameInfo DirName;
8643   getDerived().getSema().StartOpenMPDSABlock(OMPD_for, DirName, nullptr,
8644                                              D->getBeginLoc());
8645   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8646   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8647   return Res;
8648 }
8649 
8650 template <typename Derived>
8651 StmtResult
8652 TreeTransform<Derived>::TransformOMPForSimdDirective(OMPForSimdDirective *D) {
8653   DeclarationNameInfo DirName;
8654   getDerived().getSema().StartOpenMPDSABlock(OMPD_for_simd, DirName, nullptr,
8655                                              D->getBeginLoc());
8656   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8657   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8658   return Res;
8659 }
8660 
8661 template <typename Derived>
8662 StmtResult
8663 TreeTransform<Derived>::TransformOMPSectionsDirective(OMPSectionsDirective *D) {
8664   DeclarationNameInfo DirName;
8665   getDerived().getSema().StartOpenMPDSABlock(OMPD_sections, DirName, nullptr,
8666                                              D->getBeginLoc());
8667   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8668   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8669   return Res;
8670 }
8671 
8672 template <typename Derived>
8673 StmtResult
8674 TreeTransform<Derived>::TransformOMPSectionDirective(OMPSectionDirective *D) {
8675   DeclarationNameInfo DirName;
8676   getDerived().getSema().StartOpenMPDSABlock(OMPD_section, DirName, nullptr,
8677                                              D->getBeginLoc());
8678   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8679   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8680   return Res;
8681 }
8682 
8683 template <typename Derived>
8684 StmtResult
8685 TreeTransform<Derived>::TransformOMPSingleDirective(OMPSingleDirective *D) {
8686   DeclarationNameInfo DirName;
8687   getDerived().getSema().StartOpenMPDSABlock(OMPD_single, DirName, nullptr,
8688                                              D->getBeginLoc());
8689   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8690   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8691   return Res;
8692 }
8693 
8694 template <typename Derived>
8695 StmtResult
8696 TreeTransform<Derived>::TransformOMPMasterDirective(OMPMasterDirective *D) {
8697   DeclarationNameInfo DirName;
8698   getDerived().getSema().StartOpenMPDSABlock(OMPD_master, DirName, nullptr,
8699                                              D->getBeginLoc());
8700   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8701   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8702   return Res;
8703 }
8704 
8705 template <typename Derived>
8706 StmtResult
8707 TreeTransform<Derived>::TransformOMPCriticalDirective(OMPCriticalDirective *D) {
8708   getDerived().getSema().StartOpenMPDSABlock(
8709       OMPD_critical, D->getDirectiveName(), nullptr, D->getBeginLoc());
8710   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8711   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8712   return Res;
8713 }
8714 
8715 template <typename Derived>
8716 StmtResult TreeTransform<Derived>::TransformOMPParallelForDirective(
8717     OMPParallelForDirective *D) {
8718   DeclarationNameInfo DirName;
8719   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_for, DirName,
8720                                              nullptr, D->getBeginLoc());
8721   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8722   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8723   return Res;
8724 }
8725 
8726 template <typename Derived>
8727 StmtResult TreeTransform<Derived>::TransformOMPParallelForSimdDirective(
8728     OMPParallelForSimdDirective *D) {
8729   DeclarationNameInfo DirName;
8730   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_for_simd, DirName,
8731                                              nullptr, D->getBeginLoc());
8732   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8733   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8734   return Res;
8735 }
8736 
8737 template <typename Derived>
8738 StmtResult TreeTransform<Derived>::TransformOMPParallelMasterDirective(
8739     OMPParallelMasterDirective *D) {
8740   DeclarationNameInfo DirName;
8741   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_master, DirName,
8742                                              nullptr, D->getBeginLoc());
8743   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8744   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8745   return Res;
8746 }
8747 
8748 template <typename Derived>
8749 StmtResult TreeTransform<Derived>::TransformOMPParallelSectionsDirective(
8750     OMPParallelSectionsDirective *D) {
8751   DeclarationNameInfo DirName;
8752   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_sections, DirName,
8753                                              nullptr, D->getBeginLoc());
8754   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8755   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8756   return Res;
8757 }
8758 
8759 template <typename Derived>
8760 StmtResult
8761 TreeTransform<Derived>::TransformOMPTaskDirective(OMPTaskDirective *D) {
8762   DeclarationNameInfo DirName;
8763   getDerived().getSema().StartOpenMPDSABlock(OMPD_task, DirName, nullptr,
8764                                              D->getBeginLoc());
8765   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8766   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8767   return Res;
8768 }
8769 
8770 template <typename Derived>
8771 StmtResult TreeTransform<Derived>::TransformOMPTaskyieldDirective(
8772     OMPTaskyieldDirective *D) {
8773   DeclarationNameInfo DirName;
8774   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskyield, DirName, nullptr,
8775                                              D->getBeginLoc());
8776   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8777   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8778   return Res;
8779 }
8780 
8781 template <typename Derived>
8782 StmtResult
8783 TreeTransform<Derived>::TransformOMPBarrierDirective(OMPBarrierDirective *D) {
8784   DeclarationNameInfo DirName;
8785   getDerived().getSema().StartOpenMPDSABlock(OMPD_barrier, DirName, nullptr,
8786                                              D->getBeginLoc());
8787   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8788   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8789   return Res;
8790 }
8791 
8792 template <typename Derived>
8793 StmtResult
8794 TreeTransform<Derived>::TransformOMPTaskwaitDirective(OMPTaskwaitDirective *D) {
8795   DeclarationNameInfo DirName;
8796   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskwait, DirName, nullptr,
8797                                              D->getBeginLoc());
8798   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8799   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8800   return Res;
8801 }
8802 
8803 template <typename Derived>
8804 StmtResult TreeTransform<Derived>::TransformOMPTaskgroupDirective(
8805     OMPTaskgroupDirective *D) {
8806   DeclarationNameInfo DirName;
8807   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskgroup, DirName, nullptr,
8808                                              D->getBeginLoc());
8809   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8810   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8811   return Res;
8812 }
8813 
8814 template <typename Derived>
8815 StmtResult
8816 TreeTransform<Derived>::TransformOMPFlushDirective(OMPFlushDirective *D) {
8817   DeclarationNameInfo DirName;
8818   getDerived().getSema().StartOpenMPDSABlock(OMPD_flush, DirName, nullptr,
8819                                              D->getBeginLoc());
8820   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8821   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8822   return Res;
8823 }
8824 
8825 template <typename Derived>
8826 StmtResult
8827 TreeTransform<Derived>::TransformOMPDepobjDirective(OMPDepobjDirective *D) {
8828   DeclarationNameInfo DirName;
8829   getDerived().getSema().StartOpenMPDSABlock(OMPD_depobj, DirName, nullptr,
8830                                              D->getBeginLoc());
8831   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8832   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8833   return Res;
8834 }
8835 
8836 template <typename Derived>
8837 StmtResult
8838 TreeTransform<Derived>::TransformOMPScanDirective(OMPScanDirective *D) {
8839   DeclarationNameInfo DirName;
8840   getDerived().getSema().StartOpenMPDSABlock(OMPD_scan, DirName, nullptr,
8841                                              D->getBeginLoc());
8842   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8843   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8844   return Res;
8845 }
8846 
8847 template <typename Derived>
8848 StmtResult
8849 TreeTransform<Derived>::TransformOMPOrderedDirective(OMPOrderedDirective *D) {
8850   DeclarationNameInfo DirName;
8851   getDerived().getSema().StartOpenMPDSABlock(OMPD_ordered, DirName, nullptr,
8852                                              D->getBeginLoc());
8853   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8854   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8855   return Res;
8856 }
8857 
8858 template <typename Derived>
8859 StmtResult
8860 TreeTransform<Derived>::TransformOMPAtomicDirective(OMPAtomicDirective *D) {
8861   DeclarationNameInfo DirName;
8862   getDerived().getSema().StartOpenMPDSABlock(OMPD_atomic, DirName, nullptr,
8863                                              D->getBeginLoc());
8864   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8865   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8866   return Res;
8867 }
8868 
8869 template <typename Derived>
8870 StmtResult
8871 TreeTransform<Derived>::TransformOMPTargetDirective(OMPTargetDirective *D) {
8872   DeclarationNameInfo DirName;
8873   getDerived().getSema().StartOpenMPDSABlock(OMPD_target, DirName, nullptr,
8874                                              D->getBeginLoc());
8875   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8876   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8877   return Res;
8878 }
8879 
8880 template <typename Derived>
8881 StmtResult TreeTransform<Derived>::TransformOMPTargetDataDirective(
8882     OMPTargetDataDirective *D) {
8883   DeclarationNameInfo DirName;
8884   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_data, DirName, nullptr,
8885                                              D->getBeginLoc());
8886   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8887   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8888   return Res;
8889 }
8890 
8891 template <typename Derived>
8892 StmtResult TreeTransform<Derived>::TransformOMPTargetEnterDataDirective(
8893     OMPTargetEnterDataDirective *D) {
8894   DeclarationNameInfo DirName;
8895   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_enter_data, DirName,
8896                                              nullptr, D->getBeginLoc());
8897   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8898   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8899   return Res;
8900 }
8901 
8902 template <typename Derived>
8903 StmtResult TreeTransform<Derived>::TransformOMPTargetExitDataDirective(
8904     OMPTargetExitDataDirective *D) {
8905   DeclarationNameInfo DirName;
8906   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_exit_data, DirName,
8907                                              nullptr, D->getBeginLoc());
8908   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8909   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8910   return Res;
8911 }
8912 
8913 template <typename Derived>
8914 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelDirective(
8915     OMPTargetParallelDirective *D) {
8916   DeclarationNameInfo DirName;
8917   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel, DirName,
8918                                              nullptr, D->getBeginLoc());
8919   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8920   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8921   return Res;
8922 }
8923 
8924 template <typename Derived>
8925 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelForDirective(
8926     OMPTargetParallelForDirective *D) {
8927   DeclarationNameInfo DirName;
8928   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel_for, DirName,
8929                                              nullptr, D->getBeginLoc());
8930   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8931   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8932   return Res;
8933 }
8934 
8935 template <typename Derived>
8936 StmtResult TreeTransform<Derived>::TransformOMPTargetUpdateDirective(
8937     OMPTargetUpdateDirective *D) {
8938   DeclarationNameInfo DirName;
8939   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_update, DirName,
8940                                              nullptr, D->getBeginLoc());
8941   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8942   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8943   return Res;
8944 }
8945 
8946 template <typename Derived>
8947 StmtResult
8948 TreeTransform<Derived>::TransformOMPTeamsDirective(OMPTeamsDirective *D) {
8949   DeclarationNameInfo DirName;
8950   getDerived().getSema().StartOpenMPDSABlock(OMPD_teams, DirName, nullptr,
8951                                              D->getBeginLoc());
8952   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8953   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8954   return Res;
8955 }
8956 
8957 template <typename Derived>
8958 StmtResult TreeTransform<Derived>::TransformOMPCancellationPointDirective(
8959     OMPCancellationPointDirective *D) {
8960   DeclarationNameInfo DirName;
8961   getDerived().getSema().StartOpenMPDSABlock(OMPD_cancellation_point, DirName,
8962                                              nullptr, D->getBeginLoc());
8963   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8964   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8965   return Res;
8966 }
8967 
8968 template <typename Derived>
8969 StmtResult
8970 TreeTransform<Derived>::TransformOMPCancelDirective(OMPCancelDirective *D) {
8971   DeclarationNameInfo DirName;
8972   getDerived().getSema().StartOpenMPDSABlock(OMPD_cancel, DirName, nullptr,
8973                                              D->getBeginLoc());
8974   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8975   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8976   return Res;
8977 }
8978 
8979 template <typename Derived>
8980 StmtResult
8981 TreeTransform<Derived>::TransformOMPTaskLoopDirective(OMPTaskLoopDirective *D) {
8982   DeclarationNameInfo DirName;
8983   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskloop, DirName, nullptr,
8984                                              D->getBeginLoc());
8985   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8986   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8987   return Res;
8988 }
8989 
8990 template <typename Derived>
8991 StmtResult TreeTransform<Derived>::TransformOMPTaskLoopSimdDirective(
8992     OMPTaskLoopSimdDirective *D) {
8993   DeclarationNameInfo DirName;
8994   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskloop_simd, DirName,
8995                                              nullptr, D->getBeginLoc());
8996   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8997   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8998   return Res;
8999 }
9000 
9001 template <typename Derived>
9002 StmtResult TreeTransform<Derived>::TransformOMPMasterTaskLoopDirective(
9003     OMPMasterTaskLoopDirective *D) {
9004   DeclarationNameInfo DirName;
9005   getDerived().getSema().StartOpenMPDSABlock(OMPD_master_taskloop, DirName,
9006                                              nullptr, D->getBeginLoc());
9007   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9008   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9009   return Res;
9010 }
9011 
9012 template <typename Derived>
9013 StmtResult TreeTransform<Derived>::TransformOMPMasterTaskLoopSimdDirective(
9014     OMPMasterTaskLoopSimdDirective *D) {
9015   DeclarationNameInfo DirName;
9016   getDerived().getSema().StartOpenMPDSABlock(OMPD_master_taskloop_simd, DirName,
9017                                              nullptr, D->getBeginLoc());
9018   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9019   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9020   return Res;
9021 }
9022 
9023 template <typename Derived>
9024 StmtResult TreeTransform<Derived>::TransformOMPParallelMasterTaskLoopDirective(
9025     OMPParallelMasterTaskLoopDirective *D) {
9026   DeclarationNameInfo DirName;
9027   getDerived().getSema().StartOpenMPDSABlock(
9028       OMPD_parallel_master_taskloop, DirName, nullptr, D->getBeginLoc());
9029   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9030   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9031   return Res;
9032 }
9033 
9034 template <typename Derived>
9035 StmtResult
9036 TreeTransform<Derived>::TransformOMPParallelMasterTaskLoopSimdDirective(
9037     OMPParallelMasterTaskLoopSimdDirective *D) {
9038   DeclarationNameInfo DirName;
9039   getDerived().getSema().StartOpenMPDSABlock(
9040       OMPD_parallel_master_taskloop_simd, DirName, nullptr, D->getBeginLoc());
9041   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9042   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9043   return Res;
9044 }
9045 
9046 template <typename Derived>
9047 StmtResult TreeTransform<Derived>::TransformOMPDistributeDirective(
9048     OMPDistributeDirective *D) {
9049   DeclarationNameInfo DirName;
9050   getDerived().getSema().StartOpenMPDSABlock(OMPD_distribute, DirName, nullptr,
9051                                              D->getBeginLoc());
9052   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9053   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9054   return Res;
9055 }
9056 
9057 template <typename Derived>
9058 StmtResult TreeTransform<Derived>::TransformOMPDistributeParallelForDirective(
9059     OMPDistributeParallelForDirective *D) {
9060   DeclarationNameInfo DirName;
9061   getDerived().getSema().StartOpenMPDSABlock(
9062       OMPD_distribute_parallel_for, DirName, nullptr, D->getBeginLoc());
9063   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9064   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9065   return Res;
9066 }
9067 
9068 template <typename Derived>
9069 StmtResult
9070 TreeTransform<Derived>::TransformOMPDistributeParallelForSimdDirective(
9071     OMPDistributeParallelForSimdDirective *D) {
9072   DeclarationNameInfo DirName;
9073   getDerived().getSema().StartOpenMPDSABlock(
9074       OMPD_distribute_parallel_for_simd, DirName, nullptr, D->getBeginLoc());
9075   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9076   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9077   return Res;
9078 }
9079 
9080 template <typename Derived>
9081 StmtResult TreeTransform<Derived>::TransformOMPDistributeSimdDirective(
9082     OMPDistributeSimdDirective *D) {
9083   DeclarationNameInfo DirName;
9084   getDerived().getSema().StartOpenMPDSABlock(OMPD_distribute_simd, DirName,
9085                                              nullptr, D->getBeginLoc());
9086   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9087   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9088   return Res;
9089 }
9090 
9091 template <typename Derived>
9092 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelForSimdDirective(
9093     OMPTargetParallelForSimdDirective *D) {
9094   DeclarationNameInfo DirName;
9095   getDerived().getSema().StartOpenMPDSABlock(
9096       OMPD_target_parallel_for_simd, DirName, nullptr, D->getBeginLoc());
9097   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9098   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9099   return Res;
9100 }
9101 
9102 template <typename Derived>
9103 StmtResult TreeTransform<Derived>::TransformOMPTargetSimdDirective(
9104     OMPTargetSimdDirective *D) {
9105   DeclarationNameInfo DirName;
9106   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_simd, DirName, nullptr,
9107                                              D->getBeginLoc());
9108   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9109   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9110   return Res;
9111 }
9112 
9113 template <typename Derived>
9114 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeDirective(
9115     OMPTeamsDistributeDirective *D) {
9116   DeclarationNameInfo DirName;
9117   getDerived().getSema().StartOpenMPDSABlock(OMPD_teams_distribute, DirName,
9118                                              nullptr, D->getBeginLoc());
9119   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9120   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9121   return Res;
9122 }
9123 
9124 template <typename Derived>
9125 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeSimdDirective(
9126     OMPTeamsDistributeSimdDirective *D) {
9127   DeclarationNameInfo DirName;
9128   getDerived().getSema().StartOpenMPDSABlock(
9129       OMPD_teams_distribute_simd, DirName, nullptr, D->getBeginLoc());
9130   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9131   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9132   return Res;
9133 }
9134 
9135 template <typename Derived>
9136 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeParallelForSimdDirective(
9137     OMPTeamsDistributeParallelForSimdDirective *D) {
9138   DeclarationNameInfo DirName;
9139   getDerived().getSema().StartOpenMPDSABlock(
9140       OMPD_teams_distribute_parallel_for_simd, DirName, nullptr,
9141       D->getBeginLoc());
9142   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9143   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9144   return Res;
9145 }
9146 
9147 template <typename Derived>
9148 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeParallelForDirective(
9149     OMPTeamsDistributeParallelForDirective *D) {
9150   DeclarationNameInfo DirName;
9151   getDerived().getSema().StartOpenMPDSABlock(
9152       OMPD_teams_distribute_parallel_for, DirName, nullptr, D->getBeginLoc());
9153   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9154   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9155   return Res;
9156 }
9157 
9158 template <typename Derived>
9159 StmtResult TreeTransform<Derived>::TransformOMPTargetTeamsDirective(
9160     OMPTargetTeamsDirective *D) {
9161   DeclarationNameInfo DirName;
9162   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_teams, DirName,
9163                                              nullptr, D->getBeginLoc());
9164   auto Res = getDerived().TransformOMPExecutableDirective(D);
9165   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9166   return Res;
9167 }
9168 
9169 template <typename Derived>
9170 StmtResult TreeTransform<Derived>::TransformOMPTargetTeamsDistributeDirective(
9171     OMPTargetTeamsDistributeDirective *D) {
9172   DeclarationNameInfo DirName;
9173   getDerived().getSema().StartOpenMPDSABlock(
9174       OMPD_target_teams_distribute, DirName, nullptr, D->getBeginLoc());
9175   auto Res = getDerived().TransformOMPExecutableDirective(D);
9176   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9177   return Res;
9178 }
9179 
9180 template <typename Derived>
9181 StmtResult
9182 TreeTransform<Derived>::TransformOMPTargetTeamsDistributeParallelForDirective(
9183     OMPTargetTeamsDistributeParallelForDirective *D) {
9184   DeclarationNameInfo DirName;
9185   getDerived().getSema().StartOpenMPDSABlock(
9186       OMPD_target_teams_distribute_parallel_for, DirName, nullptr,
9187       D->getBeginLoc());
9188   auto Res = getDerived().TransformOMPExecutableDirective(D);
9189   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9190   return Res;
9191 }
9192 
9193 template <typename Derived>
9194 StmtResult TreeTransform<Derived>::
9195     TransformOMPTargetTeamsDistributeParallelForSimdDirective(
9196         OMPTargetTeamsDistributeParallelForSimdDirective *D) {
9197   DeclarationNameInfo DirName;
9198   getDerived().getSema().StartOpenMPDSABlock(
9199       OMPD_target_teams_distribute_parallel_for_simd, DirName, nullptr,
9200       D->getBeginLoc());
9201   auto Res = getDerived().TransformOMPExecutableDirective(D);
9202   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9203   return Res;
9204 }
9205 
9206 template <typename Derived>
9207 StmtResult
9208 TreeTransform<Derived>::TransformOMPTargetTeamsDistributeSimdDirective(
9209     OMPTargetTeamsDistributeSimdDirective *D) {
9210   DeclarationNameInfo DirName;
9211   getDerived().getSema().StartOpenMPDSABlock(
9212       OMPD_target_teams_distribute_simd, DirName, nullptr, D->getBeginLoc());
9213   auto Res = getDerived().TransformOMPExecutableDirective(D);
9214   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9215   return Res;
9216 }
9217 
9218 template <typename Derived>
9219 StmtResult
9220 TreeTransform<Derived>::TransformOMPInteropDirective(OMPInteropDirective *D) {
9221   DeclarationNameInfo DirName;
9222   getDerived().getSema().StartOpenMPDSABlock(OMPD_interop, DirName, nullptr,
9223                                              D->getBeginLoc());
9224   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9225   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9226   return Res;
9227 }
9228 
9229 template <typename Derived>
9230 StmtResult
9231 TreeTransform<Derived>::TransformOMPDispatchDirective(OMPDispatchDirective *D) {
9232   DeclarationNameInfo DirName;
9233   getDerived().getSema().StartOpenMPDSABlock(OMPD_dispatch, DirName, nullptr,
9234                                              D->getBeginLoc());
9235   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9236   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9237   return Res;
9238 }
9239 
9240 template <typename Derived>
9241 StmtResult
9242 TreeTransform<Derived>::TransformOMPMaskedDirective(OMPMaskedDirective *D) {
9243   DeclarationNameInfo DirName;
9244   getDerived().getSema().StartOpenMPDSABlock(OMPD_masked, DirName, nullptr,
9245                                              D->getBeginLoc());
9246   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9247   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9248   return Res;
9249 }
9250 
9251 template <typename Derived>
9252 StmtResult TreeTransform<Derived>::TransformOMPGenericLoopDirective(
9253     OMPGenericLoopDirective *D) {
9254   DeclarationNameInfo DirName;
9255   getDerived().getSema().StartOpenMPDSABlock(OMPD_loop, DirName, nullptr,
9256                                              D->getBeginLoc());
9257   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9258   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9259   return Res;
9260 }
9261 
9262 template <typename Derived>
9263 StmtResult TreeTransform<Derived>::TransformOMPTeamsGenericLoopDirective(
9264     OMPTeamsGenericLoopDirective *D) {
9265   DeclarationNameInfo DirName;
9266   getDerived().getSema().StartOpenMPDSABlock(OMPD_teams_loop, DirName, nullptr,
9267                                              D->getBeginLoc());
9268   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9269   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9270   return Res;
9271 }
9272 
9273 template <typename Derived>
9274 StmtResult TreeTransform<Derived>::TransformOMPTargetTeamsGenericLoopDirective(
9275     OMPTargetTeamsGenericLoopDirective *D) {
9276   DeclarationNameInfo DirName;
9277   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_teams_loop, DirName,
9278                                              nullptr, D->getBeginLoc());
9279   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9280   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9281   return Res;
9282 }
9283 
9284 template <typename Derived>
9285 StmtResult TreeTransform<Derived>::TransformOMPParallelGenericLoopDirective(
9286     OMPParallelGenericLoopDirective *D) {
9287   DeclarationNameInfo DirName;
9288   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_loop, DirName,
9289                                              nullptr, D->getBeginLoc());
9290   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9291   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9292   return Res;
9293 }
9294 
9295 template <typename Derived>
9296 StmtResult
9297 TreeTransform<Derived>::TransformOMPTargetParallelGenericLoopDirective(
9298     OMPTargetParallelGenericLoopDirective *D) {
9299   DeclarationNameInfo DirName;
9300   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel_loop, DirName,
9301                                              nullptr, D->getBeginLoc());
9302   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9303   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9304   return Res;
9305 }
9306 
9307 //===----------------------------------------------------------------------===//
9308 // OpenMP clause transformation
9309 //===----------------------------------------------------------------------===//
9310 template <typename Derived>
9311 OMPClause *TreeTransform<Derived>::TransformOMPIfClause(OMPIfClause *C) {
9312   ExprResult Cond = getDerived().TransformExpr(C->getCondition());
9313   if (Cond.isInvalid())
9314     return nullptr;
9315   return getDerived().RebuildOMPIfClause(
9316       C->getNameModifier(), Cond.get(), C->getBeginLoc(), C->getLParenLoc(),
9317       C->getNameModifierLoc(), C->getColonLoc(), C->getEndLoc());
9318 }
9319 
9320 template <typename Derived>
9321 OMPClause *TreeTransform<Derived>::TransformOMPFinalClause(OMPFinalClause *C) {
9322   ExprResult Cond = getDerived().TransformExpr(C->getCondition());
9323   if (Cond.isInvalid())
9324     return nullptr;
9325   return getDerived().RebuildOMPFinalClause(Cond.get(), C->getBeginLoc(),
9326                                             C->getLParenLoc(), C->getEndLoc());
9327 }
9328 
9329 template <typename Derived>
9330 OMPClause *
9331 TreeTransform<Derived>::TransformOMPNumThreadsClause(OMPNumThreadsClause *C) {
9332   ExprResult NumThreads = getDerived().TransformExpr(C->getNumThreads());
9333   if (NumThreads.isInvalid())
9334     return nullptr;
9335   return getDerived().RebuildOMPNumThreadsClause(
9336       NumThreads.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9337 }
9338 
9339 template <typename Derived>
9340 OMPClause *
9341 TreeTransform<Derived>::TransformOMPSafelenClause(OMPSafelenClause *C) {
9342   ExprResult E = getDerived().TransformExpr(C->getSafelen());
9343   if (E.isInvalid())
9344     return nullptr;
9345   return getDerived().RebuildOMPSafelenClause(
9346       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9347 }
9348 
9349 template <typename Derived>
9350 OMPClause *
9351 TreeTransform<Derived>::TransformOMPAllocatorClause(OMPAllocatorClause *C) {
9352   ExprResult E = getDerived().TransformExpr(C->getAllocator());
9353   if (E.isInvalid())
9354     return nullptr;
9355   return getDerived().RebuildOMPAllocatorClause(
9356       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9357 }
9358 
9359 template <typename Derived>
9360 OMPClause *
9361 TreeTransform<Derived>::TransformOMPSimdlenClause(OMPSimdlenClause *C) {
9362   ExprResult E = getDerived().TransformExpr(C->getSimdlen());
9363   if (E.isInvalid())
9364     return nullptr;
9365   return getDerived().RebuildOMPSimdlenClause(
9366       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9367 }
9368 
9369 template <typename Derived>
9370 OMPClause *TreeTransform<Derived>::TransformOMPSizesClause(OMPSizesClause *C) {
9371   SmallVector<Expr *, 4> TransformedSizes;
9372   TransformedSizes.reserve(C->getNumSizes());
9373   bool Changed = false;
9374   for (Expr *E : C->getSizesRefs()) {
9375     if (!E) {
9376       TransformedSizes.push_back(nullptr);
9377       continue;
9378     }
9379 
9380     ExprResult T = getDerived().TransformExpr(E);
9381     if (T.isInvalid())
9382       return nullptr;
9383     if (E != T.get())
9384       Changed = true;
9385     TransformedSizes.push_back(T.get());
9386   }
9387 
9388   if (!Changed && !getDerived().AlwaysRebuild())
9389     return C;
9390   return RebuildOMPSizesClause(TransformedSizes, C->getBeginLoc(),
9391                                C->getLParenLoc(), C->getEndLoc());
9392 }
9393 
9394 template <typename Derived>
9395 OMPClause *TreeTransform<Derived>::TransformOMPFullClause(OMPFullClause *C) {
9396   if (!getDerived().AlwaysRebuild())
9397     return C;
9398   return RebuildOMPFullClause(C->getBeginLoc(), C->getEndLoc());
9399 }
9400 
9401 template <typename Derived>
9402 OMPClause *
9403 TreeTransform<Derived>::TransformOMPPartialClause(OMPPartialClause *C) {
9404   ExprResult T = getDerived().TransformExpr(C->getFactor());
9405   if (T.isInvalid())
9406     return nullptr;
9407   Expr *Factor = T.get();
9408   bool Changed = Factor != C->getFactor();
9409 
9410   if (!Changed && !getDerived().AlwaysRebuild())
9411     return C;
9412   return RebuildOMPPartialClause(Factor, C->getBeginLoc(), C->getLParenLoc(),
9413                                  C->getEndLoc());
9414 }
9415 
9416 template <typename Derived>
9417 OMPClause *
9418 TreeTransform<Derived>::TransformOMPCollapseClause(OMPCollapseClause *C) {
9419   ExprResult E = getDerived().TransformExpr(C->getNumForLoops());
9420   if (E.isInvalid())
9421     return nullptr;
9422   return getDerived().RebuildOMPCollapseClause(
9423       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9424 }
9425 
9426 template <typename Derived>
9427 OMPClause *
9428 TreeTransform<Derived>::TransformOMPDefaultClause(OMPDefaultClause *C) {
9429   return getDerived().RebuildOMPDefaultClause(
9430       C->getDefaultKind(), C->getDefaultKindKwLoc(), C->getBeginLoc(),
9431       C->getLParenLoc(), C->getEndLoc());
9432 }
9433 
9434 template <typename Derived>
9435 OMPClause *
9436 TreeTransform<Derived>::TransformOMPProcBindClause(OMPProcBindClause *C) {
9437   return getDerived().RebuildOMPProcBindClause(
9438       C->getProcBindKind(), C->getProcBindKindKwLoc(), C->getBeginLoc(),
9439       C->getLParenLoc(), C->getEndLoc());
9440 }
9441 
9442 template <typename Derived>
9443 OMPClause *
9444 TreeTransform<Derived>::TransformOMPScheduleClause(OMPScheduleClause *C) {
9445   ExprResult E = getDerived().TransformExpr(C->getChunkSize());
9446   if (E.isInvalid())
9447     return nullptr;
9448   return getDerived().RebuildOMPScheduleClause(
9449       C->getFirstScheduleModifier(), C->getSecondScheduleModifier(),
9450       C->getScheduleKind(), E.get(), C->getBeginLoc(), C->getLParenLoc(),
9451       C->getFirstScheduleModifierLoc(), C->getSecondScheduleModifierLoc(),
9452       C->getScheduleKindLoc(), C->getCommaLoc(), C->getEndLoc());
9453 }
9454 
9455 template <typename Derived>
9456 OMPClause *
9457 TreeTransform<Derived>::TransformOMPOrderedClause(OMPOrderedClause *C) {
9458   ExprResult E;
9459   if (auto *Num = C->getNumForLoops()) {
9460     E = getDerived().TransformExpr(Num);
9461     if (E.isInvalid())
9462       return nullptr;
9463   }
9464   return getDerived().RebuildOMPOrderedClause(C->getBeginLoc(), C->getEndLoc(),
9465                                               C->getLParenLoc(), E.get());
9466 }
9467 
9468 template <typename Derived>
9469 OMPClause *
9470 TreeTransform<Derived>::TransformOMPDetachClause(OMPDetachClause *C) {
9471   ExprResult E;
9472   if (Expr *Evt = C->getEventHandler()) {
9473     E = getDerived().TransformExpr(Evt);
9474     if (E.isInvalid())
9475       return nullptr;
9476   }
9477   return getDerived().RebuildOMPDetachClause(E.get(), C->getBeginLoc(),
9478                                              C->getLParenLoc(), C->getEndLoc());
9479 }
9480 
9481 template <typename Derived>
9482 OMPClause *
9483 TreeTransform<Derived>::TransformOMPNowaitClause(OMPNowaitClause *C) {
9484   // No need to rebuild this clause, no template-dependent parameters.
9485   return C;
9486 }
9487 
9488 template <typename Derived>
9489 OMPClause *
9490 TreeTransform<Derived>::TransformOMPUntiedClause(OMPUntiedClause *C) {
9491   // No need to rebuild this clause, no template-dependent parameters.
9492   return C;
9493 }
9494 
9495 template <typename Derived>
9496 OMPClause *
9497 TreeTransform<Derived>::TransformOMPMergeableClause(OMPMergeableClause *C) {
9498   // No need to rebuild this clause, no template-dependent parameters.
9499   return C;
9500 }
9501 
9502 template <typename Derived>
9503 OMPClause *TreeTransform<Derived>::TransformOMPReadClause(OMPReadClause *C) {
9504   // No need to rebuild this clause, no template-dependent parameters.
9505   return C;
9506 }
9507 
9508 template <typename Derived>
9509 OMPClause *TreeTransform<Derived>::TransformOMPWriteClause(OMPWriteClause *C) {
9510   // No need to rebuild this clause, no template-dependent parameters.
9511   return C;
9512 }
9513 
9514 template <typename Derived>
9515 OMPClause *
9516 TreeTransform<Derived>::TransformOMPUpdateClause(OMPUpdateClause *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>::TransformOMPCaptureClause(OMPCaptureClause *C) {
9524   // No need to rebuild this clause, no template-dependent parameters.
9525   return C;
9526 }
9527 
9528 template <typename Derived>
9529 OMPClause *
9530 TreeTransform<Derived>::TransformOMPCompareClause(OMPCompareClause *C) {
9531   // No need to rebuild this clause, no template-dependent parameters.
9532   return C;
9533 }
9534 
9535 template <typename Derived>
9536 OMPClause *
9537 TreeTransform<Derived>::TransformOMPSeqCstClause(OMPSeqCstClause *C) {
9538   // No need to rebuild this clause, no template-dependent parameters.
9539   return C;
9540 }
9541 
9542 template <typename Derived>
9543 OMPClause *
9544 TreeTransform<Derived>::TransformOMPAcqRelClause(OMPAcqRelClause *C) {
9545   // No need to rebuild this clause, no template-dependent parameters.
9546   return C;
9547 }
9548 
9549 template <typename Derived>
9550 OMPClause *
9551 TreeTransform<Derived>::TransformOMPAcquireClause(OMPAcquireClause *C) {
9552   // No need to rebuild this clause, no template-dependent parameters.
9553   return C;
9554 }
9555 
9556 template <typename Derived>
9557 OMPClause *
9558 TreeTransform<Derived>::TransformOMPReleaseClause(OMPReleaseClause *C) {
9559   // No need to rebuild this clause, no template-dependent parameters.
9560   return C;
9561 }
9562 
9563 template <typename Derived>
9564 OMPClause *
9565 TreeTransform<Derived>::TransformOMPRelaxedClause(OMPRelaxedClause *C) {
9566   // No need to rebuild this clause, no template-dependent parameters.
9567   return C;
9568 }
9569 
9570 template <typename Derived>
9571 OMPClause *
9572 TreeTransform<Derived>::TransformOMPThreadsClause(OMPThreadsClause *C) {
9573   // No need to rebuild this clause, no template-dependent parameters.
9574   return C;
9575 }
9576 
9577 template <typename Derived>
9578 OMPClause *TreeTransform<Derived>::TransformOMPSIMDClause(OMPSIMDClause *C) {
9579   // No need to rebuild this clause, no template-dependent parameters.
9580   return C;
9581 }
9582 
9583 template <typename Derived>
9584 OMPClause *
9585 TreeTransform<Derived>::TransformOMPNogroupClause(OMPNogroupClause *C) {
9586   // No need to rebuild this clause, no template-dependent parameters.
9587   return C;
9588 }
9589 
9590 template <typename Derived>
9591 OMPClause *TreeTransform<Derived>::TransformOMPInitClause(OMPInitClause *C) {
9592   ExprResult IVR = getDerived().TransformExpr(C->getInteropVar());
9593   if (IVR.isInvalid())
9594     return nullptr;
9595 
9596   llvm::SmallVector<Expr *, 8> PrefExprs;
9597   PrefExprs.reserve(C->varlist_size() - 1);
9598   for (Expr *E : llvm::drop_begin(C->varlists())) {
9599     ExprResult ER = getDerived().TransformExpr(cast<Expr>(E));
9600     if (ER.isInvalid())
9601       return nullptr;
9602     PrefExprs.push_back(ER.get());
9603   }
9604   return getDerived().RebuildOMPInitClause(
9605       IVR.get(), PrefExprs, C->getIsTarget(), C->getIsTargetSync(),
9606       C->getBeginLoc(), C->getLParenLoc(), C->getVarLoc(), C->getEndLoc());
9607 }
9608 
9609 template <typename Derived>
9610 OMPClause *TreeTransform<Derived>::TransformOMPUseClause(OMPUseClause *C) {
9611   ExprResult ER = getDerived().TransformExpr(C->getInteropVar());
9612   if (ER.isInvalid())
9613     return nullptr;
9614   return getDerived().RebuildOMPUseClause(ER.get(), C->getBeginLoc(),
9615                                           C->getLParenLoc(), C->getVarLoc(),
9616                                           C->getEndLoc());
9617 }
9618 
9619 template <typename Derived>
9620 OMPClause *
9621 TreeTransform<Derived>::TransformOMPDestroyClause(OMPDestroyClause *C) {
9622   ExprResult ER;
9623   if (Expr *IV = C->getInteropVar()) {
9624     ER = getDerived().TransformExpr(IV);
9625     if (ER.isInvalid())
9626       return nullptr;
9627   }
9628   return getDerived().RebuildOMPDestroyClause(ER.get(), C->getBeginLoc(),
9629                                               C->getLParenLoc(), C->getVarLoc(),
9630                                               C->getEndLoc());
9631 }
9632 
9633 template <typename Derived>
9634 OMPClause *
9635 TreeTransform<Derived>::TransformOMPNovariantsClause(OMPNovariantsClause *C) {
9636   ExprResult Cond = getDerived().TransformExpr(C->getCondition());
9637   if (Cond.isInvalid())
9638     return nullptr;
9639   return getDerived().RebuildOMPNovariantsClause(
9640       Cond.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9641 }
9642 
9643 template <typename Derived>
9644 OMPClause *
9645 TreeTransform<Derived>::TransformOMPNocontextClause(OMPNocontextClause *C) {
9646   ExprResult Cond = getDerived().TransformExpr(C->getCondition());
9647   if (Cond.isInvalid())
9648     return nullptr;
9649   return getDerived().RebuildOMPNocontextClause(
9650       Cond.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9651 }
9652 
9653 template <typename Derived>
9654 OMPClause *
9655 TreeTransform<Derived>::TransformOMPFilterClause(OMPFilterClause *C) {
9656   ExprResult ThreadID = getDerived().TransformExpr(C->getThreadID());
9657   if (ThreadID.isInvalid())
9658     return nullptr;
9659   return getDerived().RebuildOMPFilterClause(ThreadID.get(), C->getBeginLoc(),
9660                                              C->getLParenLoc(), C->getEndLoc());
9661 }
9662 
9663 template <typename Derived>
9664 OMPClause *TreeTransform<Derived>::TransformOMPAlignClause(OMPAlignClause *C) {
9665   ExprResult E = getDerived().TransformExpr(C->getAlignment());
9666   if (E.isInvalid())
9667     return nullptr;
9668   return getDerived().RebuildOMPAlignClause(E.get(), C->getBeginLoc(),
9669                                             C->getLParenLoc(), C->getEndLoc());
9670 }
9671 
9672 template <typename Derived>
9673 OMPClause *TreeTransform<Derived>::TransformOMPUnifiedAddressClause(
9674     OMPUnifiedAddressClause *C) {
9675   llvm_unreachable("unified_address clause cannot appear in dependent context");
9676 }
9677 
9678 template <typename Derived>
9679 OMPClause *TreeTransform<Derived>::TransformOMPUnifiedSharedMemoryClause(
9680     OMPUnifiedSharedMemoryClause *C) {
9681   llvm_unreachable(
9682       "unified_shared_memory clause cannot appear in dependent context");
9683 }
9684 
9685 template <typename Derived>
9686 OMPClause *TreeTransform<Derived>::TransformOMPReverseOffloadClause(
9687     OMPReverseOffloadClause *C) {
9688   llvm_unreachable("reverse_offload clause cannot appear in dependent context");
9689 }
9690 
9691 template <typename Derived>
9692 OMPClause *TreeTransform<Derived>::TransformOMPDynamicAllocatorsClause(
9693     OMPDynamicAllocatorsClause *C) {
9694   llvm_unreachable(
9695       "dynamic_allocators clause cannot appear in dependent context");
9696 }
9697 
9698 template <typename Derived>
9699 OMPClause *TreeTransform<Derived>::TransformOMPAtomicDefaultMemOrderClause(
9700     OMPAtomicDefaultMemOrderClause *C) {
9701   llvm_unreachable(
9702       "atomic_default_mem_order clause cannot appear in dependent context");
9703 }
9704 
9705 template <typename Derived>
9706 OMPClause *
9707 TreeTransform<Derived>::TransformOMPPrivateClause(OMPPrivateClause *C) {
9708   llvm::SmallVector<Expr *, 16> Vars;
9709   Vars.reserve(C->varlist_size());
9710   for (auto *VE : C->varlists()) {
9711     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9712     if (EVar.isInvalid())
9713       return nullptr;
9714     Vars.push_back(EVar.get());
9715   }
9716   return getDerived().RebuildOMPPrivateClause(
9717       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9718 }
9719 
9720 template <typename Derived>
9721 OMPClause *TreeTransform<Derived>::TransformOMPFirstprivateClause(
9722     OMPFirstprivateClause *C) {
9723   llvm::SmallVector<Expr *, 16> Vars;
9724   Vars.reserve(C->varlist_size());
9725   for (auto *VE : C->varlists()) {
9726     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9727     if (EVar.isInvalid())
9728       return nullptr;
9729     Vars.push_back(EVar.get());
9730   }
9731   return getDerived().RebuildOMPFirstprivateClause(
9732       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9733 }
9734 
9735 template <typename Derived>
9736 OMPClause *
9737 TreeTransform<Derived>::TransformOMPLastprivateClause(OMPLastprivateClause *C) {
9738   llvm::SmallVector<Expr *, 16> Vars;
9739   Vars.reserve(C->varlist_size());
9740   for (auto *VE : C->varlists()) {
9741     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9742     if (EVar.isInvalid())
9743       return nullptr;
9744     Vars.push_back(EVar.get());
9745   }
9746   return getDerived().RebuildOMPLastprivateClause(
9747       Vars, C->getKind(), C->getKindLoc(), C->getColonLoc(), C->getBeginLoc(),
9748       C->getLParenLoc(), C->getEndLoc());
9749 }
9750 
9751 template <typename Derived>
9752 OMPClause *
9753 TreeTransform<Derived>::TransformOMPSharedClause(OMPSharedClause *C) {
9754   llvm::SmallVector<Expr *, 16> Vars;
9755   Vars.reserve(C->varlist_size());
9756   for (auto *VE : C->varlists()) {
9757     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9758     if (EVar.isInvalid())
9759       return nullptr;
9760     Vars.push_back(EVar.get());
9761   }
9762   return getDerived().RebuildOMPSharedClause(Vars, C->getBeginLoc(),
9763                                              C->getLParenLoc(), C->getEndLoc());
9764 }
9765 
9766 template <typename Derived>
9767 OMPClause *
9768 TreeTransform<Derived>::TransformOMPReductionClause(OMPReductionClause *C) {
9769   llvm::SmallVector<Expr *, 16> Vars;
9770   Vars.reserve(C->varlist_size());
9771   for (auto *VE : C->varlists()) {
9772     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9773     if (EVar.isInvalid())
9774       return nullptr;
9775     Vars.push_back(EVar.get());
9776   }
9777   CXXScopeSpec ReductionIdScopeSpec;
9778   ReductionIdScopeSpec.Adopt(C->getQualifierLoc());
9779 
9780   DeclarationNameInfo NameInfo = C->getNameInfo();
9781   if (NameInfo.getName()) {
9782     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
9783     if (!NameInfo.getName())
9784       return nullptr;
9785   }
9786   // Build a list of all UDR decls with the same names ranged by the Scopes.
9787   // The Scope boundary is a duplication of the previous decl.
9788   llvm::SmallVector<Expr *, 16> UnresolvedReductions;
9789   for (auto *E : C->reduction_ops()) {
9790     // Transform all the decls.
9791     if (E) {
9792       auto *ULE = cast<UnresolvedLookupExpr>(E);
9793       UnresolvedSet<8> Decls;
9794       for (auto *D : ULE->decls()) {
9795         NamedDecl *InstD =
9796             cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D));
9797         Decls.addDecl(InstD, InstD->getAccess());
9798       }
9799       UnresolvedReductions.push_back(
9800        UnresolvedLookupExpr::Create(
9801           SemaRef.Context, /*NamingClass=*/nullptr,
9802           ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context),
9803           NameInfo, /*ADL=*/true, ULE->isOverloaded(),
9804           Decls.begin(), Decls.end()));
9805     } else
9806       UnresolvedReductions.push_back(nullptr);
9807   }
9808   return getDerived().RebuildOMPReductionClause(
9809       Vars, C->getModifier(), C->getBeginLoc(), C->getLParenLoc(),
9810       C->getModifierLoc(), C->getColonLoc(), C->getEndLoc(),
9811       ReductionIdScopeSpec, NameInfo, UnresolvedReductions);
9812 }
9813 
9814 template <typename Derived>
9815 OMPClause *TreeTransform<Derived>::TransformOMPTaskReductionClause(
9816     OMPTaskReductionClause *C) {
9817   llvm::SmallVector<Expr *, 16> Vars;
9818   Vars.reserve(C->varlist_size());
9819   for (auto *VE : C->varlists()) {
9820     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9821     if (EVar.isInvalid())
9822       return nullptr;
9823     Vars.push_back(EVar.get());
9824   }
9825   CXXScopeSpec ReductionIdScopeSpec;
9826   ReductionIdScopeSpec.Adopt(C->getQualifierLoc());
9827 
9828   DeclarationNameInfo NameInfo = C->getNameInfo();
9829   if (NameInfo.getName()) {
9830     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
9831     if (!NameInfo.getName())
9832       return nullptr;
9833   }
9834   // Build a list of all UDR decls with the same names ranged by the Scopes.
9835   // The Scope boundary is a duplication of the previous decl.
9836   llvm::SmallVector<Expr *, 16> UnresolvedReductions;
9837   for (auto *E : C->reduction_ops()) {
9838     // Transform all the decls.
9839     if (E) {
9840       auto *ULE = cast<UnresolvedLookupExpr>(E);
9841       UnresolvedSet<8> Decls;
9842       for (auto *D : ULE->decls()) {
9843         NamedDecl *InstD =
9844             cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D));
9845         Decls.addDecl(InstD, InstD->getAccess());
9846       }
9847       UnresolvedReductions.push_back(UnresolvedLookupExpr::Create(
9848           SemaRef.Context, /*NamingClass=*/nullptr,
9849           ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), NameInfo,
9850           /*ADL=*/true, ULE->isOverloaded(), Decls.begin(), Decls.end()));
9851     } else
9852       UnresolvedReductions.push_back(nullptr);
9853   }
9854   return getDerived().RebuildOMPTaskReductionClause(
9855       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(),
9856       C->getEndLoc(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions);
9857 }
9858 
9859 template <typename Derived>
9860 OMPClause *
9861 TreeTransform<Derived>::TransformOMPInReductionClause(OMPInReductionClause *C) {
9862   llvm::SmallVector<Expr *, 16> Vars;
9863   Vars.reserve(C->varlist_size());
9864   for (auto *VE : C->varlists()) {
9865     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9866     if (EVar.isInvalid())
9867       return nullptr;
9868     Vars.push_back(EVar.get());
9869   }
9870   CXXScopeSpec ReductionIdScopeSpec;
9871   ReductionIdScopeSpec.Adopt(C->getQualifierLoc());
9872 
9873   DeclarationNameInfo NameInfo = C->getNameInfo();
9874   if (NameInfo.getName()) {
9875     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
9876     if (!NameInfo.getName())
9877       return nullptr;
9878   }
9879   // Build a list of all UDR decls with the same names ranged by the Scopes.
9880   // The Scope boundary is a duplication of the previous decl.
9881   llvm::SmallVector<Expr *, 16> UnresolvedReductions;
9882   for (auto *E : C->reduction_ops()) {
9883     // Transform all the decls.
9884     if (E) {
9885       auto *ULE = cast<UnresolvedLookupExpr>(E);
9886       UnresolvedSet<8> Decls;
9887       for (auto *D : ULE->decls()) {
9888         NamedDecl *InstD =
9889             cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D));
9890         Decls.addDecl(InstD, InstD->getAccess());
9891       }
9892       UnresolvedReductions.push_back(UnresolvedLookupExpr::Create(
9893           SemaRef.Context, /*NamingClass=*/nullptr,
9894           ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), NameInfo,
9895           /*ADL=*/true, ULE->isOverloaded(), Decls.begin(), Decls.end()));
9896     } else
9897       UnresolvedReductions.push_back(nullptr);
9898   }
9899   return getDerived().RebuildOMPInReductionClause(
9900       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(),
9901       C->getEndLoc(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions);
9902 }
9903 
9904 template <typename Derived>
9905 OMPClause *
9906 TreeTransform<Derived>::TransformOMPLinearClause(OMPLinearClause *C) {
9907   llvm::SmallVector<Expr *, 16> Vars;
9908   Vars.reserve(C->varlist_size());
9909   for (auto *VE : C->varlists()) {
9910     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9911     if (EVar.isInvalid())
9912       return nullptr;
9913     Vars.push_back(EVar.get());
9914   }
9915   ExprResult Step = getDerived().TransformExpr(C->getStep());
9916   if (Step.isInvalid())
9917     return nullptr;
9918   return getDerived().RebuildOMPLinearClause(
9919       Vars, Step.get(), C->getBeginLoc(), C->getLParenLoc(), C->getModifier(),
9920       C->getModifierLoc(), C->getColonLoc(), C->getEndLoc());
9921 }
9922 
9923 template <typename Derived>
9924 OMPClause *
9925 TreeTransform<Derived>::TransformOMPAlignedClause(OMPAlignedClause *C) {
9926   llvm::SmallVector<Expr *, 16> Vars;
9927   Vars.reserve(C->varlist_size());
9928   for (auto *VE : C->varlists()) {
9929     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9930     if (EVar.isInvalid())
9931       return nullptr;
9932     Vars.push_back(EVar.get());
9933   }
9934   ExprResult Alignment = getDerived().TransformExpr(C->getAlignment());
9935   if (Alignment.isInvalid())
9936     return nullptr;
9937   return getDerived().RebuildOMPAlignedClause(
9938       Vars, Alignment.get(), C->getBeginLoc(), C->getLParenLoc(),
9939       C->getColonLoc(), C->getEndLoc());
9940 }
9941 
9942 template <typename Derived>
9943 OMPClause *
9944 TreeTransform<Derived>::TransformOMPCopyinClause(OMPCopyinClause *C) {
9945   llvm::SmallVector<Expr *, 16> Vars;
9946   Vars.reserve(C->varlist_size());
9947   for (auto *VE : C->varlists()) {
9948     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9949     if (EVar.isInvalid())
9950       return nullptr;
9951     Vars.push_back(EVar.get());
9952   }
9953   return getDerived().RebuildOMPCopyinClause(Vars, C->getBeginLoc(),
9954                                              C->getLParenLoc(), C->getEndLoc());
9955 }
9956 
9957 template <typename Derived>
9958 OMPClause *
9959 TreeTransform<Derived>::TransformOMPCopyprivateClause(OMPCopyprivateClause *C) {
9960   llvm::SmallVector<Expr *, 16> Vars;
9961   Vars.reserve(C->varlist_size());
9962   for (auto *VE : C->varlists()) {
9963     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9964     if (EVar.isInvalid())
9965       return nullptr;
9966     Vars.push_back(EVar.get());
9967   }
9968   return getDerived().RebuildOMPCopyprivateClause(
9969       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9970 }
9971 
9972 template <typename Derived>
9973 OMPClause *TreeTransform<Derived>::TransformOMPFlushClause(OMPFlushClause *C) {
9974   llvm::SmallVector<Expr *, 16> Vars;
9975   Vars.reserve(C->varlist_size());
9976   for (auto *VE : C->varlists()) {
9977     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9978     if (EVar.isInvalid())
9979       return nullptr;
9980     Vars.push_back(EVar.get());
9981   }
9982   return getDerived().RebuildOMPFlushClause(Vars, C->getBeginLoc(),
9983                                             C->getLParenLoc(), C->getEndLoc());
9984 }
9985 
9986 template <typename Derived>
9987 OMPClause *
9988 TreeTransform<Derived>::TransformOMPDepobjClause(OMPDepobjClause *C) {
9989   ExprResult E = getDerived().TransformExpr(C->getDepobj());
9990   if (E.isInvalid())
9991     return nullptr;
9992   return getDerived().RebuildOMPDepobjClause(E.get(), C->getBeginLoc(),
9993                                              C->getLParenLoc(), C->getEndLoc());
9994 }
9995 
9996 template <typename Derived>
9997 OMPClause *
9998 TreeTransform<Derived>::TransformOMPDependClause(OMPDependClause *C) {
9999   llvm::SmallVector<Expr *, 16> Vars;
10000   Expr *DepModifier = C->getModifier();
10001   if (DepModifier) {
10002     ExprResult DepModRes = getDerived().TransformExpr(DepModifier);
10003     if (DepModRes.isInvalid())
10004       return nullptr;
10005     DepModifier = DepModRes.get();
10006   }
10007   Vars.reserve(C->varlist_size());
10008   for (auto *VE : C->varlists()) {
10009     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10010     if (EVar.isInvalid())
10011       return nullptr;
10012     Vars.push_back(EVar.get());
10013   }
10014   return getDerived().RebuildOMPDependClause(
10015       DepModifier, C->getDependencyKind(), C->getDependencyLoc(),
10016       C->getColonLoc(), Vars, C->getBeginLoc(), C->getLParenLoc(),
10017       C->getEndLoc());
10018 }
10019 
10020 template <typename Derived>
10021 OMPClause *
10022 TreeTransform<Derived>::TransformOMPDeviceClause(OMPDeviceClause *C) {
10023   ExprResult E = getDerived().TransformExpr(C->getDevice());
10024   if (E.isInvalid())
10025     return nullptr;
10026   return getDerived().RebuildOMPDeviceClause(
10027       C->getModifier(), E.get(), C->getBeginLoc(), C->getLParenLoc(),
10028       C->getModifierLoc(), C->getEndLoc());
10029 }
10030 
10031 template <typename Derived, class T>
10032 bool transformOMPMappableExprListClause(
10033     TreeTransform<Derived> &TT, OMPMappableExprListClause<T> *C,
10034     llvm::SmallVectorImpl<Expr *> &Vars, CXXScopeSpec &MapperIdScopeSpec,
10035     DeclarationNameInfo &MapperIdInfo,
10036     llvm::SmallVectorImpl<Expr *> &UnresolvedMappers) {
10037   // Transform expressions in the list.
10038   Vars.reserve(C->varlist_size());
10039   for (auto *VE : C->varlists()) {
10040     ExprResult EVar = TT.getDerived().TransformExpr(cast<Expr>(VE));
10041     if (EVar.isInvalid())
10042       return true;
10043     Vars.push_back(EVar.get());
10044   }
10045   // Transform mapper scope specifier and identifier.
10046   NestedNameSpecifierLoc QualifierLoc;
10047   if (C->getMapperQualifierLoc()) {
10048     QualifierLoc = TT.getDerived().TransformNestedNameSpecifierLoc(
10049         C->getMapperQualifierLoc());
10050     if (!QualifierLoc)
10051       return true;
10052   }
10053   MapperIdScopeSpec.Adopt(QualifierLoc);
10054   MapperIdInfo = C->getMapperIdInfo();
10055   if (MapperIdInfo.getName()) {
10056     MapperIdInfo = TT.getDerived().TransformDeclarationNameInfo(MapperIdInfo);
10057     if (!MapperIdInfo.getName())
10058       return true;
10059   }
10060   // Build a list of all candidate OMPDeclareMapperDecls, which is provided by
10061   // the previous user-defined mapper lookup in dependent environment.
10062   for (auto *E : C->mapperlists()) {
10063     // Transform all the decls.
10064     if (E) {
10065       auto *ULE = cast<UnresolvedLookupExpr>(E);
10066       UnresolvedSet<8> Decls;
10067       for (auto *D : ULE->decls()) {
10068         NamedDecl *InstD =
10069             cast<NamedDecl>(TT.getDerived().TransformDecl(E->getExprLoc(), D));
10070         Decls.addDecl(InstD, InstD->getAccess());
10071       }
10072       UnresolvedMappers.push_back(UnresolvedLookupExpr::Create(
10073           TT.getSema().Context, /*NamingClass=*/nullptr,
10074           MapperIdScopeSpec.getWithLocInContext(TT.getSema().Context),
10075           MapperIdInfo, /*ADL=*/true, ULE->isOverloaded(), Decls.begin(),
10076           Decls.end()));
10077     } else {
10078       UnresolvedMappers.push_back(nullptr);
10079     }
10080   }
10081   return false;
10082 }
10083 
10084 template <typename Derived>
10085 OMPClause *TreeTransform<Derived>::TransformOMPMapClause(OMPMapClause *C) {
10086   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10087   llvm::SmallVector<Expr *, 16> Vars;
10088   CXXScopeSpec MapperIdScopeSpec;
10089   DeclarationNameInfo MapperIdInfo;
10090   llvm::SmallVector<Expr *, 16> UnresolvedMappers;
10091   if (transformOMPMappableExprListClause<Derived, OMPMapClause>(
10092           *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers))
10093     return nullptr;
10094   return getDerived().RebuildOMPMapClause(
10095       C->getMapTypeModifiers(), C->getMapTypeModifiersLoc(), MapperIdScopeSpec,
10096       MapperIdInfo, C->getMapType(), C->isImplicitMapType(), C->getMapLoc(),
10097       C->getColonLoc(), Vars, Locs, UnresolvedMappers);
10098 }
10099 
10100 template <typename Derived>
10101 OMPClause *
10102 TreeTransform<Derived>::TransformOMPAllocateClause(OMPAllocateClause *C) {
10103   Expr *Allocator = C->getAllocator();
10104   if (Allocator) {
10105     ExprResult AllocatorRes = getDerived().TransformExpr(Allocator);
10106     if (AllocatorRes.isInvalid())
10107       return nullptr;
10108     Allocator = AllocatorRes.get();
10109   }
10110   llvm::SmallVector<Expr *, 16> Vars;
10111   Vars.reserve(C->varlist_size());
10112   for (auto *VE : C->varlists()) {
10113     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10114     if (EVar.isInvalid())
10115       return nullptr;
10116     Vars.push_back(EVar.get());
10117   }
10118   return getDerived().RebuildOMPAllocateClause(
10119       Allocator, Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(),
10120       C->getEndLoc());
10121 }
10122 
10123 template <typename Derived>
10124 OMPClause *
10125 TreeTransform<Derived>::TransformOMPNumTeamsClause(OMPNumTeamsClause *C) {
10126   ExprResult E = getDerived().TransformExpr(C->getNumTeams());
10127   if (E.isInvalid())
10128     return nullptr;
10129   return getDerived().RebuildOMPNumTeamsClause(
10130       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10131 }
10132 
10133 template <typename Derived>
10134 OMPClause *
10135 TreeTransform<Derived>::TransformOMPThreadLimitClause(OMPThreadLimitClause *C) {
10136   ExprResult E = getDerived().TransformExpr(C->getThreadLimit());
10137   if (E.isInvalid())
10138     return nullptr;
10139   return getDerived().RebuildOMPThreadLimitClause(
10140       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10141 }
10142 
10143 template <typename Derived>
10144 OMPClause *
10145 TreeTransform<Derived>::TransformOMPPriorityClause(OMPPriorityClause *C) {
10146   ExprResult E = getDerived().TransformExpr(C->getPriority());
10147   if (E.isInvalid())
10148     return nullptr;
10149   return getDerived().RebuildOMPPriorityClause(
10150       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10151 }
10152 
10153 template <typename Derived>
10154 OMPClause *
10155 TreeTransform<Derived>::TransformOMPGrainsizeClause(OMPGrainsizeClause *C) {
10156   ExprResult E = getDerived().TransformExpr(C->getGrainsize());
10157   if (E.isInvalid())
10158     return nullptr;
10159   return getDerived().RebuildOMPGrainsizeClause(
10160       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10161 }
10162 
10163 template <typename Derived>
10164 OMPClause *
10165 TreeTransform<Derived>::TransformOMPNumTasksClause(OMPNumTasksClause *C) {
10166   ExprResult E = getDerived().TransformExpr(C->getNumTasks());
10167   if (E.isInvalid())
10168     return nullptr;
10169   return getDerived().RebuildOMPNumTasksClause(
10170       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10171 }
10172 
10173 template <typename Derived>
10174 OMPClause *TreeTransform<Derived>::TransformOMPHintClause(OMPHintClause *C) {
10175   ExprResult E = getDerived().TransformExpr(C->getHint());
10176   if (E.isInvalid())
10177     return nullptr;
10178   return getDerived().RebuildOMPHintClause(E.get(), C->getBeginLoc(),
10179                                            C->getLParenLoc(), C->getEndLoc());
10180 }
10181 
10182 template <typename Derived>
10183 OMPClause *TreeTransform<Derived>::TransformOMPDistScheduleClause(
10184     OMPDistScheduleClause *C) {
10185   ExprResult E = getDerived().TransformExpr(C->getChunkSize());
10186   if (E.isInvalid())
10187     return nullptr;
10188   return getDerived().RebuildOMPDistScheduleClause(
10189       C->getDistScheduleKind(), E.get(), C->getBeginLoc(), C->getLParenLoc(),
10190       C->getDistScheduleKindLoc(), C->getCommaLoc(), C->getEndLoc());
10191 }
10192 
10193 template <typename Derived>
10194 OMPClause *
10195 TreeTransform<Derived>::TransformOMPDefaultmapClause(OMPDefaultmapClause *C) {
10196   // Rebuild Defaultmap Clause since we need to invoke the checking of
10197   // defaultmap(none:variable-category) after template initialization.
10198   return getDerived().RebuildOMPDefaultmapClause(C->getDefaultmapModifier(),
10199                                                  C->getDefaultmapKind(),
10200                                                  C->getBeginLoc(),
10201                                                  C->getLParenLoc(),
10202                                                  C->getDefaultmapModifierLoc(),
10203                                                  C->getDefaultmapKindLoc(),
10204                                                  C->getEndLoc());
10205 }
10206 
10207 template <typename Derived>
10208 OMPClause *TreeTransform<Derived>::TransformOMPToClause(OMPToClause *C) {
10209   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10210   llvm::SmallVector<Expr *, 16> Vars;
10211   CXXScopeSpec MapperIdScopeSpec;
10212   DeclarationNameInfo MapperIdInfo;
10213   llvm::SmallVector<Expr *, 16> UnresolvedMappers;
10214   if (transformOMPMappableExprListClause<Derived, OMPToClause>(
10215           *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers))
10216     return nullptr;
10217   return getDerived().RebuildOMPToClause(
10218       C->getMotionModifiers(), C->getMotionModifiersLoc(), MapperIdScopeSpec,
10219       MapperIdInfo, C->getColonLoc(), Vars, Locs, UnresolvedMappers);
10220 }
10221 
10222 template <typename Derived>
10223 OMPClause *TreeTransform<Derived>::TransformOMPFromClause(OMPFromClause *C) {
10224   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10225   llvm::SmallVector<Expr *, 16> Vars;
10226   CXXScopeSpec MapperIdScopeSpec;
10227   DeclarationNameInfo MapperIdInfo;
10228   llvm::SmallVector<Expr *, 16> UnresolvedMappers;
10229   if (transformOMPMappableExprListClause<Derived, OMPFromClause>(
10230           *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers))
10231     return nullptr;
10232   return getDerived().RebuildOMPFromClause(
10233       C->getMotionModifiers(), C->getMotionModifiersLoc(), MapperIdScopeSpec,
10234       MapperIdInfo, C->getColonLoc(), Vars, Locs, UnresolvedMappers);
10235 }
10236 
10237 template <typename Derived>
10238 OMPClause *TreeTransform<Derived>::TransformOMPUseDevicePtrClause(
10239     OMPUseDevicePtrClause *C) {
10240   llvm::SmallVector<Expr *, 16> Vars;
10241   Vars.reserve(C->varlist_size());
10242   for (auto *VE : C->varlists()) {
10243     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10244     if (EVar.isInvalid())
10245       return nullptr;
10246     Vars.push_back(EVar.get());
10247   }
10248   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10249   return getDerived().RebuildOMPUseDevicePtrClause(Vars, Locs);
10250 }
10251 
10252 template <typename Derived>
10253 OMPClause *TreeTransform<Derived>::TransformOMPUseDeviceAddrClause(
10254     OMPUseDeviceAddrClause *C) {
10255   llvm::SmallVector<Expr *, 16> Vars;
10256   Vars.reserve(C->varlist_size());
10257   for (auto *VE : C->varlists()) {
10258     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10259     if (EVar.isInvalid())
10260       return nullptr;
10261     Vars.push_back(EVar.get());
10262   }
10263   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10264   return getDerived().RebuildOMPUseDeviceAddrClause(Vars, Locs);
10265 }
10266 
10267 template <typename Derived>
10268 OMPClause *
10269 TreeTransform<Derived>::TransformOMPIsDevicePtrClause(OMPIsDevicePtrClause *C) {
10270   llvm::SmallVector<Expr *, 16> Vars;
10271   Vars.reserve(C->varlist_size());
10272   for (auto *VE : C->varlists()) {
10273     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10274     if (EVar.isInvalid())
10275       return nullptr;
10276     Vars.push_back(EVar.get());
10277   }
10278   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10279   return getDerived().RebuildOMPIsDevicePtrClause(Vars, Locs);
10280 }
10281 
10282 template <typename Derived>
10283 OMPClause *TreeTransform<Derived>::TransformOMPHasDeviceAddrClause(
10284     OMPHasDeviceAddrClause *C) {
10285   llvm::SmallVector<Expr *, 16> Vars;
10286   Vars.reserve(C->varlist_size());
10287   for (auto *VE : C->varlists()) {
10288     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10289     if (EVar.isInvalid())
10290       return nullptr;
10291     Vars.push_back(EVar.get());
10292   }
10293   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10294   return getDerived().RebuildOMPHasDeviceAddrClause(Vars, Locs);
10295 }
10296 
10297 template <typename Derived>
10298 OMPClause *
10299 TreeTransform<Derived>::TransformOMPNontemporalClause(OMPNontemporalClause *C) {
10300   llvm::SmallVector<Expr *, 16> Vars;
10301   Vars.reserve(C->varlist_size());
10302   for (auto *VE : C->varlists()) {
10303     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10304     if (EVar.isInvalid())
10305       return nullptr;
10306     Vars.push_back(EVar.get());
10307   }
10308   return getDerived().RebuildOMPNontemporalClause(
10309       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10310 }
10311 
10312 template <typename Derived>
10313 OMPClause *
10314 TreeTransform<Derived>::TransformOMPInclusiveClause(OMPInclusiveClause *C) {
10315   llvm::SmallVector<Expr *, 16> Vars;
10316   Vars.reserve(C->varlist_size());
10317   for (auto *VE : C->varlists()) {
10318     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10319     if (EVar.isInvalid())
10320       return nullptr;
10321     Vars.push_back(EVar.get());
10322   }
10323   return getDerived().RebuildOMPInclusiveClause(
10324       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10325 }
10326 
10327 template <typename Derived>
10328 OMPClause *
10329 TreeTransform<Derived>::TransformOMPExclusiveClause(OMPExclusiveClause *C) {
10330   llvm::SmallVector<Expr *, 16> Vars;
10331   Vars.reserve(C->varlist_size());
10332   for (auto *VE : C->varlists()) {
10333     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10334     if (EVar.isInvalid())
10335       return nullptr;
10336     Vars.push_back(EVar.get());
10337   }
10338   return getDerived().RebuildOMPExclusiveClause(
10339       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10340 }
10341 
10342 template <typename Derived>
10343 OMPClause *TreeTransform<Derived>::TransformOMPUsesAllocatorsClause(
10344     OMPUsesAllocatorsClause *C) {
10345   SmallVector<Sema::UsesAllocatorsData, 16> Data;
10346   Data.reserve(C->getNumberOfAllocators());
10347   for (unsigned I = 0, E = C->getNumberOfAllocators(); I < E; ++I) {
10348     OMPUsesAllocatorsClause::Data D = C->getAllocatorData(I);
10349     ExprResult Allocator = getDerived().TransformExpr(D.Allocator);
10350     if (Allocator.isInvalid())
10351       continue;
10352     ExprResult AllocatorTraits;
10353     if (Expr *AT = D.AllocatorTraits) {
10354       AllocatorTraits = getDerived().TransformExpr(AT);
10355       if (AllocatorTraits.isInvalid())
10356         continue;
10357     }
10358     Sema::UsesAllocatorsData &NewD = Data.emplace_back();
10359     NewD.Allocator = Allocator.get();
10360     NewD.AllocatorTraits = AllocatorTraits.get();
10361     NewD.LParenLoc = D.LParenLoc;
10362     NewD.RParenLoc = D.RParenLoc;
10363   }
10364   return getDerived().RebuildOMPUsesAllocatorsClause(
10365       Data, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10366 }
10367 
10368 template <typename Derived>
10369 OMPClause *
10370 TreeTransform<Derived>::TransformOMPAffinityClause(OMPAffinityClause *C) {
10371   SmallVector<Expr *, 4> Locators;
10372   Locators.reserve(C->varlist_size());
10373   ExprResult ModifierRes;
10374   if (Expr *Modifier = C->getModifier()) {
10375     ModifierRes = getDerived().TransformExpr(Modifier);
10376     if (ModifierRes.isInvalid())
10377       return nullptr;
10378   }
10379   for (Expr *E : C->varlists()) {
10380     ExprResult Locator = getDerived().TransformExpr(E);
10381     if (Locator.isInvalid())
10382       continue;
10383     Locators.push_back(Locator.get());
10384   }
10385   return getDerived().RebuildOMPAffinityClause(
10386       C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(), C->getEndLoc(),
10387       ModifierRes.get(), Locators);
10388 }
10389 
10390 template <typename Derived>
10391 OMPClause *TreeTransform<Derived>::TransformOMPOrderClause(OMPOrderClause *C) {
10392   return getDerived().RebuildOMPOrderClause(C->getKind(), C->getKindKwLoc(),
10393                                             C->getBeginLoc(), C->getLParenLoc(),
10394                                             C->getEndLoc());
10395 }
10396 
10397 template <typename Derived>
10398 OMPClause *TreeTransform<Derived>::TransformOMPBindClause(OMPBindClause *C) {
10399   return getDerived().RebuildOMPBindClause(
10400       C->getBindKind(), C->getBindKindLoc(), C->getBeginLoc(),
10401       C->getLParenLoc(), C->getEndLoc());
10402 }
10403 
10404 //===----------------------------------------------------------------------===//
10405 // Expression transformation
10406 //===----------------------------------------------------------------------===//
10407 template<typename Derived>
10408 ExprResult
10409 TreeTransform<Derived>::TransformConstantExpr(ConstantExpr *E) {
10410   return TransformExpr(E->getSubExpr());
10411 }
10412 
10413 template <typename Derived>
10414 ExprResult TreeTransform<Derived>::TransformSYCLUniqueStableNameExpr(
10415     SYCLUniqueStableNameExpr *E) {
10416   if (!E->isTypeDependent())
10417     return E;
10418 
10419   TypeSourceInfo *NewT = getDerived().TransformType(E->getTypeSourceInfo());
10420 
10421   if (!NewT)
10422     return ExprError();
10423 
10424   if (!getDerived().AlwaysRebuild() && E->getTypeSourceInfo() == NewT)
10425     return E;
10426 
10427   return getDerived().RebuildSYCLUniqueStableNameExpr(
10428       E->getLocation(), E->getLParenLocation(), E->getRParenLocation(), NewT);
10429 }
10430 
10431 template<typename Derived>
10432 ExprResult
10433 TreeTransform<Derived>::TransformPredefinedExpr(PredefinedExpr *E) {
10434   if (!E->isTypeDependent())
10435     return E;
10436 
10437   return getDerived().RebuildPredefinedExpr(E->getLocation(),
10438                                             E->getIdentKind());
10439 }
10440 
10441 template<typename Derived>
10442 ExprResult
10443 TreeTransform<Derived>::TransformDeclRefExpr(DeclRefExpr *E) {
10444   NestedNameSpecifierLoc QualifierLoc;
10445   if (E->getQualifierLoc()) {
10446     QualifierLoc
10447       = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
10448     if (!QualifierLoc)
10449       return ExprError();
10450   }
10451 
10452   ValueDecl *ND
10453     = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getLocation(),
10454                                                          E->getDecl()));
10455   if (!ND)
10456     return ExprError();
10457 
10458   NamedDecl *Found = ND;
10459   if (E->getFoundDecl() != E->getDecl()) {
10460     Found = cast_or_null<NamedDecl>(
10461         getDerived().TransformDecl(E->getLocation(), E->getFoundDecl()));
10462     if (!Found)
10463       return ExprError();
10464   }
10465 
10466   DeclarationNameInfo NameInfo = E->getNameInfo();
10467   if (NameInfo.getName()) {
10468     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
10469     if (!NameInfo.getName())
10470       return ExprError();
10471   }
10472 
10473   if (!getDerived().AlwaysRebuild() &&
10474       QualifierLoc == E->getQualifierLoc() &&
10475       ND == E->getDecl() &&
10476       Found == E->getFoundDecl() &&
10477       NameInfo.getName() == E->getDecl()->getDeclName() &&
10478       !E->hasExplicitTemplateArgs()) {
10479 
10480     // Mark it referenced in the new context regardless.
10481     // FIXME: this is a bit instantiation-specific.
10482     SemaRef.MarkDeclRefReferenced(E);
10483 
10484     return E;
10485   }
10486 
10487   TemplateArgumentListInfo TransArgs, *TemplateArgs = nullptr;
10488   if (E->hasExplicitTemplateArgs()) {
10489     TemplateArgs = &TransArgs;
10490     TransArgs.setLAngleLoc(E->getLAngleLoc());
10491     TransArgs.setRAngleLoc(E->getRAngleLoc());
10492     if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
10493                                                 E->getNumTemplateArgs(),
10494                                                 TransArgs))
10495       return ExprError();
10496   }
10497 
10498   return getDerived().RebuildDeclRefExpr(QualifierLoc, ND, NameInfo,
10499                                          Found, TemplateArgs);
10500 }
10501 
10502 template<typename Derived>
10503 ExprResult
10504 TreeTransform<Derived>::TransformIntegerLiteral(IntegerLiteral *E) {
10505   return E;
10506 }
10507 
10508 template <typename Derived>
10509 ExprResult TreeTransform<Derived>::TransformFixedPointLiteral(
10510     FixedPointLiteral *E) {
10511   return E;
10512 }
10513 
10514 template<typename Derived>
10515 ExprResult
10516 TreeTransform<Derived>::TransformFloatingLiteral(FloatingLiteral *E) {
10517   return E;
10518 }
10519 
10520 template<typename Derived>
10521 ExprResult
10522 TreeTransform<Derived>::TransformImaginaryLiteral(ImaginaryLiteral *E) {
10523   return E;
10524 }
10525 
10526 template<typename Derived>
10527 ExprResult
10528 TreeTransform<Derived>::TransformStringLiteral(StringLiteral *E) {
10529   return E;
10530 }
10531 
10532 template<typename Derived>
10533 ExprResult
10534 TreeTransform<Derived>::TransformCharacterLiteral(CharacterLiteral *E) {
10535   return E;
10536 }
10537 
10538 template<typename Derived>
10539 ExprResult
10540 TreeTransform<Derived>::TransformUserDefinedLiteral(UserDefinedLiteral *E) {
10541   return getDerived().TransformCallExpr(E);
10542 }
10543 
10544 template<typename Derived>
10545 ExprResult
10546 TreeTransform<Derived>::TransformGenericSelectionExpr(GenericSelectionExpr *E) {
10547   ExprResult ControllingExpr =
10548     getDerived().TransformExpr(E->getControllingExpr());
10549   if (ControllingExpr.isInvalid())
10550     return ExprError();
10551 
10552   SmallVector<Expr *, 4> AssocExprs;
10553   SmallVector<TypeSourceInfo *, 4> AssocTypes;
10554   for (const GenericSelectionExpr::Association Assoc : E->associations()) {
10555     TypeSourceInfo *TSI = Assoc.getTypeSourceInfo();
10556     if (TSI) {
10557       TypeSourceInfo *AssocType = getDerived().TransformType(TSI);
10558       if (!AssocType)
10559         return ExprError();
10560       AssocTypes.push_back(AssocType);
10561     } else {
10562       AssocTypes.push_back(nullptr);
10563     }
10564 
10565     ExprResult AssocExpr =
10566         getDerived().TransformExpr(Assoc.getAssociationExpr());
10567     if (AssocExpr.isInvalid())
10568       return ExprError();
10569     AssocExprs.push_back(AssocExpr.get());
10570   }
10571 
10572   return getDerived().RebuildGenericSelectionExpr(E->getGenericLoc(),
10573                                                   E->getDefaultLoc(),
10574                                                   E->getRParenLoc(),
10575                                                   ControllingExpr.get(),
10576                                                   AssocTypes,
10577                                                   AssocExprs);
10578 }
10579 
10580 template<typename Derived>
10581 ExprResult
10582 TreeTransform<Derived>::TransformParenExpr(ParenExpr *E) {
10583   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
10584   if (SubExpr.isInvalid())
10585     return ExprError();
10586 
10587   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr())
10588     return E;
10589 
10590   return getDerived().RebuildParenExpr(SubExpr.get(), E->getLParen(),
10591                                        E->getRParen());
10592 }
10593 
10594 /// The operand of a unary address-of operator has special rules: it's
10595 /// allowed to refer to a non-static member of a class even if there's no 'this'
10596 /// object available.
10597 template<typename Derived>
10598 ExprResult
10599 TreeTransform<Derived>::TransformAddressOfOperand(Expr *E) {
10600   if (DependentScopeDeclRefExpr *DRE = dyn_cast<DependentScopeDeclRefExpr>(E))
10601     return getDerived().TransformDependentScopeDeclRefExpr(DRE, true, nullptr);
10602   else
10603     return getDerived().TransformExpr(E);
10604 }
10605 
10606 template<typename Derived>
10607 ExprResult
10608 TreeTransform<Derived>::TransformUnaryOperator(UnaryOperator *E) {
10609   ExprResult SubExpr;
10610   if (E->getOpcode() == UO_AddrOf)
10611     SubExpr = TransformAddressOfOperand(E->getSubExpr());
10612   else
10613     SubExpr = TransformExpr(E->getSubExpr());
10614   if (SubExpr.isInvalid())
10615     return ExprError();
10616 
10617   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr())
10618     return E;
10619 
10620   return getDerived().RebuildUnaryOperator(E->getOperatorLoc(),
10621                                            E->getOpcode(),
10622                                            SubExpr.get());
10623 }
10624 
10625 template<typename Derived>
10626 ExprResult
10627 TreeTransform<Derived>::TransformOffsetOfExpr(OffsetOfExpr *E) {
10628   // Transform the type.
10629   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo());
10630   if (!Type)
10631     return ExprError();
10632 
10633   // Transform all of the components into components similar to what the
10634   // parser uses.
10635   // FIXME: It would be slightly more efficient in the non-dependent case to
10636   // just map FieldDecls, rather than requiring the rebuilder to look for
10637   // the fields again. However, __builtin_offsetof is rare enough in
10638   // template code that we don't care.
10639   bool ExprChanged = false;
10640   typedef Sema::OffsetOfComponent Component;
10641   SmallVector<Component, 4> Components;
10642   for (unsigned I = 0, N = E->getNumComponents(); I != N; ++I) {
10643     const OffsetOfNode &ON = E->getComponent(I);
10644     Component Comp;
10645     Comp.isBrackets = true;
10646     Comp.LocStart = ON.getSourceRange().getBegin();
10647     Comp.LocEnd = ON.getSourceRange().getEnd();
10648     switch (ON.getKind()) {
10649     case OffsetOfNode::Array: {
10650       Expr *FromIndex = E->getIndexExpr(ON.getArrayExprIndex());
10651       ExprResult Index = getDerived().TransformExpr(FromIndex);
10652       if (Index.isInvalid())
10653         return ExprError();
10654 
10655       ExprChanged = ExprChanged || Index.get() != FromIndex;
10656       Comp.isBrackets = true;
10657       Comp.U.E = Index.get();
10658       break;
10659     }
10660 
10661     case OffsetOfNode::Field:
10662     case OffsetOfNode::Identifier:
10663       Comp.isBrackets = false;
10664       Comp.U.IdentInfo = ON.getFieldName();
10665       if (!Comp.U.IdentInfo)
10666         continue;
10667 
10668       break;
10669 
10670     case OffsetOfNode::Base:
10671       // Will be recomputed during the rebuild.
10672       continue;
10673     }
10674 
10675     Components.push_back(Comp);
10676   }
10677 
10678   // If nothing changed, retain the existing expression.
10679   if (!getDerived().AlwaysRebuild() &&
10680       Type == E->getTypeSourceInfo() &&
10681       !ExprChanged)
10682     return E;
10683 
10684   // Build a new offsetof expression.
10685   return getDerived().RebuildOffsetOfExpr(E->getOperatorLoc(), Type,
10686                                           Components, E->getRParenLoc());
10687 }
10688 
10689 template<typename Derived>
10690 ExprResult
10691 TreeTransform<Derived>::TransformOpaqueValueExpr(OpaqueValueExpr *E) {
10692   assert((!E->getSourceExpr() || getDerived().AlreadyTransformed(E->getType())) &&
10693          "opaque value expression requires transformation");
10694   return E;
10695 }
10696 
10697 template<typename Derived>
10698 ExprResult
10699 TreeTransform<Derived>::TransformTypoExpr(TypoExpr *E) {
10700   return E;
10701 }
10702 
10703 template <typename Derived>
10704 ExprResult TreeTransform<Derived>::TransformRecoveryExpr(RecoveryExpr *E) {
10705   llvm::SmallVector<Expr *, 8> Children;
10706   bool Changed = false;
10707   for (Expr *C : E->subExpressions()) {
10708     ExprResult NewC = getDerived().TransformExpr(C);
10709     if (NewC.isInvalid())
10710       return ExprError();
10711     Children.push_back(NewC.get());
10712 
10713     Changed |= NewC.get() != C;
10714   }
10715   if (!getDerived().AlwaysRebuild() && !Changed)
10716     return E;
10717   return getDerived().RebuildRecoveryExpr(E->getBeginLoc(), E->getEndLoc(),
10718                                           Children, E->getType());
10719 }
10720 
10721 template<typename Derived>
10722 ExprResult
10723 TreeTransform<Derived>::TransformPseudoObjectExpr(PseudoObjectExpr *E) {
10724   // Rebuild the syntactic form.  The original syntactic form has
10725   // opaque-value expressions in it, so strip those away and rebuild
10726   // the result.  This is a really awful way of doing this, but the
10727   // better solution (rebuilding the semantic expressions and
10728   // rebinding OVEs as necessary) doesn't work; we'd need
10729   // TreeTransform to not strip away implicit conversions.
10730   Expr *newSyntacticForm = SemaRef.recreateSyntacticForm(E);
10731   ExprResult result = getDerived().TransformExpr(newSyntacticForm);
10732   if (result.isInvalid()) return ExprError();
10733 
10734   // If that gives us a pseudo-object result back, the pseudo-object
10735   // expression must have been an lvalue-to-rvalue conversion which we
10736   // should reapply.
10737   if (result.get()->hasPlaceholderType(BuiltinType::PseudoObject))
10738     result = SemaRef.checkPseudoObjectRValue(result.get());
10739 
10740   return result;
10741 }
10742 
10743 template<typename Derived>
10744 ExprResult
10745 TreeTransform<Derived>::TransformUnaryExprOrTypeTraitExpr(
10746                                                 UnaryExprOrTypeTraitExpr *E) {
10747   if (E->isArgumentType()) {
10748     TypeSourceInfo *OldT = E->getArgumentTypeInfo();
10749 
10750     TypeSourceInfo *NewT = getDerived().TransformType(OldT);
10751     if (!NewT)
10752       return ExprError();
10753 
10754     if (!getDerived().AlwaysRebuild() && OldT == NewT)
10755       return E;
10756 
10757     return getDerived().RebuildUnaryExprOrTypeTrait(NewT, E->getOperatorLoc(),
10758                                                     E->getKind(),
10759                                                     E->getSourceRange());
10760   }
10761 
10762   // C++0x [expr.sizeof]p1:
10763   //   The operand is either an expression, which is an unevaluated operand
10764   //   [...]
10765   EnterExpressionEvaluationContext Unevaluated(
10766       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated,
10767       Sema::ReuseLambdaContextDecl);
10768 
10769   // Try to recover if we have something like sizeof(T::X) where X is a type.
10770   // Notably, there must be *exactly* one set of parens if X is a type.
10771   TypeSourceInfo *RecoveryTSI = nullptr;
10772   ExprResult SubExpr;
10773   auto *PE = dyn_cast<ParenExpr>(E->getArgumentExpr());
10774   if (auto *DRE =
10775           PE ? dyn_cast<DependentScopeDeclRefExpr>(PE->getSubExpr()) : nullptr)
10776     SubExpr = getDerived().TransformParenDependentScopeDeclRefExpr(
10777         PE, DRE, false, &RecoveryTSI);
10778   else
10779     SubExpr = getDerived().TransformExpr(E->getArgumentExpr());
10780 
10781   if (RecoveryTSI) {
10782     return getDerived().RebuildUnaryExprOrTypeTrait(
10783         RecoveryTSI, E->getOperatorLoc(), E->getKind(), E->getSourceRange());
10784   } else if (SubExpr.isInvalid())
10785     return ExprError();
10786 
10787   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getArgumentExpr())
10788     return E;
10789 
10790   return getDerived().RebuildUnaryExprOrTypeTrait(SubExpr.get(),
10791                                                   E->getOperatorLoc(),
10792                                                   E->getKind(),
10793                                                   E->getSourceRange());
10794 }
10795 
10796 template<typename Derived>
10797 ExprResult
10798 TreeTransform<Derived>::TransformArraySubscriptExpr(ArraySubscriptExpr *E) {
10799   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
10800   if (LHS.isInvalid())
10801     return ExprError();
10802 
10803   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
10804   if (RHS.isInvalid())
10805     return ExprError();
10806 
10807 
10808   if (!getDerived().AlwaysRebuild() &&
10809       LHS.get() == E->getLHS() &&
10810       RHS.get() == E->getRHS())
10811     return E;
10812 
10813   return getDerived().RebuildArraySubscriptExpr(
10814       LHS.get(),
10815       /*FIXME:*/ E->getLHS()->getBeginLoc(), RHS.get(), E->getRBracketLoc());
10816 }
10817 
10818 template <typename Derived>
10819 ExprResult
10820 TreeTransform<Derived>::TransformMatrixSubscriptExpr(MatrixSubscriptExpr *E) {
10821   ExprResult Base = getDerived().TransformExpr(E->getBase());
10822   if (Base.isInvalid())
10823     return ExprError();
10824 
10825   ExprResult RowIdx = getDerived().TransformExpr(E->getRowIdx());
10826   if (RowIdx.isInvalid())
10827     return ExprError();
10828 
10829   ExprResult ColumnIdx = getDerived().TransformExpr(E->getColumnIdx());
10830   if (ColumnIdx.isInvalid())
10831     return ExprError();
10832 
10833   if (!getDerived().AlwaysRebuild() && Base.get() == E->getBase() &&
10834       RowIdx.get() == E->getRowIdx() && ColumnIdx.get() == E->getColumnIdx())
10835     return E;
10836 
10837   return getDerived().RebuildMatrixSubscriptExpr(
10838       Base.get(), RowIdx.get(), ColumnIdx.get(), E->getRBracketLoc());
10839 }
10840 
10841 template <typename Derived>
10842 ExprResult
10843 TreeTransform<Derived>::TransformOMPArraySectionExpr(OMPArraySectionExpr *E) {
10844   ExprResult Base = getDerived().TransformExpr(E->getBase());
10845   if (Base.isInvalid())
10846     return ExprError();
10847 
10848   ExprResult LowerBound;
10849   if (E->getLowerBound()) {
10850     LowerBound = getDerived().TransformExpr(E->getLowerBound());
10851     if (LowerBound.isInvalid())
10852       return ExprError();
10853   }
10854 
10855   ExprResult Length;
10856   if (E->getLength()) {
10857     Length = getDerived().TransformExpr(E->getLength());
10858     if (Length.isInvalid())
10859       return ExprError();
10860   }
10861 
10862   ExprResult Stride;
10863   if (Expr *Str = E->getStride()) {
10864     Stride = getDerived().TransformExpr(Str);
10865     if (Stride.isInvalid())
10866       return ExprError();
10867   }
10868 
10869   if (!getDerived().AlwaysRebuild() && Base.get() == E->getBase() &&
10870       LowerBound.get() == E->getLowerBound() && Length.get() == E->getLength())
10871     return E;
10872 
10873   return getDerived().RebuildOMPArraySectionExpr(
10874       Base.get(), E->getBase()->getEndLoc(), LowerBound.get(),
10875       E->getColonLocFirst(), E->getColonLocSecond(), Length.get(), Stride.get(),
10876       E->getRBracketLoc());
10877 }
10878 
10879 template <typename Derived>
10880 ExprResult
10881 TreeTransform<Derived>::TransformOMPArrayShapingExpr(OMPArrayShapingExpr *E) {
10882   ExprResult Base = getDerived().TransformExpr(E->getBase());
10883   if (Base.isInvalid())
10884     return ExprError();
10885 
10886   SmallVector<Expr *, 4> Dims;
10887   bool ErrorFound = false;
10888   for (Expr *Dim : E->getDimensions()) {
10889     ExprResult DimRes = getDerived().TransformExpr(Dim);
10890     if (DimRes.isInvalid()) {
10891       ErrorFound = true;
10892       continue;
10893     }
10894     Dims.push_back(DimRes.get());
10895   }
10896 
10897   if (ErrorFound)
10898     return ExprError();
10899   return getDerived().RebuildOMPArrayShapingExpr(Base.get(), E->getLParenLoc(),
10900                                                  E->getRParenLoc(), Dims,
10901                                                  E->getBracketsRanges());
10902 }
10903 
10904 template <typename Derived>
10905 ExprResult
10906 TreeTransform<Derived>::TransformOMPIteratorExpr(OMPIteratorExpr *E) {
10907   unsigned NumIterators = E->numOfIterators();
10908   SmallVector<Sema::OMPIteratorData, 4> Data(NumIterators);
10909 
10910   bool ErrorFound = false;
10911   bool NeedToRebuild = getDerived().AlwaysRebuild();
10912   for (unsigned I = 0; I < NumIterators; ++I) {
10913     auto *D = cast<VarDecl>(E->getIteratorDecl(I));
10914     Data[I].DeclIdent = D->getIdentifier();
10915     Data[I].DeclIdentLoc = D->getLocation();
10916     if (D->getLocation() == D->getBeginLoc()) {
10917       assert(SemaRef.Context.hasSameType(D->getType(), SemaRef.Context.IntTy) &&
10918              "Implicit type must be int.");
10919     } else {
10920       TypeSourceInfo *TSI = getDerived().TransformType(D->getTypeSourceInfo());
10921       QualType DeclTy = getDerived().TransformType(D->getType());
10922       Data[I].Type = SemaRef.CreateParsedType(DeclTy, TSI);
10923     }
10924     OMPIteratorExpr::IteratorRange Range = E->getIteratorRange(I);
10925     ExprResult Begin = getDerived().TransformExpr(Range.Begin);
10926     ExprResult End = getDerived().TransformExpr(Range.End);
10927     ExprResult Step = getDerived().TransformExpr(Range.Step);
10928     ErrorFound = ErrorFound ||
10929                  !(!D->getTypeSourceInfo() || (Data[I].Type.getAsOpaquePtr() &&
10930                                                !Data[I].Type.get().isNull())) ||
10931                  Begin.isInvalid() || End.isInvalid() || Step.isInvalid();
10932     if (ErrorFound)
10933       continue;
10934     Data[I].Range.Begin = Begin.get();
10935     Data[I].Range.End = End.get();
10936     Data[I].Range.Step = Step.get();
10937     Data[I].AssignLoc = E->getAssignLoc(I);
10938     Data[I].ColonLoc = E->getColonLoc(I);
10939     Data[I].SecColonLoc = E->getSecondColonLoc(I);
10940     NeedToRebuild =
10941         NeedToRebuild ||
10942         (D->getTypeSourceInfo() && Data[I].Type.get().getTypePtrOrNull() !=
10943                                        D->getType().getTypePtrOrNull()) ||
10944         Range.Begin != Data[I].Range.Begin || Range.End != Data[I].Range.End ||
10945         Range.Step != Data[I].Range.Step;
10946   }
10947   if (ErrorFound)
10948     return ExprError();
10949   if (!NeedToRebuild)
10950     return E;
10951 
10952   ExprResult Res = getDerived().RebuildOMPIteratorExpr(
10953       E->getIteratorKwLoc(), E->getLParenLoc(), E->getRParenLoc(), Data);
10954   if (!Res.isUsable())
10955     return Res;
10956   auto *IE = cast<OMPIteratorExpr>(Res.get());
10957   for (unsigned I = 0; I < NumIterators; ++I)
10958     getDerived().transformedLocalDecl(E->getIteratorDecl(I),
10959                                       IE->getIteratorDecl(I));
10960   return Res;
10961 }
10962 
10963 template<typename Derived>
10964 ExprResult
10965 TreeTransform<Derived>::TransformCallExpr(CallExpr *E) {
10966   // Transform the callee.
10967   ExprResult Callee = getDerived().TransformExpr(E->getCallee());
10968   if (Callee.isInvalid())
10969     return ExprError();
10970 
10971   // Transform arguments.
10972   bool ArgChanged = false;
10973   SmallVector<Expr*, 8> Args;
10974   if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
10975                                   &ArgChanged))
10976     return ExprError();
10977 
10978   if (!getDerived().AlwaysRebuild() &&
10979       Callee.get() == E->getCallee() &&
10980       !ArgChanged)
10981     return SemaRef.MaybeBindToTemporary(E);
10982 
10983   // FIXME: Wrong source location information for the '('.
10984   SourceLocation FakeLParenLoc
10985     = ((Expr *)Callee.get())->getSourceRange().getBegin();
10986 
10987   Sema::FPFeaturesStateRAII FPFeaturesState(getSema());
10988   if (E->hasStoredFPFeatures()) {
10989     FPOptionsOverride NewOverrides = E->getFPFeatures();
10990     getSema().CurFPFeatures =
10991         NewOverrides.applyOverrides(getSema().getLangOpts());
10992     getSema().FpPragmaStack.CurrentValue = NewOverrides;
10993   }
10994 
10995   return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc,
10996                                       Args,
10997                                       E->getRParenLoc());
10998 }
10999 
11000 template<typename Derived>
11001 ExprResult
11002 TreeTransform<Derived>::TransformMemberExpr(MemberExpr *E) {
11003   ExprResult Base = getDerived().TransformExpr(E->getBase());
11004   if (Base.isInvalid())
11005     return ExprError();
11006 
11007   NestedNameSpecifierLoc QualifierLoc;
11008   if (E->hasQualifier()) {
11009     QualifierLoc
11010       = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
11011 
11012     if (!QualifierLoc)
11013       return ExprError();
11014   }
11015   SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc();
11016 
11017   ValueDecl *Member
11018     = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getMemberLoc(),
11019                                                          E->getMemberDecl()));
11020   if (!Member)
11021     return ExprError();
11022 
11023   NamedDecl *FoundDecl = E->getFoundDecl();
11024   if (FoundDecl == E->getMemberDecl()) {
11025     FoundDecl = Member;
11026   } else {
11027     FoundDecl = cast_or_null<NamedDecl>(
11028                    getDerived().TransformDecl(E->getMemberLoc(), FoundDecl));
11029     if (!FoundDecl)
11030       return ExprError();
11031   }
11032 
11033   if (!getDerived().AlwaysRebuild() &&
11034       Base.get() == E->getBase() &&
11035       QualifierLoc == E->getQualifierLoc() &&
11036       Member == E->getMemberDecl() &&
11037       FoundDecl == E->getFoundDecl() &&
11038       !E->hasExplicitTemplateArgs()) {
11039 
11040     // Mark it referenced in the new context regardless.
11041     // FIXME: this is a bit instantiation-specific.
11042     SemaRef.MarkMemberReferenced(E);
11043 
11044     return E;
11045   }
11046 
11047   TemplateArgumentListInfo TransArgs;
11048   if (E->hasExplicitTemplateArgs()) {
11049     TransArgs.setLAngleLoc(E->getLAngleLoc());
11050     TransArgs.setRAngleLoc(E->getRAngleLoc());
11051     if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
11052                                                 E->getNumTemplateArgs(),
11053                                                 TransArgs))
11054       return ExprError();
11055   }
11056 
11057   // FIXME: Bogus source location for the operator
11058   SourceLocation FakeOperatorLoc =
11059       SemaRef.getLocForEndOfToken(E->getBase()->getSourceRange().getEnd());
11060 
11061   // FIXME: to do this check properly, we will need to preserve the
11062   // first-qualifier-in-scope here, just in case we had a dependent
11063   // base (and therefore couldn't do the check) and a
11064   // nested-name-qualifier (and therefore could do the lookup).
11065   NamedDecl *FirstQualifierInScope = nullptr;
11066   DeclarationNameInfo MemberNameInfo = E->getMemberNameInfo();
11067   if (MemberNameInfo.getName()) {
11068     MemberNameInfo = getDerived().TransformDeclarationNameInfo(MemberNameInfo);
11069     if (!MemberNameInfo.getName())
11070       return ExprError();
11071   }
11072 
11073   return getDerived().RebuildMemberExpr(Base.get(), FakeOperatorLoc,
11074                                         E->isArrow(),
11075                                         QualifierLoc,
11076                                         TemplateKWLoc,
11077                                         MemberNameInfo,
11078                                         Member,
11079                                         FoundDecl,
11080                                         (E->hasExplicitTemplateArgs()
11081                                            ? &TransArgs : nullptr),
11082                                         FirstQualifierInScope);
11083 }
11084 
11085 template<typename Derived>
11086 ExprResult
11087 TreeTransform<Derived>::TransformBinaryOperator(BinaryOperator *E) {
11088   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
11089   if (LHS.isInvalid())
11090     return ExprError();
11091 
11092   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
11093   if (RHS.isInvalid())
11094     return ExprError();
11095 
11096   if (!getDerived().AlwaysRebuild() &&
11097       LHS.get() == E->getLHS() &&
11098       RHS.get() == E->getRHS())
11099     return E;
11100 
11101   if (E->isCompoundAssignmentOp())
11102     // FPFeatures has already been established from trailing storage
11103     return getDerived().RebuildBinaryOperator(
11104         E->getOperatorLoc(), E->getOpcode(), LHS.get(), RHS.get());
11105   Sema::FPFeaturesStateRAII FPFeaturesState(getSema());
11106   FPOptionsOverride NewOverrides(E->getFPFeatures(getSema().getLangOpts()));
11107   getSema().CurFPFeatures =
11108       NewOverrides.applyOverrides(getSema().getLangOpts());
11109   getSema().FpPragmaStack.CurrentValue = NewOverrides;
11110   return getDerived().RebuildBinaryOperator(E->getOperatorLoc(), E->getOpcode(),
11111                                             LHS.get(), RHS.get());
11112 }
11113 
11114 template <typename Derived>
11115 ExprResult TreeTransform<Derived>::TransformCXXRewrittenBinaryOperator(
11116     CXXRewrittenBinaryOperator *E) {
11117   CXXRewrittenBinaryOperator::DecomposedForm Decomp = E->getDecomposedForm();
11118 
11119   ExprResult LHS = getDerived().TransformExpr(const_cast<Expr*>(Decomp.LHS));
11120   if (LHS.isInvalid())
11121     return ExprError();
11122 
11123   ExprResult RHS = getDerived().TransformExpr(const_cast<Expr*>(Decomp.RHS));
11124   if (RHS.isInvalid())
11125     return ExprError();
11126 
11127   // Extract the already-resolved callee declarations so that we can restrict
11128   // ourselves to using them as the unqualified lookup results when rebuilding.
11129   UnresolvedSet<2> UnqualLookups;
11130   bool ChangedAnyLookups = false;
11131   Expr *PossibleBinOps[] = {E->getSemanticForm(),
11132                             const_cast<Expr *>(Decomp.InnerBinOp)};
11133   for (Expr *PossibleBinOp : PossibleBinOps) {
11134     auto *Op = dyn_cast<CXXOperatorCallExpr>(PossibleBinOp->IgnoreImplicit());
11135     if (!Op)
11136       continue;
11137     auto *Callee = dyn_cast<DeclRefExpr>(Op->getCallee()->IgnoreImplicit());
11138     if (!Callee || isa<CXXMethodDecl>(Callee->getDecl()))
11139       continue;
11140 
11141     // Transform the callee in case we built a call to a local extern
11142     // declaration.
11143     NamedDecl *Found = cast_or_null<NamedDecl>(getDerived().TransformDecl(
11144         E->getOperatorLoc(), Callee->getFoundDecl()));
11145     if (!Found)
11146       return ExprError();
11147     if (Found != Callee->getFoundDecl())
11148       ChangedAnyLookups = true;
11149     UnqualLookups.addDecl(Found);
11150   }
11151 
11152   if (!getDerived().AlwaysRebuild() && !ChangedAnyLookups &&
11153       LHS.get() == Decomp.LHS && RHS.get() == Decomp.RHS) {
11154     // Mark all functions used in the rewrite as referenced. Note that when
11155     // a < b is rewritten to (a <=> b) < 0, both the <=> and the < might be
11156     // function calls, and/or there might be a user-defined conversion sequence
11157     // applied to the operands of the <.
11158     // FIXME: this is a bit instantiation-specific.
11159     const Expr *StopAt[] = {Decomp.LHS, Decomp.RHS};
11160     SemaRef.MarkDeclarationsReferencedInExpr(E, false, StopAt);
11161     return E;
11162   }
11163 
11164   return getDerived().RebuildCXXRewrittenBinaryOperator(
11165       E->getOperatorLoc(), Decomp.Opcode, UnqualLookups, LHS.get(), RHS.get());
11166 }
11167 
11168 template<typename Derived>
11169 ExprResult
11170 TreeTransform<Derived>::TransformCompoundAssignOperator(
11171                                                       CompoundAssignOperator *E) {
11172   Sema::FPFeaturesStateRAII FPFeaturesState(getSema());
11173   FPOptionsOverride NewOverrides(E->getFPFeatures(getSema().getLangOpts()));
11174   getSema().CurFPFeatures =
11175       NewOverrides.applyOverrides(getSema().getLangOpts());
11176   getSema().FpPragmaStack.CurrentValue = NewOverrides;
11177   return getDerived().TransformBinaryOperator(E);
11178 }
11179 
11180 template<typename Derived>
11181 ExprResult TreeTransform<Derived>::
11182 TransformBinaryConditionalOperator(BinaryConditionalOperator *e) {
11183   // Just rebuild the common and RHS expressions and see whether we
11184   // get any changes.
11185 
11186   ExprResult commonExpr = getDerived().TransformExpr(e->getCommon());
11187   if (commonExpr.isInvalid())
11188     return ExprError();
11189 
11190   ExprResult rhs = getDerived().TransformExpr(e->getFalseExpr());
11191   if (rhs.isInvalid())
11192     return ExprError();
11193 
11194   if (!getDerived().AlwaysRebuild() &&
11195       commonExpr.get() == e->getCommon() &&
11196       rhs.get() == e->getFalseExpr())
11197     return e;
11198 
11199   return getDerived().RebuildConditionalOperator(commonExpr.get(),
11200                                                  e->getQuestionLoc(),
11201                                                  nullptr,
11202                                                  e->getColonLoc(),
11203                                                  rhs.get());
11204 }
11205 
11206 template<typename Derived>
11207 ExprResult
11208 TreeTransform<Derived>::TransformConditionalOperator(ConditionalOperator *E) {
11209   ExprResult Cond = getDerived().TransformExpr(E->getCond());
11210   if (Cond.isInvalid())
11211     return ExprError();
11212 
11213   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
11214   if (LHS.isInvalid())
11215     return ExprError();
11216 
11217   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
11218   if (RHS.isInvalid())
11219     return ExprError();
11220 
11221   if (!getDerived().AlwaysRebuild() &&
11222       Cond.get() == E->getCond() &&
11223       LHS.get() == E->getLHS() &&
11224       RHS.get() == E->getRHS())
11225     return E;
11226 
11227   return getDerived().RebuildConditionalOperator(Cond.get(),
11228                                                  E->getQuestionLoc(),
11229                                                  LHS.get(),
11230                                                  E->getColonLoc(),
11231                                                  RHS.get());
11232 }
11233 
11234 template<typename Derived>
11235 ExprResult
11236 TreeTransform<Derived>::TransformImplicitCastExpr(ImplicitCastExpr *E) {
11237   // Implicit casts are eliminated during transformation, since they
11238   // will be recomputed by semantic analysis after transformation.
11239   return getDerived().TransformExpr(E->getSubExprAsWritten());
11240 }
11241 
11242 template<typename Derived>
11243 ExprResult
11244 TreeTransform<Derived>::TransformCStyleCastExpr(CStyleCastExpr *E) {
11245   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten());
11246   if (!Type)
11247     return ExprError();
11248 
11249   ExprResult SubExpr
11250     = getDerived().TransformExpr(E->getSubExprAsWritten());
11251   if (SubExpr.isInvalid())
11252     return ExprError();
11253 
11254   if (!getDerived().AlwaysRebuild() &&
11255       Type == E->getTypeInfoAsWritten() &&
11256       SubExpr.get() == E->getSubExpr())
11257     return E;
11258 
11259   return getDerived().RebuildCStyleCastExpr(E->getLParenLoc(),
11260                                             Type,
11261                                             E->getRParenLoc(),
11262                                             SubExpr.get());
11263 }
11264 
11265 template<typename Derived>
11266 ExprResult
11267 TreeTransform<Derived>::TransformCompoundLiteralExpr(CompoundLiteralExpr *E) {
11268   TypeSourceInfo *OldT = E->getTypeSourceInfo();
11269   TypeSourceInfo *NewT = getDerived().TransformType(OldT);
11270   if (!NewT)
11271     return ExprError();
11272 
11273   ExprResult Init = getDerived().TransformExpr(E->getInitializer());
11274   if (Init.isInvalid())
11275     return ExprError();
11276 
11277   if (!getDerived().AlwaysRebuild() &&
11278       OldT == NewT &&
11279       Init.get() == E->getInitializer())
11280     return SemaRef.MaybeBindToTemporary(E);
11281 
11282   // Note: the expression type doesn't necessarily match the
11283   // type-as-written, but that's okay, because it should always be
11284   // derivable from the initializer.
11285 
11286   return getDerived().RebuildCompoundLiteralExpr(
11287       E->getLParenLoc(), NewT,
11288       /*FIXME:*/ E->getInitializer()->getEndLoc(), Init.get());
11289 }
11290 
11291 template<typename Derived>
11292 ExprResult
11293 TreeTransform<Derived>::TransformExtVectorElementExpr(ExtVectorElementExpr *E) {
11294   ExprResult Base = getDerived().TransformExpr(E->getBase());
11295   if (Base.isInvalid())
11296     return ExprError();
11297 
11298   if (!getDerived().AlwaysRebuild() &&
11299       Base.get() == E->getBase())
11300     return E;
11301 
11302   // FIXME: Bad source location
11303   SourceLocation FakeOperatorLoc =
11304       SemaRef.getLocForEndOfToken(E->getBase()->getEndLoc());
11305   return getDerived().RebuildExtVectorElementExpr(Base.get(), FakeOperatorLoc,
11306                                                   E->getAccessorLoc(),
11307                                                   E->getAccessor());
11308 }
11309 
11310 template<typename Derived>
11311 ExprResult
11312 TreeTransform<Derived>::TransformInitListExpr(InitListExpr *E) {
11313   if (InitListExpr *Syntactic = E->getSyntacticForm())
11314     E = Syntactic;
11315 
11316   bool InitChanged = false;
11317 
11318   EnterExpressionEvaluationContext Context(
11319       getSema(), EnterExpressionEvaluationContext::InitList);
11320 
11321   SmallVector<Expr*, 4> Inits;
11322   if (getDerived().TransformExprs(E->getInits(), E->getNumInits(), false,
11323                                   Inits, &InitChanged))
11324     return ExprError();
11325 
11326   if (!getDerived().AlwaysRebuild() && !InitChanged) {
11327     // FIXME: Attempt to reuse the existing syntactic form of the InitListExpr
11328     // in some cases. We can't reuse it in general, because the syntactic and
11329     // semantic forms are linked, and we can't know that semantic form will
11330     // match even if the syntactic form does.
11331   }
11332 
11333   return getDerived().RebuildInitList(E->getLBraceLoc(), Inits,
11334                                       E->getRBraceLoc());
11335 }
11336 
11337 template<typename Derived>
11338 ExprResult
11339 TreeTransform<Derived>::TransformDesignatedInitExpr(DesignatedInitExpr *E) {
11340   Designation Desig;
11341 
11342   // transform the initializer value
11343   ExprResult Init = getDerived().TransformExpr(E->getInit());
11344   if (Init.isInvalid())
11345     return ExprError();
11346 
11347   // transform the designators.
11348   SmallVector<Expr*, 4> ArrayExprs;
11349   bool ExprChanged = false;
11350   for (const DesignatedInitExpr::Designator &D : E->designators()) {
11351     if (D.isFieldDesignator()) {
11352       Desig.AddDesignator(Designator::getField(D.getFieldName(),
11353                                                D.getDotLoc(),
11354                                                D.getFieldLoc()));
11355       if (D.getField()) {
11356         FieldDecl *Field = cast_or_null<FieldDecl>(
11357             getDerived().TransformDecl(D.getFieldLoc(), D.getField()));
11358         if (Field != D.getField())
11359           // Rebuild the expression when the transformed FieldDecl is
11360           // different to the already assigned FieldDecl.
11361           ExprChanged = true;
11362       } else {
11363         // Ensure that the designator expression is rebuilt when there isn't
11364         // a resolved FieldDecl in the designator as we don't want to assign
11365         // a FieldDecl to a pattern designator that will be instantiated again.
11366         ExprChanged = true;
11367       }
11368       continue;
11369     }
11370 
11371     if (D.isArrayDesignator()) {
11372       ExprResult Index = getDerived().TransformExpr(E->getArrayIndex(D));
11373       if (Index.isInvalid())
11374         return ExprError();
11375 
11376       Desig.AddDesignator(
11377           Designator::getArray(Index.get(), D.getLBracketLoc()));
11378 
11379       ExprChanged = ExprChanged || Init.get() != E->getArrayIndex(D);
11380       ArrayExprs.push_back(Index.get());
11381       continue;
11382     }
11383 
11384     assert(D.isArrayRangeDesignator() && "New kind of designator?");
11385     ExprResult Start
11386       = getDerived().TransformExpr(E->getArrayRangeStart(D));
11387     if (Start.isInvalid())
11388       return ExprError();
11389 
11390     ExprResult End = getDerived().TransformExpr(E->getArrayRangeEnd(D));
11391     if (End.isInvalid())
11392       return ExprError();
11393 
11394     Desig.AddDesignator(Designator::getArrayRange(Start.get(),
11395                                                   End.get(),
11396                                                   D.getLBracketLoc(),
11397                                                   D.getEllipsisLoc()));
11398 
11399     ExprChanged = ExprChanged || Start.get() != E->getArrayRangeStart(D) ||
11400                   End.get() != E->getArrayRangeEnd(D);
11401 
11402     ArrayExprs.push_back(Start.get());
11403     ArrayExprs.push_back(End.get());
11404   }
11405 
11406   if (!getDerived().AlwaysRebuild() &&
11407       Init.get() == E->getInit() &&
11408       !ExprChanged)
11409     return E;
11410 
11411   return getDerived().RebuildDesignatedInitExpr(Desig, ArrayExprs,
11412                                                 E->getEqualOrColonLoc(),
11413                                                 E->usesGNUSyntax(), Init.get());
11414 }
11415 
11416 // Seems that if TransformInitListExpr() only works on the syntactic form of an
11417 // InitListExpr, then a DesignatedInitUpdateExpr is not encountered.
11418 template<typename Derived>
11419 ExprResult
11420 TreeTransform<Derived>::TransformDesignatedInitUpdateExpr(
11421     DesignatedInitUpdateExpr *E) {
11422   llvm_unreachable("Unexpected DesignatedInitUpdateExpr in syntactic form of "
11423                    "initializer");
11424   return ExprError();
11425 }
11426 
11427 template<typename Derived>
11428 ExprResult
11429 TreeTransform<Derived>::TransformNoInitExpr(
11430     NoInitExpr *E) {
11431   llvm_unreachable("Unexpected NoInitExpr in syntactic form of initializer");
11432   return ExprError();
11433 }
11434 
11435 template<typename Derived>
11436 ExprResult
11437 TreeTransform<Derived>::TransformArrayInitLoopExpr(ArrayInitLoopExpr *E) {
11438   llvm_unreachable("Unexpected ArrayInitLoopExpr outside of initializer");
11439   return ExprError();
11440 }
11441 
11442 template<typename Derived>
11443 ExprResult
11444 TreeTransform<Derived>::TransformArrayInitIndexExpr(ArrayInitIndexExpr *E) {
11445   llvm_unreachable("Unexpected ArrayInitIndexExpr outside of initializer");
11446   return ExprError();
11447 }
11448 
11449 template<typename Derived>
11450 ExprResult
11451 TreeTransform<Derived>::TransformImplicitValueInitExpr(
11452                                                      ImplicitValueInitExpr *E) {
11453   TemporaryBase Rebase(*this, E->getBeginLoc(), DeclarationName());
11454 
11455   // FIXME: Will we ever have proper type location here? Will we actually
11456   // need to transform the type?
11457   QualType T = getDerived().TransformType(E->getType());
11458   if (T.isNull())
11459     return ExprError();
11460 
11461   if (!getDerived().AlwaysRebuild() &&
11462       T == E->getType())
11463     return E;
11464 
11465   return getDerived().RebuildImplicitValueInitExpr(T);
11466 }
11467 
11468 template<typename Derived>
11469 ExprResult
11470 TreeTransform<Derived>::TransformVAArgExpr(VAArgExpr *E) {
11471   TypeSourceInfo *TInfo = getDerived().TransformType(E->getWrittenTypeInfo());
11472   if (!TInfo)
11473     return ExprError();
11474 
11475   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
11476   if (SubExpr.isInvalid())
11477     return ExprError();
11478 
11479   if (!getDerived().AlwaysRebuild() &&
11480       TInfo == E->getWrittenTypeInfo() &&
11481       SubExpr.get() == E->getSubExpr())
11482     return E;
11483 
11484   return getDerived().RebuildVAArgExpr(E->getBuiltinLoc(), SubExpr.get(),
11485                                        TInfo, E->getRParenLoc());
11486 }
11487 
11488 template<typename Derived>
11489 ExprResult
11490 TreeTransform<Derived>::TransformParenListExpr(ParenListExpr *E) {
11491   bool ArgumentChanged = false;
11492   SmallVector<Expr*, 4> Inits;
11493   if (TransformExprs(E->getExprs(), E->getNumExprs(), true, Inits,
11494                      &ArgumentChanged))
11495     return ExprError();
11496 
11497   return getDerived().RebuildParenListExpr(E->getLParenLoc(),
11498                                            Inits,
11499                                            E->getRParenLoc());
11500 }
11501 
11502 /// Transform an address-of-label expression.
11503 ///
11504 /// By default, the transformation of an address-of-label expression always
11505 /// rebuilds the expression, so that the label identifier can be resolved to
11506 /// the corresponding label statement by semantic analysis.
11507 template<typename Derived>
11508 ExprResult
11509 TreeTransform<Derived>::TransformAddrLabelExpr(AddrLabelExpr *E) {
11510   Decl *LD = getDerived().TransformDecl(E->getLabel()->getLocation(),
11511                                         E->getLabel());
11512   if (!LD)
11513     return ExprError();
11514 
11515   return getDerived().RebuildAddrLabelExpr(E->getAmpAmpLoc(), E->getLabelLoc(),
11516                                            cast<LabelDecl>(LD));
11517 }
11518 
11519 template<typename Derived>
11520 ExprResult
11521 TreeTransform<Derived>::TransformStmtExpr(StmtExpr *E) {
11522   SemaRef.ActOnStartStmtExpr();
11523   StmtResult SubStmt
11524     = getDerived().TransformCompoundStmt(E->getSubStmt(), true);
11525   if (SubStmt.isInvalid()) {
11526     SemaRef.ActOnStmtExprError();
11527     return ExprError();
11528   }
11529 
11530   unsigned OldDepth = E->getTemplateDepth();
11531   unsigned NewDepth = getDerived().TransformTemplateDepth(OldDepth);
11532 
11533   if (!getDerived().AlwaysRebuild() && OldDepth == NewDepth &&
11534       SubStmt.get() == E->getSubStmt()) {
11535     // Calling this an 'error' is unintuitive, but it does the right thing.
11536     SemaRef.ActOnStmtExprError();
11537     return SemaRef.MaybeBindToTemporary(E);
11538   }
11539 
11540   return getDerived().RebuildStmtExpr(E->getLParenLoc(), SubStmt.get(),
11541                                       E->getRParenLoc(), NewDepth);
11542 }
11543 
11544 template<typename Derived>
11545 ExprResult
11546 TreeTransform<Derived>::TransformChooseExpr(ChooseExpr *E) {
11547   ExprResult Cond = getDerived().TransformExpr(E->getCond());
11548   if (Cond.isInvalid())
11549     return ExprError();
11550 
11551   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
11552   if (LHS.isInvalid())
11553     return ExprError();
11554 
11555   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
11556   if (RHS.isInvalid())
11557     return ExprError();
11558 
11559   if (!getDerived().AlwaysRebuild() &&
11560       Cond.get() == E->getCond() &&
11561       LHS.get() == E->getLHS() &&
11562       RHS.get() == E->getRHS())
11563     return E;
11564 
11565   return getDerived().RebuildChooseExpr(E->getBuiltinLoc(),
11566                                         Cond.get(), LHS.get(), RHS.get(),
11567                                         E->getRParenLoc());
11568 }
11569 
11570 template<typename Derived>
11571 ExprResult
11572 TreeTransform<Derived>::TransformGNUNullExpr(GNUNullExpr *E) {
11573   return E;
11574 }
11575 
11576 template<typename Derived>
11577 ExprResult
11578 TreeTransform<Derived>::TransformCXXOperatorCallExpr(CXXOperatorCallExpr *E) {
11579   switch (E->getOperator()) {
11580   case OO_New:
11581   case OO_Delete:
11582   case OO_Array_New:
11583   case OO_Array_Delete:
11584     llvm_unreachable("new and delete operators cannot use CXXOperatorCallExpr");
11585 
11586   case OO_Subscript:
11587   case OO_Call: {
11588     // This is a call to an object's operator().
11589     assert(E->getNumArgs() >= 1 && "Object call is missing arguments");
11590 
11591     // Transform the object itself.
11592     ExprResult Object = getDerived().TransformExpr(E->getArg(0));
11593     if (Object.isInvalid())
11594       return ExprError();
11595 
11596     // FIXME: Poor location information
11597     SourceLocation FakeLParenLoc = SemaRef.getLocForEndOfToken(
11598         static_cast<Expr *>(Object.get())->getEndLoc());
11599 
11600     // Transform the call arguments.
11601     SmallVector<Expr*, 8> Args;
11602     if (getDerived().TransformExprs(E->getArgs() + 1, E->getNumArgs() - 1, true,
11603                                     Args))
11604       return ExprError();
11605 
11606     if (E->getOperator() == OO_Subscript)
11607       return getDerived().RebuildCxxSubscriptExpr(Object.get(), FakeLParenLoc,
11608                                                   Args, E->getEndLoc());
11609 
11610     return getDerived().RebuildCallExpr(Object.get(), FakeLParenLoc, Args,
11611                                         E->getEndLoc());
11612   }
11613 
11614 #define OVERLOADED_OPERATOR(Name, Spelling, Token, Unary, Binary, MemberOnly)  \
11615   case OO_##Name:                                                              \
11616     break;
11617 
11618 #define OVERLOADED_OPERATOR_MULTI(Name,Spelling,Unary,Binary,MemberOnly)
11619 #include "clang/Basic/OperatorKinds.def"
11620 
11621   case OO_Conditional:
11622     llvm_unreachable("conditional operator is not actually overloadable");
11623 
11624   case OO_None:
11625   case NUM_OVERLOADED_OPERATORS:
11626     llvm_unreachable("not an overloaded operator?");
11627   }
11628 
11629   ExprResult Callee = getDerived().TransformExpr(E->getCallee());
11630   if (Callee.isInvalid())
11631     return ExprError();
11632 
11633   ExprResult First;
11634   if (E->getOperator() == OO_Amp)
11635     First = getDerived().TransformAddressOfOperand(E->getArg(0));
11636   else
11637     First = getDerived().TransformExpr(E->getArg(0));
11638   if (First.isInvalid())
11639     return ExprError();
11640 
11641   ExprResult Second;
11642   if (E->getNumArgs() == 2) {
11643     Second = getDerived().TransformExpr(E->getArg(1));
11644     if (Second.isInvalid())
11645       return ExprError();
11646   }
11647 
11648   if (!getDerived().AlwaysRebuild() &&
11649       Callee.get() == E->getCallee() &&
11650       First.get() == E->getArg(0) &&
11651       (E->getNumArgs() != 2 || Second.get() == E->getArg(1)))
11652     return SemaRef.MaybeBindToTemporary(E);
11653 
11654   Sema::FPFeaturesStateRAII FPFeaturesState(getSema());
11655   FPOptionsOverride NewOverrides(E->getFPFeatures());
11656   getSema().CurFPFeatures =
11657       NewOverrides.applyOverrides(getSema().getLangOpts());
11658   getSema().FpPragmaStack.CurrentValue = NewOverrides;
11659 
11660   return getDerived().RebuildCXXOperatorCallExpr(E->getOperator(),
11661                                                  E->getOperatorLoc(),
11662                                                  Callee.get(),
11663                                                  First.get(),
11664                                                  Second.get());
11665 }
11666 
11667 template<typename Derived>
11668 ExprResult
11669 TreeTransform<Derived>::TransformCXXMemberCallExpr(CXXMemberCallExpr *E) {
11670   return getDerived().TransformCallExpr(E);
11671 }
11672 
11673 template <typename Derived>
11674 ExprResult TreeTransform<Derived>::TransformSourceLocExpr(SourceLocExpr *E) {
11675   bool NeedRebuildFunc = E->getIdentKind() == SourceLocExpr::Function &&
11676                          getSema().CurContext != E->getParentContext();
11677 
11678   if (!getDerived().AlwaysRebuild() && !NeedRebuildFunc)
11679     return E;
11680 
11681   return getDerived().RebuildSourceLocExpr(E->getIdentKind(), E->getType(),
11682                                            E->getBeginLoc(), E->getEndLoc(),
11683                                            getSema().CurContext);
11684 }
11685 
11686 template<typename Derived>
11687 ExprResult
11688 TreeTransform<Derived>::TransformCUDAKernelCallExpr(CUDAKernelCallExpr *E) {
11689   // Transform the callee.
11690   ExprResult Callee = getDerived().TransformExpr(E->getCallee());
11691   if (Callee.isInvalid())
11692     return ExprError();
11693 
11694   // Transform exec config.
11695   ExprResult EC = getDerived().TransformCallExpr(E->getConfig());
11696   if (EC.isInvalid())
11697     return ExprError();
11698 
11699   // Transform arguments.
11700   bool ArgChanged = false;
11701   SmallVector<Expr*, 8> Args;
11702   if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
11703                                   &ArgChanged))
11704     return ExprError();
11705 
11706   if (!getDerived().AlwaysRebuild() &&
11707       Callee.get() == E->getCallee() &&
11708       !ArgChanged)
11709     return SemaRef.MaybeBindToTemporary(E);
11710 
11711   // FIXME: Wrong source location information for the '('.
11712   SourceLocation FakeLParenLoc
11713     = ((Expr *)Callee.get())->getSourceRange().getBegin();
11714   return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc,
11715                                       Args,
11716                                       E->getRParenLoc(), EC.get());
11717 }
11718 
11719 template<typename Derived>
11720 ExprResult
11721 TreeTransform<Derived>::TransformCXXNamedCastExpr(CXXNamedCastExpr *E) {
11722   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten());
11723   if (!Type)
11724     return ExprError();
11725 
11726   ExprResult SubExpr
11727     = getDerived().TransformExpr(E->getSubExprAsWritten());
11728   if (SubExpr.isInvalid())
11729     return ExprError();
11730 
11731   if (!getDerived().AlwaysRebuild() &&
11732       Type == E->getTypeInfoAsWritten() &&
11733       SubExpr.get() == E->getSubExpr())
11734     return E;
11735   return getDerived().RebuildCXXNamedCastExpr(
11736       E->getOperatorLoc(), E->getStmtClass(), E->getAngleBrackets().getBegin(),
11737       Type, E->getAngleBrackets().getEnd(),
11738       // FIXME. this should be '(' location
11739       E->getAngleBrackets().getEnd(), SubExpr.get(), E->getRParenLoc());
11740 }
11741 
11742 template<typename Derived>
11743 ExprResult
11744 TreeTransform<Derived>::TransformBuiltinBitCastExpr(BuiltinBitCastExpr *BCE) {
11745   TypeSourceInfo *TSI =
11746       getDerived().TransformType(BCE->getTypeInfoAsWritten());
11747   if (!TSI)
11748     return ExprError();
11749 
11750   ExprResult Sub = getDerived().TransformExpr(BCE->getSubExpr());
11751   if (Sub.isInvalid())
11752     return ExprError();
11753 
11754   return getDerived().RebuildBuiltinBitCastExpr(BCE->getBeginLoc(), TSI,
11755                                                 Sub.get(), BCE->getEndLoc());
11756 }
11757 
11758 template<typename Derived>
11759 ExprResult
11760 TreeTransform<Derived>::TransformCXXStaticCastExpr(CXXStaticCastExpr *E) {
11761   return getDerived().TransformCXXNamedCastExpr(E);
11762 }
11763 
11764 template<typename Derived>
11765 ExprResult
11766 TreeTransform<Derived>::TransformCXXDynamicCastExpr(CXXDynamicCastExpr *E) {
11767   return getDerived().TransformCXXNamedCastExpr(E);
11768 }
11769 
11770 template<typename Derived>
11771 ExprResult
11772 TreeTransform<Derived>::TransformCXXReinterpretCastExpr(
11773                                                       CXXReinterpretCastExpr *E) {
11774   return getDerived().TransformCXXNamedCastExpr(E);
11775 }
11776 
11777 template<typename Derived>
11778 ExprResult
11779 TreeTransform<Derived>::TransformCXXConstCastExpr(CXXConstCastExpr *E) {
11780   return getDerived().TransformCXXNamedCastExpr(E);
11781 }
11782 
11783 template<typename Derived>
11784 ExprResult
11785 TreeTransform<Derived>::TransformCXXAddrspaceCastExpr(CXXAddrspaceCastExpr *E) {
11786   return getDerived().TransformCXXNamedCastExpr(E);
11787 }
11788 
11789 template<typename Derived>
11790 ExprResult
11791 TreeTransform<Derived>::TransformCXXFunctionalCastExpr(
11792                                                      CXXFunctionalCastExpr *E) {
11793   TypeSourceInfo *Type =
11794       getDerived().TransformTypeWithDeducedTST(E->getTypeInfoAsWritten());
11795   if (!Type)
11796     return ExprError();
11797 
11798   ExprResult SubExpr
11799     = getDerived().TransformExpr(E->getSubExprAsWritten());
11800   if (SubExpr.isInvalid())
11801     return ExprError();
11802 
11803   if (!getDerived().AlwaysRebuild() &&
11804       Type == E->getTypeInfoAsWritten() &&
11805       SubExpr.get() == E->getSubExpr())
11806     return E;
11807 
11808   return getDerived().RebuildCXXFunctionalCastExpr(Type,
11809                                                    E->getLParenLoc(),
11810                                                    SubExpr.get(),
11811                                                    E->getRParenLoc(),
11812                                                    E->isListInitialization());
11813 }
11814 
11815 template<typename Derived>
11816 ExprResult
11817 TreeTransform<Derived>::TransformCXXTypeidExpr(CXXTypeidExpr *E) {
11818   if (E->isTypeOperand()) {
11819     TypeSourceInfo *TInfo
11820       = getDerived().TransformType(E->getTypeOperandSourceInfo());
11821     if (!TInfo)
11822       return ExprError();
11823 
11824     if (!getDerived().AlwaysRebuild() &&
11825         TInfo == E->getTypeOperandSourceInfo())
11826       return E;
11827 
11828     return getDerived().RebuildCXXTypeidExpr(E->getType(), E->getBeginLoc(),
11829                                              TInfo, E->getEndLoc());
11830   }
11831 
11832   // Typeid's operand is an unevaluated context, unless it's a polymorphic
11833   // type.  We must not unilaterally enter unevaluated context here, as then
11834   // semantic processing can re-transform an already transformed operand.
11835   Expr *Op = E->getExprOperand();
11836   auto EvalCtx = Sema::ExpressionEvaluationContext::Unevaluated;
11837   if (E->isGLValue())
11838     if (auto *RecordT = Op->getType()->getAs<RecordType>())
11839       if (cast<CXXRecordDecl>(RecordT->getDecl())->isPolymorphic())
11840         EvalCtx = SemaRef.ExprEvalContexts.back().Context;
11841 
11842   EnterExpressionEvaluationContext Unevaluated(SemaRef, EvalCtx,
11843                                                Sema::ReuseLambdaContextDecl);
11844 
11845   ExprResult SubExpr = getDerived().TransformExpr(Op);
11846   if (SubExpr.isInvalid())
11847     return ExprError();
11848 
11849   if (!getDerived().AlwaysRebuild() &&
11850       SubExpr.get() == E->getExprOperand())
11851     return E;
11852 
11853   return getDerived().RebuildCXXTypeidExpr(E->getType(), E->getBeginLoc(),
11854                                            SubExpr.get(), E->getEndLoc());
11855 }
11856 
11857 template<typename Derived>
11858 ExprResult
11859 TreeTransform<Derived>::TransformCXXUuidofExpr(CXXUuidofExpr *E) {
11860   if (E->isTypeOperand()) {
11861     TypeSourceInfo *TInfo
11862       = getDerived().TransformType(E->getTypeOperandSourceInfo());
11863     if (!TInfo)
11864       return ExprError();
11865 
11866     if (!getDerived().AlwaysRebuild() &&
11867         TInfo == E->getTypeOperandSourceInfo())
11868       return E;
11869 
11870     return getDerived().RebuildCXXUuidofExpr(E->getType(), E->getBeginLoc(),
11871                                              TInfo, E->getEndLoc());
11872   }
11873 
11874   EnterExpressionEvaluationContext Unevaluated(
11875       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
11876 
11877   ExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand());
11878   if (SubExpr.isInvalid())
11879     return ExprError();
11880 
11881   if (!getDerived().AlwaysRebuild() &&
11882       SubExpr.get() == E->getExprOperand())
11883     return E;
11884 
11885   return getDerived().RebuildCXXUuidofExpr(E->getType(), E->getBeginLoc(),
11886                                            SubExpr.get(), E->getEndLoc());
11887 }
11888 
11889 template<typename Derived>
11890 ExprResult
11891 TreeTransform<Derived>::TransformCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) {
11892   return E;
11893 }
11894 
11895 template<typename Derived>
11896 ExprResult
11897 TreeTransform<Derived>::TransformCXXNullPtrLiteralExpr(
11898                                                      CXXNullPtrLiteralExpr *E) {
11899   return E;
11900 }
11901 
11902 template<typename Derived>
11903 ExprResult
11904 TreeTransform<Derived>::TransformCXXThisExpr(CXXThisExpr *E) {
11905   QualType T = getSema().getCurrentThisType();
11906 
11907   if (!getDerived().AlwaysRebuild() && T == E->getType()) {
11908     // Mark it referenced in the new context regardless.
11909     // FIXME: this is a bit instantiation-specific.
11910     getSema().MarkThisReferenced(E);
11911     return E;
11912   }
11913 
11914   return getDerived().RebuildCXXThisExpr(E->getBeginLoc(), T, E->isImplicit());
11915 }
11916 
11917 template<typename Derived>
11918 ExprResult
11919 TreeTransform<Derived>::TransformCXXThrowExpr(CXXThrowExpr *E) {
11920   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
11921   if (SubExpr.isInvalid())
11922     return ExprError();
11923 
11924   if (!getDerived().AlwaysRebuild() &&
11925       SubExpr.get() == E->getSubExpr())
11926     return E;
11927 
11928   return getDerived().RebuildCXXThrowExpr(E->getThrowLoc(), SubExpr.get(),
11929                                           E->isThrownVariableInScope());
11930 }
11931 
11932 template<typename Derived>
11933 ExprResult
11934 TreeTransform<Derived>::TransformCXXDefaultArgExpr(CXXDefaultArgExpr *E) {
11935   ParmVarDecl *Param = cast_or_null<ParmVarDecl>(
11936       getDerived().TransformDecl(E->getBeginLoc(), E->getParam()));
11937   if (!Param)
11938     return ExprError();
11939 
11940   if (!getDerived().AlwaysRebuild() && Param == E->getParam() &&
11941       E->getUsedContext() == SemaRef.CurContext)
11942     return E;
11943 
11944   return getDerived().RebuildCXXDefaultArgExpr(E->getUsedLocation(), Param);
11945 }
11946 
11947 template<typename Derived>
11948 ExprResult
11949 TreeTransform<Derived>::TransformCXXDefaultInitExpr(CXXDefaultInitExpr *E) {
11950   FieldDecl *Field = cast_or_null<FieldDecl>(
11951       getDerived().TransformDecl(E->getBeginLoc(), E->getField()));
11952   if (!Field)
11953     return ExprError();
11954 
11955   if (!getDerived().AlwaysRebuild() && Field == E->getField() &&
11956       E->getUsedContext() == SemaRef.CurContext)
11957     return E;
11958 
11959   return getDerived().RebuildCXXDefaultInitExpr(E->getExprLoc(), Field);
11960 }
11961 
11962 template<typename Derived>
11963 ExprResult
11964 TreeTransform<Derived>::TransformCXXScalarValueInitExpr(
11965                                                     CXXScalarValueInitExpr *E) {
11966   TypeSourceInfo *T = getDerived().TransformType(E->getTypeSourceInfo());
11967   if (!T)
11968     return ExprError();
11969 
11970   if (!getDerived().AlwaysRebuild() &&
11971       T == E->getTypeSourceInfo())
11972     return E;
11973 
11974   return getDerived().RebuildCXXScalarValueInitExpr(T,
11975                                           /*FIXME:*/T->getTypeLoc().getEndLoc(),
11976                                                     E->getRParenLoc());
11977 }
11978 
11979 template<typename Derived>
11980 ExprResult
11981 TreeTransform<Derived>::TransformCXXNewExpr(CXXNewExpr *E) {
11982   // Transform the type that we're allocating
11983   TypeSourceInfo *AllocTypeInfo =
11984       getDerived().TransformTypeWithDeducedTST(E->getAllocatedTypeSourceInfo());
11985   if (!AllocTypeInfo)
11986     return ExprError();
11987 
11988   // Transform the size of the array we're allocating (if any).
11989   Optional<Expr *> ArraySize;
11990   if (E->isArray()) {
11991     ExprResult NewArraySize;
11992     if (Optional<Expr *> OldArraySize = E->getArraySize()) {
11993       NewArraySize = getDerived().TransformExpr(*OldArraySize);
11994       if (NewArraySize.isInvalid())
11995         return ExprError();
11996     }
11997     ArraySize = NewArraySize.get();
11998   }
11999 
12000   // Transform the placement arguments (if any).
12001   bool ArgumentChanged = false;
12002   SmallVector<Expr*, 8> PlacementArgs;
12003   if (getDerived().TransformExprs(E->getPlacementArgs(),
12004                                   E->getNumPlacementArgs(), true,
12005                                   PlacementArgs, &ArgumentChanged))
12006     return ExprError();
12007 
12008   // Transform the initializer (if any).
12009   Expr *OldInit = E->getInitializer();
12010   ExprResult NewInit;
12011   if (OldInit)
12012     NewInit = getDerived().TransformInitializer(OldInit, true);
12013   if (NewInit.isInvalid())
12014     return ExprError();
12015 
12016   // Transform new operator and delete operator.
12017   FunctionDecl *OperatorNew = nullptr;
12018   if (E->getOperatorNew()) {
12019     OperatorNew = cast_or_null<FunctionDecl>(
12020         getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorNew()));
12021     if (!OperatorNew)
12022       return ExprError();
12023   }
12024 
12025   FunctionDecl *OperatorDelete = nullptr;
12026   if (E->getOperatorDelete()) {
12027     OperatorDelete = cast_or_null<FunctionDecl>(
12028         getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorDelete()));
12029     if (!OperatorDelete)
12030       return ExprError();
12031   }
12032 
12033   if (!getDerived().AlwaysRebuild() &&
12034       AllocTypeInfo == E->getAllocatedTypeSourceInfo() &&
12035       ArraySize == E->getArraySize() &&
12036       NewInit.get() == OldInit &&
12037       OperatorNew == E->getOperatorNew() &&
12038       OperatorDelete == E->getOperatorDelete() &&
12039       !ArgumentChanged) {
12040     // Mark any declarations we need as referenced.
12041     // FIXME: instantiation-specific.
12042     if (OperatorNew)
12043       SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorNew);
12044     if (OperatorDelete)
12045       SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorDelete);
12046 
12047     if (E->isArray() && !E->getAllocatedType()->isDependentType()) {
12048       QualType ElementType
12049         = SemaRef.Context.getBaseElementType(E->getAllocatedType());
12050       if (const RecordType *RecordT = ElementType->getAs<RecordType>()) {
12051         CXXRecordDecl *Record = cast<CXXRecordDecl>(RecordT->getDecl());
12052         if (CXXDestructorDecl *Destructor = SemaRef.LookupDestructor(Record)) {
12053           SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Destructor);
12054         }
12055       }
12056     }
12057 
12058     return E;
12059   }
12060 
12061   QualType AllocType = AllocTypeInfo->getType();
12062   if (!ArraySize) {
12063     // If no array size was specified, but the new expression was
12064     // instantiated with an array type (e.g., "new T" where T is
12065     // instantiated with "int[4]"), extract the outer bound from the
12066     // array type as our array size. We do this with constant and
12067     // dependently-sized array types.
12068     const ArrayType *ArrayT = SemaRef.Context.getAsArrayType(AllocType);
12069     if (!ArrayT) {
12070       // Do nothing
12071     } else if (const ConstantArrayType *ConsArrayT
12072                                      = dyn_cast<ConstantArrayType>(ArrayT)) {
12073       ArraySize = IntegerLiteral::Create(SemaRef.Context, ConsArrayT->getSize(),
12074                                          SemaRef.Context.getSizeType(),
12075                                          /*FIXME:*/ E->getBeginLoc());
12076       AllocType = ConsArrayT->getElementType();
12077     } else if (const DependentSizedArrayType *DepArrayT
12078                               = dyn_cast<DependentSizedArrayType>(ArrayT)) {
12079       if (DepArrayT->getSizeExpr()) {
12080         ArraySize = DepArrayT->getSizeExpr();
12081         AllocType = DepArrayT->getElementType();
12082       }
12083     }
12084   }
12085 
12086   return getDerived().RebuildCXXNewExpr(
12087       E->getBeginLoc(), E->isGlobalNew(),
12088       /*FIXME:*/ E->getBeginLoc(), PlacementArgs,
12089       /*FIXME:*/ E->getBeginLoc(), E->getTypeIdParens(), AllocType,
12090       AllocTypeInfo, ArraySize, E->getDirectInitRange(), NewInit.get());
12091 }
12092 
12093 template<typename Derived>
12094 ExprResult
12095 TreeTransform<Derived>::TransformCXXDeleteExpr(CXXDeleteExpr *E) {
12096   ExprResult Operand = getDerived().TransformExpr(E->getArgument());
12097   if (Operand.isInvalid())
12098     return ExprError();
12099 
12100   // Transform the delete operator, if known.
12101   FunctionDecl *OperatorDelete = nullptr;
12102   if (E->getOperatorDelete()) {
12103     OperatorDelete = cast_or_null<FunctionDecl>(
12104         getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorDelete()));
12105     if (!OperatorDelete)
12106       return ExprError();
12107   }
12108 
12109   if (!getDerived().AlwaysRebuild() &&
12110       Operand.get() == E->getArgument() &&
12111       OperatorDelete == E->getOperatorDelete()) {
12112     // Mark any declarations we need as referenced.
12113     // FIXME: instantiation-specific.
12114     if (OperatorDelete)
12115       SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorDelete);
12116 
12117     if (!E->getArgument()->isTypeDependent()) {
12118       QualType Destroyed = SemaRef.Context.getBaseElementType(
12119                                                          E->getDestroyedType());
12120       if (const RecordType *DestroyedRec = Destroyed->getAs<RecordType>()) {
12121         CXXRecordDecl *Record = cast<CXXRecordDecl>(DestroyedRec->getDecl());
12122         SemaRef.MarkFunctionReferenced(E->getBeginLoc(),
12123                                        SemaRef.LookupDestructor(Record));
12124       }
12125     }
12126 
12127     return E;
12128   }
12129 
12130   return getDerived().RebuildCXXDeleteExpr(
12131       E->getBeginLoc(), E->isGlobalDelete(), E->isArrayForm(), Operand.get());
12132 }
12133 
12134 template<typename Derived>
12135 ExprResult
12136 TreeTransform<Derived>::TransformCXXPseudoDestructorExpr(
12137                                                      CXXPseudoDestructorExpr *E) {
12138   ExprResult Base = getDerived().TransformExpr(E->getBase());
12139   if (Base.isInvalid())
12140     return ExprError();
12141 
12142   ParsedType ObjectTypePtr;
12143   bool MayBePseudoDestructor = false;
12144   Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(),
12145                                               E->getOperatorLoc(),
12146                                         E->isArrow()? tok::arrow : tok::period,
12147                                               ObjectTypePtr,
12148                                               MayBePseudoDestructor);
12149   if (Base.isInvalid())
12150     return ExprError();
12151 
12152   QualType ObjectType = ObjectTypePtr.get();
12153   NestedNameSpecifierLoc QualifierLoc = E->getQualifierLoc();
12154   if (QualifierLoc) {
12155     QualifierLoc
12156       = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc, ObjectType);
12157     if (!QualifierLoc)
12158       return ExprError();
12159   }
12160   CXXScopeSpec SS;
12161   SS.Adopt(QualifierLoc);
12162 
12163   PseudoDestructorTypeStorage Destroyed;
12164   if (E->getDestroyedTypeInfo()) {
12165     TypeSourceInfo *DestroyedTypeInfo
12166       = getDerived().TransformTypeInObjectScope(E->getDestroyedTypeInfo(),
12167                                                 ObjectType, nullptr, SS);
12168     if (!DestroyedTypeInfo)
12169       return ExprError();
12170     Destroyed = DestroyedTypeInfo;
12171   } else if (!ObjectType.isNull() && ObjectType->isDependentType()) {
12172     // We aren't likely to be able to resolve the identifier down to a type
12173     // now anyway, so just retain the identifier.
12174     Destroyed = PseudoDestructorTypeStorage(E->getDestroyedTypeIdentifier(),
12175                                             E->getDestroyedTypeLoc());
12176   } else {
12177     // Look for a destructor known with the given name.
12178     ParsedType T = SemaRef.getDestructorName(E->getTildeLoc(),
12179                                               *E->getDestroyedTypeIdentifier(),
12180                                                 E->getDestroyedTypeLoc(),
12181                                                 /*Scope=*/nullptr,
12182                                                 SS, ObjectTypePtr,
12183                                                 false);
12184     if (!T)
12185       return ExprError();
12186 
12187     Destroyed
12188       = SemaRef.Context.getTrivialTypeSourceInfo(SemaRef.GetTypeFromParser(T),
12189                                                  E->getDestroyedTypeLoc());
12190   }
12191 
12192   TypeSourceInfo *ScopeTypeInfo = nullptr;
12193   if (E->getScopeTypeInfo()) {
12194     CXXScopeSpec EmptySS;
12195     ScopeTypeInfo = getDerived().TransformTypeInObjectScope(
12196                       E->getScopeTypeInfo(), ObjectType, nullptr, EmptySS);
12197     if (!ScopeTypeInfo)
12198       return ExprError();
12199   }
12200 
12201   return getDerived().RebuildCXXPseudoDestructorExpr(Base.get(),
12202                                                      E->getOperatorLoc(),
12203                                                      E->isArrow(),
12204                                                      SS,
12205                                                      ScopeTypeInfo,
12206                                                      E->getColonColonLoc(),
12207                                                      E->getTildeLoc(),
12208                                                      Destroyed);
12209 }
12210 
12211 template <typename Derived>
12212 bool TreeTransform<Derived>::TransformOverloadExprDecls(OverloadExpr *Old,
12213                                                         bool RequiresADL,
12214                                                         LookupResult &R) {
12215   // Transform all the decls.
12216   bool AllEmptyPacks = true;
12217   for (auto *OldD : Old->decls()) {
12218     Decl *InstD = getDerived().TransformDecl(Old->getNameLoc(), OldD);
12219     if (!InstD) {
12220       // Silently ignore these if a UsingShadowDecl instantiated to nothing.
12221       // This can happen because of dependent hiding.
12222       if (isa<UsingShadowDecl>(OldD))
12223         continue;
12224       else {
12225         R.clear();
12226         return true;
12227       }
12228     }
12229 
12230     // Expand using pack declarations.
12231     NamedDecl *SingleDecl = cast<NamedDecl>(InstD);
12232     ArrayRef<NamedDecl*> Decls = SingleDecl;
12233     if (auto *UPD = dyn_cast<UsingPackDecl>(InstD))
12234       Decls = UPD->expansions();
12235 
12236     // Expand using declarations.
12237     for (auto *D : Decls) {
12238       if (auto *UD = dyn_cast<UsingDecl>(D)) {
12239         for (auto *SD : UD->shadows())
12240           R.addDecl(SD);
12241       } else {
12242         R.addDecl(D);
12243       }
12244     }
12245 
12246     AllEmptyPacks &= Decls.empty();
12247   };
12248 
12249   // C++ [temp.res]/8.4.2:
12250   //   The program is ill-formed, no diagnostic required, if [...] lookup for
12251   //   a name in the template definition found a using-declaration, but the
12252   //   lookup in the corresponding scope in the instantiation odoes not find
12253   //   any declarations because the using-declaration was a pack expansion and
12254   //   the corresponding pack is empty
12255   if (AllEmptyPacks && !RequiresADL) {
12256     getSema().Diag(Old->getNameLoc(), diag::err_using_pack_expansion_empty)
12257         << isa<UnresolvedMemberExpr>(Old) << Old->getName();
12258     return true;
12259   }
12260 
12261   // Resolve a kind, but don't do any further analysis.  If it's
12262   // ambiguous, the callee needs to deal with it.
12263   R.resolveKind();
12264   return false;
12265 }
12266 
12267 template<typename Derived>
12268 ExprResult
12269 TreeTransform<Derived>::TransformUnresolvedLookupExpr(
12270                                                   UnresolvedLookupExpr *Old) {
12271   LookupResult R(SemaRef, Old->getName(), Old->getNameLoc(),
12272                  Sema::LookupOrdinaryName);
12273 
12274   // Transform the declaration set.
12275   if (TransformOverloadExprDecls(Old, Old->requiresADL(), R))
12276     return ExprError();
12277 
12278   // Rebuild the nested-name qualifier, if present.
12279   CXXScopeSpec SS;
12280   if (Old->getQualifierLoc()) {
12281     NestedNameSpecifierLoc QualifierLoc
12282       = getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc());
12283     if (!QualifierLoc)
12284       return ExprError();
12285 
12286     SS.Adopt(QualifierLoc);
12287   }
12288 
12289   if (Old->getNamingClass()) {
12290     CXXRecordDecl *NamingClass
12291       = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl(
12292                                                             Old->getNameLoc(),
12293                                                         Old->getNamingClass()));
12294     if (!NamingClass) {
12295       R.clear();
12296       return ExprError();
12297     }
12298 
12299     R.setNamingClass(NamingClass);
12300   }
12301 
12302   SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc();
12303 
12304   // If we have neither explicit template arguments, nor the template keyword,
12305   // it's a normal declaration name or member reference.
12306   if (!Old->hasExplicitTemplateArgs() && !TemplateKWLoc.isValid()) {
12307     NamedDecl *D = R.getAsSingle<NamedDecl>();
12308     // In a C++11 unevaluated context, an UnresolvedLookupExpr might refer to an
12309     // instance member. In other contexts, BuildPossibleImplicitMemberExpr will
12310     // give a good diagnostic.
12311     if (D && D->isCXXInstanceMember()) {
12312       return SemaRef.BuildPossibleImplicitMemberExpr(SS, TemplateKWLoc, R,
12313                                                      /*TemplateArgs=*/nullptr,
12314                                                      /*Scope=*/nullptr);
12315     }
12316 
12317     return getDerived().RebuildDeclarationNameExpr(SS, R, Old->requiresADL());
12318   }
12319 
12320   // If we have template arguments, rebuild them, then rebuild the
12321   // templateid expression.
12322   TemplateArgumentListInfo TransArgs(Old->getLAngleLoc(), Old->getRAngleLoc());
12323   if (Old->hasExplicitTemplateArgs() &&
12324       getDerived().TransformTemplateArguments(Old->getTemplateArgs(),
12325                                               Old->getNumTemplateArgs(),
12326                                               TransArgs)) {
12327     R.clear();
12328     return ExprError();
12329   }
12330 
12331   return getDerived().RebuildTemplateIdExpr(SS, TemplateKWLoc, R,
12332                                             Old->requiresADL(), &TransArgs);
12333 }
12334 
12335 template<typename Derived>
12336 ExprResult
12337 TreeTransform<Derived>::TransformTypeTraitExpr(TypeTraitExpr *E) {
12338   bool ArgChanged = false;
12339   SmallVector<TypeSourceInfo *, 4> Args;
12340   for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) {
12341     TypeSourceInfo *From = E->getArg(I);
12342     TypeLoc FromTL = From->getTypeLoc();
12343     if (!FromTL.getAs<PackExpansionTypeLoc>()) {
12344       TypeLocBuilder TLB;
12345       TLB.reserve(FromTL.getFullDataSize());
12346       QualType To = getDerived().TransformType(TLB, FromTL);
12347       if (To.isNull())
12348         return ExprError();
12349 
12350       if (To == From->getType())
12351         Args.push_back(From);
12352       else {
12353         Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
12354         ArgChanged = true;
12355       }
12356       continue;
12357     }
12358 
12359     ArgChanged = true;
12360 
12361     // We have a pack expansion. Instantiate it.
12362     PackExpansionTypeLoc ExpansionTL = FromTL.castAs<PackExpansionTypeLoc>();
12363     TypeLoc PatternTL = ExpansionTL.getPatternLoc();
12364     SmallVector<UnexpandedParameterPack, 2> Unexpanded;
12365     SemaRef.collectUnexpandedParameterPacks(PatternTL, Unexpanded);
12366 
12367     // Determine whether the set of unexpanded parameter packs can and should
12368     // be expanded.
12369     bool Expand = true;
12370     bool RetainExpansion = false;
12371     Optional<unsigned> OrigNumExpansions =
12372         ExpansionTL.getTypePtr()->getNumExpansions();
12373     Optional<unsigned> NumExpansions = OrigNumExpansions;
12374     if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(),
12375                                              PatternTL.getSourceRange(),
12376                                              Unexpanded,
12377                                              Expand, RetainExpansion,
12378                                              NumExpansions))
12379       return ExprError();
12380 
12381     if (!Expand) {
12382       // The transform has determined that we should perform a simple
12383       // transformation on the pack expansion, producing another pack
12384       // expansion.
12385       Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
12386 
12387       TypeLocBuilder TLB;
12388       TLB.reserve(From->getTypeLoc().getFullDataSize());
12389 
12390       QualType To = getDerived().TransformType(TLB, PatternTL);
12391       if (To.isNull())
12392         return ExprError();
12393 
12394       To = getDerived().RebuildPackExpansionType(To,
12395                                                  PatternTL.getSourceRange(),
12396                                                  ExpansionTL.getEllipsisLoc(),
12397                                                  NumExpansions);
12398       if (To.isNull())
12399         return ExprError();
12400 
12401       PackExpansionTypeLoc ToExpansionTL
12402         = TLB.push<PackExpansionTypeLoc>(To);
12403       ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc());
12404       Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
12405       continue;
12406     }
12407 
12408     // Expand the pack expansion by substituting for each argument in the
12409     // pack(s).
12410     for (unsigned I = 0; I != *NumExpansions; ++I) {
12411       Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(SemaRef, I);
12412       TypeLocBuilder TLB;
12413       TLB.reserve(PatternTL.getFullDataSize());
12414       QualType To = getDerived().TransformType(TLB, PatternTL);
12415       if (To.isNull())
12416         return ExprError();
12417 
12418       if (To->containsUnexpandedParameterPack()) {
12419         To = getDerived().RebuildPackExpansionType(To,
12420                                                    PatternTL.getSourceRange(),
12421                                                    ExpansionTL.getEllipsisLoc(),
12422                                                    NumExpansions);
12423         if (To.isNull())
12424           return ExprError();
12425 
12426         PackExpansionTypeLoc ToExpansionTL
12427           = TLB.push<PackExpansionTypeLoc>(To);
12428         ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc());
12429       }
12430 
12431       Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
12432     }
12433 
12434     if (!RetainExpansion)
12435       continue;
12436 
12437     // If we're supposed to retain a pack expansion, do so by temporarily
12438     // forgetting the partially-substituted parameter pack.
12439     ForgetPartiallySubstitutedPackRAII Forget(getDerived());
12440 
12441     TypeLocBuilder TLB;
12442     TLB.reserve(From->getTypeLoc().getFullDataSize());
12443 
12444     QualType To = getDerived().TransformType(TLB, PatternTL);
12445     if (To.isNull())
12446       return ExprError();
12447 
12448     To = getDerived().RebuildPackExpansionType(To,
12449                                                PatternTL.getSourceRange(),
12450                                                ExpansionTL.getEllipsisLoc(),
12451                                                NumExpansions);
12452     if (To.isNull())
12453       return ExprError();
12454 
12455     PackExpansionTypeLoc ToExpansionTL
12456       = TLB.push<PackExpansionTypeLoc>(To);
12457     ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc());
12458     Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
12459   }
12460 
12461   if (!getDerived().AlwaysRebuild() && !ArgChanged)
12462     return E;
12463 
12464   return getDerived().RebuildTypeTrait(E->getTrait(), E->getBeginLoc(), Args,
12465                                        E->getEndLoc());
12466 }
12467 
12468 template<typename Derived>
12469 ExprResult
12470 TreeTransform<Derived>::TransformConceptSpecializationExpr(
12471                                                  ConceptSpecializationExpr *E) {
12472   const ASTTemplateArgumentListInfo *Old = E->getTemplateArgsAsWritten();
12473   TemplateArgumentListInfo TransArgs(Old->LAngleLoc, Old->RAngleLoc);
12474   if (getDerived().TransformTemplateArguments(Old->getTemplateArgs(),
12475                                               Old->NumTemplateArgs, TransArgs))
12476     return ExprError();
12477 
12478   return getDerived().RebuildConceptSpecializationExpr(
12479       E->getNestedNameSpecifierLoc(), E->getTemplateKWLoc(),
12480       E->getConceptNameInfo(), E->getFoundDecl(), E->getNamedConcept(),
12481       &TransArgs);
12482 }
12483 
12484 template<typename Derived>
12485 ExprResult
12486 TreeTransform<Derived>::TransformRequiresExpr(RequiresExpr *E) {
12487   SmallVector<ParmVarDecl*, 4> TransParams;
12488   SmallVector<QualType, 4> TransParamTypes;
12489   Sema::ExtParameterInfoBuilder ExtParamInfos;
12490 
12491   // C++2a [expr.prim.req]p2
12492   // Expressions appearing within a requirement-body are unevaluated operands.
12493   EnterExpressionEvaluationContext Ctx(
12494       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
12495 
12496   RequiresExprBodyDecl *Body = RequiresExprBodyDecl::Create(
12497       getSema().Context, getSema().CurContext,
12498       E->getBody()->getBeginLoc());
12499 
12500   Sema::ContextRAII SavedContext(getSema(), Body, /*NewThisContext*/false);
12501 
12502   if (getDerived().TransformFunctionTypeParams(E->getRequiresKWLoc(),
12503                                                E->getLocalParameters(),
12504                                                /*ParamTypes=*/nullptr,
12505                                                /*ParamInfos=*/nullptr,
12506                                                TransParamTypes, &TransParams,
12507                                                ExtParamInfos))
12508     return ExprError();
12509 
12510   for (ParmVarDecl *Param : TransParams)
12511     Param->setDeclContext(Body);
12512 
12513   SmallVector<concepts::Requirement *, 4> TransReqs;
12514   if (getDerived().TransformRequiresExprRequirements(E->getRequirements(),
12515                                                      TransReqs))
12516     return ExprError();
12517 
12518   for (concepts::Requirement *Req : TransReqs) {
12519     if (auto *ER = dyn_cast<concepts::ExprRequirement>(Req)) {
12520       if (ER->getReturnTypeRequirement().isTypeConstraint()) {
12521         ER->getReturnTypeRequirement()
12522                 .getTypeConstraintTemplateParameterList()->getParam(0)
12523                 ->setDeclContext(Body);
12524       }
12525     }
12526   }
12527 
12528   return getDerived().RebuildRequiresExpr(E->getRequiresKWLoc(), Body,
12529                                           TransParams, TransReqs,
12530                                           E->getRBraceLoc());
12531 }
12532 
12533 template<typename Derived>
12534 bool TreeTransform<Derived>::TransformRequiresExprRequirements(
12535     ArrayRef<concepts::Requirement *> Reqs,
12536     SmallVectorImpl<concepts::Requirement *> &Transformed) {
12537   for (concepts::Requirement *Req : Reqs) {
12538     concepts::Requirement *TransReq = nullptr;
12539     if (auto *TypeReq = dyn_cast<concepts::TypeRequirement>(Req))
12540       TransReq = getDerived().TransformTypeRequirement(TypeReq);
12541     else if (auto *ExprReq = dyn_cast<concepts::ExprRequirement>(Req))
12542       TransReq = getDerived().TransformExprRequirement(ExprReq);
12543     else
12544       TransReq = getDerived().TransformNestedRequirement(
12545                      cast<concepts::NestedRequirement>(Req));
12546     if (!TransReq)
12547       return true;
12548     Transformed.push_back(TransReq);
12549   }
12550   return false;
12551 }
12552 
12553 template<typename Derived>
12554 concepts::TypeRequirement *
12555 TreeTransform<Derived>::TransformTypeRequirement(
12556     concepts::TypeRequirement *Req) {
12557   if (Req->isSubstitutionFailure()) {
12558     if (getDerived().AlwaysRebuild())
12559       return getDerived().RebuildTypeRequirement(
12560               Req->getSubstitutionDiagnostic());
12561     return Req;
12562   }
12563   TypeSourceInfo *TransType = getDerived().TransformType(Req->getType());
12564   if (!TransType)
12565     return nullptr;
12566   return getDerived().RebuildTypeRequirement(TransType);
12567 }
12568 
12569 template<typename Derived>
12570 concepts::ExprRequirement *
12571 TreeTransform<Derived>::TransformExprRequirement(concepts::ExprRequirement *Req) {
12572   llvm::PointerUnion<Expr *, concepts::Requirement::SubstitutionDiagnostic *> TransExpr;
12573   if (Req->isExprSubstitutionFailure())
12574     TransExpr = Req->getExprSubstitutionDiagnostic();
12575   else {
12576     ExprResult TransExprRes = getDerived().TransformExpr(Req->getExpr());
12577     if (TransExprRes.isUsable() && TransExprRes.get()->hasPlaceholderType())
12578       TransExprRes = SemaRef.CheckPlaceholderExpr(TransExprRes.get());
12579     if (TransExprRes.isInvalid())
12580       return nullptr;
12581     TransExpr = TransExprRes.get();
12582   }
12583 
12584   llvm::Optional<concepts::ExprRequirement::ReturnTypeRequirement> TransRetReq;
12585   const auto &RetReq = Req->getReturnTypeRequirement();
12586   if (RetReq.isEmpty())
12587     TransRetReq.emplace();
12588   else if (RetReq.isSubstitutionFailure())
12589     TransRetReq.emplace(RetReq.getSubstitutionDiagnostic());
12590   else if (RetReq.isTypeConstraint()) {
12591     TemplateParameterList *OrigTPL =
12592         RetReq.getTypeConstraintTemplateParameterList();
12593     TemplateParameterList *TPL =
12594         getDerived().TransformTemplateParameterList(OrigTPL);
12595     if (!TPL)
12596       return nullptr;
12597     TransRetReq.emplace(TPL);
12598   }
12599   assert(TransRetReq.hasValue() &&
12600          "All code paths leading here must set TransRetReq");
12601   if (Expr *E = TransExpr.dyn_cast<Expr *>())
12602     return getDerived().RebuildExprRequirement(E, Req->isSimple(),
12603                                                Req->getNoexceptLoc(),
12604                                                std::move(*TransRetReq));
12605   return getDerived().RebuildExprRequirement(
12606       TransExpr.get<concepts::Requirement::SubstitutionDiagnostic *>(),
12607       Req->isSimple(), Req->getNoexceptLoc(), std::move(*TransRetReq));
12608 }
12609 
12610 template<typename Derived>
12611 concepts::NestedRequirement *
12612 TreeTransform<Derived>::TransformNestedRequirement(
12613     concepts::NestedRequirement *Req) {
12614   if (Req->isSubstitutionFailure()) {
12615     if (getDerived().AlwaysRebuild())
12616       return getDerived().RebuildNestedRequirement(
12617           Req->getSubstitutionDiagnostic());
12618     return Req;
12619   }
12620   ExprResult TransConstraint =
12621       getDerived().TransformExpr(Req->getConstraintExpr());
12622   if (TransConstraint.isInvalid())
12623     return nullptr;
12624   return getDerived().RebuildNestedRequirement(TransConstraint.get());
12625 }
12626 
12627 template<typename Derived>
12628 ExprResult
12629 TreeTransform<Derived>::TransformArrayTypeTraitExpr(ArrayTypeTraitExpr *E) {
12630   TypeSourceInfo *T = getDerived().TransformType(E->getQueriedTypeSourceInfo());
12631   if (!T)
12632     return ExprError();
12633 
12634   if (!getDerived().AlwaysRebuild() &&
12635       T == E->getQueriedTypeSourceInfo())
12636     return E;
12637 
12638   ExprResult SubExpr;
12639   {
12640     EnterExpressionEvaluationContext Unevaluated(
12641         SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
12642     SubExpr = getDerived().TransformExpr(E->getDimensionExpression());
12643     if (SubExpr.isInvalid())
12644       return ExprError();
12645 
12646     if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getDimensionExpression())
12647       return E;
12648   }
12649 
12650   return getDerived().RebuildArrayTypeTrait(E->getTrait(), E->getBeginLoc(), T,
12651                                             SubExpr.get(), E->getEndLoc());
12652 }
12653 
12654 template<typename Derived>
12655 ExprResult
12656 TreeTransform<Derived>::TransformExpressionTraitExpr(ExpressionTraitExpr *E) {
12657   ExprResult SubExpr;
12658   {
12659     EnterExpressionEvaluationContext Unevaluated(
12660         SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
12661     SubExpr = getDerived().TransformExpr(E->getQueriedExpression());
12662     if (SubExpr.isInvalid())
12663       return ExprError();
12664 
12665     if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getQueriedExpression())
12666       return E;
12667   }
12668 
12669   return getDerived().RebuildExpressionTrait(E->getTrait(), E->getBeginLoc(),
12670                                              SubExpr.get(), E->getEndLoc());
12671 }
12672 
12673 template <typename Derived>
12674 ExprResult TreeTransform<Derived>::TransformParenDependentScopeDeclRefExpr(
12675     ParenExpr *PE, DependentScopeDeclRefExpr *DRE, bool AddrTaken,
12676     TypeSourceInfo **RecoveryTSI) {
12677   ExprResult NewDRE = getDerived().TransformDependentScopeDeclRefExpr(
12678       DRE, AddrTaken, RecoveryTSI);
12679 
12680   // Propagate both errors and recovered types, which return ExprEmpty.
12681   if (!NewDRE.isUsable())
12682     return NewDRE;
12683 
12684   // We got an expr, wrap it up in parens.
12685   if (!getDerived().AlwaysRebuild() && NewDRE.get() == DRE)
12686     return PE;
12687   return getDerived().RebuildParenExpr(NewDRE.get(), PE->getLParen(),
12688                                        PE->getRParen());
12689 }
12690 
12691 template <typename Derived>
12692 ExprResult TreeTransform<Derived>::TransformDependentScopeDeclRefExpr(
12693     DependentScopeDeclRefExpr *E) {
12694   return TransformDependentScopeDeclRefExpr(E, /*IsAddressOfOperand=*/false,
12695                                             nullptr);
12696 }
12697 
12698 template <typename Derived>
12699 ExprResult TreeTransform<Derived>::TransformDependentScopeDeclRefExpr(
12700     DependentScopeDeclRefExpr *E, bool IsAddressOfOperand,
12701     TypeSourceInfo **RecoveryTSI) {
12702   assert(E->getQualifierLoc());
12703   NestedNameSpecifierLoc QualifierLoc =
12704       getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
12705   if (!QualifierLoc)
12706     return ExprError();
12707   SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc();
12708 
12709   // TODO: If this is a conversion-function-id, verify that the
12710   // destination type name (if present) resolves the same way after
12711   // instantiation as it did in the local scope.
12712 
12713   DeclarationNameInfo NameInfo =
12714       getDerived().TransformDeclarationNameInfo(E->getNameInfo());
12715   if (!NameInfo.getName())
12716     return ExprError();
12717 
12718   if (!E->hasExplicitTemplateArgs()) {
12719     if (!getDerived().AlwaysRebuild() && QualifierLoc == E->getQualifierLoc() &&
12720         // Note: it is sufficient to compare the Name component of NameInfo:
12721         // if name has not changed, DNLoc has not changed either.
12722         NameInfo.getName() == E->getDeclName())
12723       return E;
12724 
12725     return getDerived().RebuildDependentScopeDeclRefExpr(
12726         QualifierLoc, TemplateKWLoc, NameInfo, /*TemplateArgs=*/nullptr,
12727         IsAddressOfOperand, RecoveryTSI);
12728   }
12729 
12730   TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc());
12731   if (getDerived().TransformTemplateArguments(
12732           E->getTemplateArgs(), E->getNumTemplateArgs(), TransArgs))
12733     return ExprError();
12734 
12735   return getDerived().RebuildDependentScopeDeclRefExpr(
12736       QualifierLoc, TemplateKWLoc, NameInfo, &TransArgs, IsAddressOfOperand,
12737       RecoveryTSI);
12738 }
12739 
12740 template<typename Derived>
12741 ExprResult
12742 TreeTransform<Derived>::TransformCXXConstructExpr(CXXConstructExpr *E) {
12743   // CXXConstructExprs other than for list-initialization and
12744   // CXXTemporaryObjectExpr are always implicit, so when we have
12745   // a 1-argument construction we just transform that argument.
12746   if (getDerived().AllowSkippingCXXConstructExpr() &&
12747       ((E->getNumArgs() == 1 ||
12748         (E->getNumArgs() > 1 && getDerived().DropCallArgument(E->getArg(1)))) &&
12749        (!getDerived().DropCallArgument(E->getArg(0))) &&
12750        !E->isListInitialization()))
12751     return getDerived().TransformInitializer(E->getArg(0),
12752                                              /*DirectInit*/ false);
12753 
12754   TemporaryBase Rebase(*this, /*FIXME*/ E->getBeginLoc(), DeclarationName());
12755 
12756   QualType T = getDerived().TransformType(E->getType());
12757   if (T.isNull())
12758     return ExprError();
12759 
12760   CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>(
12761       getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor()));
12762   if (!Constructor)
12763     return ExprError();
12764 
12765   bool ArgumentChanged = false;
12766   SmallVector<Expr*, 8> Args;
12767   {
12768     EnterExpressionEvaluationContext Context(
12769         getSema(), EnterExpressionEvaluationContext::InitList,
12770         E->isListInitialization());
12771     if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
12772                                     &ArgumentChanged))
12773       return ExprError();
12774   }
12775 
12776   if (!getDerived().AlwaysRebuild() &&
12777       T == E->getType() &&
12778       Constructor == E->getConstructor() &&
12779       !ArgumentChanged) {
12780     // Mark the constructor as referenced.
12781     // FIXME: Instantiation-specific
12782     SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor);
12783     return E;
12784   }
12785 
12786   return getDerived().RebuildCXXConstructExpr(
12787       T, /*FIXME:*/ E->getBeginLoc(), Constructor, E->isElidable(), Args,
12788       E->hadMultipleCandidates(), E->isListInitialization(),
12789       E->isStdInitListInitialization(), E->requiresZeroInitialization(),
12790       E->getConstructionKind(), E->getParenOrBraceRange());
12791 }
12792 
12793 template<typename Derived>
12794 ExprResult TreeTransform<Derived>::TransformCXXInheritedCtorInitExpr(
12795     CXXInheritedCtorInitExpr *E) {
12796   QualType T = getDerived().TransformType(E->getType());
12797   if (T.isNull())
12798     return ExprError();
12799 
12800   CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>(
12801       getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor()));
12802   if (!Constructor)
12803     return ExprError();
12804 
12805   if (!getDerived().AlwaysRebuild() &&
12806       T == E->getType() &&
12807       Constructor == E->getConstructor()) {
12808     // Mark the constructor as referenced.
12809     // FIXME: Instantiation-specific
12810     SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor);
12811     return E;
12812   }
12813 
12814   return getDerived().RebuildCXXInheritedCtorInitExpr(
12815       T, E->getLocation(), Constructor,
12816       E->constructsVBase(), E->inheritedFromVBase());
12817 }
12818 
12819 /// Transform a C++ temporary-binding expression.
12820 ///
12821 /// Since CXXBindTemporaryExpr nodes are implicitly generated, we just
12822 /// transform the subexpression and return that.
12823 template<typename Derived>
12824 ExprResult
12825 TreeTransform<Derived>::TransformCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) {
12826   if (auto *Dtor = E->getTemporary()->getDestructor())
12827     SemaRef.MarkFunctionReferenced(E->getBeginLoc(),
12828                                    const_cast<CXXDestructorDecl *>(Dtor));
12829   return getDerived().TransformExpr(E->getSubExpr());
12830 }
12831 
12832 /// Transform a C++ expression that contains cleanups that should
12833 /// be run after the expression is evaluated.
12834 ///
12835 /// Since ExprWithCleanups nodes are implicitly generated, we
12836 /// just transform the subexpression and return that.
12837 template<typename Derived>
12838 ExprResult
12839 TreeTransform<Derived>::TransformExprWithCleanups(ExprWithCleanups *E) {
12840   return getDerived().TransformExpr(E->getSubExpr());
12841 }
12842 
12843 template<typename Derived>
12844 ExprResult
12845 TreeTransform<Derived>::TransformCXXTemporaryObjectExpr(
12846                                                     CXXTemporaryObjectExpr *E) {
12847   TypeSourceInfo *T =
12848       getDerived().TransformTypeWithDeducedTST(E->getTypeSourceInfo());
12849   if (!T)
12850     return ExprError();
12851 
12852   CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>(
12853       getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor()));
12854   if (!Constructor)
12855     return ExprError();
12856 
12857   bool ArgumentChanged = false;
12858   SmallVector<Expr*, 8> Args;
12859   Args.reserve(E->getNumArgs());
12860   {
12861     EnterExpressionEvaluationContext Context(
12862         getSema(), EnterExpressionEvaluationContext::InitList,
12863         E->isListInitialization());
12864     if (TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
12865                        &ArgumentChanged))
12866       return ExprError();
12867   }
12868 
12869   if (!getDerived().AlwaysRebuild() &&
12870       T == E->getTypeSourceInfo() &&
12871       Constructor == E->getConstructor() &&
12872       !ArgumentChanged) {
12873     // FIXME: Instantiation-specific
12874     SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor);
12875     return SemaRef.MaybeBindToTemporary(E);
12876   }
12877 
12878   // FIXME: We should just pass E->isListInitialization(), but we're not
12879   // prepared to handle list-initialization without a child InitListExpr.
12880   SourceLocation LParenLoc = T->getTypeLoc().getEndLoc();
12881   return getDerived().RebuildCXXTemporaryObjectExpr(
12882       T, LParenLoc, Args, E->getEndLoc(),
12883       /*ListInitialization=*/LParenLoc.isInvalid());
12884 }
12885 
12886 template<typename Derived>
12887 ExprResult
12888 TreeTransform<Derived>::TransformLambdaExpr(LambdaExpr *E) {
12889   // Transform any init-capture expressions before entering the scope of the
12890   // lambda body, because they are not semantically within that scope.
12891   typedef std::pair<ExprResult, QualType> InitCaptureInfoTy;
12892   struct TransformedInitCapture {
12893     // The location of the ... if the result is retaining a pack expansion.
12894     SourceLocation EllipsisLoc;
12895     // Zero or more expansions of the init-capture.
12896     SmallVector<InitCaptureInfoTy, 4> Expansions;
12897   };
12898   SmallVector<TransformedInitCapture, 4> InitCaptures;
12899   InitCaptures.resize(E->explicit_capture_end() - E->explicit_capture_begin());
12900   for (LambdaExpr::capture_iterator C = E->capture_begin(),
12901                                     CEnd = E->capture_end();
12902        C != CEnd; ++C) {
12903     if (!E->isInitCapture(C))
12904       continue;
12905 
12906     TransformedInitCapture &Result = InitCaptures[C - E->capture_begin()];
12907     VarDecl *OldVD = C->getCapturedVar();
12908 
12909     auto SubstInitCapture = [&](SourceLocation EllipsisLoc,
12910                                 Optional<unsigned> NumExpansions) {
12911       ExprResult NewExprInitResult = getDerived().TransformInitializer(
12912           OldVD->getInit(), OldVD->getInitStyle() == VarDecl::CallInit);
12913 
12914       if (NewExprInitResult.isInvalid()) {
12915         Result.Expansions.push_back(InitCaptureInfoTy(ExprError(), QualType()));
12916         return;
12917       }
12918       Expr *NewExprInit = NewExprInitResult.get();
12919 
12920       QualType NewInitCaptureType =
12921           getSema().buildLambdaInitCaptureInitialization(
12922               C->getLocation(), OldVD->getType()->isReferenceType(),
12923               EllipsisLoc, NumExpansions, OldVD->getIdentifier(),
12924               C->getCapturedVar()->getInitStyle() != VarDecl::CInit,
12925               NewExprInit);
12926       Result.Expansions.push_back(
12927           InitCaptureInfoTy(NewExprInit, NewInitCaptureType));
12928     };
12929 
12930     // If this is an init-capture pack, consider expanding the pack now.
12931     if (OldVD->isParameterPack()) {
12932       PackExpansionTypeLoc ExpansionTL = OldVD->getTypeSourceInfo()
12933                                              ->getTypeLoc()
12934                                              .castAs<PackExpansionTypeLoc>();
12935       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
12936       SemaRef.collectUnexpandedParameterPacks(OldVD->getInit(), Unexpanded);
12937 
12938       // Determine whether the set of unexpanded parameter packs can and should
12939       // be expanded.
12940       bool Expand = true;
12941       bool RetainExpansion = false;
12942       Optional<unsigned> OrigNumExpansions =
12943           ExpansionTL.getTypePtr()->getNumExpansions();
12944       Optional<unsigned> NumExpansions = OrigNumExpansions;
12945       if (getDerived().TryExpandParameterPacks(
12946               ExpansionTL.getEllipsisLoc(),
12947               OldVD->getInit()->getSourceRange(), Unexpanded, Expand,
12948               RetainExpansion, NumExpansions))
12949         return ExprError();
12950       if (Expand) {
12951         for (unsigned I = 0; I != *NumExpansions; ++I) {
12952           Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
12953           SubstInitCapture(SourceLocation(), None);
12954         }
12955       }
12956       if (!Expand || RetainExpansion) {
12957         ForgetPartiallySubstitutedPackRAII Forget(getDerived());
12958         SubstInitCapture(ExpansionTL.getEllipsisLoc(), NumExpansions);
12959         Result.EllipsisLoc = ExpansionTL.getEllipsisLoc();
12960       }
12961     } else {
12962       SubstInitCapture(SourceLocation(), None);
12963     }
12964   }
12965 
12966   LambdaScopeInfo *LSI = getSema().PushLambdaScope();
12967   Sema::FunctionScopeRAII FuncScopeCleanup(getSema());
12968 
12969   // Transform the template parameters, and add them to the current
12970   // instantiation scope. The null case is handled correctly.
12971   auto TPL = getDerived().TransformTemplateParameterList(
12972       E->getTemplateParameterList());
12973   LSI->GLTemplateParameterList = TPL;
12974 
12975   // Transform the type of the original lambda's call operator.
12976   // The transformation MUST be done in the CurrentInstantiationScope since
12977   // it introduces a mapping of the original to the newly created
12978   // transformed parameters.
12979   TypeSourceInfo *NewCallOpTSI = nullptr;
12980   {
12981     TypeSourceInfo *OldCallOpTSI = E->getCallOperator()->getTypeSourceInfo();
12982     FunctionProtoTypeLoc OldCallOpFPTL =
12983         OldCallOpTSI->getTypeLoc().getAs<FunctionProtoTypeLoc>();
12984 
12985     TypeLocBuilder NewCallOpTLBuilder;
12986     SmallVector<QualType, 4> ExceptionStorage;
12987     TreeTransform *This = this; // Work around gcc.gnu.org/PR56135.
12988     QualType NewCallOpType = TransformFunctionProtoType(
12989         NewCallOpTLBuilder, OldCallOpFPTL, nullptr, Qualifiers(),
12990         [&](FunctionProtoType::ExceptionSpecInfo &ESI, bool &Changed) {
12991           return This->TransformExceptionSpec(OldCallOpFPTL.getBeginLoc(), ESI,
12992                                               ExceptionStorage, Changed);
12993         });
12994     if (NewCallOpType.isNull())
12995       return ExprError();
12996     NewCallOpTSI = NewCallOpTLBuilder.getTypeSourceInfo(getSema().Context,
12997                                                         NewCallOpType);
12998   }
12999 
13000   // Transform the trailing requires clause
13001   ExprResult NewTrailingRequiresClause;
13002   if (Expr *TRC = E->getCallOperator()->getTrailingRequiresClause())
13003     // FIXME: Concepts: Substitution into requires clause should only happen
13004     //                  when checking satisfaction.
13005     NewTrailingRequiresClause = getDerived().TransformExpr(TRC);
13006 
13007   // Create the local class that will describe the lambda.
13008 
13009   // FIXME: DependencyKind below is wrong when substituting inside a templated
13010   // context that isn't a DeclContext (such as a variable template), or when
13011   // substituting an unevaluated lambda inside of a function's parameter's type
13012   // - as parameter types are not instantiated from within a function's DC. We
13013   // use isUnevaluatedContext() to distinguish the function parameter case.
13014   CXXRecordDecl::LambdaDependencyKind DependencyKind =
13015       CXXRecordDecl::LDK_Unknown;
13016   if (getSema().isUnevaluatedContext() &&
13017       (getSema().CurContext->isFileContext() ||
13018        !getSema().CurContext->getParent()->isDependentContext()))
13019     DependencyKind = CXXRecordDecl::LDK_NeverDependent;
13020 
13021   CXXRecordDecl *OldClass = E->getLambdaClass();
13022   CXXRecordDecl *Class =
13023       getSema().createLambdaClosureType(E->getIntroducerRange(), NewCallOpTSI,
13024                                         DependencyKind, E->getCaptureDefault());
13025 
13026   getDerived().transformedLocalDecl(OldClass, {Class});
13027 
13028   Optional<std::tuple<bool, unsigned, unsigned, Decl *>> Mangling;
13029   if (getDerived().ReplacingOriginal())
13030     Mangling = std::make_tuple(OldClass->hasKnownLambdaInternalLinkage(),
13031                                OldClass->getLambdaManglingNumber(),
13032                                OldClass->getDeviceLambdaManglingNumber(),
13033                                OldClass->getLambdaContextDecl());
13034 
13035   // Build the call operator.
13036   CXXMethodDecl *NewCallOperator = getSema().startLambdaDefinition(
13037       Class, E->getIntroducerRange(), NewCallOpTSI,
13038       E->getCallOperator()->getEndLoc(),
13039       NewCallOpTSI->getTypeLoc().castAs<FunctionProtoTypeLoc>().getParams(),
13040       E->getCallOperator()->getConstexprKind(),
13041       NewTrailingRequiresClause.get());
13042 
13043   LSI->CallOperator = NewCallOperator;
13044 
13045   getDerived().transformAttrs(E->getCallOperator(), NewCallOperator);
13046   getDerived().transformedLocalDecl(E->getCallOperator(), {NewCallOperator});
13047 
13048   // Number the lambda for linkage purposes if necessary.
13049   getSema().handleLambdaNumbering(Class, NewCallOperator, Mangling);
13050 
13051   // Introduce the context of the call operator.
13052   Sema::ContextRAII SavedContext(getSema(), NewCallOperator,
13053                                  /*NewThisContext*/false);
13054 
13055   // Enter the scope of the lambda.
13056   getSema().buildLambdaScope(LSI, NewCallOperator,
13057                              E->getIntroducerRange(),
13058                              E->getCaptureDefault(),
13059                              E->getCaptureDefaultLoc(),
13060                              E->hasExplicitParameters(),
13061                              E->hasExplicitResultType(),
13062                              E->isMutable());
13063 
13064   bool Invalid = false;
13065 
13066   // Transform captures.
13067   for (LambdaExpr::capture_iterator C = E->capture_begin(),
13068                                  CEnd = E->capture_end();
13069        C != CEnd; ++C) {
13070     // When we hit the first implicit capture, tell Sema that we've finished
13071     // the list of explicit captures.
13072     if (C->isImplicit())
13073       break;
13074 
13075     // Capturing 'this' is trivial.
13076     if (C->capturesThis()) {
13077       getSema().CheckCXXThisCapture(C->getLocation(), C->isExplicit(),
13078                                     /*BuildAndDiagnose*/ true, nullptr,
13079                                     C->getCaptureKind() == LCK_StarThis);
13080       continue;
13081     }
13082     // Captured expression will be recaptured during captured variables
13083     // rebuilding.
13084     if (C->capturesVLAType())
13085       continue;
13086 
13087     // Rebuild init-captures, including the implied field declaration.
13088     if (E->isInitCapture(C)) {
13089       TransformedInitCapture &NewC = InitCaptures[C - E->capture_begin()];
13090 
13091       VarDecl *OldVD = C->getCapturedVar();
13092       llvm::SmallVector<Decl*, 4> NewVDs;
13093 
13094       for (InitCaptureInfoTy &Info : NewC.Expansions) {
13095         ExprResult Init = Info.first;
13096         QualType InitQualType = Info.second;
13097         if (Init.isInvalid() || InitQualType.isNull()) {
13098           Invalid = true;
13099           break;
13100         }
13101         VarDecl *NewVD = getSema().createLambdaInitCaptureVarDecl(
13102             OldVD->getLocation(), InitQualType, NewC.EllipsisLoc,
13103             OldVD->getIdentifier(), OldVD->getInitStyle(), Init.get());
13104         if (!NewVD) {
13105           Invalid = true;
13106           break;
13107         }
13108         NewVDs.push_back(NewVD);
13109         getSema().addInitCapture(LSI, NewVD);
13110       }
13111 
13112       if (Invalid)
13113         break;
13114 
13115       getDerived().transformedLocalDecl(OldVD, NewVDs);
13116       continue;
13117     }
13118 
13119     assert(C->capturesVariable() && "unexpected kind of lambda capture");
13120 
13121     // Determine the capture kind for Sema.
13122     Sema::TryCaptureKind Kind
13123       = C->isImplicit()? Sema::TryCapture_Implicit
13124                        : C->getCaptureKind() == LCK_ByCopy
13125                            ? Sema::TryCapture_ExplicitByVal
13126                            : Sema::TryCapture_ExplicitByRef;
13127     SourceLocation EllipsisLoc;
13128     if (C->isPackExpansion()) {
13129       UnexpandedParameterPack Unexpanded(C->getCapturedVar(), C->getLocation());
13130       bool ShouldExpand = false;
13131       bool RetainExpansion = false;
13132       Optional<unsigned> NumExpansions;
13133       if (getDerived().TryExpandParameterPacks(C->getEllipsisLoc(),
13134                                                C->getLocation(),
13135                                                Unexpanded,
13136                                                ShouldExpand, RetainExpansion,
13137                                                NumExpansions)) {
13138         Invalid = true;
13139         continue;
13140       }
13141 
13142       if (ShouldExpand) {
13143         // The transform has determined that we should perform an expansion;
13144         // transform and capture each of the arguments.
13145         // expansion of the pattern. Do so.
13146         VarDecl *Pack = C->getCapturedVar();
13147         for (unsigned I = 0; I != *NumExpansions; ++I) {
13148           Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
13149           VarDecl *CapturedVar
13150             = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(),
13151                                                                Pack));
13152           if (!CapturedVar) {
13153             Invalid = true;
13154             continue;
13155           }
13156 
13157           // Capture the transformed variable.
13158           getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind);
13159         }
13160 
13161         // FIXME: Retain a pack expansion if RetainExpansion is true.
13162 
13163         continue;
13164       }
13165 
13166       EllipsisLoc = C->getEllipsisLoc();
13167     }
13168 
13169     // Transform the captured variable.
13170     VarDecl *CapturedVar
13171       = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(),
13172                                                          C->getCapturedVar()));
13173     if (!CapturedVar || CapturedVar->isInvalidDecl()) {
13174       Invalid = true;
13175       continue;
13176     }
13177 
13178     // Capture the transformed variable.
13179     getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind,
13180                                  EllipsisLoc);
13181   }
13182   getSema().finishLambdaExplicitCaptures(LSI);
13183 
13184   // FIXME: Sema's lambda-building mechanism expects us to push an expression
13185   // evaluation context even if we're not transforming the function body.
13186   getSema().PushExpressionEvaluationContext(
13187       Sema::ExpressionEvaluationContext::PotentiallyEvaluated);
13188 
13189   // Instantiate the body of the lambda expression.
13190   StmtResult Body =
13191       Invalid ? StmtError() : getDerived().TransformLambdaBody(E, E->getBody());
13192 
13193   // ActOnLambda* will pop the function scope for us.
13194   FuncScopeCleanup.disable();
13195 
13196   if (Body.isInvalid()) {
13197     SavedContext.pop();
13198     getSema().ActOnLambdaError(E->getBeginLoc(), /*CurScope=*/nullptr,
13199                                /*IsInstantiation=*/true);
13200     return ExprError();
13201   }
13202 
13203   // Copy the LSI before ActOnFinishFunctionBody removes it.
13204   // FIXME: This is dumb. Store the lambda information somewhere that outlives
13205   // the call operator.
13206   auto LSICopy = *LSI;
13207   getSema().ActOnFinishFunctionBody(NewCallOperator, Body.get(),
13208                                     /*IsInstantiation*/ true);
13209   SavedContext.pop();
13210 
13211   return getSema().BuildLambdaExpr(E->getBeginLoc(), Body.get()->getEndLoc(),
13212                                    &LSICopy);
13213 }
13214 
13215 template<typename Derived>
13216 StmtResult
13217 TreeTransform<Derived>::TransformLambdaBody(LambdaExpr *E, Stmt *S) {
13218   return TransformStmt(S);
13219 }
13220 
13221 template<typename Derived>
13222 StmtResult
13223 TreeTransform<Derived>::SkipLambdaBody(LambdaExpr *E, Stmt *S) {
13224   // Transform captures.
13225   for (LambdaExpr::capture_iterator C = E->capture_begin(),
13226                                  CEnd = E->capture_end();
13227        C != CEnd; ++C) {
13228     // When we hit the first implicit capture, tell Sema that we've finished
13229     // the list of explicit captures.
13230     if (!C->isImplicit())
13231       continue;
13232 
13233     // Capturing 'this' is trivial.
13234     if (C->capturesThis()) {
13235       getSema().CheckCXXThisCapture(C->getLocation(), C->isExplicit(),
13236                                     /*BuildAndDiagnose*/ true, nullptr,
13237                                     C->getCaptureKind() == LCK_StarThis);
13238       continue;
13239     }
13240     // Captured expression will be recaptured during captured variables
13241     // rebuilding.
13242     if (C->capturesVLAType())
13243       continue;
13244 
13245     assert(C->capturesVariable() && "unexpected kind of lambda capture");
13246     assert(!E->isInitCapture(C) && "implicit init-capture?");
13247 
13248     // Transform the captured variable.
13249     VarDecl *CapturedVar = cast_or_null<VarDecl>(
13250         getDerived().TransformDecl(C->getLocation(), C->getCapturedVar()));
13251     if (!CapturedVar || CapturedVar->isInvalidDecl())
13252       return StmtError();
13253 
13254     // Capture the transformed variable.
13255     getSema().tryCaptureVariable(CapturedVar, C->getLocation());
13256   }
13257 
13258   return S;
13259 }
13260 
13261 template<typename Derived>
13262 ExprResult
13263 TreeTransform<Derived>::TransformCXXUnresolvedConstructExpr(
13264                                                   CXXUnresolvedConstructExpr *E) {
13265   TypeSourceInfo *T =
13266       getDerived().TransformTypeWithDeducedTST(E->getTypeSourceInfo());
13267   if (!T)
13268     return ExprError();
13269 
13270   bool ArgumentChanged = false;
13271   SmallVector<Expr*, 8> Args;
13272   Args.reserve(E->getNumArgs());
13273   {
13274     EnterExpressionEvaluationContext Context(
13275         getSema(), EnterExpressionEvaluationContext::InitList,
13276         E->isListInitialization());
13277     if (getDerived().TransformExprs(E->arg_begin(), E->getNumArgs(), true, Args,
13278                                     &ArgumentChanged))
13279       return ExprError();
13280   }
13281 
13282   if (!getDerived().AlwaysRebuild() &&
13283       T == E->getTypeSourceInfo() &&
13284       !ArgumentChanged)
13285     return E;
13286 
13287   // FIXME: we're faking the locations of the commas
13288   return getDerived().RebuildCXXUnresolvedConstructExpr(
13289       T, E->getLParenLoc(), Args, E->getRParenLoc(), E->isListInitialization());
13290 }
13291 
13292 template<typename Derived>
13293 ExprResult
13294 TreeTransform<Derived>::TransformCXXDependentScopeMemberExpr(
13295                                              CXXDependentScopeMemberExpr *E) {
13296   // Transform the base of the expression.
13297   ExprResult Base((Expr*) nullptr);
13298   Expr *OldBase;
13299   QualType BaseType;
13300   QualType ObjectType;
13301   if (!E->isImplicitAccess()) {
13302     OldBase = E->getBase();
13303     Base = getDerived().TransformExpr(OldBase);
13304     if (Base.isInvalid())
13305       return ExprError();
13306 
13307     // Start the member reference and compute the object's type.
13308     ParsedType ObjectTy;
13309     bool MayBePseudoDestructor = false;
13310     Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(),
13311                                                 E->getOperatorLoc(),
13312                                       E->isArrow()? tok::arrow : tok::period,
13313                                                 ObjectTy,
13314                                                 MayBePseudoDestructor);
13315     if (Base.isInvalid())
13316       return ExprError();
13317 
13318     ObjectType = ObjectTy.get();
13319     BaseType = ((Expr*) Base.get())->getType();
13320   } else {
13321     OldBase = nullptr;
13322     BaseType = getDerived().TransformType(E->getBaseType());
13323     ObjectType = BaseType->castAs<PointerType>()->getPointeeType();
13324   }
13325 
13326   // Transform the first part of the nested-name-specifier that qualifies
13327   // the member name.
13328   NamedDecl *FirstQualifierInScope
13329     = getDerived().TransformFirstQualifierInScope(
13330                                             E->getFirstQualifierFoundInScope(),
13331                                             E->getQualifierLoc().getBeginLoc());
13332 
13333   NestedNameSpecifierLoc QualifierLoc;
13334   if (E->getQualifier()) {
13335     QualifierLoc
13336       = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc(),
13337                                                      ObjectType,
13338                                                      FirstQualifierInScope);
13339     if (!QualifierLoc)
13340       return ExprError();
13341   }
13342 
13343   SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc();
13344 
13345   // TODO: If this is a conversion-function-id, verify that the
13346   // destination type name (if present) resolves the same way after
13347   // instantiation as it did in the local scope.
13348 
13349   DeclarationNameInfo NameInfo
13350     = getDerived().TransformDeclarationNameInfo(E->getMemberNameInfo());
13351   if (!NameInfo.getName())
13352     return ExprError();
13353 
13354   if (!E->hasExplicitTemplateArgs()) {
13355     // This is a reference to a member without an explicitly-specified
13356     // template argument list. Optimize for this common case.
13357     if (!getDerived().AlwaysRebuild() &&
13358         Base.get() == OldBase &&
13359         BaseType == E->getBaseType() &&
13360         QualifierLoc == E->getQualifierLoc() &&
13361         NameInfo.getName() == E->getMember() &&
13362         FirstQualifierInScope == E->getFirstQualifierFoundInScope())
13363       return E;
13364 
13365     return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(),
13366                                                        BaseType,
13367                                                        E->isArrow(),
13368                                                        E->getOperatorLoc(),
13369                                                        QualifierLoc,
13370                                                        TemplateKWLoc,
13371                                                        FirstQualifierInScope,
13372                                                        NameInfo,
13373                                                        /*TemplateArgs*/nullptr);
13374   }
13375 
13376   TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc());
13377   if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
13378                                               E->getNumTemplateArgs(),
13379                                               TransArgs))
13380     return ExprError();
13381 
13382   return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(),
13383                                                      BaseType,
13384                                                      E->isArrow(),
13385                                                      E->getOperatorLoc(),
13386                                                      QualifierLoc,
13387                                                      TemplateKWLoc,
13388                                                      FirstQualifierInScope,
13389                                                      NameInfo,
13390                                                      &TransArgs);
13391 }
13392 
13393 template <typename Derived>
13394 ExprResult TreeTransform<Derived>::TransformUnresolvedMemberExpr(
13395     UnresolvedMemberExpr *Old) {
13396   // Transform the base of the expression.
13397   ExprResult Base((Expr *)nullptr);
13398   QualType BaseType;
13399   if (!Old->isImplicitAccess()) {
13400     Base = getDerived().TransformExpr(Old->getBase());
13401     if (Base.isInvalid())
13402       return ExprError();
13403     Base =
13404         getSema().PerformMemberExprBaseConversion(Base.get(), Old->isArrow());
13405     if (Base.isInvalid())
13406       return ExprError();
13407     BaseType = Base.get()->getType();
13408   } else {
13409     BaseType = getDerived().TransformType(Old->getBaseType());
13410   }
13411 
13412   NestedNameSpecifierLoc QualifierLoc;
13413   if (Old->getQualifierLoc()) {
13414     QualifierLoc =
13415         getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc());
13416     if (!QualifierLoc)
13417       return ExprError();
13418   }
13419 
13420   SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc();
13421 
13422   LookupResult R(SemaRef, Old->getMemberNameInfo(), Sema::LookupOrdinaryName);
13423 
13424   // Transform the declaration set.
13425   if (TransformOverloadExprDecls(Old, /*RequiresADL*/ false, R))
13426     return ExprError();
13427 
13428   // Determine the naming class.
13429   if (Old->getNamingClass()) {
13430     CXXRecordDecl *NamingClass = cast_or_null<CXXRecordDecl>(
13431         getDerived().TransformDecl(Old->getMemberLoc(), Old->getNamingClass()));
13432     if (!NamingClass)
13433       return ExprError();
13434 
13435     R.setNamingClass(NamingClass);
13436   }
13437 
13438   TemplateArgumentListInfo TransArgs;
13439   if (Old->hasExplicitTemplateArgs()) {
13440     TransArgs.setLAngleLoc(Old->getLAngleLoc());
13441     TransArgs.setRAngleLoc(Old->getRAngleLoc());
13442     if (getDerived().TransformTemplateArguments(
13443             Old->getTemplateArgs(), Old->getNumTemplateArgs(), TransArgs))
13444       return ExprError();
13445   }
13446 
13447   // FIXME: to do this check properly, we will need to preserve the
13448   // first-qualifier-in-scope here, just in case we had a dependent
13449   // base (and therefore couldn't do the check) and a
13450   // nested-name-qualifier (and therefore could do the lookup).
13451   NamedDecl *FirstQualifierInScope = nullptr;
13452 
13453   return getDerived().RebuildUnresolvedMemberExpr(
13454       Base.get(), BaseType, Old->getOperatorLoc(), Old->isArrow(), QualifierLoc,
13455       TemplateKWLoc, FirstQualifierInScope, R,
13456       (Old->hasExplicitTemplateArgs() ? &TransArgs : nullptr));
13457 }
13458 
13459 template<typename Derived>
13460 ExprResult
13461 TreeTransform<Derived>::TransformCXXNoexceptExpr(CXXNoexceptExpr *E) {
13462   EnterExpressionEvaluationContext Unevaluated(
13463       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
13464   ExprResult SubExpr = getDerived().TransformExpr(E->getOperand());
13465   if (SubExpr.isInvalid())
13466     return ExprError();
13467 
13468   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getOperand())
13469     return E;
13470 
13471   return getDerived().RebuildCXXNoexceptExpr(E->getSourceRange(),SubExpr.get());
13472 }
13473 
13474 template<typename Derived>
13475 ExprResult
13476 TreeTransform<Derived>::TransformPackExpansionExpr(PackExpansionExpr *E) {
13477   ExprResult Pattern = getDerived().TransformExpr(E->getPattern());
13478   if (Pattern.isInvalid())
13479     return ExprError();
13480 
13481   if (!getDerived().AlwaysRebuild() && Pattern.get() == E->getPattern())
13482     return E;
13483 
13484   return getDerived().RebuildPackExpansion(Pattern.get(), E->getEllipsisLoc(),
13485                                            E->getNumExpansions());
13486 }
13487 
13488 template<typename Derived>
13489 ExprResult
13490 TreeTransform<Derived>::TransformSizeOfPackExpr(SizeOfPackExpr *E) {
13491   // If E is not value-dependent, then nothing will change when we transform it.
13492   // Note: This is an instantiation-centric view.
13493   if (!E->isValueDependent())
13494     return E;
13495 
13496   EnterExpressionEvaluationContext Unevaluated(
13497       getSema(), Sema::ExpressionEvaluationContext::Unevaluated);
13498 
13499   ArrayRef<TemplateArgument> PackArgs;
13500   TemplateArgument ArgStorage;
13501 
13502   // Find the argument list to transform.
13503   if (E->isPartiallySubstituted()) {
13504     PackArgs = E->getPartialArguments();
13505   } else if (E->isValueDependent()) {
13506     UnexpandedParameterPack Unexpanded(E->getPack(), E->getPackLoc());
13507     bool ShouldExpand = false;
13508     bool RetainExpansion = false;
13509     Optional<unsigned> NumExpansions;
13510     if (getDerived().TryExpandParameterPacks(E->getOperatorLoc(), E->getPackLoc(),
13511                                              Unexpanded,
13512                                              ShouldExpand, RetainExpansion,
13513                                              NumExpansions))
13514       return ExprError();
13515 
13516     // If we need to expand the pack, build a template argument from it and
13517     // expand that.
13518     if (ShouldExpand) {
13519       auto *Pack = E->getPack();
13520       if (auto *TTPD = dyn_cast<TemplateTypeParmDecl>(Pack)) {
13521         ArgStorage = getSema().Context.getPackExpansionType(
13522             getSema().Context.getTypeDeclType(TTPD), None);
13523       } else if (auto *TTPD = dyn_cast<TemplateTemplateParmDecl>(Pack)) {
13524         ArgStorage = TemplateArgument(TemplateName(TTPD), None);
13525       } else {
13526         auto *VD = cast<ValueDecl>(Pack);
13527         ExprResult DRE = getSema().BuildDeclRefExpr(
13528             VD, VD->getType().getNonLValueExprType(getSema().Context),
13529             VD->getType()->isReferenceType() ? VK_LValue : VK_PRValue,
13530             E->getPackLoc());
13531         if (DRE.isInvalid())
13532           return ExprError();
13533         ArgStorage = new (getSema().Context) PackExpansionExpr(
13534             getSema().Context.DependentTy, DRE.get(), E->getPackLoc(), None);
13535       }
13536       PackArgs = ArgStorage;
13537     }
13538   }
13539 
13540   // If we're not expanding the pack, just transform the decl.
13541   if (!PackArgs.size()) {
13542     auto *Pack = cast_or_null<NamedDecl>(
13543         getDerived().TransformDecl(E->getPackLoc(), E->getPack()));
13544     if (!Pack)
13545       return ExprError();
13546     return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), Pack,
13547                                               E->getPackLoc(),
13548                                               E->getRParenLoc(), None, None);
13549   }
13550 
13551   // Try to compute the result without performing a partial substitution.
13552   Optional<unsigned> Result = 0;
13553   for (const TemplateArgument &Arg : PackArgs) {
13554     if (!Arg.isPackExpansion()) {
13555       Result = *Result + 1;
13556       continue;
13557     }
13558 
13559     TemplateArgumentLoc ArgLoc;
13560     InventTemplateArgumentLoc(Arg, ArgLoc);
13561 
13562     // Find the pattern of the pack expansion.
13563     SourceLocation Ellipsis;
13564     Optional<unsigned> OrigNumExpansions;
13565     TemplateArgumentLoc Pattern =
13566         getSema().getTemplateArgumentPackExpansionPattern(ArgLoc, Ellipsis,
13567                                                           OrigNumExpansions);
13568 
13569     // Substitute under the pack expansion. Do not expand the pack (yet).
13570     TemplateArgumentLoc OutPattern;
13571     Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
13572     if (getDerived().TransformTemplateArgument(Pattern, OutPattern,
13573                                                /*Uneval*/ true))
13574       return true;
13575 
13576     // See if we can determine the number of arguments from the result.
13577     Optional<unsigned> NumExpansions =
13578         getSema().getFullyPackExpandedSize(OutPattern.getArgument());
13579     if (!NumExpansions) {
13580       // No: we must be in an alias template expansion, and we're going to need
13581       // to actually expand the packs.
13582       Result = None;
13583       break;
13584     }
13585 
13586     Result = *Result + *NumExpansions;
13587   }
13588 
13589   // Common case: we could determine the number of expansions without
13590   // substituting.
13591   if (Result)
13592     return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(),
13593                                               E->getPackLoc(),
13594                                               E->getRParenLoc(), *Result, None);
13595 
13596   TemplateArgumentListInfo TransformedPackArgs(E->getPackLoc(),
13597                                                E->getPackLoc());
13598   {
13599     TemporaryBase Rebase(*this, E->getPackLoc(), getBaseEntity());
13600     typedef TemplateArgumentLocInventIterator<
13601         Derived, const TemplateArgument*> PackLocIterator;
13602     if (TransformTemplateArguments(PackLocIterator(*this, PackArgs.begin()),
13603                                    PackLocIterator(*this, PackArgs.end()),
13604                                    TransformedPackArgs, /*Uneval*/true))
13605       return ExprError();
13606   }
13607 
13608   // Check whether we managed to fully-expand the pack.
13609   // FIXME: Is it possible for us to do so and not hit the early exit path?
13610   SmallVector<TemplateArgument, 8> Args;
13611   bool PartialSubstitution = false;
13612   for (auto &Loc : TransformedPackArgs.arguments()) {
13613     Args.push_back(Loc.getArgument());
13614     if (Loc.getArgument().isPackExpansion())
13615       PartialSubstitution = true;
13616   }
13617 
13618   if (PartialSubstitution)
13619     return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(),
13620                                               E->getPackLoc(),
13621                                               E->getRParenLoc(), None, Args);
13622 
13623   return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(),
13624                                             E->getPackLoc(), E->getRParenLoc(),
13625                                             Args.size(), None);
13626 }
13627 
13628 template<typename Derived>
13629 ExprResult
13630 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmPackExpr(
13631                                           SubstNonTypeTemplateParmPackExpr *E) {
13632   // Default behavior is to do nothing with this transformation.
13633   return E;
13634 }
13635 
13636 template<typename Derived>
13637 ExprResult
13638 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmExpr(
13639                                           SubstNonTypeTemplateParmExpr *E) {
13640   // Default behavior is to do nothing with this transformation.
13641   return E;
13642 }
13643 
13644 template<typename Derived>
13645 ExprResult
13646 TreeTransform<Derived>::TransformFunctionParmPackExpr(FunctionParmPackExpr *E) {
13647   // Default behavior is to do nothing with this transformation.
13648   return E;
13649 }
13650 
13651 template<typename Derived>
13652 ExprResult
13653 TreeTransform<Derived>::TransformMaterializeTemporaryExpr(
13654                                                   MaterializeTemporaryExpr *E) {
13655   return getDerived().TransformExpr(E->getSubExpr());
13656 }
13657 
13658 template<typename Derived>
13659 ExprResult
13660 TreeTransform<Derived>::TransformCXXFoldExpr(CXXFoldExpr *E) {
13661   UnresolvedLookupExpr *Callee = nullptr;
13662   if (Expr *OldCallee = E->getCallee()) {
13663     ExprResult CalleeResult = getDerived().TransformExpr(OldCallee);
13664     if (CalleeResult.isInvalid())
13665       return ExprError();
13666     Callee = cast<UnresolvedLookupExpr>(CalleeResult.get());
13667   }
13668 
13669   Expr *Pattern = E->getPattern();
13670 
13671   SmallVector<UnexpandedParameterPack, 2> Unexpanded;
13672   getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
13673   assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
13674 
13675   // Determine whether the set of unexpanded parameter packs can and should
13676   // be expanded.
13677   bool Expand = true;
13678   bool RetainExpansion = false;
13679   Optional<unsigned> OrigNumExpansions = E->getNumExpansions(),
13680                      NumExpansions = OrigNumExpansions;
13681   if (getDerived().TryExpandParameterPacks(E->getEllipsisLoc(),
13682                                            Pattern->getSourceRange(),
13683                                            Unexpanded,
13684                                            Expand, RetainExpansion,
13685                                            NumExpansions))
13686     return true;
13687 
13688   if (!Expand) {
13689     // Do not expand any packs here, just transform and rebuild a fold
13690     // expression.
13691     Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
13692 
13693     ExprResult LHS =
13694         E->getLHS() ? getDerived().TransformExpr(E->getLHS()) : ExprResult();
13695     if (LHS.isInvalid())
13696       return true;
13697 
13698     ExprResult RHS =
13699         E->getRHS() ? getDerived().TransformExpr(E->getRHS()) : ExprResult();
13700     if (RHS.isInvalid())
13701       return true;
13702 
13703     if (!getDerived().AlwaysRebuild() &&
13704         LHS.get() == E->getLHS() && RHS.get() == E->getRHS())
13705       return E;
13706 
13707     return getDerived().RebuildCXXFoldExpr(
13708         Callee, E->getBeginLoc(), LHS.get(), E->getOperator(),
13709         E->getEllipsisLoc(), RHS.get(), E->getEndLoc(), NumExpansions);
13710   }
13711 
13712   // Formally a fold expression expands to nested parenthesized expressions.
13713   // Enforce this limit to avoid creating trees so deep we can't safely traverse
13714   // them.
13715   if (NumExpansions && SemaRef.getLangOpts().BracketDepth < NumExpansions) {
13716     SemaRef.Diag(E->getEllipsisLoc(),
13717                  clang::diag::err_fold_expression_limit_exceeded)
13718         << *NumExpansions << SemaRef.getLangOpts().BracketDepth
13719         << E->getSourceRange();
13720     SemaRef.Diag(E->getEllipsisLoc(), diag::note_bracket_depth);
13721     return ExprError();
13722   }
13723 
13724   // The transform has determined that we should perform an elementwise
13725   // expansion of the pattern. Do so.
13726   ExprResult Result = getDerived().TransformExpr(E->getInit());
13727   if (Result.isInvalid())
13728     return true;
13729   bool LeftFold = E->isLeftFold();
13730 
13731   // If we're retaining an expansion for a right fold, it is the innermost
13732   // component and takes the init (if any).
13733   if (!LeftFold && RetainExpansion) {
13734     ForgetPartiallySubstitutedPackRAII Forget(getDerived());
13735 
13736     ExprResult Out = getDerived().TransformExpr(Pattern);
13737     if (Out.isInvalid())
13738       return true;
13739 
13740     Result = getDerived().RebuildCXXFoldExpr(
13741         Callee, E->getBeginLoc(), Out.get(), E->getOperator(),
13742         E->getEllipsisLoc(), Result.get(), E->getEndLoc(), OrigNumExpansions);
13743     if (Result.isInvalid())
13744       return true;
13745   }
13746 
13747   for (unsigned I = 0; I != *NumExpansions; ++I) {
13748     Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(
13749         getSema(), LeftFold ? I : *NumExpansions - I - 1);
13750     ExprResult Out = getDerived().TransformExpr(Pattern);
13751     if (Out.isInvalid())
13752       return true;
13753 
13754     if (Out.get()->containsUnexpandedParameterPack()) {
13755       // We still have a pack; retain a pack expansion for this slice.
13756       Result = getDerived().RebuildCXXFoldExpr(
13757           Callee, E->getBeginLoc(), LeftFold ? Result.get() : Out.get(),
13758           E->getOperator(), E->getEllipsisLoc(),
13759           LeftFold ? Out.get() : Result.get(), E->getEndLoc(),
13760           OrigNumExpansions);
13761     } else if (Result.isUsable()) {
13762       // We've got down to a single element; build a binary operator.
13763       Expr *LHS = LeftFold ? Result.get() : Out.get();
13764       Expr *RHS = LeftFold ? Out.get() : Result.get();
13765       if (Callee)
13766         Result = getDerived().RebuildCXXOperatorCallExpr(
13767             BinaryOperator::getOverloadedOperator(E->getOperator()),
13768             E->getEllipsisLoc(), Callee, LHS, RHS);
13769       else
13770         Result = getDerived().RebuildBinaryOperator(E->getEllipsisLoc(),
13771                                                     E->getOperator(), LHS, RHS);
13772     } else
13773       Result = Out;
13774 
13775     if (Result.isInvalid())
13776       return true;
13777   }
13778 
13779   // If we're retaining an expansion for a left fold, it is the outermost
13780   // component and takes the complete expansion so far as its init (if any).
13781   if (LeftFold && RetainExpansion) {
13782     ForgetPartiallySubstitutedPackRAII Forget(getDerived());
13783 
13784     ExprResult Out = getDerived().TransformExpr(Pattern);
13785     if (Out.isInvalid())
13786       return true;
13787 
13788     Result = getDerived().RebuildCXXFoldExpr(
13789         Callee, E->getBeginLoc(), Result.get(), E->getOperator(),
13790         E->getEllipsisLoc(), Out.get(), E->getEndLoc(), OrigNumExpansions);
13791     if (Result.isInvalid())
13792       return true;
13793   }
13794 
13795   // If we had no init and an empty pack, and we're not retaining an expansion,
13796   // then produce a fallback value or error.
13797   if (Result.isUnset())
13798     return getDerived().RebuildEmptyCXXFoldExpr(E->getEllipsisLoc(),
13799                                                 E->getOperator());
13800 
13801   return Result;
13802 }
13803 
13804 template<typename Derived>
13805 ExprResult
13806 TreeTransform<Derived>::TransformCXXStdInitializerListExpr(
13807     CXXStdInitializerListExpr *E) {
13808   return getDerived().TransformExpr(E->getSubExpr());
13809 }
13810 
13811 template<typename Derived>
13812 ExprResult
13813 TreeTransform<Derived>::TransformObjCStringLiteral(ObjCStringLiteral *E) {
13814   return SemaRef.MaybeBindToTemporary(E);
13815 }
13816 
13817 template<typename Derived>
13818 ExprResult
13819 TreeTransform<Derived>::TransformObjCBoolLiteralExpr(ObjCBoolLiteralExpr *E) {
13820   return E;
13821 }
13822 
13823 template<typename Derived>
13824 ExprResult
13825 TreeTransform<Derived>::TransformObjCBoxedExpr(ObjCBoxedExpr *E) {
13826   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
13827   if (SubExpr.isInvalid())
13828     return ExprError();
13829 
13830   if (!getDerived().AlwaysRebuild() &&
13831       SubExpr.get() == E->getSubExpr())
13832     return E;
13833 
13834   return getDerived().RebuildObjCBoxedExpr(E->getSourceRange(), SubExpr.get());
13835 }
13836 
13837 template<typename Derived>
13838 ExprResult
13839 TreeTransform<Derived>::TransformObjCArrayLiteral(ObjCArrayLiteral *E) {
13840   // Transform each of the elements.
13841   SmallVector<Expr *, 8> Elements;
13842   bool ArgChanged = false;
13843   if (getDerived().TransformExprs(E->getElements(), E->getNumElements(),
13844                                   /*IsCall=*/false, Elements, &ArgChanged))
13845     return ExprError();
13846 
13847   if (!getDerived().AlwaysRebuild() && !ArgChanged)
13848     return SemaRef.MaybeBindToTemporary(E);
13849 
13850   return getDerived().RebuildObjCArrayLiteral(E->getSourceRange(),
13851                                               Elements.data(),
13852                                               Elements.size());
13853 }
13854 
13855 template<typename Derived>
13856 ExprResult
13857 TreeTransform<Derived>::TransformObjCDictionaryLiteral(
13858                                                     ObjCDictionaryLiteral *E) {
13859   // Transform each of the elements.
13860   SmallVector<ObjCDictionaryElement, 8> Elements;
13861   bool ArgChanged = false;
13862   for (unsigned I = 0, N = E->getNumElements(); I != N; ++I) {
13863     ObjCDictionaryElement OrigElement = E->getKeyValueElement(I);
13864 
13865     if (OrigElement.isPackExpansion()) {
13866       // This key/value element is a pack expansion.
13867       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
13868       getSema().collectUnexpandedParameterPacks(OrigElement.Key, Unexpanded);
13869       getSema().collectUnexpandedParameterPacks(OrigElement.Value, Unexpanded);
13870       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
13871 
13872       // Determine whether the set of unexpanded parameter packs can
13873       // and should be expanded.
13874       bool Expand = true;
13875       bool RetainExpansion = false;
13876       Optional<unsigned> OrigNumExpansions = OrigElement.NumExpansions;
13877       Optional<unsigned> NumExpansions = OrigNumExpansions;
13878       SourceRange PatternRange(OrigElement.Key->getBeginLoc(),
13879                                OrigElement.Value->getEndLoc());
13880       if (getDerived().TryExpandParameterPacks(OrigElement.EllipsisLoc,
13881                                                PatternRange, Unexpanded, Expand,
13882                                                RetainExpansion, NumExpansions))
13883         return ExprError();
13884 
13885       if (!Expand) {
13886         // The transform has determined that we should perform a simple
13887         // transformation on the pack expansion, producing another pack
13888         // expansion.
13889         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
13890         ExprResult Key = getDerived().TransformExpr(OrigElement.Key);
13891         if (Key.isInvalid())
13892           return ExprError();
13893 
13894         if (Key.get() != OrigElement.Key)
13895           ArgChanged = true;
13896 
13897         ExprResult Value = getDerived().TransformExpr(OrigElement.Value);
13898         if (Value.isInvalid())
13899           return ExprError();
13900 
13901         if (Value.get() != OrigElement.Value)
13902           ArgChanged = true;
13903 
13904         ObjCDictionaryElement Expansion = {
13905           Key.get(), Value.get(), OrigElement.EllipsisLoc, NumExpansions
13906         };
13907         Elements.push_back(Expansion);
13908         continue;
13909       }
13910 
13911       // Record right away that the argument was changed.  This needs
13912       // to happen even if the array expands to nothing.
13913       ArgChanged = true;
13914 
13915       // The transform has determined that we should perform an elementwise
13916       // expansion of the pattern. Do so.
13917       for (unsigned I = 0; I != *NumExpansions; ++I) {
13918         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
13919         ExprResult Key = getDerived().TransformExpr(OrigElement.Key);
13920         if (Key.isInvalid())
13921           return ExprError();
13922 
13923         ExprResult Value = getDerived().TransformExpr(OrigElement.Value);
13924         if (Value.isInvalid())
13925           return ExprError();
13926 
13927         ObjCDictionaryElement Element = {
13928           Key.get(), Value.get(), SourceLocation(), NumExpansions
13929         };
13930 
13931         // If any unexpanded parameter packs remain, we still have a
13932         // pack expansion.
13933         // FIXME: Can this really happen?
13934         if (Key.get()->containsUnexpandedParameterPack() ||
13935             Value.get()->containsUnexpandedParameterPack())
13936           Element.EllipsisLoc = OrigElement.EllipsisLoc;
13937 
13938         Elements.push_back(Element);
13939       }
13940 
13941       // FIXME: Retain a pack expansion if RetainExpansion is true.
13942 
13943       // We've finished with this pack expansion.
13944       continue;
13945     }
13946 
13947     // Transform and check key.
13948     ExprResult Key = getDerived().TransformExpr(OrigElement.Key);
13949     if (Key.isInvalid())
13950       return ExprError();
13951 
13952     if (Key.get() != OrigElement.Key)
13953       ArgChanged = true;
13954 
13955     // Transform and check value.
13956     ExprResult Value
13957       = getDerived().TransformExpr(OrigElement.Value);
13958     if (Value.isInvalid())
13959       return ExprError();
13960 
13961     if (Value.get() != OrigElement.Value)
13962       ArgChanged = true;
13963 
13964     ObjCDictionaryElement Element = {
13965       Key.get(), Value.get(), SourceLocation(), None
13966     };
13967     Elements.push_back(Element);
13968   }
13969 
13970   if (!getDerived().AlwaysRebuild() && !ArgChanged)
13971     return SemaRef.MaybeBindToTemporary(E);
13972 
13973   return getDerived().RebuildObjCDictionaryLiteral(E->getSourceRange(),
13974                                                    Elements);
13975 }
13976 
13977 template<typename Derived>
13978 ExprResult
13979 TreeTransform<Derived>::TransformObjCEncodeExpr(ObjCEncodeExpr *E) {
13980   TypeSourceInfo *EncodedTypeInfo
13981     = getDerived().TransformType(E->getEncodedTypeSourceInfo());
13982   if (!EncodedTypeInfo)
13983     return ExprError();
13984 
13985   if (!getDerived().AlwaysRebuild() &&
13986       EncodedTypeInfo == E->getEncodedTypeSourceInfo())
13987     return E;
13988 
13989   return getDerived().RebuildObjCEncodeExpr(E->getAtLoc(),
13990                                             EncodedTypeInfo,
13991                                             E->getRParenLoc());
13992 }
13993 
13994 template<typename Derived>
13995 ExprResult TreeTransform<Derived>::
13996 TransformObjCIndirectCopyRestoreExpr(ObjCIndirectCopyRestoreExpr *E) {
13997   // This is a kind of implicit conversion, and it needs to get dropped
13998   // and recomputed for the same general reasons that ImplicitCastExprs
13999   // do, as well a more specific one: this expression is only valid when
14000   // it appears *immediately* as an argument expression.
14001   return getDerived().TransformExpr(E->getSubExpr());
14002 }
14003 
14004 template<typename Derived>
14005 ExprResult TreeTransform<Derived>::
14006 TransformObjCBridgedCastExpr(ObjCBridgedCastExpr *E) {
14007   TypeSourceInfo *TSInfo
14008     = getDerived().TransformType(E->getTypeInfoAsWritten());
14009   if (!TSInfo)
14010     return ExprError();
14011 
14012   ExprResult Result = getDerived().TransformExpr(E->getSubExpr());
14013   if (Result.isInvalid())
14014     return ExprError();
14015 
14016   if (!getDerived().AlwaysRebuild() &&
14017       TSInfo == E->getTypeInfoAsWritten() &&
14018       Result.get() == E->getSubExpr())
14019     return E;
14020 
14021   return SemaRef.BuildObjCBridgedCast(E->getLParenLoc(), E->getBridgeKind(),
14022                                       E->getBridgeKeywordLoc(), TSInfo,
14023                                       Result.get());
14024 }
14025 
14026 template <typename Derived>
14027 ExprResult TreeTransform<Derived>::TransformObjCAvailabilityCheckExpr(
14028     ObjCAvailabilityCheckExpr *E) {
14029   return E;
14030 }
14031 
14032 template<typename Derived>
14033 ExprResult
14034 TreeTransform<Derived>::TransformObjCMessageExpr(ObjCMessageExpr *E) {
14035   // Transform arguments.
14036   bool ArgChanged = false;
14037   SmallVector<Expr*, 8> Args;
14038   Args.reserve(E->getNumArgs());
14039   if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), false, Args,
14040                                   &ArgChanged))
14041     return ExprError();
14042 
14043   if (E->getReceiverKind() == ObjCMessageExpr::Class) {
14044     // Class message: transform the receiver type.
14045     TypeSourceInfo *ReceiverTypeInfo
14046       = getDerived().TransformType(E->getClassReceiverTypeInfo());
14047     if (!ReceiverTypeInfo)
14048       return ExprError();
14049 
14050     // If nothing changed, just retain the existing message send.
14051     if (!getDerived().AlwaysRebuild() &&
14052         ReceiverTypeInfo == E->getClassReceiverTypeInfo() && !ArgChanged)
14053       return SemaRef.MaybeBindToTemporary(E);
14054 
14055     // Build a new class message send.
14056     SmallVector<SourceLocation, 16> SelLocs;
14057     E->getSelectorLocs(SelLocs);
14058     return getDerived().RebuildObjCMessageExpr(ReceiverTypeInfo,
14059                                                E->getSelector(),
14060                                                SelLocs,
14061                                                E->getMethodDecl(),
14062                                                E->getLeftLoc(),
14063                                                Args,
14064                                                E->getRightLoc());
14065   }
14066   else if (E->getReceiverKind() == ObjCMessageExpr::SuperClass ||
14067            E->getReceiverKind() == ObjCMessageExpr::SuperInstance) {
14068     if (!E->getMethodDecl())
14069       return ExprError();
14070 
14071     // Build a new class message send to 'super'.
14072     SmallVector<SourceLocation, 16> SelLocs;
14073     E->getSelectorLocs(SelLocs);
14074     return getDerived().RebuildObjCMessageExpr(E->getSuperLoc(),
14075                                                E->getSelector(),
14076                                                SelLocs,
14077                                                E->getReceiverType(),
14078                                                E->getMethodDecl(),
14079                                                E->getLeftLoc(),
14080                                                Args,
14081                                                E->getRightLoc());
14082   }
14083 
14084   // Instance message: transform the receiver
14085   assert(E->getReceiverKind() == ObjCMessageExpr::Instance &&
14086          "Only class and instance messages may be instantiated");
14087   ExprResult Receiver
14088     = getDerived().TransformExpr(E->getInstanceReceiver());
14089   if (Receiver.isInvalid())
14090     return ExprError();
14091 
14092   // If nothing changed, just retain the existing message send.
14093   if (!getDerived().AlwaysRebuild() &&
14094       Receiver.get() == E->getInstanceReceiver() && !ArgChanged)
14095     return SemaRef.MaybeBindToTemporary(E);
14096 
14097   // Build a new instance message send.
14098   SmallVector<SourceLocation, 16> SelLocs;
14099   E->getSelectorLocs(SelLocs);
14100   return getDerived().RebuildObjCMessageExpr(Receiver.get(),
14101                                              E->getSelector(),
14102                                              SelLocs,
14103                                              E->getMethodDecl(),
14104                                              E->getLeftLoc(),
14105                                              Args,
14106                                              E->getRightLoc());
14107 }
14108 
14109 template<typename Derived>
14110 ExprResult
14111 TreeTransform<Derived>::TransformObjCSelectorExpr(ObjCSelectorExpr *E) {
14112   return E;
14113 }
14114 
14115 template<typename Derived>
14116 ExprResult
14117 TreeTransform<Derived>::TransformObjCProtocolExpr(ObjCProtocolExpr *E) {
14118   return E;
14119 }
14120 
14121 template<typename Derived>
14122 ExprResult
14123 TreeTransform<Derived>::TransformObjCIvarRefExpr(ObjCIvarRefExpr *E) {
14124   // Transform the base expression.
14125   ExprResult Base = getDerived().TransformExpr(E->getBase());
14126   if (Base.isInvalid())
14127     return ExprError();
14128 
14129   // We don't need to transform the ivar; it will never change.
14130 
14131   // If nothing changed, just retain the existing expression.
14132   if (!getDerived().AlwaysRebuild() &&
14133       Base.get() == E->getBase())
14134     return E;
14135 
14136   return getDerived().RebuildObjCIvarRefExpr(Base.get(), E->getDecl(),
14137                                              E->getLocation(),
14138                                              E->isArrow(), E->isFreeIvar());
14139 }
14140 
14141 template<typename Derived>
14142 ExprResult
14143 TreeTransform<Derived>::TransformObjCPropertyRefExpr(ObjCPropertyRefExpr *E) {
14144   // 'super' and types never change. Property never changes. Just
14145   // retain the existing expression.
14146   if (!E->isObjectReceiver())
14147     return E;
14148 
14149   // Transform the base expression.
14150   ExprResult Base = getDerived().TransformExpr(E->getBase());
14151   if (Base.isInvalid())
14152     return ExprError();
14153 
14154   // We don't need to transform the property; it will never change.
14155 
14156   // If nothing changed, just retain the existing expression.
14157   if (!getDerived().AlwaysRebuild() &&
14158       Base.get() == E->getBase())
14159     return E;
14160 
14161   if (E->isExplicitProperty())
14162     return getDerived().RebuildObjCPropertyRefExpr(Base.get(),
14163                                                    E->getExplicitProperty(),
14164                                                    E->getLocation());
14165 
14166   return getDerived().RebuildObjCPropertyRefExpr(Base.get(),
14167                                                  SemaRef.Context.PseudoObjectTy,
14168                                                  E->getImplicitPropertyGetter(),
14169                                                  E->getImplicitPropertySetter(),
14170                                                  E->getLocation());
14171 }
14172 
14173 template<typename Derived>
14174 ExprResult
14175 TreeTransform<Derived>::TransformObjCSubscriptRefExpr(ObjCSubscriptRefExpr *E) {
14176   // Transform the base expression.
14177   ExprResult Base = getDerived().TransformExpr(E->getBaseExpr());
14178   if (Base.isInvalid())
14179     return ExprError();
14180 
14181   // Transform the key expression.
14182   ExprResult Key = getDerived().TransformExpr(E->getKeyExpr());
14183   if (Key.isInvalid())
14184     return ExprError();
14185 
14186   // If nothing changed, just retain the existing expression.
14187   if (!getDerived().AlwaysRebuild() &&
14188       Key.get() == E->getKeyExpr() && Base.get() == E->getBaseExpr())
14189     return E;
14190 
14191   return getDerived().RebuildObjCSubscriptRefExpr(E->getRBracket(),
14192                                                   Base.get(), Key.get(),
14193                                                   E->getAtIndexMethodDecl(),
14194                                                   E->setAtIndexMethodDecl());
14195 }
14196 
14197 template<typename Derived>
14198 ExprResult
14199 TreeTransform<Derived>::TransformObjCIsaExpr(ObjCIsaExpr *E) {
14200   // Transform the base expression.
14201   ExprResult Base = getDerived().TransformExpr(E->getBase());
14202   if (Base.isInvalid())
14203     return ExprError();
14204 
14205   // If nothing changed, just retain the existing expression.
14206   if (!getDerived().AlwaysRebuild() &&
14207       Base.get() == E->getBase())
14208     return E;
14209 
14210   return getDerived().RebuildObjCIsaExpr(Base.get(), E->getIsaMemberLoc(),
14211                                          E->getOpLoc(),
14212                                          E->isArrow());
14213 }
14214 
14215 template<typename Derived>
14216 ExprResult
14217 TreeTransform<Derived>::TransformShuffleVectorExpr(ShuffleVectorExpr *E) {
14218   bool ArgumentChanged = false;
14219   SmallVector<Expr*, 8> SubExprs;
14220   SubExprs.reserve(E->getNumSubExprs());
14221   if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false,
14222                                   SubExprs, &ArgumentChanged))
14223     return ExprError();
14224 
14225   if (!getDerived().AlwaysRebuild() &&
14226       !ArgumentChanged)
14227     return E;
14228 
14229   return getDerived().RebuildShuffleVectorExpr(E->getBuiltinLoc(),
14230                                                SubExprs,
14231                                                E->getRParenLoc());
14232 }
14233 
14234 template<typename Derived>
14235 ExprResult
14236 TreeTransform<Derived>::TransformConvertVectorExpr(ConvertVectorExpr *E) {
14237   ExprResult SrcExpr = getDerived().TransformExpr(E->getSrcExpr());
14238   if (SrcExpr.isInvalid())
14239     return ExprError();
14240 
14241   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo());
14242   if (!Type)
14243     return ExprError();
14244 
14245   if (!getDerived().AlwaysRebuild() &&
14246       Type == E->getTypeSourceInfo() &&
14247       SrcExpr.get() == E->getSrcExpr())
14248     return E;
14249 
14250   return getDerived().RebuildConvertVectorExpr(E->getBuiltinLoc(),
14251                                                SrcExpr.get(), Type,
14252                                                E->getRParenLoc());
14253 }
14254 
14255 template<typename Derived>
14256 ExprResult
14257 TreeTransform<Derived>::TransformBlockExpr(BlockExpr *E) {
14258   BlockDecl *oldBlock = E->getBlockDecl();
14259 
14260   SemaRef.ActOnBlockStart(E->getCaretLocation(), /*Scope=*/nullptr);
14261   BlockScopeInfo *blockScope = SemaRef.getCurBlock();
14262 
14263   blockScope->TheDecl->setIsVariadic(oldBlock->isVariadic());
14264   blockScope->TheDecl->setBlockMissingReturnType(
14265                          oldBlock->blockMissingReturnType());
14266 
14267   SmallVector<ParmVarDecl*, 4> params;
14268   SmallVector<QualType, 4> paramTypes;
14269 
14270   const FunctionProtoType *exprFunctionType = E->getFunctionType();
14271 
14272   // Parameter substitution.
14273   Sema::ExtParameterInfoBuilder extParamInfos;
14274   if (getDerived().TransformFunctionTypeParams(
14275           E->getCaretLocation(), oldBlock->parameters(), nullptr,
14276           exprFunctionType->getExtParameterInfosOrNull(), paramTypes, &params,
14277           extParamInfos)) {
14278     getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr);
14279     return ExprError();
14280   }
14281 
14282   QualType exprResultType =
14283       getDerived().TransformType(exprFunctionType->getReturnType());
14284 
14285   auto epi = exprFunctionType->getExtProtoInfo();
14286   epi.ExtParameterInfos = extParamInfos.getPointerOrNull(paramTypes.size());
14287 
14288   QualType functionType =
14289     getDerived().RebuildFunctionProtoType(exprResultType, paramTypes, epi);
14290   blockScope->FunctionType = functionType;
14291 
14292   // Set the parameters on the block decl.
14293   if (!params.empty())
14294     blockScope->TheDecl->setParams(params);
14295 
14296   if (!oldBlock->blockMissingReturnType()) {
14297     blockScope->HasImplicitReturnType = false;
14298     blockScope->ReturnType = exprResultType;
14299   }
14300 
14301   // Transform the body
14302   StmtResult body = getDerived().TransformStmt(E->getBody());
14303   if (body.isInvalid()) {
14304     getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr);
14305     return ExprError();
14306   }
14307 
14308 #ifndef NDEBUG
14309   // In builds with assertions, make sure that we captured everything we
14310   // captured before.
14311   if (!SemaRef.getDiagnostics().hasErrorOccurred()) {
14312     for (const auto &I : oldBlock->captures()) {
14313       VarDecl *oldCapture = I.getVariable();
14314 
14315       // Ignore parameter packs.
14316       if (oldCapture->isParameterPack())
14317         continue;
14318 
14319       VarDecl *newCapture =
14320         cast<VarDecl>(getDerived().TransformDecl(E->getCaretLocation(),
14321                                                  oldCapture));
14322       assert(blockScope->CaptureMap.count(newCapture));
14323     }
14324     assert(oldBlock->capturesCXXThis() == blockScope->isCXXThisCaptured());
14325   }
14326 #endif
14327 
14328   return SemaRef.ActOnBlockStmtExpr(E->getCaretLocation(), body.get(),
14329                                     /*Scope=*/nullptr);
14330 }
14331 
14332 template<typename Derived>
14333 ExprResult
14334 TreeTransform<Derived>::TransformAsTypeExpr(AsTypeExpr *E) {
14335   ExprResult SrcExpr = getDerived().TransformExpr(E->getSrcExpr());
14336   if (SrcExpr.isInvalid())
14337     return ExprError();
14338 
14339   QualType Type = getDerived().TransformType(E->getType());
14340 
14341   return SemaRef.BuildAsTypeExpr(SrcExpr.get(), Type, E->getBuiltinLoc(),
14342                                  E->getRParenLoc());
14343 }
14344 
14345 template<typename Derived>
14346 ExprResult
14347 TreeTransform<Derived>::TransformAtomicExpr(AtomicExpr *E) {
14348   bool ArgumentChanged = false;
14349   SmallVector<Expr*, 8> SubExprs;
14350   SubExprs.reserve(E->getNumSubExprs());
14351   if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false,
14352                                   SubExprs, &ArgumentChanged))
14353     return ExprError();
14354 
14355   if (!getDerived().AlwaysRebuild() &&
14356       !ArgumentChanged)
14357     return E;
14358 
14359   return getDerived().RebuildAtomicExpr(E->getBuiltinLoc(), SubExprs,
14360                                         E->getOp(), E->getRParenLoc());
14361 }
14362 
14363 //===----------------------------------------------------------------------===//
14364 // Type reconstruction
14365 //===----------------------------------------------------------------------===//
14366 
14367 template<typename Derived>
14368 QualType TreeTransform<Derived>::RebuildPointerType(QualType PointeeType,
14369                                                     SourceLocation Star) {
14370   return SemaRef.BuildPointerType(PointeeType, Star,
14371                                   getDerived().getBaseEntity());
14372 }
14373 
14374 template<typename Derived>
14375 QualType TreeTransform<Derived>::RebuildBlockPointerType(QualType PointeeType,
14376                                                          SourceLocation Star) {
14377   return SemaRef.BuildBlockPointerType(PointeeType, Star,
14378                                        getDerived().getBaseEntity());
14379 }
14380 
14381 template<typename Derived>
14382 QualType
14383 TreeTransform<Derived>::RebuildReferenceType(QualType ReferentType,
14384                                              bool WrittenAsLValue,
14385                                              SourceLocation Sigil) {
14386   return SemaRef.BuildReferenceType(ReferentType, WrittenAsLValue,
14387                                     Sigil, getDerived().getBaseEntity());
14388 }
14389 
14390 template<typename Derived>
14391 QualType
14392 TreeTransform<Derived>::RebuildMemberPointerType(QualType PointeeType,
14393                                                  QualType ClassType,
14394                                                  SourceLocation Sigil) {
14395   return SemaRef.BuildMemberPointerType(PointeeType, ClassType, Sigil,
14396                                         getDerived().getBaseEntity());
14397 }
14398 
14399 template<typename Derived>
14400 QualType TreeTransform<Derived>::RebuildObjCTypeParamType(
14401            const ObjCTypeParamDecl *Decl,
14402            SourceLocation ProtocolLAngleLoc,
14403            ArrayRef<ObjCProtocolDecl *> Protocols,
14404            ArrayRef<SourceLocation> ProtocolLocs,
14405            SourceLocation ProtocolRAngleLoc) {
14406   return SemaRef.BuildObjCTypeParamType(Decl,
14407                                         ProtocolLAngleLoc, Protocols,
14408                                         ProtocolLocs, ProtocolRAngleLoc,
14409                                         /*FailOnError=*/true);
14410 }
14411 
14412 template<typename Derived>
14413 QualType TreeTransform<Derived>::RebuildObjCObjectType(
14414            QualType BaseType,
14415            SourceLocation Loc,
14416            SourceLocation TypeArgsLAngleLoc,
14417            ArrayRef<TypeSourceInfo *> TypeArgs,
14418            SourceLocation TypeArgsRAngleLoc,
14419            SourceLocation ProtocolLAngleLoc,
14420            ArrayRef<ObjCProtocolDecl *> Protocols,
14421            ArrayRef<SourceLocation> ProtocolLocs,
14422            SourceLocation ProtocolRAngleLoc) {
14423   return SemaRef.BuildObjCObjectType(BaseType, Loc, TypeArgsLAngleLoc,
14424                                      TypeArgs, TypeArgsRAngleLoc,
14425                                      ProtocolLAngleLoc, Protocols, ProtocolLocs,
14426                                      ProtocolRAngleLoc,
14427                                      /*FailOnError=*/true);
14428 }
14429 
14430 template<typename Derived>
14431 QualType TreeTransform<Derived>::RebuildObjCObjectPointerType(
14432            QualType PointeeType,
14433            SourceLocation Star) {
14434   return SemaRef.Context.getObjCObjectPointerType(PointeeType);
14435 }
14436 
14437 template<typename Derived>
14438 QualType
14439 TreeTransform<Derived>::RebuildArrayType(QualType ElementType,
14440                                          ArrayType::ArraySizeModifier SizeMod,
14441                                          const llvm::APInt *Size,
14442                                          Expr *SizeExpr,
14443                                          unsigned IndexTypeQuals,
14444                                          SourceRange BracketsRange) {
14445   if (SizeExpr || !Size)
14446     return SemaRef.BuildArrayType(ElementType, SizeMod, SizeExpr,
14447                                   IndexTypeQuals, BracketsRange,
14448                                   getDerived().getBaseEntity());
14449 
14450   QualType Types[] = {
14451     SemaRef.Context.UnsignedCharTy, SemaRef.Context.UnsignedShortTy,
14452     SemaRef.Context.UnsignedIntTy, SemaRef.Context.UnsignedLongTy,
14453     SemaRef.Context.UnsignedLongLongTy, SemaRef.Context.UnsignedInt128Ty
14454   };
14455   const unsigned NumTypes = llvm::array_lengthof(Types);
14456   QualType SizeType;
14457   for (unsigned I = 0; I != NumTypes; ++I)
14458     if (Size->getBitWidth() == SemaRef.Context.getIntWidth(Types[I])) {
14459       SizeType = Types[I];
14460       break;
14461     }
14462 
14463   // Note that we can return a VariableArrayType here in the case where
14464   // the element type was a dependent VariableArrayType.
14465   IntegerLiteral *ArraySize
14466       = IntegerLiteral::Create(SemaRef.Context, *Size, SizeType,
14467                                /*FIXME*/BracketsRange.getBegin());
14468   return SemaRef.BuildArrayType(ElementType, SizeMod, ArraySize,
14469                                 IndexTypeQuals, BracketsRange,
14470                                 getDerived().getBaseEntity());
14471 }
14472 
14473 template<typename Derived>
14474 QualType
14475 TreeTransform<Derived>::RebuildConstantArrayType(QualType ElementType,
14476                                                  ArrayType::ArraySizeModifier SizeMod,
14477                                                  const llvm::APInt &Size,
14478                                                  Expr *SizeExpr,
14479                                                  unsigned IndexTypeQuals,
14480                                                  SourceRange BracketsRange) {
14481   return getDerived().RebuildArrayType(ElementType, SizeMod, &Size, SizeExpr,
14482                                         IndexTypeQuals, BracketsRange);
14483 }
14484 
14485 template<typename Derived>
14486 QualType
14487 TreeTransform<Derived>::RebuildIncompleteArrayType(QualType ElementType,
14488                                           ArrayType::ArraySizeModifier SizeMod,
14489                                                  unsigned IndexTypeQuals,
14490                                                    SourceRange BracketsRange) {
14491   return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr, nullptr,
14492                                        IndexTypeQuals, BracketsRange);
14493 }
14494 
14495 template<typename Derived>
14496 QualType
14497 TreeTransform<Derived>::RebuildVariableArrayType(QualType ElementType,
14498                                           ArrayType::ArraySizeModifier SizeMod,
14499                                                  Expr *SizeExpr,
14500                                                  unsigned IndexTypeQuals,
14501                                                  SourceRange BracketsRange) {
14502   return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr,
14503                                        SizeExpr,
14504                                        IndexTypeQuals, BracketsRange);
14505 }
14506 
14507 template<typename Derived>
14508 QualType
14509 TreeTransform<Derived>::RebuildDependentSizedArrayType(QualType ElementType,
14510                                           ArrayType::ArraySizeModifier SizeMod,
14511                                                        Expr *SizeExpr,
14512                                                        unsigned IndexTypeQuals,
14513                                                    SourceRange BracketsRange) {
14514   return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr,
14515                                        SizeExpr,
14516                                        IndexTypeQuals, BracketsRange);
14517 }
14518 
14519 template <typename Derived>
14520 QualType TreeTransform<Derived>::RebuildDependentAddressSpaceType(
14521     QualType PointeeType, Expr *AddrSpaceExpr, SourceLocation AttributeLoc) {
14522   return SemaRef.BuildAddressSpaceAttr(PointeeType, AddrSpaceExpr,
14523                                           AttributeLoc);
14524 }
14525 
14526 template <typename Derived>
14527 QualType
14528 TreeTransform<Derived>::RebuildVectorType(QualType ElementType,
14529                                           unsigned NumElements,
14530                                           VectorType::VectorKind VecKind) {
14531   // FIXME: semantic checking!
14532   return SemaRef.Context.getVectorType(ElementType, NumElements, VecKind);
14533 }
14534 
14535 template <typename Derived>
14536 QualType TreeTransform<Derived>::RebuildDependentVectorType(
14537     QualType ElementType, Expr *SizeExpr, SourceLocation AttributeLoc,
14538     VectorType::VectorKind VecKind) {
14539   return SemaRef.BuildVectorType(ElementType, SizeExpr, AttributeLoc);
14540 }
14541 
14542 template<typename Derived>
14543 QualType TreeTransform<Derived>::RebuildExtVectorType(QualType ElementType,
14544                                                       unsigned NumElements,
14545                                                  SourceLocation AttributeLoc) {
14546   llvm::APInt numElements(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy),
14547                           NumElements, true);
14548   IntegerLiteral *VectorSize
14549     = IntegerLiteral::Create(SemaRef.Context, numElements, SemaRef.Context.IntTy,
14550                              AttributeLoc);
14551   return SemaRef.BuildExtVectorType(ElementType, VectorSize, AttributeLoc);
14552 }
14553 
14554 template<typename Derived>
14555 QualType
14556 TreeTransform<Derived>::RebuildDependentSizedExtVectorType(QualType ElementType,
14557                                                            Expr *SizeExpr,
14558                                                   SourceLocation AttributeLoc) {
14559   return SemaRef.BuildExtVectorType(ElementType, SizeExpr, AttributeLoc);
14560 }
14561 
14562 template <typename Derived>
14563 QualType TreeTransform<Derived>::RebuildConstantMatrixType(
14564     QualType ElementType, unsigned NumRows, unsigned NumColumns) {
14565   return SemaRef.Context.getConstantMatrixType(ElementType, NumRows,
14566                                                NumColumns);
14567 }
14568 
14569 template <typename Derived>
14570 QualType TreeTransform<Derived>::RebuildDependentSizedMatrixType(
14571     QualType ElementType, Expr *RowExpr, Expr *ColumnExpr,
14572     SourceLocation AttributeLoc) {
14573   return SemaRef.BuildMatrixType(ElementType, RowExpr, ColumnExpr,
14574                                  AttributeLoc);
14575 }
14576 
14577 template<typename Derived>
14578 QualType TreeTransform<Derived>::RebuildFunctionProtoType(
14579     QualType T,
14580     MutableArrayRef<QualType> ParamTypes,
14581     const FunctionProtoType::ExtProtoInfo &EPI) {
14582   return SemaRef.BuildFunctionType(T, ParamTypes,
14583                                    getDerived().getBaseLocation(),
14584                                    getDerived().getBaseEntity(),
14585                                    EPI);
14586 }
14587 
14588 template<typename Derived>
14589 QualType TreeTransform<Derived>::RebuildFunctionNoProtoType(QualType T) {
14590   return SemaRef.Context.getFunctionNoProtoType(T);
14591 }
14592 
14593 template<typename Derived>
14594 QualType TreeTransform<Derived>::RebuildUnresolvedUsingType(SourceLocation Loc,
14595                                                             Decl *D) {
14596   assert(D && "no decl found");
14597   if (D->isInvalidDecl()) return QualType();
14598 
14599   // FIXME: Doesn't account for ObjCInterfaceDecl!
14600   if (auto *UPD = dyn_cast<UsingPackDecl>(D)) {
14601     // A valid resolved using typename pack expansion decl can have multiple
14602     // UsingDecls, but they must each have exactly one type, and it must be
14603     // the same type in every case. But we must have at least one expansion!
14604     if (UPD->expansions().empty()) {
14605       getSema().Diag(Loc, diag::err_using_pack_expansion_empty)
14606           << UPD->isCXXClassMember() << UPD;
14607       return QualType();
14608     }
14609 
14610     // We might still have some unresolved types. Try to pick a resolved type
14611     // if we can. The final instantiation will check that the remaining
14612     // unresolved types instantiate to the type we pick.
14613     QualType FallbackT;
14614     QualType T;
14615     for (auto *E : UPD->expansions()) {
14616       QualType ThisT = RebuildUnresolvedUsingType(Loc, E);
14617       if (ThisT.isNull())
14618         continue;
14619       else if (ThisT->getAs<UnresolvedUsingType>())
14620         FallbackT = ThisT;
14621       else if (T.isNull())
14622         T = ThisT;
14623       else
14624         assert(getSema().Context.hasSameType(ThisT, T) &&
14625                "mismatched resolved types in using pack expansion");
14626     }
14627     return T.isNull() ? FallbackT : T;
14628   } else if (auto *Using = dyn_cast<UsingDecl>(D)) {
14629     assert(Using->hasTypename() &&
14630            "UnresolvedUsingTypenameDecl transformed to non-typename using");
14631 
14632     // A valid resolved using typename decl points to exactly one type decl.
14633     assert(++Using->shadow_begin() == Using->shadow_end());
14634 
14635     UsingShadowDecl *Shadow = *Using->shadow_begin();
14636     if (SemaRef.DiagnoseUseOfDecl(Shadow->getTargetDecl(), Loc))
14637       return QualType();
14638     return SemaRef.Context.getUsingType(
14639         Shadow, SemaRef.Context.getTypeDeclType(
14640                     cast<TypeDecl>(Shadow->getTargetDecl())));
14641   } else {
14642     assert(isa<UnresolvedUsingTypenameDecl>(D) &&
14643            "UnresolvedUsingTypenameDecl transformed to non-using decl");
14644     return SemaRef.Context.getTypeDeclType(
14645         cast<UnresolvedUsingTypenameDecl>(D));
14646   }
14647 }
14648 
14649 template <typename Derived>
14650 QualType TreeTransform<Derived>::RebuildTypeOfExprType(Expr *E,
14651                                                        SourceLocation) {
14652   return SemaRef.BuildTypeofExprType(E);
14653 }
14654 
14655 template<typename Derived>
14656 QualType TreeTransform<Derived>::RebuildTypeOfType(QualType Underlying) {
14657   return SemaRef.Context.getTypeOfType(Underlying);
14658 }
14659 
14660 template <typename Derived>
14661 QualType TreeTransform<Derived>::RebuildDecltypeType(Expr *E, SourceLocation) {
14662   return SemaRef.BuildDecltypeType(E);
14663 }
14664 
14665 template<typename Derived>
14666 QualType TreeTransform<Derived>::RebuildUnaryTransformType(QualType BaseType,
14667                                             UnaryTransformType::UTTKind UKind,
14668                                             SourceLocation Loc) {
14669   return SemaRef.BuildUnaryTransformType(BaseType, UKind, Loc);
14670 }
14671 
14672 template<typename Derived>
14673 QualType TreeTransform<Derived>::RebuildTemplateSpecializationType(
14674                                                       TemplateName Template,
14675                                              SourceLocation TemplateNameLoc,
14676                                      TemplateArgumentListInfo &TemplateArgs) {
14677   return SemaRef.CheckTemplateIdType(Template, TemplateNameLoc, TemplateArgs);
14678 }
14679 
14680 template<typename Derived>
14681 QualType TreeTransform<Derived>::RebuildAtomicType(QualType ValueType,
14682                                                    SourceLocation KWLoc) {
14683   return SemaRef.BuildAtomicType(ValueType, KWLoc);
14684 }
14685 
14686 template<typename Derived>
14687 QualType TreeTransform<Derived>::RebuildPipeType(QualType ValueType,
14688                                                  SourceLocation KWLoc,
14689                                                  bool isReadPipe) {
14690   return isReadPipe ? SemaRef.BuildReadPipeType(ValueType, KWLoc)
14691                     : SemaRef.BuildWritePipeType(ValueType, KWLoc);
14692 }
14693 
14694 template <typename Derived>
14695 QualType TreeTransform<Derived>::RebuildBitIntType(bool IsUnsigned,
14696                                                    unsigned NumBits,
14697                                                    SourceLocation Loc) {
14698   llvm::APInt NumBitsAP(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy),
14699                         NumBits, true);
14700   IntegerLiteral *Bits = IntegerLiteral::Create(SemaRef.Context, NumBitsAP,
14701                                                 SemaRef.Context.IntTy, Loc);
14702   return SemaRef.BuildBitIntType(IsUnsigned, Bits, Loc);
14703 }
14704 
14705 template <typename Derived>
14706 QualType TreeTransform<Derived>::RebuildDependentBitIntType(
14707     bool IsUnsigned, Expr *NumBitsExpr, SourceLocation Loc) {
14708   return SemaRef.BuildBitIntType(IsUnsigned, NumBitsExpr, Loc);
14709 }
14710 
14711 template<typename Derived>
14712 TemplateName
14713 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS,
14714                                             bool TemplateKW,
14715                                             TemplateDecl *Template) {
14716   return SemaRef.Context.getQualifiedTemplateName(SS.getScopeRep(), TemplateKW,
14717                                                   TemplateName(Template));
14718 }
14719 
14720 template<typename Derived>
14721 TemplateName
14722 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS,
14723                                             SourceLocation TemplateKWLoc,
14724                                             const IdentifierInfo &Name,
14725                                             SourceLocation NameLoc,
14726                                             QualType ObjectType,
14727                                             NamedDecl *FirstQualifierInScope,
14728                                             bool AllowInjectedClassName) {
14729   UnqualifiedId TemplateName;
14730   TemplateName.setIdentifier(&Name, NameLoc);
14731   Sema::TemplateTy Template;
14732   getSema().ActOnTemplateName(/*Scope=*/nullptr, SS, TemplateKWLoc,
14733                               TemplateName, ParsedType::make(ObjectType),
14734                               /*EnteringContext=*/false, Template,
14735                               AllowInjectedClassName);
14736   return Template.get();
14737 }
14738 
14739 template<typename Derived>
14740 TemplateName
14741 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS,
14742                                             SourceLocation TemplateKWLoc,
14743                                             OverloadedOperatorKind Operator,
14744                                             SourceLocation NameLoc,
14745                                             QualType ObjectType,
14746                                             bool AllowInjectedClassName) {
14747   UnqualifiedId Name;
14748   // FIXME: Bogus location information.
14749   SourceLocation SymbolLocations[3] = { NameLoc, NameLoc, NameLoc };
14750   Name.setOperatorFunctionId(NameLoc, Operator, SymbolLocations);
14751   Sema::TemplateTy Template;
14752   getSema().ActOnTemplateName(
14753       /*Scope=*/nullptr, SS, TemplateKWLoc, Name, ParsedType::make(ObjectType),
14754       /*EnteringContext=*/false, Template, AllowInjectedClassName);
14755   return Template.get();
14756 }
14757 
14758 template<typename Derived>
14759 ExprResult
14760 TreeTransform<Derived>::RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op,
14761                                                    SourceLocation OpLoc,
14762                                                    Expr *OrigCallee,
14763                                                    Expr *First,
14764                                                    Expr *Second) {
14765   Expr *Callee = OrigCallee->IgnoreParenCasts();
14766   bool isPostIncDec = Second && (Op == OO_PlusPlus || Op == OO_MinusMinus);
14767 
14768   if (First->getObjectKind() == OK_ObjCProperty) {
14769     BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op);
14770     if (BinaryOperator::isAssignmentOp(Opc))
14771       return SemaRef.checkPseudoObjectAssignment(/*Scope=*/nullptr, OpLoc, Opc,
14772                                                  First, Second);
14773     ExprResult Result = SemaRef.CheckPlaceholderExpr(First);
14774     if (Result.isInvalid())
14775       return ExprError();
14776     First = Result.get();
14777   }
14778 
14779   if (Second && Second->getObjectKind() == OK_ObjCProperty) {
14780     ExprResult Result = SemaRef.CheckPlaceholderExpr(Second);
14781     if (Result.isInvalid())
14782       return ExprError();
14783     Second = Result.get();
14784   }
14785 
14786   // Determine whether this should be a builtin operation.
14787   if (Op == OO_Subscript) {
14788     if (!First->getType()->isOverloadableType() &&
14789         !Second->getType()->isOverloadableType())
14790       return getSema().CreateBuiltinArraySubscriptExpr(
14791           First, Callee->getBeginLoc(), Second, OpLoc);
14792   } else if (Op == OO_Arrow) {
14793     // It is possible that the type refers to a RecoveryExpr created earlier
14794     // in the tree transformation.
14795     if (First->getType()->isDependentType())
14796       return ExprError();
14797     // -> is never a builtin operation.
14798     return SemaRef.BuildOverloadedArrowExpr(nullptr, First, OpLoc);
14799   } else if (Second == nullptr || isPostIncDec) {
14800     if (!First->getType()->isOverloadableType() ||
14801         (Op == OO_Amp && getSema().isQualifiedMemberAccess(First))) {
14802       // The argument is not of overloadable type, or this is an expression
14803       // of the form &Class::member, so try to create a built-in unary
14804       // operation.
14805       UnaryOperatorKind Opc
14806         = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec);
14807 
14808       return getSema().CreateBuiltinUnaryOp(OpLoc, Opc, First);
14809     }
14810   } else {
14811     if (!First->getType()->isOverloadableType() &&
14812         !Second->getType()->isOverloadableType()) {
14813       // Neither of the arguments is an overloadable type, so try to
14814       // create a built-in binary operation.
14815       BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op);
14816       ExprResult Result
14817         = SemaRef.CreateBuiltinBinOp(OpLoc, Opc, First, Second);
14818       if (Result.isInvalid())
14819         return ExprError();
14820 
14821       return Result;
14822     }
14823   }
14824 
14825   // Compute the transformed set of functions (and function templates) to be
14826   // used during overload resolution.
14827   UnresolvedSet<16> Functions;
14828   bool RequiresADL;
14829 
14830   if (UnresolvedLookupExpr *ULE = dyn_cast<UnresolvedLookupExpr>(Callee)) {
14831     Functions.append(ULE->decls_begin(), ULE->decls_end());
14832     // If the overload could not be resolved in the template definition
14833     // (because we had a dependent argument), ADL is performed as part of
14834     // template instantiation.
14835     RequiresADL = ULE->requiresADL();
14836   } else {
14837     // If we've resolved this to a particular non-member function, just call
14838     // that function. If we resolved it to a member function,
14839     // CreateOverloaded* will find that function for us.
14840     NamedDecl *ND = cast<DeclRefExpr>(Callee)->getDecl();
14841     if (!isa<CXXMethodDecl>(ND))
14842       Functions.addDecl(ND);
14843     RequiresADL = false;
14844   }
14845 
14846   // Add any functions found via argument-dependent lookup.
14847   Expr *Args[2] = { First, Second };
14848   unsigned NumArgs = 1 + (Second != nullptr);
14849 
14850   // Create the overloaded operator invocation for unary operators.
14851   if (NumArgs == 1 || isPostIncDec) {
14852     UnaryOperatorKind Opc
14853       = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec);
14854     return SemaRef.CreateOverloadedUnaryOp(OpLoc, Opc, Functions, First,
14855                                            RequiresADL);
14856   }
14857 
14858   if (Op == OO_Subscript) {
14859     SourceLocation LBrace;
14860     SourceLocation RBrace;
14861 
14862     if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Callee)) {
14863       DeclarationNameLoc NameLoc = DRE->getNameInfo().getInfo();
14864       LBrace = NameLoc.getCXXOperatorNameBeginLoc();
14865       RBrace = NameLoc.getCXXOperatorNameEndLoc();
14866     } else {
14867       LBrace = Callee->getBeginLoc();
14868       RBrace = OpLoc;
14869     }
14870 
14871     return SemaRef.CreateOverloadedArraySubscriptExpr(LBrace, RBrace,
14872                                                       First, Second);
14873   }
14874 
14875   // Create the overloaded operator invocation for binary operators.
14876   BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op);
14877   ExprResult Result = SemaRef.CreateOverloadedBinOp(
14878       OpLoc, Opc, Functions, Args[0], Args[1], RequiresADL);
14879   if (Result.isInvalid())
14880     return ExprError();
14881 
14882   return Result;
14883 }
14884 
14885 template<typename Derived>
14886 ExprResult
14887 TreeTransform<Derived>::RebuildCXXPseudoDestructorExpr(Expr *Base,
14888                                                      SourceLocation OperatorLoc,
14889                                                        bool isArrow,
14890                                                        CXXScopeSpec &SS,
14891                                                      TypeSourceInfo *ScopeType,
14892                                                        SourceLocation CCLoc,
14893                                                        SourceLocation TildeLoc,
14894                                         PseudoDestructorTypeStorage Destroyed) {
14895   QualType BaseType = Base->getType();
14896   if (Base->isTypeDependent() || Destroyed.getIdentifier() ||
14897       (!isArrow && !BaseType->getAs<RecordType>()) ||
14898       (isArrow && BaseType->getAs<PointerType>() &&
14899        !BaseType->castAs<PointerType>()->getPointeeType()
14900                                               ->template getAs<RecordType>())){
14901     // This pseudo-destructor expression is still a pseudo-destructor.
14902     return SemaRef.BuildPseudoDestructorExpr(
14903         Base, OperatorLoc, isArrow ? tok::arrow : tok::period, SS, ScopeType,
14904         CCLoc, TildeLoc, Destroyed);
14905   }
14906 
14907   TypeSourceInfo *DestroyedType = Destroyed.getTypeSourceInfo();
14908   DeclarationName Name(SemaRef.Context.DeclarationNames.getCXXDestructorName(
14909                  SemaRef.Context.getCanonicalType(DestroyedType->getType())));
14910   DeclarationNameInfo NameInfo(Name, Destroyed.getLocation());
14911   NameInfo.setNamedTypeInfo(DestroyedType);
14912 
14913   // The scope type is now known to be a valid nested name specifier
14914   // component. Tack it on to the end of the nested name specifier.
14915   if (ScopeType) {
14916     if (!ScopeType->getType()->getAs<TagType>()) {
14917       getSema().Diag(ScopeType->getTypeLoc().getBeginLoc(),
14918                      diag::err_expected_class_or_namespace)
14919           << ScopeType->getType() << getSema().getLangOpts().CPlusPlus;
14920       return ExprError();
14921     }
14922     SS.Extend(SemaRef.Context, SourceLocation(), ScopeType->getTypeLoc(),
14923               CCLoc);
14924   }
14925 
14926   SourceLocation TemplateKWLoc; // FIXME: retrieve it from caller.
14927   return getSema().BuildMemberReferenceExpr(Base, BaseType,
14928                                             OperatorLoc, isArrow,
14929                                             SS, TemplateKWLoc,
14930                                             /*FIXME: FirstQualifier*/ nullptr,
14931                                             NameInfo,
14932                                             /*TemplateArgs*/ nullptr,
14933                                             /*S*/nullptr);
14934 }
14935 
14936 template<typename Derived>
14937 StmtResult
14938 TreeTransform<Derived>::TransformCapturedStmt(CapturedStmt *S) {
14939   SourceLocation Loc = S->getBeginLoc();
14940   CapturedDecl *CD = S->getCapturedDecl();
14941   unsigned NumParams = CD->getNumParams();
14942   unsigned ContextParamPos = CD->getContextParamPosition();
14943   SmallVector<Sema::CapturedParamNameType, 4> Params;
14944   for (unsigned I = 0; I < NumParams; ++I) {
14945     if (I != ContextParamPos) {
14946       Params.push_back(
14947              std::make_pair(
14948                   CD->getParam(I)->getName(),
14949                   getDerived().TransformType(CD->getParam(I)->getType())));
14950     } else {
14951       Params.push_back(std::make_pair(StringRef(), QualType()));
14952     }
14953   }
14954   getSema().ActOnCapturedRegionStart(Loc, /*CurScope*/nullptr,
14955                                      S->getCapturedRegionKind(), Params);
14956   StmtResult Body;
14957   {
14958     Sema::CompoundScopeRAII CompoundScope(getSema());
14959     Body = getDerived().TransformStmt(S->getCapturedStmt());
14960   }
14961 
14962   if (Body.isInvalid()) {
14963     getSema().ActOnCapturedRegionError();
14964     return StmtError();
14965   }
14966 
14967   return getSema().ActOnCapturedRegionEnd(Body.get());
14968 }
14969 
14970 } // end namespace clang
14971 
14972 #endif // LLVM_CLANG_LIB_SEMA_TREETRANSFORM_H
14973